From 436f13e604c3d62c95d6ffa8cd4035871f4c8954 Mon Sep 17 00:00:00 2001 From: archos Date: Wed, 16 Oct 2024 19:47:13 +0200 Subject: [PATCH] =?UTF-8?q?aktualizce=20a=20nov=C3=A1=20verze=20phanpy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ompose-Gtwe4AUy.js => compose-cXFPaEYk.js} | 4 +- ...twe4AUy.js.map => compose-cXFPaEYk.js.map} | 2 +- assets/compose-hDlR2o-x.js | 26 ------------- assets/compose-hDlR2o-x.js.map | 1 - assets/compose-xua1VIA2.js | 26 +++++++++++++ assets/compose-xua1VIA2.js.map | 1 + assets/{fuse-uYeGZ3ik.js => fuse-RZOrQKm7.js} | 28 +++++++------- assets/fuse-RZOrQKm7.js.map | 1 + assets/fuse-uYeGZ3ik.js.map | 1 - assets/locales/ar-SA-Uzlm3CnA.js | 2 + assets/locales/ar-SA-Uzlm3CnA.js.map | 1 + assets/locales/ar-SA-d0IcoGc_.js | 2 - assets/locales/ar-SA-d0IcoGc_.js.map | 1 - assets/locales/ca-ES-5_SOnaYH.js | 2 + assets/locales/ca-ES-5_SOnaYH.js.map | 1 + assets/locales/ca-ES-NQgq8q4p.js | 2 - assets/locales/ca-ES-NQgq8q4p.js.map | 1 - assets/locales/cs-CZ-2Py_5fQz.js | 2 + assets/locales/cs-CZ-2Py_5fQz.js.map | 1 + assets/locales/cs-CZ-fQsWEx8D.js | 2 - assets/locales/cs-CZ-fQsWEx8D.js.map | 1 - assets/locales/de-DE-4Y9oxJt9.js | 2 - assets/locales/de-DE-4Y9oxJt9.js.map | 1 - assets/locales/de-DE-bAVNgbg5.js | 2 + assets/locales/de-DE-bAVNgbg5.js.map | 1 + assets/locales/eo-UY-QMukRqop.js | 2 - assets/locales/eo-UY-QMukRqop.js.map | 1 - assets/locales/eo-UY-r8Bn4Jz9.js | 2 + assets/locales/eo-UY-r8Bn4Jz9.js.map | 1 + assets/locales/es-ES-BVO7yU-V.js | 2 - assets/locales/es-ES-BVO7yU-V.js.map | 1 - assets/locales/es-ES-PR1ILcci.js | 2 + assets/locales/es-ES-PR1ILcci.js.map | 1 + assets/locales/eu-ES-dWk2yKpU.js | 2 + assets/locales/eu-ES-dWk2yKpU.js.map | 1 + assets/locales/eu-ES-e1MlT9L0.js | 2 - assets/locales/eu-ES-e1MlT9L0.js.map | 1 - assets/locales/fa-IR-Lefw2bMZ.js | 2 - assets/locales/fa-IR-Lefw2bMZ.js.map | 1 - assets/locales/fa-IR-y1BJrbGe.js | 2 + assets/locales/fa-IR-y1BJrbGe.js.map | 1 + assets/locales/fi-FI-9IjbAn2c.js | 2 + assets/locales/fi-FI-9IjbAn2c.js.map | 1 + assets/locales/fi-FI-JVGPDlpj.js | 2 - assets/locales/fi-FI-JVGPDlpj.js.map | 1 - assets/locales/fr-FR-a8NEAH69.js | 2 + assets/locales/fr-FR-a8NEAH69.js.map | 1 + assets/locales/fr-FR-ePx-LY3z.js | 2 - assets/locales/fr-FR-ePx-LY3z.js.map | 1 - assets/locales/gl-ES-_YsEArw9.js | 2 + assets/locales/gl-ES-_YsEArw9.js.map | 1 + assets/locales/gl-ES-uOACPqDw.js | 2 - assets/locales/gl-ES-uOACPqDw.js.map | 1 - assets/locales/he-IL-Uzlm3CnA.js | 2 + assets/locales/he-IL-Uzlm3CnA.js.map | 1 + assets/locales/he-IL-d0IcoGc_.js | 2 - assets/locales/he-IL-d0IcoGc_.js.map | 1 - assets/locales/it-IT-_S6470dm.js | 2 + assets/locales/it-IT-_S6470dm.js.map | 1 + assets/locales/it-IT-zkEqgvQc.js | 2 - assets/locales/it-IT-zkEqgvQc.js.map | 1 - assets/locales/ja-JP-7hRw_nT0.js | 2 - assets/locales/ja-JP-7hRw_nT0.js.map | 1 - assets/locales/ja-JP-WT2zE1dP.js | 2 + assets/locales/ja-JP-WT2zE1dP.js.map | 1 + assets/locales/kab-lv33LHbV.js | 2 + assets/locales/kab-lv33LHbV.js.map | 1 + assets/locales/kab-nrAsUXV7.js | 2 - assets/locales/kab-nrAsUXV7.js.map | 1 - assets/locales/ko-KR-rcv85GJM.js | 2 - assets/locales/ko-KR-rcv85GJM.js.map | 1 - assets/locales/ko-KR-s2vFazcI.js | 2 + assets/locales/ko-KR-s2vFazcI.js.map | 1 + assets/locales/lt-LT-8RxWCtZs.js | 2 - assets/locales/lt-LT-8RxWCtZs.js.map | 1 - assets/locales/lt-LT-gZhJ_llT.js | 2 + assets/locales/lt-LT-gZhJ_llT.js.map | 1 + assets/locales/nb-NO-Uzlm3CnA.js | 2 + assets/locales/nb-NO-Uzlm3CnA.js.map | 1 + assets/locales/nb-NO-d0IcoGc_.js | 2 - assets/locales/nb-NO-d0IcoGc_.js.map | 1 - assets/locales/nl-NL-CeLvve2g.js | 2 - assets/locales/nl-NL-CeLvve2g.js.map | 1 - assets/locales/nl-NL-J2baItxn.js | 2 + assets/locales/nl-NL-J2baItxn.js.map | 1 + assets/locales/oc-FR-Uzlm3CnA.js | 2 + assets/locales/oc-FR-Uzlm3CnA.js.map | 1 + assets/locales/oc-FR-d0IcoGc_.js | 2 - assets/locales/oc-FR-d0IcoGc_.js.map | 1 - assets/locales/pl-PL-Uzlm3CnA.js | 2 + assets/locales/pl-PL-Uzlm3CnA.js.map | 1 + assets/locales/pl-PL-d0IcoGc_.js | 2 - assets/locales/pl-PL-d0IcoGc_.js.map | 1 - assets/locales/pseudo-LOCALE-lLq1wKZc.js | 2 + ...m.js.map => pseudo-LOCALE-lLq1wKZc.js.map} | 2 +- assets/locales/pseudo-LOCALE-tOtHxWmm.js | 2 - assets/locales/pt-BR-5SDHrTgX.js | 2 + assets/locales/pt-BR-5SDHrTgX.js.map | 1 + assets/locales/pt-BR-VPHddHuv.js | 2 - assets/locales/pt-BR-VPHddHuv.js.map | 1 - assets/locales/pt-PT-Shszru04.js | 2 - assets/locales/pt-PT-Shszru04.js.map | 1 - assets/locales/pt-PT-Udm3ESZ-.js | 2 + assets/locales/pt-PT-Udm3ESZ-.js.map | 1 + assets/locales/ru-RU-E1hp90nG.js | 2 + assets/locales/ru-RU-E1hp90nG.js.map | 1 + assets/locales/ru-RU-ffvGPZ2f.js | 2 - assets/locales/ru-RU-ffvGPZ2f.js.map | 1 - assets/locales/th-TH-Uzlm3CnA.js | 2 + assets/locales/th-TH-Uzlm3CnA.js.map | 1 + assets/locales/th-TH-d0IcoGc_.js | 2 - assets/locales/th-TH-d0IcoGc_.js.map | 1 - assets/locales/uk-UA-Uzlm3CnA.js | 2 + assets/locales/uk-UA-Uzlm3CnA.js.map | 1 + assets/locales/uk-UA-d0IcoGc_.js | 2 - assets/locales/uk-UA-d0IcoGc_.js.map | 1 - assets/locales/zh-CN-k1HE4cP0.js | 2 + assets/locales/zh-CN-k1HE4cP0.js.map | 1 + assets/locales/zh-CN-lSLSktKu.js | 2 - assets/locales/zh-CN-lSLSktKu.js.map | 1 - assets/locales/zh-TW-Uzlm3CnA.js | 2 + assets/locales/zh-TW-Uzlm3CnA.js.map | 1 + assets/locales/zh-TW-d0IcoGc_.js | 2 - assets/locales/zh-TW-d0IcoGc_.js.map | 1 - assets/main-DaGMLi0n.js | 29 -------------- assets/main-DaGMLi0n.js.map | 1 - assets/main-e75P80UH.js | 29 ++++++++++++++ assets/main-e75P80UH.js.map | 1 + assets/polyfill-force-71Ewx0dk.js | 3 -- assets/polyfill-force-71Ewx0dk.js.map | 1 - assets/polyfill-force-BFlUYQp5.js | 3 ++ assets/polyfill-force-BFlUYQp5.js.map | 1 + ...{style-VzhezNpT.css => style-Wrm_LoQi.css} | 2 +- assets/useTitle-6AJYXxJy.js | 38 ------------------- assets/useTitle-6AJYXxJy.js.map | 1 - assets/useTitle-B8ZF9tfB.js | 38 +++++++++++++++++++ assets/useTitle-B8ZF9tfB.js.map | 1 + compose/index.html | 6 +-- index.html | 8 ++-- version.json | 2 +- 140 files changed, 214 insertions(+), 214 deletions(-) rename assets/{compose-Gtwe4AUy.js => compose-cXFPaEYk.js} (91%) rename assets/{compose-Gtwe4AUy.js.map => compose-cXFPaEYk.js.map} (98%) delete mode 100644 assets/compose-hDlR2o-x.js delete mode 100644 assets/compose-hDlR2o-x.js.map create mode 100644 assets/compose-xua1VIA2.js create mode 100644 assets/compose-xua1VIA2.js.map rename assets/{fuse-uYeGZ3ik.js => fuse-RZOrQKm7.js} (74%) create mode 100644 assets/fuse-RZOrQKm7.js.map delete mode 100644 assets/fuse-uYeGZ3ik.js.map create mode 100644 assets/locales/ar-SA-Uzlm3CnA.js create mode 100644 assets/locales/ar-SA-Uzlm3CnA.js.map delete mode 100644 assets/locales/ar-SA-d0IcoGc_.js delete mode 100644 assets/locales/ar-SA-d0IcoGc_.js.map create mode 100644 assets/locales/ca-ES-5_SOnaYH.js create mode 100644 assets/locales/ca-ES-5_SOnaYH.js.map delete mode 100644 assets/locales/ca-ES-NQgq8q4p.js delete mode 100644 assets/locales/ca-ES-NQgq8q4p.js.map create mode 100644 assets/locales/cs-CZ-2Py_5fQz.js create mode 100644 assets/locales/cs-CZ-2Py_5fQz.js.map delete mode 100644 assets/locales/cs-CZ-fQsWEx8D.js delete mode 100644 assets/locales/cs-CZ-fQsWEx8D.js.map delete mode 100644 assets/locales/de-DE-4Y9oxJt9.js delete mode 100644 assets/locales/de-DE-4Y9oxJt9.js.map create mode 100644 assets/locales/de-DE-bAVNgbg5.js create mode 100644 assets/locales/de-DE-bAVNgbg5.js.map delete mode 100644 assets/locales/eo-UY-QMukRqop.js delete mode 100644 assets/locales/eo-UY-QMukRqop.js.map create mode 100644 assets/locales/eo-UY-r8Bn4Jz9.js create mode 100644 assets/locales/eo-UY-r8Bn4Jz9.js.map delete mode 100644 assets/locales/es-ES-BVO7yU-V.js delete mode 100644 assets/locales/es-ES-BVO7yU-V.js.map create mode 100644 assets/locales/es-ES-PR1ILcci.js create mode 100644 assets/locales/es-ES-PR1ILcci.js.map create mode 100644 assets/locales/eu-ES-dWk2yKpU.js create mode 100644 assets/locales/eu-ES-dWk2yKpU.js.map delete mode 100644 assets/locales/eu-ES-e1MlT9L0.js delete mode 100644 assets/locales/eu-ES-e1MlT9L0.js.map delete mode 100644 assets/locales/fa-IR-Lefw2bMZ.js delete mode 100644 assets/locales/fa-IR-Lefw2bMZ.js.map create mode 100644 assets/locales/fa-IR-y1BJrbGe.js create mode 100644 assets/locales/fa-IR-y1BJrbGe.js.map create mode 100644 assets/locales/fi-FI-9IjbAn2c.js create mode 100644 assets/locales/fi-FI-9IjbAn2c.js.map delete mode 100644 assets/locales/fi-FI-JVGPDlpj.js delete mode 100644 assets/locales/fi-FI-JVGPDlpj.js.map create mode 100644 assets/locales/fr-FR-a8NEAH69.js create mode 100644 assets/locales/fr-FR-a8NEAH69.js.map delete mode 100644 assets/locales/fr-FR-ePx-LY3z.js delete mode 100644 assets/locales/fr-FR-ePx-LY3z.js.map create mode 100644 assets/locales/gl-ES-_YsEArw9.js create mode 100644 assets/locales/gl-ES-_YsEArw9.js.map delete mode 100644 assets/locales/gl-ES-uOACPqDw.js delete mode 100644 assets/locales/gl-ES-uOACPqDw.js.map create mode 100644 assets/locales/he-IL-Uzlm3CnA.js create mode 100644 assets/locales/he-IL-Uzlm3CnA.js.map delete mode 100644 assets/locales/he-IL-d0IcoGc_.js delete mode 100644 assets/locales/he-IL-d0IcoGc_.js.map create mode 100644 assets/locales/it-IT-_S6470dm.js create mode 100644 assets/locales/it-IT-_S6470dm.js.map delete mode 100644 assets/locales/it-IT-zkEqgvQc.js delete mode 100644 assets/locales/it-IT-zkEqgvQc.js.map delete mode 100644 assets/locales/ja-JP-7hRw_nT0.js delete mode 100644 assets/locales/ja-JP-7hRw_nT0.js.map create mode 100644 assets/locales/ja-JP-WT2zE1dP.js create mode 100644 assets/locales/ja-JP-WT2zE1dP.js.map create mode 100644 assets/locales/kab-lv33LHbV.js create mode 100644 assets/locales/kab-lv33LHbV.js.map delete mode 100644 assets/locales/kab-nrAsUXV7.js delete mode 100644 assets/locales/kab-nrAsUXV7.js.map delete mode 100644 assets/locales/ko-KR-rcv85GJM.js delete mode 100644 assets/locales/ko-KR-rcv85GJM.js.map create mode 100644 assets/locales/ko-KR-s2vFazcI.js create mode 100644 assets/locales/ko-KR-s2vFazcI.js.map delete mode 100644 assets/locales/lt-LT-8RxWCtZs.js delete mode 100644 assets/locales/lt-LT-8RxWCtZs.js.map create mode 100644 assets/locales/lt-LT-gZhJ_llT.js create mode 100644 assets/locales/lt-LT-gZhJ_llT.js.map create mode 100644 assets/locales/nb-NO-Uzlm3CnA.js create mode 100644 assets/locales/nb-NO-Uzlm3CnA.js.map delete mode 100644 assets/locales/nb-NO-d0IcoGc_.js delete mode 100644 assets/locales/nb-NO-d0IcoGc_.js.map delete mode 100644 assets/locales/nl-NL-CeLvve2g.js delete mode 100644 assets/locales/nl-NL-CeLvve2g.js.map create mode 100644 assets/locales/nl-NL-J2baItxn.js create mode 100644 assets/locales/nl-NL-J2baItxn.js.map create mode 100644 assets/locales/oc-FR-Uzlm3CnA.js create mode 100644 assets/locales/oc-FR-Uzlm3CnA.js.map delete mode 100644 assets/locales/oc-FR-d0IcoGc_.js delete mode 100644 assets/locales/oc-FR-d0IcoGc_.js.map create mode 100644 assets/locales/pl-PL-Uzlm3CnA.js create mode 100644 assets/locales/pl-PL-Uzlm3CnA.js.map delete mode 100644 assets/locales/pl-PL-d0IcoGc_.js delete mode 100644 assets/locales/pl-PL-d0IcoGc_.js.map create mode 100644 assets/locales/pseudo-LOCALE-lLq1wKZc.js rename assets/locales/{pseudo-LOCALE-tOtHxWmm.js.map => pseudo-LOCALE-lLq1wKZc.js.map} (99%) delete mode 100644 assets/locales/pseudo-LOCALE-tOtHxWmm.js create mode 100644 assets/locales/pt-BR-5SDHrTgX.js create mode 100644 assets/locales/pt-BR-5SDHrTgX.js.map delete mode 100644 assets/locales/pt-BR-VPHddHuv.js delete mode 100644 assets/locales/pt-BR-VPHddHuv.js.map delete mode 100644 assets/locales/pt-PT-Shszru04.js delete mode 100644 assets/locales/pt-PT-Shszru04.js.map create mode 100644 assets/locales/pt-PT-Udm3ESZ-.js create mode 100644 assets/locales/pt-PT-Udm3ESZ-.js.map create mode 100644 assets/locales/ru-RU-E1hp90nG.js create mode 100644 assets/locales/ru-RU-E1hp90nG.js.map delete mode 100644 assets/locales/ru-RU-ffvGPZ2f.js delete mode 100644 assets/locales/ru-RU-ffvGPZ2f.js.map create mode 100644 assets/locales/th-TH-Uzlm3CnA.js create mode 100644 assets/locales/th-TH-Uzlm3CnA.js.map delete mode 100644 assets/locales/th-TH-d0IcoGc_.js delete mode 100644 assets/locales/th-TH-d0IcoGc_.js.map create mode 100644 assets/locales/uk-UA-Uzlm3CnA.js create mode 100644 assets/locales/uk-UA-Uzlm3CnA.js.map delete mode 100644 assets/locales/uk-UA-d0IcoGc_.js delete mode 100644 assets/locales/uk-UA-d0IcoGc_.js.map create mode 100644 assets/locales/zh-CN-k1HE4cP0.js create mode 100644 assets/locales/zh-CN-k1HE4cP0.js.map delete mode 100644 assets/locales/zh-CN-lSLSktKu.js delete mode 100644 assets/locales/zh-CN-lSLSktKu.js.map create mode 100644 assets/locales/zh-TW-Uzlm3CnA.js create mode 100644 assets/locales/zh-TW-Uzlm3CnA.js.map delete mode 100644 assets/locales/zh-TW-d0IcoGc_.js delete mode 100644 assets/locales/zh-TW-d0IcoGc_.js.map delete mode 100644 assets/main-DaGMLi0n.js delete mode 100644 assets/main-DaGMLi0n.js.map create mode 100644 assets/main-e75P80UH.js create mode 100644 assets/main-e75P80UH.js.map delete mode 100644 assets/polyfill-force-71Ewx0dk.js delete mode 100644 assets/polyfill-force-71Ewx0dk.js.map create mode 100644 assets/polyfill-force-BFlUYQp5.js create mode 100644 assets/polyfill-force-BFlUYQp5.js.map rename assets/{style-VzhezNpT.css => style-Wrm_LoQi.css} (57%) delete mode 100644 assets/useTitle-6AJYXxJy.js delete mode 100644 assets/useTitle-6AJYXxJy.js.map create mode 100644 assets/useTitle-B8ZF9tfB.js create mode 100644 assets/useTitle-B8ZF9tfB.js.map diff --git a/assets/compose-Gtwe4AUy.js b/assets/compose-cXFPaEYk.js similarity index 91% rename from assets/compose-Gtwe4AUy.js rename to assets/compose-cXFPaEYk.js index 60de394..d498ea4 100644 --- a/assets/compose-Gtwe4AUy.js +++ b/assets/compose-cXFPaEYk.js @@ -1,2 +1,2 @@ -import{a9 as _,h as l,i as o,U as g,M as v,a3 as T,y as u,T as t,c as e,I as m,w as y,aa as I,ac as C}from"./useTitle-6AJYXxJy.js";_();window.opener&&(console=window.opener.console);function x(){var d,r;const[s,p]=l("default"),[a,w]=l(null),{editStatus:c,replyToStatus:i,draftStatus:f}=window.__COMPOSE__||{};return g(c?o._({id:"Txus+H"}):i?o._({id:"03vjxE",values:{0:((d=i.account)==null?void 0:d.acct)||((r=i.account)==null?void 0:r.username)}}):o._({id:"QOhkyl"})),u(()=>{const n=v();w(!!n),n&&T()},[]),u(()=>{if(s==="closed"){try{window.opener.focus()}catch{}window.close()}},[s]),s==="closed"?e("div",{class:"box",children:[e("p",{children:e(t,{id:"mBdQnV"})}),e("p",{children:e("button",{onClick:()=>{window.close()},children:e(t,{id:"rf8fiC"})})})]}):a===!1?e("div",{class:"box",children:[e("h1",{children:e(t,{id:"SlfejT"})}),e("p",{children:e(t,{id:"D3vX+9"})}),e("p",{children:e("a",{href:"/",children:e(t,{id:"iWpEwy"})})})]}):a?e(m,{editStatus:c,replyToStatus:i,draftStatus:f,standalone:!0,hasOpener:window.opener,onClose:n=>{const{newStatus:h,fn:S=()=>{}}=n||{};try{h&&window.opener.__STATES__.reloadStatusPage++,S(),p("closed")}catch{}}}):e("div",{class:"box",children:e(y,{})})}C(e(I,{i18n:o,children:e(x,{})}),document.getElementById("app-standalone")); -//# sourceMappingURL=compose-Gtwe4AUy.js.map +import{a9 as _,h as l,i as o,U as g,M as v,a3 as T,y as u,T as t,c as e,I as m,w as y,aa as I,ac as C}from"./useTitle-B8ZF9tfB.js";_();window.opener&&(console=window.opener.console);function x(){var d,r;const[s,p]=l("default"),[a,w]=l(null),{editStatus:c,replyToStatus:i,draftStatus:f}=window.__COMPOSE__||{};return g(c?o._({id:"Txus+H"}):i?o._({id:"03vjxE",values:{0:((d=i.account)==null?void 0:d.acct)||((r=i.account)==null?void 0:r.username)}}):o._({id:"QOhkyl"})),u(()=>{const n=v();w(!!n),n&&T()},[]),u(()=>{if(s==="closed"){try{window.opener.focus()}catch{}window.close()}},[s]),s==="closed"?e("div",{class:"box",children:[e("p",{children:e(t,{id:"mBdQnV"})}),e("p",{children:e("button",{onClick:()=>{window.close()},children:e(t,{id:"rf8fiC"})})})]}):a===!1?e("div",{class:"box",children:[e("h1",{children:e(t,{id:"SlfejT"})}),e("p",{children:e(t,{id:"D3vX+9"})}),e("p",{children:e("a",{href:"/",children:e(t,{id:"iWpEwy"})})})]}):a?e(m,{editStatus:c,replyToStatus:i,draftStatus:f,standalone:!0,hasOpener:window.opener,onClose:n=>{const{newStatus:h,fn:S=()=>{}}=n||{};try{h&&window.opener.__STATES__.reloadStatusPage++,S(),p("closed")}catch{}}}):e("div",{class:"box",children:e(y,{})})}C(e(I,{i18n:o,children:e(x,{})}),document.getElementById("app-standalone")); +//# sourceMappingURL=compose-cXFPaEYk.js.map diff --git a/assets/compose-Gtwe4AUy.js.map b/assets/compose-cXFPaEYk.js.map similarity index 98% rename from assets/compose-Gtwe4AUy.js.map rename to assets/compose-cXFPaEYk.js.map index e38c8f8..39ab05c 100644 --- a/assets/compose-Gtwe4AUy.js.map +++ b/assets/compose-cXFPaEYk.js.map @@ -1 +1 @@ -{"version":3,"file":"compose-Gtwe4AUy.js","sources":["../../src/compose.jsx"],"sourcesContent":["import './index.css';\nimport './app.css';\nimport './polyfills';\n\nimport { i18n } from '@lingui/core';\nimport { t, Trans } from '@lingui/macro';\nimport { I18nProvider } from '@lingui/react';\nimport { render } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport ComposeSuspense from './components/compose-suspense';\nimport Loader from './components/loader';\nimport { initActivateLang } from './utils/lang';\nimport { initStates } from './utils/states';\nimport { getCurrentAccount, setCurrentAccountID } from './utils/store-utils';\nimport useTitle from './utils/useTitle';\n\ninitActivateLang();\n\nif (window.opener) {\n console = window.opener.console;\n}\n\nfunction App() {\n const [uiState, setUIState] = useState('default');\n const [isLoggedIn, setIsLoggedIn] = useState(null);\n\n const { editStatus, replyToStatus, draftStatus } = window.__COMPOSE__ || {};\n\n useTitle(\n editStatus\n ? t`Editing source status`\n : replyToStatus\n ? t`Replying to @${\n replyToStatus.account?.acct || replyToStatus.account?.username\n }`\n : t`Compose`,\n );\n\n useEffect(() => {\n const account = getCurrentAccount();\n setIsLoggedIn(!!account);\n if (account) {\n initStates();\n }\n }, []);\n\n useEffect(() => {\n if (uiState === 'closed') {\n try {\n // Focus parent window\n window.opener.focus();\n } catch (e) {}\n window.close();\n }\n }, [uiState]);\n\n if (uiState === 'closed') {\n return (\n
\n

\n You may close this page now.\n

\n

\n {\n window.close();\n }}\n >\n Close window\n \n

\n
\n );\n }\n\n console.debug('OPEN COMPOSE');\n\n if (isLoggedIn === false) {\n return (\n
\n

\n Error\n

\n

\n Login required.\n

\n

\n \n Go home\n \n

\n
\n );\n }\n\n if (isLoggedIn) {\n return (\n {\n const { newStatus, fn = () => {} } = results || {};\n try {\n if (newStatus) {\n window.opener.__STATES__.reloadStatusPage++;\n }\n fn();\n setUIState('closed');\n } catch (e) {}\n }}\n />\n );\n }\n\n return (\n
\n \n
\n );\n}\n\nrender(\n \n \n ,\n document.getElementById('app-standalone'),\n);\n"],"names":["initActivateLang","window","opener","console","App","uiState","setUIState","useState","isLoggedIn","setIsLoggedIn","editStatus","replyToStatus","draftStatus","__COMPOSE__","useTitle","i18n","_","id","values","0","account","acct","username","useEffect","getCurrentAccount","initStates","focus","close","_jsxs","class","children","_jsx","Trans","onClick","href","ComposeSuspense","standalone","hasOpener","newStatus","results","fn","Loader","render","I18nProvider"],"mappings":"mIAiBAA,IAEIC,OAAOC,SACTC,QAAUF,OAAOC,OAAOC,SAG1B,SAASC,GAAM,SACb,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAS,SAAS,EAC1C,CAACC,EAAYC,CAAa,EAAIF,EAAS,IAAI,EAE3C,CAAEG,WAAAA,EAAYC,cAAAA,EAAeC,YAAAA,CAAAA,EAAgBX,OAAOY,aAAe,GA8BzE,OA5BAC,EACEJ,EAAUK,EAAAC,EACN,CAAAC,GAAA,QAAuB,CAAA,EACvBN,EAAaI,EAAAC,EACb,CAAAC,GAAA,SAAAC,OAAA,CAAAC,IACER,EAAAA,EAAcS,UAAdT,YAAAA,EAAuBU,SAAQV,EAAAA,EAAcS,UAAdT,YAAAA,EAAuBW,SAAQ,CAC/D,GAACP,EAAAC,EACF,CAAAC,GAAA,QAAS,CAAA,CACf,EAEAM,EAAU,IAAM,CACd,MAAMH,EAAUI,IACFf,EAAA,CAAC,CAACW,CAAO,EACnBA,GACSK,GAEf,EAAG,CAAE,CAAA,EAELF,EAAU,IAAM,CACd,GAAIlB,IAAY,SAAU,CACpB,GAAA,CAEFJ,OAAOC,OAAOwB,aACJ,CAAC,CACbzB,OAAO0B,MAAM,CACf,CAAA,EACC,CAACtB,CAAO,CAAC,EAERA,IAAY,SAEZuB,EAAA,MAAA,CAAKC,MAAM,MAAKC,UACdC,EAAA,IAAA,CAAAD,SACEC,EAAAC,EAAA,CAAAf,GAAA,QAAA,CAA0C,CAAA,CACzC,EACHc,EAAA,IAAA,CAAAD,SACEC,EAAA,SAAA,CACEE,QAASA,IAAM,CACbhC,OAAO0B,MAAM,CACf,EAAEG,SAEFC,EAAAC,EAAA,CAAAf,GAAA,QAAA,CAA0B,CAAA,CACpB,CAAA,CACP,CAAC,CAAA,CACD,EAITd,IAA4B,WAEF,CACxB,YACO0B,SAAM,CAAAE,EAAA,KAAA,CAAKD,SACdC,EAAAC,EAAA,CAAAF,GAAAA,QACE,CAAA,CAAA,CAAA,EAAmBC,EAAA,IAAA,CAErBA,SAAAA,EAAAC,EAAA,CAAAF,GAAAA,QACE,CAAA,CAAA,CAAA,EAA6BC,EAAA,IAAA,CAE/BA,SAAAA,EAAA,IAAA,CAAAD,KAAAA,IACKI,SAAKH,EAAAC,EAAA,CAAGF,GAAAA,QACT,CAAA,CAAA,CAAA,CAAqB,CAAA,CAAC,CACrB,CAAA,EAIXtB,EAEgBuB,EAAAI,EAAA,CACd,WAAAzB,EAEIA,cAAAA,EACAC,YAAAA,EACAC,WAAAA,GACAwB,UAAU,OAAA,OACVC,WAAkBnC,OAEV,UAAAoC,EAAEA,GAAAA,EAAAA,IAAAA,EAAsB,EAACC,GAAA,CAAA,EAAE,GAAIA,CACjCD,GACF,OAAe,OAAA,WAAA,mBAEfE,IACGlC,EAAA,QAAA,CACHA,MAAAA,EACW,CAAA,CACf,EAGNyB,EAAA,MAAA,CAEA,YACOF,SAAME,EAAAU,EAAA,EAAA,CAAA,CAAA,CACA,CAGfC,EAAAX,EAAAY,EAAA,CAEAD,KAAAA,EACgB3B,SAAAA,EAAAA,EAAAA,EAAAA,CAAAA,CAAAA,EACZgB,SAAAA,eAAM,gBAAA,CAAA"} \ No newline at end of file +{"version":3,"file":"compose-cXFPaEYk.js","sources":["../../src/compose.jsx"],"sourcesContent":["import './index.css';\nimport './app.css';\nimport './polyfills';\n\nimport { i18n } from '@lingui/core';\nimport { t, Trans } from '@lingui/macro';\nimport { I18nProvider } from '@lingui/react';\nimport { render } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport ComposeSuspense from './components/compose-suspense';\nimport Loader from './components/loader';\nimport { initActivateLang } from './utils/lang';\nimport { initStates } from './utils/states';\nimport { getCurrentAccount, setCurrentAccountID } from './utils/store-utils';\nimport useTitle from './utils/useTitle';\n\ninitActivateLang();\n\nif (window.opener) {\n console = window.opener.console;\n}\n\nfunction App() {\n const [uiState, setUIState] = useState('default');\n const [isLoggedIn, setIsLoggedIn] = useState(null);\n\n const { editStatus, replyToStatus, draftStatus } = window.__COMPOSE__ || {};\n\n useTitle(\n editStatus\n ? t`Editing source status`\n : replyToStatus\n ? t`Replying to @${\n replyToStatus.account?.acct || replyToStatus.account?.username\n }`\n : t`Compose`,\n );\n\n useEffect(() => {\n const account = getCurrentAccount();\n setIsLoggedIn(!!account);\n if (account) {\n initStates();\n }\n }, []);\n\n useEffect(() => {\n if (uiState === 'closed') {\n try {\n // Focus parent window\n window.opener.focus();\n } catch (e) {}\n window.close();\n }\n }, [uiState]);\n\n if (uiState === 'closed') {\n return (\n
\n

\n You may close this page now.\n

\n

\n {\n window.close();\n }}\n >\n Close window\n \n

\n
\n );\n }\n\n console.debug('OPEN COMPOSE');\n\n if (isLoggedIn === false) {\n return (\n
\n

\n Error\n

\n

\n Login required.\n

\n

\n \n Go home\n \n

\n
\n );\n }\n\n if (isLoggedIn) {\n return (\n {\n const { newStatus, fn = () => {} } = results || {};\n try {\n if (newStatus) {\n window.opener.__STATES__.reloadStatusPage++;\n }\n fn();\n setUIState('closed');\n } catch (e) {}\n }}\n />\n );\n }\n\n return (\n
\n \n
\n );\n}\n\nrender(\n \n \n ,\n document.getElementById('app-standalone'),\n);\n"],"names":["initActivateLang","window","opener","console","App","uiState","setUIState","useState","isLoggedIn","setIsLoggedIn","editStatus","replyToStatus","draftStatus","__COMPOSE__","useTitle","i18n","_","id","values","0","account","acct","username","useEffect","getCurrentAccount","initStates","focus","close","_jsxs","class","children","_jsx","Trans","onClick","href","ComposeSuspense","standalone","hasOpener","newStatus","results","fn","Loader","render","I18nProvider"],"mappings":"mIAiBAA,IAEIC,OAAOC,SACTC,QAAUF,OAAOC,OAAOC,SAG1B,SAASC,GAAM,SACb,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAS,SAAS,EAC1C,CAACC,EAAYC,CAAa,EAAIF,EAAS,IAAI,EAE3C,CAAEG,WAAAA,EAAYC,cAAAA,EAAeC,YAAAA,CAAAA,EAAgBX,OAAOY,aAAe,GA8BzE,OA5BAC,EACEJ,EAAUK,EAAAC,EACN,CAAAC,GAAA,QAAuB,CAAA,EACvBN,EAAaI,EAAAC,EACb,CAAAC,GAAA,SAAAC,OAAA,CAAAC,IACER,EAAAA,EAAcS,UAAdT,YAAAA,EAAuBU,SAAQV,EAAAA,EAAcS,UAAdT,YAAAA,EAAuBW,SAAQ,CAC/D,GAACP,EAAAC,EACF,CAAAC,GAAA,QAAS,CAAA,CACf,EAEAM,EAAU,IAAM,CACd,MAAMH,EAAUI,IACFf,EAAA,CAAC,CAACW,CAAO,EACnBA,GACSK,GAEf,EAAG,CAAE,CAAA,EAELF,EAAU,IAAM,CACd,GAAIlB,IAAY,SAAU,CACpB,GAAA,CAEFJ,OAAOC,OAAOwB,aACJ,CAAC,CACbzB,OAAO0B,MAAM,CACf,CAAA,EACC,CAACtB,CAAO,CAAC,EAERA,IAAY,SAEZuB,EAAA,MAAA,CAAKC,MAAM,MAAKC,UACdC,EAAA,IAAA,CAAAD,SACEC,EAAAC,EAAA,CAAAf,GAAA,QAAA,CAA0C,CAAA,CACzC,EACHc,EAAA,IAAA,CAAAD,SACEC,EAAA,SAAA,CACEE,QAASA,IAAM,CACbhC,OAAO0B,MAAM,CACf,EAAEG,SAEFC,EAAAC,EAAA,CAAAf,GAAA,QAAA,CAA0B,CAAA,CACpB,CAAA,CACP,CAAC,CAAA,CACD,EAITd,IAA4B,WAEF,CACxB,YACO0B,SAAM,CAAAE,EAAA,KAAA,CAAKD,SACdC,EAAAC,EAAA,CAAAF,GAAAA,QACE,CAAA,CAAA,CAAA,EAAmBC,EAAA,IAAA,CAErBA,SAAAA,EAAAC,EAAA,CAAAF,GAAAA,QACE,CAAA,CAAA,CAAA,EAA6BC,EAAA,IAAA,CAE/BA,SAAAA,EAAA,IAAA,CAAAD,KAAAA,IACKI,SAAKH,EAAAC,EAAA,CAAGF,GAAAA,QACT,CAAA,CAAA,CAAA,CAAqB,CAAA,CAAC,CACrB,CAAA,EAIXtB,EAEgBuB,EAAAI,EAAA,CACd,WAAAzB,EAEIA,cAAAA,EACAC,YAAAA,EACAC,WAAAA,GACAwB,UAAU,OAAA,OACVC,WAAkBnC,OAEV,UAAAoC,EAAEA,GAAAA,EAAAA,IAAAA,EAAsB,EAACC,GAAA,CAAA,EAAE,GAAIA,CACjCD,GACF,OAAe,OAAA,WAAA,mBAEfE,IACGlC,EAAA,QAAA,CACHA,MAAAA,EACW,CAAA,CACf,EAGNyB,EAAA,MAAA,CAEA,YACOF,SAAME,EAAAU,EAAA,EAAA,CAAA,CAAA,CACA,CAGfC,EAAAX,EAAAY,EAAA,CAEAD,KAAAA,EACgB3B,SAAAA,EAAAA,EAAAA,EAAAA,CAAAA,CAAAA,EACZgB,SAAAA,eAAM,gBAAA,CAAA"} \ No newline at end of file diff --git a/assets/compose-hDlR2o-x.js b/assets/compose-hDlR2o-x.js deleted file mode 100644 index 36f4ea5..0000000 --- a/assets/compose-hDlR2o-x.js +++ /dev/null @@ -1,26 +0,0 @@ -var Rt=s=>{throw TypeError(s)};var mt=(s,t,n)=>t.has(s)||Rt("Cannot "+n);var I=(s,t,n)=>(mt(s,t,"read from private field"),n?n.call(s):t.get(s)),re=(s,t,n)=>t.has(s)?Rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(s):t.set(s,n),me=(s,t,n,a)=>(mt(s,t,"write to private field"),a?a.call(s,n):t.set(s,n),n),X=(s,t,n)=>(mt(s,t,"access private method"),n);import{i as ge,z as gn,s as oe,V as fn,j as Ke,a as _t,h as U,A as Y,M as vn,aC as Xt,d as Se,y as ne,x as bn,aD as yn,l as je,c as e,T as V,b as xn,f as Oe,w as at,r as wn,af as kn,P as En,u as Fn,t as Dt,C as Jt}from"./useTitle-6AJYXxJy.js";import{j as Ee,F as Cn,_ as zn,a as $e,a8 as _n,x as $t,u as Ln,k as Qt,b as An,I as J,z as jt,i as Je,a9 as Sn,l as xt,M as Qe,s as Ce,a4 as In,a0 as Mn,q as Tn,O as Bn,X as rt,c as Rn,d as Ot,y as Dn}from"./fuse-uYeGZ3ik.js";class $n{constructor(t,n,{tabInsertsSuggestions:a,defaultFirstOption:c}={}){this.input=t,this.list=n,this.tabInsertsSuggestions=a??!0,this.defaultFirstOption=c??!1,this.isComposing=!1,n.id||(n.id=`combobox-${Math.random().toString().slice(2,6)}`),this.ctrlBindings=!!navigator.userAgent.match(/Macintosh/),this.keyboardEventHandler=o=>jn(o,this),this.compositionEventHandler=o=>Pn(o,this),this.inputHandler=this.clearSelection.bind(this),t.setAttribute("role","combobox"),t.setAttribute("aria-controls",n.id),t.setAttribute("aria-expanded","false"),t.setAttribute("aria-autocomplete","list"),t.setAttribute("aria-haspopup","listbox")}destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute("role"),this.input.removeAttribute("aria-controls"),this.input.removeAttribute("aria-expanded"),this.input.removeAttribute("aria-autocomplete"),this.input.removeAttribute("aria-haspopup")}start(){this.input.setAttribute("aria-expanded","true"),this.input.addEventListener("compositionstart",this.compositionEventHandler),this.input.addEventListener("compositionend",this.compositionEventHandler),this.input.addEventListener("input",this.inputHandler),this.input.addEventListener("keydown",this.keyboardEventHandler),this.list.addEventListener("click",Pt),this.indicateDefaultOption()}stop(){this.clearSelection(),this.input.setAttribute("aria-expanded","false"),this.input.removeEventListener("compositionstart",this.compositionEventHandler),this.input.removeEventListener("compositionend",this.compositionEventHandler),this.input.removeEventListener("input",this.inputHandler),this.input.removeEventListener("keydown",this.keyboardEventHandler),this.list.removeEventListener("click",Pt)}indicateDefaultOption(){var t;this.defaultFirstOption&&((t=Array.from(this.list.querySelectorAll('[role="option"]:not([aria-disabled="true"])')).filter(gt)[0])===null||t===void 0||t.setAttribute("data-combobox-option-default","true"))}navigate(t=1){const n=Array.from(this.list.querySelectorAll('[aria-selected="true"]')).filter(gt)[0],a=Array.from(this.list.querySelectorAll('[role="option"]')).filter(gt),c=a.indexOf(n);if(c===a.length-1&&t===1||c===0&&t===-1){this.clearSelection(),this.input.focus();return}let o=t===1?0:a.length-1;if(n&&c>=0){const x=c+t;x>=0&&x0||s.offsetHeight>0)}function Pn(s,t){t.isComposing=s.type==="compositionstart",document.getElementById(t.input.getAttribute("aria-controls")||"")&&t.clearSelection()}function Hn(s,t){Nn(s,t)||(s.scrollTop=t.offsetTop)}function Nn(s,t){const n=s.scrollTop,a=n+s.clientHeight,c=t.offsetTop,o=c+t.clientHeight;return c>=n&&o<=a}const qn=/\s|\(|\[/;function Kn(s,t,n,{multiWord:a,lookBackIndex:c,lastMatchPosition:o}={multiWord:!1,lookBackIndex:0,lastMatchPosition:null}){let l=s.lastIndexOf(t,n-1);if(l===-1||l=l+t.length+1||s.lastIndexOf(` -`,n-1)>l||s.lastIndexOf(".",n-1)>l)return}else if(s.lastIndexOf(" ",n-1)>l)return;const x=s[l-1];return x&&!qn.test(x)?void 0:{text:s.substring(l+t.length,n),position:l+t.length}}class Wn extends HTMLElement{}class Un extends Event{constructor(){super("update")}}const ft=new WeakMap;var Pe,He,Ne,xe,G,wt,Ae,Ie,Me,kt,Te,et,tt,nt,qe,ze;const At=class At extends Wn{constructor(){super(...arguments);re(this,G);re(this,Pe,new MutationObserver(()=>X(this,G,tt).call(this)));re(this,He,new ResizeObserver(()=>X(this,G,et).call(this)));re(this,Ne);re(this,xe);re(this,Ie,0);re(this,Me,0);re(this,Te,!1);re(this,qe,()=>X(this,G,nt).call(this));re(this,ze,n=>{X(this,G,Ae).call(this,a=>{(n.target===document||n.target===window||n.target instanceof Node&&n.target.contains(a))&&X(this,G,et).call(this)})})}static for(n){let a=ft.get(n);return a||(a=new At,a.connect(n),ft.set(n,a)),a}connect(n){me(this,Ne,new WeakRef(n)),me(this,xe,document.createElement("div")),I(this,xe).style.position="absolute",I(this,xe).style.pointerEvents="none",n.after(I(this,xe)),I(this,xe).appendChild(this)}forceUpdate(){X(this,G,tt).call(this),X(this,G,nt).call(this)}connectedCallback(){X(this,G,Ae).call(this,n=>{this.style.pointerEvents="none",this.style.userSelect="none",this.style.overflow="hidden",this.style.display="block",this.style.visibility="hidden",n instanceof HTMLTextAreaElement?(this.style.whiteSpace="pre-wrap",this.style.wordWrap="break-word"):(this.style.whiteSpace="nowrap",this.style.display="table-cell",this.style.verticalAlign="middle"),this.setAttribute("aria-hidden","true"),X(this,G,tt).call(this),X(this,G,nt).call(this),I(this,Pe).observe(n,{attributeFilter:["style","dir"]}),I(this,He).observe(n),document.addEventListener("scroll",I(this,ze),{capture:!0}),window.addEventListener("resize",I(this,ze),{capture:!0}),n.addEventListener("input",I(this,qe),{capture:!0})})}disconnectedCallback(){var a;(a=I(this,xe))==null||a.remove(),I(this,Pe).disconnect(),I(this,He).disconnect(),document.removeEventListener("scroll",I(this,ze),{capture:!0}),window.removeEventListener("resize",I(this,ze),{capture:!0});const n=I(this,G,wt);n&&(n.removeEventListener("input",I(this,qe),{capture:!0}),ft.delete(n))}};Pe=new WeakMap,He=new WeakMap,Ne=new WeakMap,xe=new WeakMap,G=new WeakSet,wt=function(){var n;return(n=I(this,Ne))==null?void 0:n.deref()},Ae=function(n){const a=I(this,G,wt);return a?n(a):this.remove()},Ie=new WeakMap,Me=new WeakMap,kt=function(){X(this,G,Ae).call(this,n=>{const a=window.getComputedStyle(n);this.style.height=a.height,this.style.width=a.width,n.clientHeight!==this.clientHeight&&(this.style.height=`calc(${a.height} + ${n.clientHeight-this.clientHeight}px)`),n.clientWidth!==this.clientWidth&&(this.style.width=`calc(${a.width} + ${n.clientWidth-this.clientWidth}px)`);const c=n.getBoundingClientRect(),o=this.getBoundingClientRect();me(this,Ie,I(this,Ie)+c.left-o.left),me(this,Me,I(this,Me)+c.top-o.top),this.style.transform=`translate(${I(this,Ie)}px, ${I(this,Me)}px)`,this.scrollTop=n.scrollTop,this.scrollLeft=n.scrollLeft,this.dispatchEvent(new Un)})},Te=new WeakMap,et=function(){I(this,Te)||(me(this,Te,!0),requestAnimationFrame(()=>{X(this,G,kt).call(this),me(this,Te,!1)}))},tt=function(){X(this,G,Ae).call(this,n=>{const a=window.getComputedStyle(n);for(const c of Vn)this.style[c]=a[c];X(this,G,et).call(this)})},nt=function(){X(this,G,Ae).call(this,n=>{this.textContent=n.value,X(this,G,kt).call(this)})},qe=new WeakMap,ze=new WeakMap;let it=At;const Vn=["direction","writingMode","unicodeBidi","textOrientation","boxSizing","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"];try{customElements.define("input-style-clone",it)}catch(s){if(!(s instanceof DOMException&&s.name==="NotSupportedError"))throw s}var be,Be,Re,le,Ft,en,Ct,De;const st=class st{constructor(t,n=0,a=n){re(this,le);re(this,be);re(this,Be);re(this,Re);me(this,be,t),me(this,Be,n),me(this,Re,a)}static fromSelection(t){const{selectionStart:n,selectionEnd:a}=t;return new st(t,n??void 0,a??void 0)}get collapsed(){return this.startOffset===this.endOffset}get commonAncestorContainer(){return I(this,be)}get endContainer(){return I(this,be)}get startContainer(){return I(this,be)}get startOffset(){return I(this,Be)}get endOffset(){return I(this,Re)}setStartOffset(t){me(this,Be,X(this,le,Ct).call(this,t))}setEndOffset(t){me(this,Re,X(this,le,Ct).call(this,t))}collapse(t=!1){t?this.setEndOffset(this.startOffset):this.setStartOffset(this.endOffset)}cloneContents(){return X(this,le,De).call(this).cloneContents()}cloneRange(){return new st(I(this,be),this.startOffset,this.endOffset)}getBoundingClientRect(){return X(this,le,De).call(this).getBoundingClientRect()}getClientRects(){return X(this,le,De).call(this).getClientRects()}toString(){return X(this,le,De).call(this).toString()}getStyleClone(){return I(this,le,Ft)}};be=new WeakMap,Be=new WeakMap,Re=new WeakMap,le=new WeakSet,Ft=function(){return it.for(I(this,be))},en=function(){return I(this,le,Ft)},Ct=function(t){return Math.max(0,Math.min(t,I(this,be).value.length))},De=function(){const t=document.createRange(),n=I(this,le,en).childNodes[0];return n&&(t.setStart(n,this.startOffset),t.setEnd(n,this.endOffset)),t};let Et=st;const Ze=new WeakMap;class Gn{constructor(t,n){this.expander=t,this.input=n,this.combobox=null,this.menu=null,this.match=null,this.justPasted=!1,this.lookBackIndex=0,this.oninput=this.onInput.bind(this),this.onpaste=this.onPaste.bind(this),this.onkeydown=this.onKeydown.bind(this),this.oncommit=this.onCommit.bind(this),this.onmousedown=this.onMousedown.bind(this),this.onblur=this.onBlur.bind(this),this.interactingWithList=!1,n.addEventListener("paste",this.onpaste),n.addEventListener("input",this.oninput),n.addEventListener("keydown",this.onkeydown),n.addEventListener("blur",this.onblur)}destroy(){this.input.removeEventListener("paste",this.onpaste),this.input.removeEventListener("input",this.oninput),this.input.removeEventListener("keydown",this.onkeydown),this.input.removeEventListener("blur",this.onblur)}dismissMenu(){this.deactivate()&&(this.lookBackIndex=this.input.selectionEnd||this.lookBackIndex)}activate(t,n){var a,c;this.input!==document.activeElement&&this.input!==((c=(a=document.activeElement)===null||a===void 0?void 0:a.shadowRoot)===null||c===void 0?void 0:c.activeElement)||(this.deactivate(),this.menu=n,n.id||(n.id=`text-expander-${Math.floor(Math.random()*1e5).toString()}`),this.expander.append(n),this.combobox=new $n(this.input,n),this.expander.dispatchEvent(new Event("text-expander-activate")),this.positionMenu(n,t.position),this.combobox.start(),n.addEventListener("combobox-commit",this.oncommit),n.addEventListener("mousedown",this.onmousedown),this.combobox.navigate(1))}positionMenu(t,n){const a=new Et(this.input,n).getBoundingClientRect(),c={left:a.left,top:a.top+a.height},o=t.getBoundingClientRect(),l={left:c.left-o.left,top:c.top-o.top};if(l.left!==0||l.top!==0){const x=getComputedStyle(t);t.style.left=x.left?`calc(${x.left} + ${l.left}px)`:`${l.left}px`,t.style.top=x.top?`calc(${x.top} + ${l.top}px)`:`${l.top}px`}}deactivate(){const t=this.menu;return!t||!this.combobox?!1:(this.expander.dispatchEvent(new Event("text-expander-deactivate")),this.menu=null,t.removeEventListener("combobox-commit",this.oncommit),t.removeEventListener("mousedown",this.onmousedown),this.combobox.destroy(),this.combobox=null,t.remove(),!0)}onCommit({target:t}){var n;const a=t;if(!(a instanceof HTMLElement)||!this.combobox)return;const c=this.match;if(!c)return;const o=this.input.value.substring(0,c.position-c.key.length),l=this.input.value.substring(c.position+c.text.length),x={item:a,key:c.key,value:null,continue:!1};if(!this.expander.dispatchEvent(new CustomEvent("text-expander-value",{cancelable:!0,detail:x}))||!x.value)return;let M=(n=this.expander.getAttribute("suffix"))!==null&&n!==void 0?n:" ";x.continue&&(M="");const F=`${x.value}${M}`;this.input.value=o+F+l;const b=o.length+F.length;this.deactivate(),this.input.focus({preventScroll:!0}),this.input.selectionStart=b,this.input.selectionEnd=b,x.continue||(this.lookBackIndex=b,this.match=null),this.expander.dispatchEvent(new CustomEvent("text-expander-committed",{cancelable:!1,detail:{input:this.input}}))}onBlur(){if(this.interactingWithList){this.interactingWithList=!1;return}this.deactivate()}onPaste(){this.justPasted=!0}async onInput(){if(this.justPasted){this.justPasted=!1;return}const t=this.findMatch();if(t){this.match=t;const n=await this.notifyProviders(t);if(!this.match)return;n?this.activate(t,n):this.deactivate()}else this.match=null,this.deactivate()}findMatch(){const t=this.input.selectionEnd||0,n=this.input.value;t<=this.lookBackIndex&&(this.lookBackIndex=t-1);for(const{key:a,multiWord:c}of this.expander.keys){const o=Kn(n,a,t,{multiWord:c,lookBackIndex:this.lookBackIndex,lastMatchPosition:this.match?this.match.position:null});if(o)return{text:o.text,key:a,position:o.position}}}async notifyProviders(t){const n=[],a=x=>n.push(x);return this.expander.dispatchEvent(new CustomEvent("text-expander-change",{cancelable:!0,detail:{provide:a,text:t.text,key:t.key}}))?(await Promise.all(n)).filter(x=>x.matched).map(x=>x.fragment)[0]:void 0}onMousedown(){this.interactingWithList=!0}onKeydown(t){t.key==="Escape"&&(this.match=null,this.deactivate()&&(this.lookBackIndex=this.input.selectionEnd||this.lookBackIndex,t.stopImmediatePropagation(),t.preventDefault()))}}class Nt extends HTMLElement{get keys(){const t=this.getAttribute("keys"),n=t?t.split(" "):[],a=this.getAttribute("multiword"),c=a?a.split(" "):[],o=c.length===0&&this.hasAttribute("multiword");return n.map(l=>({key:l,multiWord:o||c.includes(l)}))}connectedCallback(){const t=this.querySelector('input[type="text"], textarea');if(!(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement))return;const n=new Gn(this,t);Ze.set(this,n)}disconnectedCallback(){const t=Ze.get(this);t&&(t.destroy(),Ze.delete(this))}dismiss(){const t=Ze.get(this);t&&t.dismissMenu()}}window.customElements.get("text-expander")||(window.TextExpanderElement=Nt,window.customElements.define("text-expander",Nt));function Yn({onlyFirst:s=!1}={}){const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,s?void 0:"g")}const Zn=Yn();function Xn(s){if(typeof s!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof s}\``);return s.replace(Zn,"")}const Jn=new Intl.Segmenter;function qt(s,{countAnsiEscapeCodes:t=!1}={}){if(s===""||(t||(s=Xn(s)),s===""))return 0;let n=0;for(const a of Jn.segment(s))n++;return n}const Qn="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20version='1.0'%20viewBox='0%200%20641%20223'%3e%3cpath%20fill='%23aaa'%20d='M86%20214c-9-1-17-4-24-8l-6-3-5-5-5-4-4-6-4-6-3-8-2-8v-27l2-9%203-9%204-6%204-6%205-5%205-5%207-3%206-4%207-2%207-2%2012-1h12l7%201%208%202%207%204%207%203%205%205%205%204-10%2010-10%209-4-3-10-5-5-1H88l-5%202-6%203-3%204-4%204-2%205-2%206v6l-1%207%201%207%202%207%203%205%202%204%204%203%204%203%205%202%206%202h9l10-1%205-2%206-3v-16H91v-27h59v54l-1%203-2%203-5%204-4%204-5%203-5%202-8%202-8%202-10%201H92l-6-1zm266-62V91h34v46h44V91h34v121h-34v-46h-44v46h-34v-61zm-182-1V90h34v121h-34v-60zm59-1V90h35l36%201%205%202c3%200%208%202%2010%204l5%202%204%205%205%204%203%207%203%207%201%2013v13l-4%206-3%207-4%204-5%205-5%202-5%203-6%202-5%201-18%201h-18v32h-34v-61zm67-2%203-2%202-4%202-5v-5l-2-4-2-4-3-2-3-3h-30v31h30l3-2zm226%2039v-24l-8-12-18-28a1751%201751%200%200%200-20-31v-2h39l7%2012%2012%2021%206%209%2013-21%2013-21h38v2l-41%2061-7%2010v48h-34v-24zM109%2066l-4-1-5-5-5-4-1-5-3-9v-5l1-5c2-7%203-10%208-15l4-4%207-2%207-2h7l6%201%205%202%205%202%203%204%204%203%202%206%202%205v13l-2%205-2%206-4%204-3%203-5%202-4%202-9%201h-9l-5-2zm22-11%204-2%203-4%202-5V34l-2-4-2-4-3-2-4-3-5-1h-6l-4%202-5%202-2%204-3%205-1%203v4l1%205%202%205%202%202%205%203%204%202h10l4-2zM37%2039V11h33l3%201%203%202%204%203%203%203%201%205%201%204v5l-1%204-3%204-3%205-4%201-3%202-11%201H49v16H37V39zm31%200%203-2%201-2%201-2v-4l-1-3-3-2-2-2H49v18h15l4-1zm107%2025a512%20512%200%200%200-19-53h14l4%2014%206%2019%201%204%201-1%207-19%205-17h9l6%2019%207%2018v-1l2-6%205-17%204-13h14v1l-4%2012-16%2041v2h-5l-5-1-6-15-6-15-1%201-3%207-6%2015-2%208h-11l-1-3zm74-25V11h42v11h-29v2l-1%205v4h29v11h-28v11h2l15%201h13v11h-43V39zm55%200V11h33l5%203%205%202%202%204%202%205v10l-2%203-1%204-5%203-5%203%205%205%208%2010%203%204h-14l-7-9-8-10h-9v19h-12V39zm33-3%202-3v-6l-3-3-2-3h-18v16h1v1h17l2-2zm26%203V11h42v11h-29l-1%206v5h29v11h-28v5l-1%205%201%201v1h30v11h-43V39zm54%200V11h17l18%201%204%202%205%203%202%204%203%204%202%206%201%206v5c-1%206-3%2012-6%2015l-3%204-5%203-5%202-17%201h-16V39zm33%2014%205-5%202-3v-6l-1-6-1-3-1-3-4-3-3-2h-5l-6-1-3%201h-3v34h9l8-1%203-2zm50-14V11h34l5%202%204%202%202%203%202%203v9l-2%202-3%204-1%201%203%203%203%204%201%203%201%204-1%204-1%204-3%203-3%203-5%201-5%201h-31V39zm34%2015%202-1v-6l-2-2-2-2h-20v13h20l2-2zm-3-22%204-2v-6l-2-1-2-2h-19v12h16l4-1zm42%2024V45l-6-9-11-17-5-8h15l4%208%207%2011%202%203%207-11%207-11h14l-11%2016-11%2017v23h-12V56z'/%3e%3c/svg%3e",Lt=[["aa","Afar","Afaraf"],["ab","Abkhaz","аҧсуа бызшәа"],["ae","Avestan","avesta"],["af","Afrikaans","Afrikaans"],["ak","Akan","Akan"],["am","Amharic","አማርኛ"],["an","Aragonese","aragonés"],["ar","Arabic","اللغة العربية"],["as","Assamese","অসমীয়া"],["av","Avaric","авар мацӀ"],["ay","Aymara","aymar aru"],["az","Azerbaijani","azərbaycan dili"],["ba","Bashkir","башҡорт теле"],["be","Belarusian","беларуская мова"],["bg","Bulgarian","български език"],["bh","Bihari","भोजपुरी"],["bi","Bislama","Bislama"],["bm","Bambara","bamanankan"],["bn","Bengali","বাংলা"],["bo","Tibetan","བོད་ཡིག"],["br","Breton","brezhoneg"],["bs","Bosnian","bosanski jezik"],["ca","Catalan","Català"],["ce","Chechen","нохчийн мотт"],["ch","Chamorro","Chamoru"],["co","Corsican","corsu"],["cr","Cree","ᓀᐦᐃᔭᐍᐏᐣ"],["cs","Czech","čeština"],["cu","Old Church Slavonic","ѩзыкъ словѣньскъ"],["cv","Chuvash","чӑваш чӗлхи"],["cy","Welsh","Cymraeg"],["da","Danish","dansk"],["de","German","Deutsch"],["dv","Divehi","Dhivehi"],["dz","Dzongkha","རྫོང་ཁ"],["ee","Ewe","Eʋegbe"],["el","Greek","Ελληνικά"],["en","English","English"],["eo","Esperanto","Esperanto"],["es","Spanish","Español"],["et","Estonian","eesti"],["eu","Basque","euskara"],["fa","Persian","فارسی"],["ff","Fula","Fulfulde"],["fi","Finnish","suomi"],["fj","Fijian","Vakaviti"],["fo","Faroese","føroyskt"],["fr","French","Français"],["fy","Western Frisian","Frysk"],["ga","Irish","Gaeilge"],["gd","Scottish Gaelic","Gàidhlig"],["gl","Galician","galego"],["gu","Gujarati","ગુજરાતી"],["gv","Manx","Gaelg"],["ha","Hausa","هَوُسَ"],["he","Hebrew","עברית"],["hi","Hindi","हिन्दी"],["ho","Hiri Motu","Hiri Motu"],["hr","Croatian","Hrvatski"],["ht","Haitian","Kreyòl ayisyen"],["hu","Hungarian","magyar"],["hy","Armenian","Հայերեն"],["hz","Herero","Otjiherero"],["ia","Interlingua","Interlingua"],["id","Indonesian","Bahasa Indonesia"],["ie","Interlingue","Interlingue"],["ig","Igbo","Asụsụ Igbo"],["ii","Nuosu","ꆈꌠ꒿ Nuosuhxop"],["ik","Inupiaq","Iñupiaq"],["io","Ido","Ido"],["is","Icelandic","Íslenska"],["it","Italian","Italiano"],["iu","Inuktitut","ᐃᓄᒃᑎᑐᑦ"],["ja","Japanese","日本語"],["jv","Javanese","basa Jawa"],["ka","Georgian","ქართული"],["kg","Kongo","Kikongo"],["ki","Kikuyu","Gĩkũyũ"],["kj","Kwanyama","Kuanyama"],["kk","Kazakh","қазақ тілі"],["kl","Kalaallisut","kalaallisut"],["km","Khmer","ខេមរភាសា"],["kn","Kannada","ಕನ್ನಡ"],["ko","Korean","한국어"],["kr","Kanuri","Kanuri"],["ks","Kashmiri","कश्मीरी"],["ku","Kurmanji (Kurdish)","Kurmancî"],["kv","Komi","коми кыв"],["kw","Cornish","Kernewek"],["ky","Kyrgyz","Кыргызча"],["la","Latin","latine"],["lb","Luxembourgish","Lëtzebuergesch"],["lg","Ganda","Luganda"],["li","Limburgish","Limburgs"],["ln","Lingala","Lingála"],["lo","Lao","ລາວ"],["lt","Lithuanian","lietuvių kalba"],["lu","Luba-Katanga","Tshiluba"],["lv","Latvian","latviešu valoda"],["mg","Malagasy","fiteny malagasy"],["mh","Marshallese","Kajin M̧ajeļ"],["mi","Māori","te reo Māori"],["mk","Macedonian","македонски јазик"],["ml","Malayalam","മലയാളം"],["mn","Mongolian","Монгол хэл"],["mr","Marathi","मराठी"],["ms","Malay","Bahasa Melayu"],["ms-Arab","Jawi Malay","بهاس ملايو"],["mt","Maltese","Malti"],["my","Burmese","ဗမာစာ"],["na","Nauru","Ekakairũ Naoero"],["nb","Norwegian Bokmål","Norsk bokmål"],["nd","Northern Ndebele","isiNdebele"],["ne","Nepali","नेपाली"],["ng","Ndonga","Owambo"],["nl","Dutch","Nederlands"],["nn","Norwegian Nynorsk","Norsk Nynorsk"],["no","Norwegian","Norsk"],["nr","Southern Ndebele","isiNdebele"],["nv","Navajo","Diné bizaad"],["ny","Chichewa","chiCheŵa"],["oc","Occitan","occitan"],["oj","Ojibwe","ᐊᓂᔑᓈᐯᒧᐎᓐ"],["om","Oromo","Afaan Oromoo"],["or","Oriya","ଓଡ଼ିଆ"],["os","Ossetian","ирон æвзаг"],["pa","Punjabi","ਪੰਜਾਬੀ"],["pi","Pāli","पाऴि"],["pl","Polish","Polski"],["ps","Pashto","پښتو"],["pt","Portuguese","Português"],["qu","Quechua","Runa Simi"],["rm","Romansh","rumantsch grischun"],["rn","Kirundi","Ikirundi"],["ro","Romanian","Română"],["ru","Russian","Русский"],["rw","Kinyarwanda","Ikinyarwanda"],["sa","Sanskrit","संस्कृतम्"],["sc","Sardinian","sardu"],["sd","Sindhi","सिन्धी"],["se","Northern Sami","Davvisámegiella"],["sg","Sango","yângâ tî sängö"],["si","Sinhala","සිංහල"],["sk","Slovak","slovenčina"],["sl","Slovenian","slovenščina"],["sn","Shona","chiShona"],["so","Somali","Soomaaliga"],["sq","Albanian","Shqip"],["sr","Serbian","српски језик"],["ss","Swati","SiSwati"],["st","Southern Sotho","Sesotho"],["su","Sundanese","Basa Sunda"],["sv","Swedish","Svenska"],["sw","Swahili","Kiswahili"],["ta","Tamil","தமிழ்"],["te","Telugu","తెలుగు"],["tg","Tajik","тоҷикӣ"],["th","Thai","ไทย"],["ti","Tigrinya","ትግርኛ"],["tk","Turkmen","Türkmen"],["tl","Tagalog","Wikang Tagalog"],["tn","Tswana","Setswana"],["to","Tonga","faka Tonga"],["tr","Turkish","Türkçe"],["ts","Tsonga","Xitsonga"],["tt","Tatar","татар теле"],["tw","Twi","Twi"],["ty","Tahitian","Reo Tahiti"],["ug","Uyghur","ئۇيغۇرچە‎"],["uk","Ukrainian","Українська"],["ur","Urdu","اردو"],["uz","Uzbek","Ўзбек"],["ve","Venda","Tshivenḓa"],["vi","Vietnamese","Tiếng Việt"],["vo","Volapük","Volapük"],["wa","Walloon","walon"],["wo","Wolof","Wollof"],["xh","Xhosa","isiXhosa"],["yi","Yiddish","ייִדיש"],["yo","Yoruba","Yorùbá"],["za","Zhuang","Saɯ cueŋƅ"],["zh","Chinese","中文"],["zu","Zulu","isiZulu"],["zh-CN","Chinese (China)","简体中文"],["zh-HK","Chinese (Hong Kong)","繁體中文(香港)"],["zh-TW","Chinese (Taiwan)","繁體中文(臺灣)"],["zh-YUE","Cantonese","廣東話"],["ast","Asturian","Asturianu"],["chr","Cherokee","ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ"],["ckb","Sorani (Kurdish)","سۆرانی"],["cnr","Montenegrin","crnogorski"],["csb","Kashubian","Kaszëbsczi"],["jbo","Lojban","la .lojban."],["kab","Kabyle","Taqbaylit"],["ldn","Láadan","Láadan"],["lfn","Lingua Franca Nova","lingua franca nova"],["moh","Mohawk","Kanienʼkéha"],["nds","Low German","Plattdüütsch"],["pdc","Pennsylvania Dutch","Pennsilfaani-Deitsch"],["sco","Scots","Scots"],["sma","Southern Sami","Åarjelsaemien Gïele"],["smj","Lule Sami","Julevsámegiella"],["szl","Silesian","ślůnsko godka"],["tok","Toki Pona","toki pona"],["vai","Vai","ꕙꔤ"],["xal","Kalmyk","Хальмг келн"],["zba","Balaibalan","باليبلن"],["zgh","Standard Moroccan Tamazight","ⵜⴰⵎⴰⵣⵉⵖⵜ"]],ei="(((?:[^A-Za-z0-9@@$##\\uFFFE\\uFEFF\\uFFFF]|[\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069]|^))((https?:\\/\\/)((?:(?:(?:[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/](?:[_-]|[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/])*)?[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/]\\.)*(?:(?:[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/](?:-|[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/])*)?[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/]\\.)(?:(?:(?:삼성|닷컴|닷넷|香格里拉|餐厅|食品|飞利浦|電訊盈科|集团|通販|购物|谷歌|诺基亚|联通|网络|网站|网店|网址|组织机构|移动|珠宝|点看|游戏|淡马锡|机构|書籍|时尚|新闻|政府|政务|招聘|手表|手机|我爱你|慈善|微博|广东|工行|家電|娱乐|天主教|大拿|大众汽车|在线|嘉里大酒店|嘉里|商标|商店|商城|公益|公司|八卦|健康|信息|佛山|企业|中文网|中信|世界|ポイント|ファッション|セール|ストア|コム|グーグル|クラウド|みんな|คอม|संगठन|नेट|कॉम|همراه|موقع|موبايلي|كوم|كاثوليك|عرب|شبكة|بيتك|بازار|العليان|ارامكو|اتصالات|ابوظبي|קום|сайт|рус|орг|онлайн|москва|ком|католик|дети|zuerich|zone|zippo|zip|zero|zara|zappos|yun|youtube|you|yokohama|yoga|yodobashi|yandex|yamaxun|yahoo|yachts|xyz|xxx|xperia|xin|xihuan|xfinity|xerox|xbox|wtf|wtc|wow|world|works|work|woodside|wolterskluwer|wme|winners|wine|windows|win|williamhill|wiki|wien|whoswho|weir|weibo|wedding|wed|website|weber|webcam|weatherchannel|weather|watches|watch|warman|wanggou|wang|walter|walmart|wales|vuelos|voyage|voto|voting|vote|volvo|volkswagen|vodka|vlaanderen|vivo|viva|vistaprint|vista|vision|visa|virgin|vip|vin|villas|viking|vig|video|viajes|vet|versicherung|vermögensberatung|vermögensberater|verisign|ventures|vegas|vanguard|vana|vacations|ups|uol|uno|university|unicom|uconnect|ubs|ubank|tvs|tushu|tunes|tui|tube|trv|trust|travelersinsurance|travelers|travelchannel|travel|training|trading|trade|toys|toyota|town|tours|total|toshiba|toray|top|tools|tokyo|today|tmall|tkmaxx|tjx|tjmaxx|tirol|tires|tips|tiffany|tienda|tickets|tiaa|theatre|theater|thd|teva|tennis|temasek|telefonica|telecity|tel|technology|tech|team|tdk|tci|taxi|tax|tattoo|tatar|tatamotors|target|taobao|talk|taipei|tab|systems|symantec|sydney|swiss|swiftcover|swatch|suzuki|surgery|surf|support|supply|supplies|sucks|style|study|studio|stream|store|storage|stockholm|stcgroup|stc|statoil|statefarm|statebank|starhub|star|staples|stada|srt|srl|spreadbetting|spot|sport|spiegel|space|soy|sony|song|solutions|solar|sohu|software|softbank|social|soccer|sncf|smile|smart|sling|skype|sky|skin|ski|site|singles|sina|silk|shriram|showtime|show|shouji|shopping|shop|shoes|shiksha|shia|shell|shaw|sharp|shangrila|sfr|sexy|sex|sew|seven|ses|services|sener|select|seek|security|secure|seat|search|scot|scor|scjohnson|science|schwarz|schule|school|scholarships|schmidt|schaeffler|scb|sca|sbs|sbi|saxo|save|sas|sarl|sapo|sap|sanofi|sandvikcoromant|sandvik|samsung|samsclub|salon|sale|sakura|safety|safe|saarland|ryukyu|rwe|run|ruhr|rugby|rsvp|room|rogers|rodeo|rocks|rocher|rmit|rip|rio|ril|rightathome|ricoh|richardli|rich|rexroth|reviews|review|restaurant|rest|republican|report|repair|rentals|rent|ren|reliance|reit|reisen|reise|rehab|redumbrella|redstone|red|recipes|realty|realtor|realestate|read|raid|radio|racing|qvc|quest|quebec|qpon|pwc|pub|prudential|pru|protection|property|properties|promo|progressive|prof|productions|prod|pro|prime|press|praxi|pramerica|post|porn|politie|poker|pohl|pnc|plus|plumbing|playstation|play|place|pizza|pioneer|pink|ping|pin|pid|pictures|pictet|pics|piaget|physio|photos|photography|photo|phone|philips|phd|pharmacy|pfizer|pet|pccw|pay|passagens|party|parts|partners|pars|paris|panerai|panasonic|pamperedchef|page|ovh|ott|otsuka|osaka|origins|orientexpress|organic|org|orange|oracle|open|ooo|onyourside|online|onl|ong|one|omega|ollo|oldnavy|olayangroup|olayan|okinawa|office|off|observer|obi|nyc|ntt|nrw|nra|nowtv|nowruz|now|norton|northwesternmutual|nokia|nissay|nissan|ninja|nikon|nike|nico|nhk|ngo|nfl|nexus|nextdirect|next|news|newholland|new|neustar|network|netflix|netbank|net|nec|nba|navy|natura|nationwide|name|nagoya|nadex|nab|mutuelle|mutual|museum|mtr|mtpc|mtn|msd|movistar|movie|mov|motorcycles|moto|moscow|mortgage|mormon|mopar|montblanc|monster|money|monash|mom|moi|moe|moda|mobily|mobile|mobi|mma|mls|mlb|mitsubishi|mit|mint|mini|mil|microsoft|miami|metlife|merckmsd|meo|menu|men|memorial|meme|melbourne|meet|media|med|mckinsey|mcdonalds|mcd|mba|mattel|maserati|marshalls|marriott|markets|marketing|market|map|mango|management|man|makeup|maison|maif|madrid|macys|luxury|luxe|lupin|lundbeck|ltda|ltd|lplfinancial|lpl|love|lotto|lotte|london|lol|loft|locus|locker|loans|loan|llp|llc|lixil|living|live|lipsy|link|linde|lincoln|limo|limited|lilly|like|lighting|lifestyle|lifeinsurance|life|lidl|liaison|lgbt|lexus|lego|legal|lefrak|leclerc|lease|lds|lawyer|law|latrobe|latino|lat|lasalle|lanxess|landrover|land|lancome|lancia|lancaster|lamer|lamborghini|ladbrokes|lacaixa|kyoto|kuokgroup|kred|krd|kpn|kpmg|kosher|komatsu|koeln|kiwi|kitchen|kindle|kinder|kim|kia|kfh|kerryproperties|kerrylogistics|kerryhotels|kddi|kaufen|juniper|juegos|jprs|jpmorgan|joy|jot|joburg|jobs|jnj|jmp|jll|jlc|jio|jewelry|jetzt|jeep|jcp|jcb|java|jaguar|iwc|iveco|itv|itau|istanbul|ist|ismaili|iselect|irish|ipiranga|investments|intuit|international|intel|int|insure|insurance|institute|ink|ing|info|infiniti|industries|inc|immobilien|immo|imdb|imamat|ikano|iinet|ifm|ieee|icu|ice|icbc|ibm|hyundai|hyatt|hughes|htc|hsbc|how|house|hotmail|hotels|hoteles|hot|hosting|host|hospital|horse|honeywell|honda|homesense|homes|homegoods|homedepot|holiday|holdings|hockey|hkt|hiv|hitachi|hisamitsu|hiphop|hgtv|hermes|here|helsinki|help|healthcare|health|hdfcbank|hdfc|hbo|haus|hangout|hamburg|hair|guru|guitars|guide|guge|gucci|guardian|group|grocery|gripe|green|gratis|graphics|grainger|gov|got|gop|google|goog|goodyear|goodhands|goo|golf|goldpoint|gold|godaddy|gmx|gmo|gmbh|gmail|globo|global|gle|glass|glade|giving|gives|gifts|gift|ggee|george|genting|gent|gea|gdn|gbiz|gay|garden|gap|games|game|gallup|gallo|gallery|gal|fyi|futbol|furniture|fund|fun|fujixerox|fujitsu|ftr|frontier|frontdoor|frogans|frl|fresenius|free|fox|foundation|forum|forsale|forex|ford|football|foodnetwork|food|foo|fly|flsmidth|flowers|florist|flir|flights|flickr|fitness|fit|fishing|fish|firmdale|firestone|fire|financial|finance|final|film|fido|fidelity|fiat|ferrero|ferrari|feedback|fedex|fast|fashion|farmers|farm|fans|fan|family|faith|fairwinds|fail|fage|extraspace|express|exposed|expert|exchange|everbank|events|eus|eurovision|etisalat|esurance|estate|esq|erni|ericsson|equipment|epson|epost|enterprises|engineering|engineer|energy|emerck|email|education|edu|edeka|eco|eat|earth|dvr|dvag|durban|dupont|duns|dunlop|duck|dubai|dtv|drive|download|dot|doosan|domains|doha|dog|dodge|doctor|docs|dnp|diy|dish|discover|discount|directory|direct|digital|diet|diamonds|dhl|dev|design|desi|dentist|dental|democrat|delta|deloitte|dell|delivery|degree|deals|dealer|deal|dds|dclk|day|datsun|dating|date|data|dance|dad|dabur|cyou|cymru|cuisinella|csc|cruises|cruise|crs|crown|cricket|creditunion|creditcard|credit|cpa|courses|coupons|coupon|country|corsica|coop|cool|cookingchannel|cooking|contractors|contact|consulting|construction|condos|comsec|computer|compare|company|community|commbank|comcast|com|cologne|college|coffee|codes|coach|clubmed|club|cloud|clothing|clinique|clinic|click|cleaning|claims|cityeats|city|citic|citi|citadel|cisco|circle|cipriani|church|chrysler|chrome|christmas|chloe|chintai|cheap|chat|chase|charity|channel|chanel|cfd|cfa|cern|ceo|center|ceb|cbs|cbre|cbn|cba|catholic|catering|cat|casino|cash|caseih|case|casa|cartier|cars|careers|career|care|cards|caravan|car|capitalone|capital|capetown|canon|cancerresearch|camp|camera|cam|calvinklein|call|cal|cafe|cab|bzh|buzz|buy|business|builders|build|bugatti|budapest|brussels|brother|broker|broadway|bridgestone|bradesco|box|boutique|bot|boston|bostik|bosch|boots|booking|book|boo|bond|bom|bofa|boehringer|boats|bnpparibas|bnl|bmw|bms|blue|bloomberg|blog|blockbuster|blanco|blackfriday|black|biz|bio|bingo|bing|bike|bid|bible|bharti|bet|bestbuy|best|berlin|bentley|beer|beauty|beats|bcn|bcg|bbva|bbt|bbc|bayern|bauhaus|basketball|baseball|bargains|barefoot|barclays|barclaycard|barcelona|bar|bank|band|bananarepublic|banamex|baidu|baby|azure|axa|aws|avianca|autos|auto|author|auspost|audio|audible|audi|auction|attorney|athleta|associates|asia|asda|arte|art|arpa|army|archi|aramco|arab|aquarelle|apple|app|apartments|aol|anz|anquan|android|analytics|amsterdam|amica|amfam|amex|americanfamily|americanexpress|alstom|alsace|ally|allstate|allfinanz|alipay|alibaba|alfaromeo|akdn|airtel|airforce|airbus|aigo|aig|agency|agakhan|africa|afl|afamilycompany|aetna|aero|aeg|adult|ads|adac|actor|active|aco|accountants|accountant|accenture|academy|abudhabi|abogado|able|abc|abbvie|abbott|abb|abarth|aarp|aaa|onion)(?=[^0-9a-zA-Z@+-]|$))|(?:(?:한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ລາວ|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|موريتانيا|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|البحرين|الاردن|հայ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ευ|ελ|zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|re|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac)(?=[^0-9a-zA-Z@+-]|$))|(?:xn--[\\-0-9a-z]+))))(?::([0-9]+))?(\\/(?:(?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*(?:\\((?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+|(?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*\\([a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+\\)[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*))\\)[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*)*[\\+\\-a-z\\u0400-\\u04FF0-9=_#\\/\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]|(?:\\((?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+|(?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*\\([a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+\\)[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*))\\)))|(?:@[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+\\/))*)?(\\?[a-z0-9!?\\*'@\\(\\);:&=\\+\\$\\/%#\\[\\]\\-_\\.,~|]*[a-z0-9\\-_&=#\\/])?))",ti="gi",Kt={source:ei,flags:ti},Wt=["byte","kilobyte","megabyte","gigabyte","terabyte","petabyte"];function Xe(s){const t=Math.min(Math.floor(Math.log2(s)/10),Wt.length-1),n=s/1024**t;return ge.number(n,{style:"unit",unit:Wt[t],unitDisplay:"narrow",maximumFractionDigits:0})}const ni={BASE_URL:"./",DEV:!1,MODE:"production",PHANPY_CLIENT_NAME:"Phanpy",PHANPY_LINGVA_INSTANCES:"lingva.phanpy.social lingva.lunar.icu lingva.garudalinux.org translate.plausibility.cloud",PHANPY_PRIVACY_POLICY_URL:"https://github.com/cheeaun/phanpy/blob/main/PRIVACY.MD",PHANPY_WEBSITE:"https://phanpy.social",PROD:!0,SSR:!1,VITE_APP_ENV:"production"},{PHANPY_IMG_ALT_API_URL:vt,PHANPY_GIPHY_API_KEY:ii}=ni,si=Lt.reduce((s,t)=>{const[n,a,c]=t;return s[n]={common:a,native:c},s},{}),tn={300:Ee(5,"minute"),1800:Ee(30,"minute"),3600:Ee(1,"hour"),21600:Ee(6,"hour"),86400:Ee(1,"day"),259200:Ee(3,"day"),604800:Ee(1,"week")},ai=Object.keys(tn),Ut=24*60*60,Vt=s=>{if(!s)return Ut;const t=(new Date(s).getTime()-Date.now())/1e3;return ai.find(n=>n>=t)||Ut},ke=document.createElement("ul");ke.role="listbox";ke.className="text-expander-menu";const ri=16,oi=new IntersectionObserver(s=>{s.forEach(t=>{if(t.isIntersecting){const{left:n,width:a}=t.boundingClientRect,{innerWidth:c}=window;if(n+a>c){const o=Cn()?"right":"left";ke.style[o]=c-a-ri+"px"}}})});oi.observe(ke);const Fe=gn([new Intl.DateTimeFormat().resolvedOptions().locale,...navigator.languages],Lt.map(s=>s[0]),"en"),nn=new RegExp(Kt.source,Kt.flags),li=/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/gi,ci="$2xxxxxxxxxxxxxxxxxxxxxxx";function ui(s){return s.replace(nn,ci).replace(li,"$1@$3")}const di=/[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i,hi=new RegExp(`(^|[^=\\/\\w])(@${di.source}(?:@[\\p{L}\\w.-]+[\\w]+)?)`,"uig"),pi=new RegExp("(^|[^=\\/\\w])(#[a-z0-9_]+([a-z0-9_.]+[a-z0-9_]+)?)(?![\\/\\w])","ig"),mi="[a-zA-Z0-9_]{2,}",gi=new RegExp(`(^|[^=\\/\\w])(:${mi}:)(?=[^A-Za-z0-9_:]|$)`,"g"),fi=new Intl.Segmenter;function bt(s){return s.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function vi(s,{maxCharacters:t=1/0}){const{composerCharacterCount:n}=oe;if(n>t){let a="",c="";const o=fi.segment(s);for(const{segment:l,index:x}of o)x"),bt(a)+c}return bt(s).replace(nn,'$2$3').replace(hi,'$1$2').replace(pi,'$1$2').replace(gi,'$1$2')}const bi=fn(s=>new Intl.RelativeTimeFormat(s||void 0)),zt=100;function Mi({onClose:s,replyToStatus:t,editStatus:n,draftStatus:a,standalone:c,hasOpener:o}){var Bt;const{i18n:l}=Ke(),x=bi(l.locale),{masto:E,instance:M}=_t(),[F,b]=U("default"),T=Y((a==null?void 0:a.uid)||zn()),L=vn(),B=L.info,$=Xt(),{statuses:{maxCharacters:ie,maxMediaAttachments:j,charactersReservedPerUrl:p}={},mediaAttachments:{supportedMimeTypes:d=[],imageSizeLimit:m,imageMatrixLimit:w,videoSizeLimit:f,videoMatrixLimit:O,videoFrameRateLimit:k}={},polls:{maxOptions:K,maxCharactersPerOption:ae,maxExpiration:ce,minExpiration:Q}={}}=$||{},D=Y(),W=Y(),[H,te]=U("public"),[Z,ue]=U(!1),[P,se]=U(Se.session.get("currentLanguage")||Fe),fe=Y(P),[g,S]=U([]),[z,ee]=U(null),N=Se.account.get("preferences")||{},de=()=>{D.current&&D.current.dispatchEvent(new Event("input"))},pe=()=>{setTimeout(()=>{var r,u,y;D.current&&((u=(r=a==null?void 0:a.status)==null?void 0:r.startsWith)!=null&&u.call(r,` -`)&&(D.current.selectionStart=0,D.current.selectionEnd=0),(y=D.current)==null||y.focus())},300)};ne(()=>{var r,u;if(t){const{spoilerText:y,visibility:h,language:A,sensitive:C}=t;y&&W.current&&(W.current.value=y);const v=[...new Set([t.account.acct,...t.mentions.map(_=>_.acct)])].filter(_=>_!==B.acct);v.length>0&&(D.current.value=`${v.map(_=>`@${_}`).join(" ")} `,de()),pe(),te(h==="public"&&N["posting:default:visibility"]?N["posting:default:visibility"].toLowerCase():h),se(A||((r=N["posting:default:language"])==null?void 0:r.toLowerCase())||Fe),ue(C&&!!y)}else if(n){const{visibility:y,language:h,sensitive:A,poll:C,mediaAttachments:R}=n,v=!!(C!=null&&C.options)&&{...C,options:C.options.map(_=>(_==null?void 0:_.title)||_),expiresIn:(C==null?void 0:C.expiresIn)||Vt(C.expiresAt)};b("loading"),(async()=>{var _;try{const q=await E.v1.statuses.$select(n.id).source.fetch(),{text:he,spoilerText:ve}=q;D.current.value=he,D.current.dataset.source=he,de(),pe(),W.current.value=ve,te(y),se(h||((_=N["posting:default:language"])==null?void 0:_.toLowerCase())||Fe),ue(A),v&&ee(v),S(R),b("default")}catch(q){alert((q==null?void 0:q.reason)||q),b("error")}})()}else pe(),N["posting:default:visibility"]&&te(N["posting:default:visibility"].toLowerCase()),N["posting:default:language"]&&se(N["posting:default:language"].toLowerCase()),N["posting:default:sensitive"]&&ue(!!N["posting:default:sensitive"]);if(a){const{status:y,spoilerText:h,visibility:A,language:C,sensitive:R,poll:v,mediaAttachments:_}=a,q=!!(v!=null&&v.options)&&{...v,options:v.options.map(he=>(he==null?void 0:he.title)||he),expiresIn:(v==null?void 0:v.expiresIn)||Vt(v.expiresAt)};D.current.value=y,de(),pe(),h&&(W.current.value=h),A&&te(A),se(C||((u=N["posting:default:language"])==null?void 0:u.toLowerCase())||Fe),R!==null&&ue(R),q&&ee(q),_&&S(_)}},[a,n,t]);const _e=Y(),Le=l._({id:"hR9gtK"}),ot=()=>{const{value:r,dataset:u}=D.current;if(F==="loading")return!1;const y=(r||"").trim().replace(new RegExp("^\\p{White_Space}+|\\p{White_Space}+$","gu"),""),h=g.length>0;if(!y&&!h||g.length>0&&g.every(_=>_.id))return!0;const C=(t==null?void 0:t.account.id)===B.id,R=t&&r.trim()===`@${t.account.acct}`;return!!(!C&&R||r===(u==null?void 0:u.source))},We=()=>ot()?!0:confirm(Le);ne(()=>{const r=u=>{ot()||(u.preventDefault(),u.returnValue=Le)};return window.addEventListener("beforeunload",r,{capture:!0}),()=>window.removeEventListener("beforeunload",r,{capture:!0})},[]);const rn=()=>{const{value:r}=D.current,{value:u}=W.current;return qt(ui(r))+qt(u)},lt=()=>{const r=rn();oe.composerCharacterCount=r};ne(lt,[]);const St=window.CloseWatcher,ct=Y(!1);$e("esc",()=>{ct.current=!0},{enabled:!St,enableOnFormTags:!0}),$e("esc",()=>{!c&&ct.current&&We()&&s(),ct.current=!1},{enabled:!St,enableOnFormTags:!0,keyup:!0,ignoreEventWhen:r=>{const u=document.querySelectorAll("#modal-container > *"),y=!!u,h=u.length===1&&u[0].querySelector("#compose-container");return y&&!h}}),_n(()=>{!c&&We()&&s()},[c,We,s]);const It=Y({}),Mt=()=>`${bn()}#${T.current}`,ut=()=>{if(n||oe.composerState.minimized)return;const r=Mt(),u={key:r,replyTo:t?{id:t.id,account:{id:t.account.id,username:t.account.username,acct:t.account.acct}}:null,draftStatus:{uid:T.current,status:D.current.value,spoilerText:W.current.value,visibility:H,language:P,sensitive:Z,poll:z,mediaAttachments:g}};!yn(u,It.current)&&!ot()&&($t.drafts.set(r,{...u,state:"unsaved",updatedAt:Date.now()}).then(()=>{}).catch(y=>{}),It.current=structuredClone(u))};Ln(ut,5e3),ne(()=>(ut(),()=>{$t.drafts.del(Mt())}),[]),ne(()=>{const r=y=>{const{items:h}=y.clipboardData||y.dataTransfer,A=[];for(let C=0;C0&&g.length>=j){alert(l._({id:"ctFhjs",values:{maxMediaAttachments:j}}));return}if(A.length>0){y.preventDefault(),y.stopPropagation();const C=j-g.length,R=A.slice(0,C);if(R.length<=0){alert(l._({id:"ctFhjs",values:{maxMediaAttachments:j}}));return}const v=R.map(_=>({file:_,type:_.type,size:_.size,url:URL.createObjectURL(_),id:null,description:null}));S([...g,...v])}};window.addEventListener("paste",r);const u=y=>{y.dataTransfer.items.length>0&&(y.preventDefault(),y.stopPropagation())};return window.addEventListener("dragover",u),window.addEventListener("drop",r),()=>{window.removeEventListener("paste",r),window.removeEventListener("dragover",u),window.removeEventListener("drop",r)}},[g]);const[Ue,dt]=U(!1),[Ve,Ge]=U(!1),[on,ht]=U(!1),[ye,ln]=U(null),[cn,un]=je(()=>{const r=[],u=[],{contentTranslationHideLanguages:y=[]}=oe.settings;return Lt.forEach(h=>{const[A]=h;A===P||A===fe.current||A===Fe||y.includes(A)||ye!=null&&ye.length&&ye.includes(A)?r.push(h):u.push(h)}),r.sort(([h,A],[C,R])=>h===P?-1:C===P?1:A.localeCompare(R)),u.sort(([h,A],[C,R])=>A.localeCompare(R)),[r,u]},[P,ye]),Tt=je(()=>!!(t!=null&&t.createdAt)&&Math.floor((Date.now()-new Date(t.createdAt))/(1e3*60*60*24*30)),[t]),dn=()=>{ut(),oe.composerState.minimized=!0};return e("div",{id:"compose-container-outer",children:[e("div",{id:"compose-container",class:c?"standalone":"",children:[e("div",{class:"compose-top",children:[(B==null?void 0:B.avatarStatic)&&e(Qt,{account:B,accountInstance:L.instanceURL,hideDisplayName:!0,useAvatarStatic:!0}),c?o&&e("button",{type:"button",class:"light pop-button",disabled:F==="loading",onClick:()=>{var r;if(!window.opener){alert(l._({id:"qiPXgY"}));return}if(window.opener.__STATES__.showCompose){if((r=window.opener.__STATES__.composerState)!=null&&r.publishing){alert(l._({id:"Z2l5Bt"}));return}let u=l._({id:"AB/GtR"});if(!confirm(u))return}s({fn:()=>{const u={editStatus:n,replyToStatus:t,draftStatus:{uid:T.current,status:D.current.value,spoilerText:W.current.value,visibility:H,language:P,sensitive:Z,poll:z,mediaAttachments:g}};window.opener.__COMPOSE__=u,window.opener.__STATES__.showCompose?(window.opener.__STATES__.showCompose=!1,setTimeout(()=>{window.opener.__STATES__.showCompose=!0},10)):window.opener.__STATES__.showCompose=!0,window.opener.__STATES__.composerState.minimized&&(window.opener.__STATES__.composerState.minimized=!1)}})},children:e(J,{icon:"popin",alt:l._({id:"/5ZKeE"})})}):e("span",{class:"compose-controls",children:[e("button",{type:"button",class:"plain4 pop-button",disabled:F==="loading",onClick:()=>{An({editStatus:n,replyToStatus:t,draftStatus:{uid:T.current,status:D.current.value,spoilerText:W.current.value,visibility:H,language:P,sensitive:Z,poll:z,mediaAttachments:g}})&&s()},children:e(J,{icon:"popout",alt:l._({id:"JsU2En"})})}),e("button",{type:"button",class:"plain4 min-button",onClick:dn,children:e(J,{icon:"minimize",alt:l._({id:"3TSz9S"})})})," ",e("button",{type:"button",class:"light close-button",disabled:F==="loading",onClick:()=>{We()&&s()},children:e(J,{icon:"x",alt:l._({id:"yz7wBu"})})})]})]}),!!t&&e("div",{class:"status-preview",children:[e(jt,{status:t,size:"s",previewMode:!0}),e("div",{class:"status-preview-legend reply-to",children:Tt>0?e(V,{id:"Q1Huya",values:{0:t.account.acct||t.account.username,1:x.format(-Tt,"month")},components:{0:e("strong",{})}}):e(V,{id:"dwLCPZ",values:{0:t.account.acct||t.account.username}})})]}),!!n&&e("div",{class:"status-preview",children:[e(jt,{status:n,size:"s",previewMode:!0}),e("div",{class:"status-preview-legend",children:e(V,{id:"wKtOLH"})})]}),e("form",{ref:_e,class:`form-visibility-${H}`,style:{pointerEvents:F==="loading"?"none":"auto",opacity:F==="loading"?.5:1},onKeyDown:r=>{r.key==="Enter"&&(r.ctrlKey||r.metaKey)&&_e.current.dispatchEvent(new Event("submit",{cancelable:!0}))},onSubmit:r=>{r.preventDefault();const u=new FormData(r.target),y=Object.fromEntries(u.entries());let{status:h,visibility:A,sensitive:C,spoilerText:R}=y;if(C=C==="on",z){if(z.options.length<2){alert(l._({id:"zhrMYj"}));return}if(z.options.some(v=>v==="")){alert(l._({id:"uNVxXX"}));return}}g.length>0&&g.some(_=>{var q,he;return!((he=(q=_.description)==null?void 0:q.trim)!=null&&he.call(q))})&&!confirm(l._({id:"MQYucx"}))||(R=C&&R||void 0,h=h===""?void 0:h,oe.composerState.publishing=!0,b("loading"),(async()=>{try{if(g.length>0){const q=g.map(ve=>{const{file:Ye,description:hn,id:pn}=ve;if(pn)return ve;{const mn=Zt({file:Ye,description:hn});return E.v2.media.create(mn).then(pt=>(pt.id&&(ve.id=pt.id),pt))}}),he=await Promise.allSettled(q);if(he.some(ve=>{var Ye;return ve.status==="rejected"||!((Ye=ve.value)!=null&&Ye.id)})){oe.composerState.publishing=!1,oe.composerState.publishingError=!0,b("error"),he.forEach(ve=>{ve.status==="rejected"&&alert(ve.reason||l._({id:"eIiurD",values:{i}}))});return}}let v={status:h,spoiler_text:R,language:P,sensitive:C,poll:z,media_ids:g.map(q=>q.id)};n&&Je("@mastodon/edit-media-attributes")?v.media_attributes=g.map(q=>({id:q.id,description:q.description})):n||(v.visibility=A,v.in_reply_to_id=(t==null?void 0:t.id)||void 0),v=Zt(v);let _;if(n)_=await E.v1.statuses.$select(n.id).update(v),xn(_,M,{skipThreading:!0});else try{_=await E.v1.statuses.create(v,{requestInit:{headers:{"Idempotency-Key":T.current}}})}catch{_=await E.v1.statuses.create(v)}oe.composerState.minimized=!1,oe.composerState.publishing=!1,b("default"),s({type:n?"edit":t?"reply":"post",newStatus:_,instance:M})}catch(v){oe.composerState.publishing=!1,oe.composerState.publishingError=!0,alert((v==null?void 0:v.reason)||v),b("error")}})())},children:[e("div",{class:"toolbar stretch",children:[e("input",{ref:W,type:"text",name:"spoilerText",placeholder:l._({id:"gnKo7f"}),disabled:F==="loading",class:"spoiler-text-field",lang:P,spellCheck:"true",dir:"auto",style:{opacity:Z?1:0,pointerEvents:Z?"auto":"none"},onInput:()=>{lt()}}),e("label",{class:`toolbar-button ${Z?"highlight":""}`,title:l._({id:"zKu2Aq"}),children:[e("input",{name:"sensitive",type:"checkbox",checked:Z,disabled:F==="loading",onChange:r=>{var y,h;const u=r.target.checked;ue(u),u?(y=W.current)==null||y.focus():(h=D.current)==null||h.focus()}}),e(J,{icon:`eye-${Z?"close":"open"}`})]})," ",e("label",{class:`toolbar-button ${H!=="public"&&!Z?"show-field":""} ${H!=="public"?"highlight":""}`,title:H,children:[e(J,{icon:Sn[H],alt:H}),e("select",{name:"visibility",value:H,onChange:r=>{te(r.target.value)},disabled:F==="loading"||!!n,dir:"auto",children:[e("option",{value:"public",children:e(V,{id:"7d1a0d"})}),(Je("@pleroma/local-visibility-post")||Je("@akkoma/local-visibility-post"))&&e("option",{value:"local",children:e(V,{id:"d5zxa4"})}),e("option",{value:"unlisted",children:e(V,{id:"WDcQq9"})}),e("option",{value:"private",children:e(V,{id:"o34OrG"})}),e("option",{value:"direct",children:e(V,{id:"IV4QaU"})})]})]})," "]}),e(wi,{ref:D,placeholder:t?l._({id:"Sjj+EN"}):n?l._({id:"qzVesX"}):l._({id:"owpNF1"}),required:(g==null?void 0:g.length)===0,disabled:F==="loading",lang:P,onInput:()=>{lt()},maxCharacters:ie,performSearch:r=>{const{type:u,q:y,limit:h}=r;return u==="accounts"?E.v1.accounts.search.list({q:y,limit:h,resolve:!1}):E.v2.search.fetch(r)},onTrigger:r=>{(r==null?void 0:r.name)==="custom-emojis"?Ge({defaultSearchTerm:(r==null?void 0:r.defaultSearchTerm)||null}):(r==null?void 0:r.name)==="mention"?dt({defaultSearchTerm:(r==null?void 0:r.defaultSearchTerm)||null}):(r==null?void 0:r.name)==="auto-detect-language"&&(r!=null&&r.languages)&&ln(r.languages)}}),(g==null?void 0:g.length)>0&&e("div",{class:"media-attachments",children:[g.map((r,u)=>{const{id:y,file:h}=r,A=(h==null?void 0:h.size)+(h==null?void 0:h.type)+(h==null?void 0:h.name);return e(Ei,{attachment:r,disabled:F==="loading",lang:P,onDescriptionChange:C=>{S(R=>{const v=[...R];return v[u]={...v[u],description:C},v})},onRemove:()=>{S(C=>C.filter((R,v)=>v!==u))}},y||A||u)}),e("label",{class:"media-sensitive",children:[e("input",{name:"sensitive",type:"checkbox",checked:Z,disabled:F==="loading",onChange:r=>{const u=r.target.checked;ue(u)}})," ",e("span",{children:e(V,{id:"jER18a"})})," ",e(J,{icon:`eye-${Z?"close":"open"}`})]})]}),!!z&&e(Fi,{lang:P,maxOptions:K,maxExpiration:ce,minExpiration:Q,maxCharactersPerOption:ae,poll:z,disabled:F==="loading",onInput:r=>{if(r){const u={...r};ee(u)}else ee(null)}}),e("div",{class:"toolbar wrap",style:{justifyContent:"flex-end"},children:[e("span",{children:[e("label",{class:"toolbar-button",children:[e("input",{type:"file",accept:d.join(","),multiple:g.length=j||!!z,onChange:r=>{const u=r.target.files;if(!u)return;const y=Array.from(u).map(h=>({file:h,type:h.type,size:h.size,url:URL.createObjectURL(h),id:null,description:null}));g.length+y.length>j?alert(l._({id:"ctFhjs",values:{maxMediaAttachments:j}})):S(h=>h.concat(y)),r.target.value=""}}),e(J,{icon:"attachment"})]}),K==null||K>1&&e(Oe,{children:e("button",{type:"button",class:"toolbar-button",disabled:F==="loading"||!!z||!!g.length,onClick:()=>{ee({options:["",""],expiresIn:24*60*60,multiple:!1})},children:e(J,{icon:"poll",alt:l._({id:"cZJ92q"})})})}),e("button",{type:"button",class:"toolbar-button",disabled:F==="loading",onClick:()=>{Ge(!0)},children:e(J,{icon:"emoji2",alt:l._({id:"ggiJLM"})})}),!!oe.settings.composerGIFPicker&&e("button",{type:"button",class:"toolbar-button gif-picker-button",disabled:F==="loading"||g.length>=j||!!z,onClick:()=>{ht(!0)},children:e("span",{children:"GIF"})})]}),e("div",{class:"spacer"}),F==="loading"?e(at,{abrupt:!0}):e(ki,{maxCharacters:ie,hidden:F==="loading"}),e("label",{class:`toolbar-button ${P!==fe.current||ye!=null&&ye.length&&!ye.includes(P)?"highlight":""}`,children:[e("span",{class:"icon-text",children:(Bt=si[P])==null?void 0:Bt.native}),e("select",{name:"language",value:P,onChange:r=>{const{value:u}=r.target;se(u||Fe),Se.session.set("currentLanguage",u||Fe)},disabled:F==="loading",dir:"auto",children:[cn.map(([r,u,y])=>{const h=xt({code:r,fallback:u});return e("option",{value:r,children:h!==y?`${y} - ${h}`:h},r)}),e("hr",{}),un.map(([r,u,y])=>{const h=xt({code:r,fallback:u});return e("option",{value:r,children:h!==y?`${y} - ${h}`:h},r)})]})]})," ",e("button",{type:"submit",class:"large",disabled:F==="loading",children:t?l._({id:"ImOQa9"}):n?l._({id:"EkH9pt"}):l._({id:"GMe2XV"})})]})]})]}),Ue&&e(Qe,{onClick:r=>{r.target===r.currentTarget&&dt(!1)},children:e(Ci,{masto:E,instance:M,onClose:()=>{dt(!1)},defaultSearchTerm:Ue==null?void 0:Ue.defaultSearchTerm,onSelect:r=>{const u=D.current;if(!u)return;const{selectionStart:y,selectionEnd:h}=u,A=u.value,C=A.slice(0,y),R=C?/[\s\t\n\r]$/.test(C)?"":" ":"",v=A.slice(h),_=/^[\s\t\n\r]/.test(v)?"":" ",q=C+R+"@"+r+_+v;u.value=q,u.selectionStart=u.selectionEnd=h+1+r.length+_.length,u.focus(),u.dispatchEvent(new Event("input"))}})}),Ve&&e(Qe,{onClick:r=>{r.target===r.currentTarget&&Ge(!1)},children:e(zi,{masto:E,instance:M,onClose:()=>{Ge(!1)},defaultSearchTerm:Ve==null?void 0:Ve.defaultSearchTerm,onSelect:r=>{const u=D.current;if(!u)return;const{selectionStart:y,selectionEnd:h}=u,A=u.value,C=A.slice(0,y),R=C?/[\s\t\n\r]$/.test(C)?"":" ":"",v=A.slice(h),_=/^[\s\t\n\r]/.test(v)?"":" ",q=C+R+r+_+v;u.value=q,u.selectionStart=u.selectionEnd=h+r.length+_.length,u.focus(),u.dispatchEvent(new Event("input"))}})}),on&&e(Qe,{onClick:r=>{r.target===r.currentTarget&&ht(!1)},children:e(Li,{onClose:()=>ht(!1),onSelect:({url:r,type:u,alt_text:y})=>{if(g.length>=j){alert(l._({id:"ctFhjs",values:{maxMediaAttachments:j}}));return}(async()=>{var A,C;let h;try{h=Ce({text:l._({id:"/Cw4Tx"}),duration:-1});const R=await fetch(r,{referrerPolicy:"no-referrer"}).then(q=>q.blob()),v=new File([R],u==="video/mp4"?"video.mp4":"image.gif",{type:u}),_=[...g,{file:v,type:u,size:v.size,id:null,description:y||""}];S(_),(A=h==null?void 0:h.hideToast)==null||A.call(h)}catch{(C=h==null?void 0:h.hideToast)==null||C.call(h),Ce(l._({id:"VKDnAx"}))}})()}})})]})}function Gt(s){if(!s)return;const{value:t,offsetHeight:n,scrollHeight:a,clientHeight:c}=s;if(no.visibleInPicker),c=new In(a,{keys:["shortcode"],findAllMatches:!0});return[a,c]}const sn=wn(yi,{matchesArg:(s,t)=>s.instance===t.instance,maxAge:30*60*1e3}),xi=async s=>{const{detectAll:t}=await kn(async()=>{const{detectAll:a}=await import("./tinyld-light-tbgyvj3S.js");return{detectAll:a}},[],import.meta.url),n=t(s);return n!=null&&n.length?n.slice(0,2).map(a=>a.lang):null},wi=En((s,t)=>{var j;const{masto:n,instance:a}=_t(),[c,o]=U(((j=t.current)==null?void 0:j.value)||""),{maxCharacters:l,performSearch:x=()=>{},onTrigger:E=()=>{},...M}=s,F=Y();ne(()=>{sn(a,n).then(p=>{const[d,m]=p;F.current=m}).catch(p=>{})},[]);const b=Y(),T=Y("");ne(()=>{let p,d,m;return b.current&&(p=w=>{var ae;const{key:f,provide:O,text:k}=w.detail;if(T.current=k,k===""){O(Promise.resolve({matched:!1}));return}if(f===":"){const ce=(ae=F.current)==null?void 0:ae.search(k,{limit:5});let Q="";ce.forEach(({item:D})=>{const{shortcode:W,url:H}=D;Q+=` -
  • - - ${we(W)} -
  • `}),Q+=`
  • ${ge._({id:"24misb"})}
  • `,ke.innerHTML=Q,O(Promise.resolve({matched:ce.length>0,fragment:ke}));return}const K={"@":"accounts","#":"hashtags"}[f];O(new Promise(ce=>{x({type:K,q:k,limit:5}).then(D=>{if(k!==T.current)return;const W=D[K]||D;let H="";W.forEach(te=>{var ee;const{name:Z,avatarStatic:ue,displayName:P,username:se,acct:fe,emojis:g,history:S}=te,z=Mn(P,g);if(fe)H+=` -
  • - - - - - ${z||se} -
    @${we(fe)} -
    -
  • - `;else{const N=(ee=S==null?void 0:S.reduce)==null?void 0:ee.call(S,(de,pe)=>de+ +pe.uses,0);H+=` -
  • - #${we(Z)} - ${N?`${Tn(N)}`:""} -
  • - `}}),K==="accounts"&&(H+=`
  • ${ge._({id:"24misb"})}
  • `),ke.innerHTML=H,ce({matched:W.length>0,fragment:ke})})}))},b.current.addEventListener("text-expander-change",p),d=w=>{const{key:f,item:O}=w.detail,{value:k,more:K}=O.dataset;f===":"?(w.detail.value=k?`:${k}:`:"​",K&&(w.detail.continue=!0,setTimeout(()=>{E==null||E({name:"custom-emojis",defaultSearchTerm:K})},300))):f==="@"?(w.detail.value=k?`@${k} `:"​",K&&(w.detail.continue=!0,setTimeout(()=>{E==null||E({name:"mention",defaultSearchTerm:K})},300))):w.detail.value=`${f}${k}`},b.current.addEventListener("text-expander-value",d),m=w=>{const{input:f}=w.detail;if(o(f.value),t.current){const O=new Event("input",{bubbles:!0});t.current.dispatchEvent(O)}},b.current.addEventListener("text-expander-committed",m)),()=>{b.current&&(b.current.removeEventListener("text-expander-change",p),b.current.removeEventListener("text-expander-value",d),b.current.removeEventListener("text-expander-committed",m))}},[]),ne(()=>{const p=t.current;if(!p)return;new ResizeObserver(()=>{if(b.current){const{height:m}=p.getBoundingClientRect();b.current.style.height=m+"px"}}).observe(p)},[]);const L=Y(0),B=Y(),$=Bn(p=>{var w;if(!B.current)return;if(L.current>3){B.current.innerHTML="",B.current=null,(w=$==null?void 0:$.cancel)==null||w.call($);return}let d,m;L.current<=3&&(d=Date.now()),B.current.innerHTML=vi(p,{maxCharacters:l})+` -`,L.current<=3&&(m=Date.now()),d&&m&&m-d>50&&L.current++},500),ie=rt(()=>{var m,w;const p=(m=B.current)==null?void 0:m.cloneNode(!0);if(!p)return;p.querySelectorAll("mark").forEach(f=>{f.remove()});const d=(w=p.innerText)==null?void 0:w.trim();d&&(async()=>{const f=await xi(d);f!=null&&f.length&&(E==null||E({name:"auto-detect-language",languages:f}))})()},2e3);return e("text-expander",{ref:b,keys:"@ # :",class:"compose-field-container",children:[e("textarea",{class:"compose-field",autoCapitalize:"sentences",autoComplete:"on",autoCorrect:"on",spellCheck:"true",dir:"auto",rows:"6",cols:"50",...M,ref:t,name:"status",value:c,onKeyDown:p=>{const{key:d,target:m}=p;if(d==="Enter"&&!(p.ctrlKey||p.metaKey))try{const{value:w,selectionStart:f}=m,k=w.slice(0,f).split(` -`).slice(-1)[0];if(k&&/^\s*(-|\d+\.)\s/.test(k)){const[K,ae,ce,Q,D]=k.match(/^(\s*)(-|\d+\.)(\s+)(.+)?/)||[];if(D){p.preventDefault();const[W]=ce.match(/\d+/)||[],H=W?`${+W+1}.`:"-",te=` -${ae}${H}${Q}`;m.setRangeText(te,f,f);const Z=f+te.length;m.setSelectionRange(Z,Z)}else{const W=f-k.length;m.setRangeText("",W,f)}Gt(m),m.dispatchEvent(new Event("input"))}}catch{}B.current&&(B.current.scrollTop=m.scrollTop)},onInput:p=>{var w;const{target:d}=p,m=d.value.replace(/\u200b/g,"");o(m),Gt(d),(w=s.onInput)==null||w.call(s,p),$(m),ie()},style:{width:"100%",height:"4em"},onScroll:p=>{if(B.current){const{scrollTop:d}=p.target;B.current.scrollTop=d}}}),e("div",{ref:B,class:"compose-highlight","aria-hidden":"true"})]})});function ki({maxCharacters:s=500,hidden:t}){const a=Fn(oe).composerCharacterCount,c=s-a;return t?e("span",{class:"char-counter",hidden:!0}):e("span",{class:"char-counter",title:`${c}/${s}`,style:{"--percentage":a/s*100},children:[e("meter",{class:`${c<=-10?"explode":c<=0?"danger":c<=20?"warning":""}`,value:a,max:s}),e("span",{class:"counter",children:c})]})}function Yt(s,t,n,a){const c=Math.sqrt(t/s),o=Math.floor(n*c),l=Math.floor(a*c);return{newWidth:o,newHeight:l}}function Ei({attachment:s,disabled:t,lang:n,onDescriptionChange:a=()=>{},onRemove:c=()=>{}}){const{i18n:o}=Ke(),[l,x]=U("default"),E=Je("@mastodon/edit-media-attributes"),{type:M,id:F,file:b}=s,T=je(()=>b?URL.createObjectURL(b):s.url,[b,s.url]),L=!!(b!=null&&b.size),B=L?Xt():{},{mediaAttachments:{imageSizeLimit:$,imageMatrixLimit:ie,videoSizeLimit:j,videoMatrixLimit:p,videoFrameRateLimit:d}={}}=B||{},[m,w]=U(()=>L?M.startsWith("image")&&$&&b.size>$?{type:"imageSizeLimit",details:{imageSize:b.size,imageSizeLimit:$}}:M.startsWith("video")&&j&&b.size>j?{type:"videoSizeLimit",details:{videoSize:b.size,videoSizeLimit:j}}:null:null),[f,O]=U({});ne(()=>{!L||!ie||(f==null?void 0:f.matrix)>ie&&w({type:"imageMatrixLimit",details:{imageMatrix:f==null?void 0:f.matrix,imageMatrixLimit:ie,width:f==null?void 0:f.width,height:f==null?void 0:f.height}})},[f,ie,L]);const[k,K]=U({});ne(()=>{!L||!p||(k==null?void 0:k.matrix)>p&&w({type:"videoMatrixLimit",details:{videoMatrix:k==null?void 0:k.matrix,videoMatrixLimit:p,width:k==null?void 0:k.width,height:k==null?void 0:k.height}})},[k,p,L]);const[ae,ce]=U(s.description),[Q,D]=M.split("/"),W=rt(a,250);ne(()=>{W(ae)},[ae,W]);const[H,te]=U(!1),Z=Y(null);ne(()=>{let g;return H&&Z.current&&(g=setTimeout(()=>{Z.current.focus()},100)),()=>{clearTimeout(g)}},[H]);const ue=e(Oe,{children:F&&!E?e("div",{class:"media-desc",children:[e("span",{class:"tag",children:e(V,{id:"3wG7HI"})}),e("p",{title:ae,children:s.description||e("i",{children:"No description"})})]}):e("textarea",{ref:Z,value:ae||"",lang:n,placeholder:{image:o._({id:"Lh8B0N"}),video:o._({id:"mN4S+e"}),audio:o._({id:"ieZytw"})}[Q],autoCapitalize:"sentences",autoComplete:"on",autoCorrect:"on",spellCheck:"true",dir:"auto",disabled:t||l==="loading",class:l==="loading"?"loading":"",maxlength:"1500",onInput:g=>{const{value:S}=g.target;ce(S)}})}),P=Y(null);ne(()=>()=>{var g,S;(S=(g=P.current)==null?void 0:g.hideToast)==null||S.call(g)},[]);const se=Y(null),fe=g=>{const{type:S,details:z}=g;switch(S){case"imageSizeLimit":{const{imageSize:ee,imageSizeLimit:N}=z;return o._({id:"d83/LB",values:{0:Xe(ee),1:Xe(N)}})}case"imageMatrixLimit":{const{imageMatrix:ee,imageMatrixLimit:N,width:de,height:pe}=z,{newWidth:_e,newHeight:Le}=Yt(ee,N,de,pe);return o._({id:"DuvOX/",values:{0:o.number(de),1:o.number(pe),2:o.number(_e),3:o.number(Le)}})}case"videoSizeLimit":{const{videoSize:ee,videoSizeLimit:N}=z;return o._({id:"d83/LB",values:{0:Xe(ee),1:Xe(N)}})}case"videoMatrixLimit":{const{videoMatrix:ee,videoMatrixLimit:N,width:de,height:pe}=z,{newWidth:_e,newHeight:Le}=Yt(ee,N,de,pe);return o._({id:"DuvOX/",values:{0:o.number(de),1:o.number(pe),2:o.number(_e),3:o.number(Le)}})}case"videoFrameRateLimit":return o._({id:"S1fBwy"})}};return e(Oe,{children:[e("div",{class:"media-attachment",children:[e("div",{class:"media-preview",tabIndex:"0",onClick:()=>{te(!0)},children:Q==="image"?e("img",{src:T,alt:"",onLoad:g=>{if(!L)return;const{naturalWidth:S,naturalHeight:z}=g.target;O({matrix:S*z,width:S,height:z})}}):Q==="video"||Q==="gifv"?e("video",{src:T+"#t=0.1",playsinline:!0,muted:!0,disablePictureInPicture:!0,preload:"metadata",onLoadedMetadata:g=>{if(!L)return;const{videoWidth:S,videoHeight:z}=g.target;S&&z&&K({matrix:S*z,width:S,height:z})}}):Q==="audio"?e("audio",{src:T,controls:!0}):null}),ue,e("div",{class:"media-aside",children:[e("button",{type:"button",class:"plain close-button",disabled:t,onClick:c,children:e(J,{icon:"x",alt:o._({id:"t/YqKh"})})}),!!m&&e("button",{type:"button",class:"media-error",title:fe(m),onClick:()=>{se.current&&se.current.hideToast(),se.current=Ce({text:fe(m),duration:1e4})},children:e(J,{icon:"alert",alt:o._({id:"SlfejT"})})})]})]}),H&&e(Qe,{onClose:()=>{te(!1)},children:e("div",{id:"media-sheet",class:"sheet sheet-max",children:[e("button",{type:"button",class:"sheet-close",onClick:()=>{te(!1)},children:e(J,{icon:"x",alt:o._({id:"yz7wBu"})})}),e("header",{children:e("h2",{children:{image:o._({id:"oMslIB"}),video:o._({id:"WZw+zB"}),audio:o._({id:"KMtgtM"})}[Q]})}),e("main",{tabIndex:"-1",children:[e("div",{class:"media-preview",children:Q==="image"?e("img",{src:T,alt:""}):Q==="video"||Q==="gifv"?e("video",{src:T,playsinline:!0,controls:!0}):Q==="audio"?e("audio",{src:T,controls:!0}):null}),e("div",{class:"media-form",children:[ue,e("footer",{children:[Q==="image"&&/^(png|jpe?g|gif|webp)$/i.test(D)&&!!oe.settings.mediaAltGenerator&&!!vt&&e(Rn,{portal:{target:document.body},containerProps:{style:{zIndex:1001}},align:"center",position:"anchor",overflow:"auto",menuButton:e("button",{type:"button",class:"plain",children:e(J,{icon:"more",size:"l",alt:o._({id:"2FYpfJ"})})}),children:[e(Ot,{disabled:l==="loading",onClick:()=>{x("loading"),P.current=Ce({text:o._({id:"8zsp51"}),duration:-1}),async function(){var g,S;try{const z=new FormData;z.append("image",b);const ee=await fetch(vt,{method:"POST",body:z}).then(N=>N.json());if(ee.error)throw new Error(ee.error);ce(ee.description)}catch(z){Ce(z.message?o._({id:"wy0Iwj",values:{0:z.message}}):o._({id:"xhYfVj"}))}finally{x("default"),(S=(g=P.current)==null?void 0:g.hideToast)==null||S.call(g)}}()},children:[e(J,{icon:"sparkles2"}),n&&n!=="en"?e("small",{children:[e(V,{id:"o5sTJw"}),e("br",{}),"(English)"]}):e("span",{children:e(V,{id:"o5sTJw"})})]}),!!n&&n!=="en"&&e(Ot,{disabled:l==="loading",onClick:()=>{x("loading"),P.current=Ce({text:o._({id:"8zsp51"}),duration:-1}),async function(){var g,S;try{const z=new FormData;z.append("image",b);const ee=`?lang=${n}`,N=await fetch(vt+ee,{method:"POST",body:z}).then(de=>de.json());if(N.error)throw new Error(N.error);ce(N.description)}catch(z){Ce(o._({id:"eNTGfp",values:{0:z!=null&&z.message?`: ${z.message}`:""}}))}finally{x("default"),(S=(g=P.current)==null?void 0:g.hideToast)==null||S.call(g)}}()},children:[e(J,{icon:"sparkles2"}),e("small",{children:[e(V,{id:"o5sTJw"}),e("br",{}),e(V,{id:"m+pAEQ",values:{0:xt(n)},components:{0:e("span",{class:"more-insignificant"})}})]})]})]}),e("button",{type:"button",class:"light block",onClick:()=>{te(!1)},disabled:l==="loading",children:e(V,{id:"DPfwMq"})})]})]})]})]})})]})}function Fi({lang:s,poll:t,disabled:n,onInput:a=()=>{},maxOptions:c,maxExpiration:o,minExpiration:l,maxCharactersPerOption:x}){const{_:E}=Ke(),{options:M,expiresIn:F,multiple:b}=t;return e("div",{class:`poll ${b?"multiple":""}`,children:[e("div",{class:"poll-choices",children:M.map((T,L)=>e("div",{class:"poll-choice",children:[e("input",{required:!0,type:"text",value:T,disabled:n,maxlength:x,placeholder:ge._({id:"LDUSXg",values:{0:L+1}}),lang:s,spellCheck:"true",dir:"auto",onInput:B=>{const{value:$}=B.target;M[L]=$,a(t)}}),e("button",{type:"button",class:"plain2 poll-button",disabled:n||M.length<=1,onClick:()=>{M.splice(L,1),a(t)},children:e(J,{icon:"x",size:"s",alt:ge._({id:"t/YqKh"})})})]},L))}),e("div",{class:"poll-toolbar",children:[e("button",{type:"button",class:"plain2 poll-button",disabled:n||M.length>=c,onClick:()=>{M.push(""),a(t)},children:"+"})," ",e("label",{class:"multiple-choices",children:[e("input",{type:"checkbox",checked:b,disabled:n,onChange:T=>{const{checked:L}=T.target;t.multiple=L,a(t)}})," ",e(V,{id:"T57mm9"})]}),e("label",{class:"expires-in",children:[e(V,{id:"lkz6PL"})," ",e("select",{value:F,disabled:n,onChange:T=>{const{value:L}=T.target;t.expiresIn=L,a(t)},children:Object.entries(tn).filter(([T])=>T>=l&&T<=o).map(([T,L])=>e("option",{value:T,children:L()},T))})]})]}),e("div",{class:"poll-toolbar",children:e("button",{type:"button",class:"plain remove-poll-button",disabled:n,onClick:()=>{a(null)},children:e(V,{id:"CDpQAX"})})})]})}function we(s){return s.replace(/[&<>"']/g,function(t){return"&#"+t.charCodeAt(0)+";"})}function Zt(s){for(let t in s)(s[t]===null||s[t]===void 0)&&delete s[t];return s}function Ci({onClose:s=()=>{},onSelect:t=()=>{},defaultSearchTerm:n}){const{masto:a}=_t(),[c,o]=U("default"),[l,x]=U([]),[E,M]=U({}),[F,b]=U(0),T=async p=>{if(!(p!=null&&p.length))return;const d=await Dn(p,E);d&&M({...E,...d})},L=p=>{p&&(o("loading"),(async()=>{try{const d=await a.v1.accounts.search.list({q:p,limit:40,resolve:!1});x(d),T(d),o("default")}catch{o("error")}})())},B=rt(L,1e3);ne(()=>{L()},[L]);const $=Y();ne(()=>{$.current&&($.current.focus(),$.current.value&&($.current.selectionStart=$.current.value.length,$.current.selectionEnd=$.current.value.length))},[]),ne(()=>{n&&L(n)},[n]);const ie=p=>{const d=p.acct;t(d),s()};$e("enter",()=>{const p=l[F];p&&ie(p)},{preventDefault:!0,enableOnFormTags:["input"]});const j=Y();return $e("down",()=>{F{const p=j.current.querySelector(".selected");p&&p.scrollIntoView({behavior:"smooth",block:"center",inline:"center"})},1)},{preventDefault:!0,enableOnFormTags:["input"]}),$e("up",()=>{F>0?b(F-1):b(l.length-1),setTimeout(()=>{const p=j.current.querySelector(".selected");p&&p.scrollIntoView({behavior:"smooth",block:"center",inline:"center"})},1)},{preventDefault:!0,enableOnFormTags:["input"]}),e("div",{id:"mention-sheet",class:"sheet",children:[!!s&&e("button",{type:"button",class:"sheet-close",onClick:s,children:e(J,{icon:"x",alt:ge._({id:"yz7wBu"})})}),e("header",{children:e("form",{onSubmit:p=>{var d;p.preventDefault(),(d=B.flush)==null||d.call(B)},children:e("input",{ref:$,required:!0,type:"search",class:"block",placeholder:ge._({id:"eH1bqp"}),onInput:p=>{const{value:d}=p.target;B(d)},autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellCheck:"false",dir:"auto",defaultValue:n||""})})}),e("main",{children:(l==null?void 0:l.length)>0?e("ul",{ref:j,class:`accounts-list ${c==="loading"?"loading":""}`,children:l.map((p,d)=>{const m=E[p.id];return e("li",{class:d===F?"selected":"",children:[e(Qt,{avatarSize:"xxl",account:p,relationship:m,showStats:!0,showActivity:!0}),e("button",{type:"button",class:"plain2",onClick:()=>{ie(p)},children:e(J,{icon:"plus",size:"xl",alt:ge._({id:"m16xKo"})})})]},p.id)})}):c==="loading"?e("div",{class:"ui-state",children:e(at,{abrupt:!0})}):c==="error"?e("div",{class:"ui-state",children:e("p",{children:e(V,{id:"AThL/k"})})}):null})]})}function zi({masto:s,instance:t,onClose:n=()=>{},onSelect:a=()=>{},defaultSearchTerm:c}){const[o,l]=U("default"),x=Y([]),[E,M]=U([]),F=je(()=>Se.account.get("recentlyUsedCustomEmojis")||[]),b=Y();ne(()=>{l("loading"),(async()=>{try{const[d,m]=await sn(t,s);b.current=m,M(d),l("default")}catch{l("error")}})()},[]);const T=je(()=>{const d={"--recent--":F.filter(w=>E.find(f=>f.shortcode===w.shortcode))},m=[];return E.forEach(w=>{var f,O;if((O=(f=x.current)==null?void 0:f.push)==null||O.call(f,w),!w.category){m.push(w);return}d[w.category]||(d[w.category]=[]),d[w.category].push(w)}),m.length&&(d["--others--"]=m),d},[E]),L=Y(),[B,$]=U(null),ie=Dt(d=>{var w,f,O;const{value:m}=d.target;if(m){const k=(w=b.current)==null?void 0:w.search(m,{limit:zt});$(k.map(K=>K.item)),(O=(f=L.current)==null?void 0:f.scrollTo)==null||O.call(f,0,0)}else $(null)},[E]);ne(()=>{c&&(E!=null&&E.length)&&ie({target:{value:c}})},[c,ie,E]);const j=Dt(d=>{a==null||a(d),n==null||n(),queueMicrotask(()=>{let m=Se.account.get("recentlyUsedCustomEmojis")||[];const w=m.findIndex(f=>f.shortcode===d.shortcode);w!==-1?(m.splice(w,1),m.unshift(d)):(m.unshift(d),m=m.filter(f=>{var O,k;return(k=(O=x.current)==null?void 0:O.find)==null?void 0:k.call(O,K=>K.shortcode===f.shortcode)}),m=m.slice(0,10)),Se.account.set("recentlyUsedCustomEmojis",m)})},[a]),p=Y();return ne(()=>{p.current&&(p.current.focus(),p.current.value&&(p.current.selectionStart=p.current.value.length,p.current.selectionEnd=p.current.value.length))},[]),e("div",{id:"custom-emojis-sheet",class:"sheet",children:[!!n&&e("button",{type:"button",class:"sheet-close",onClick:n,children:e(J,{icon:"x",alt:ge._({id:"yz7wBu"})})}),e("header",{children:[e("div",{children:[e("b",{children:e(V,{id:"8i6Ueo"})})," ",o==="loading"?e(at,{}):e("small",{class:"insignificant",children:[" • ",t]})]}),e("form",{onSubmit:d=>{d.preventDefault();const m=B[0];m&&j(`:${m.shortcode}:`)},children:e("input",{ref:p,type:"search",placeholder:ge._({id:"EarrCe"}),onInput:ie,autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellCheck:"false",dir:"auto",defaultValue:c||""})})]}),e("main",{ref:L,children:B!==null?e("ul",{class:"custom-emojis-matches custom-emojis-list",children:B.map(d=>e("li",{class:"custom-emojis-match",children:e(an,{emoji:d,onClick:()=>{j(`:${d.shortcode}:`)},showCode:!0})},d.shortcode))}):e("div",{class:"custom-emojis-list",children:[o==="error"&&e("div",{class:"ui-state",children:e("p",{children:e(V,{id:"Kzwsg2"})})}),o==="default"&&Object.entries(T).map(([d,m])=>!!(m!=null&&m.length)&&e("div",{class:"section-container",children:[e("div",{class:"section-header",children:{"--recent--":ge._({id:"uabU9X"}),"--others--":ge._({id:"NuKR0h"})}[d]||d}),e(_i,{emojis:m,onSelect:j})]}))]})})]})}const _i=Jt(({emojis:s,onSelect:t})=>{const{i18n:n}=Ke(),[a,c]=U(zt),o=s.length>a;return e("section",{children:[s.slice(0,a).map(l=>e(an,{emoji:l,onClick:()=>{t(`:${l.shortcode}:`)}},l.shortcode)),o&&e("button",{type:"button",class:"plain small",onClick:()=>c(a+zt),children:e(V,{id:"iAB71E",values:{0:n.number(s.length-a)}})})]})}),an=Jt(({emoji:s,onClick:t,showCode:n})=>{const a=c=>{const l=c.currentTarget.closest("main");if(l){const x=l.getBoundingClientRect(),E=c.currentTarget.getBoundingClientRect(),M=c.currentTarget.classList;E.leftx.right-88?(M.add("edge-right"),M.remove("edge-left")):M.remove("edge-left","edge-right")}};return e("button",{type:"button",className:"plain4",onClick:t,"data-title":n?void 0:s.shortcode,onPointerEnter:a,onFocus:a,children:[e("picture",{children:[!!s.staticUrl&&e("source",{srcSet:s.staticUrl,media:"(prefers-reduced-motion: reduce)"}),e("img",{className:"shortcode-emoji",src:s.url||s.staticUrl,alt:s.shortcode,width:"24",height:"24",loading:"lazy",decoding:"async"})]}),n&&e(Oe,{children:[" ",e("code",{children:s.shortcode})]})]})}),yt=20;function Li({onClose:s=()=>{},onSelect:t=()=>{}}){var L,B,$,ie,j,p;const{i18n:n}=Ke(),[a,c]=U("default"),[o,l]=U([]),x=Y(null),E=Y(null),M=Y(0),F=Y(null);function b({offset:d}){var m,w,f;(m=E.current)!=null&&m.value&&(c("loading"),(f=(w=F.current)==null?void 0:w.scrollTo)==null||f.call(w,{top:0,left:0,behavior:"smooth"}),(async()=>{var O;try{const k={api_key:ii,q:E.current.value,rating:"g",limit:yt,bundle:"messaging_non_clips",offset:d,lang:n.locale||"en"},K=await fetch("https://api.giphy.com/v1/gifs/search?"+new URLSearchParams(k),{referrerPolicy:"no-referrer"}).then(ae=>ae.json());M.current=((O=K.pagination)==null?void 0:O.offset)||0,l(K),c("results")}catch{c("error")}})())}ne(()=>{var d;(d=E.current)==null||d.focus()},[]);const T=rt(()=>{b({offset:0})},1e3);return e("div",{id:"gif-picker-sheet",class:"sheet",children:[!!s&&e("button",{type:"button",class:"sheet-close",onClick:s,children:e(J,{icon:"x",alt:n._({id:"yz7wBu"})})}),e("header",{children:e("form",{ref:x,onSubmit:d=>{d.preventDefault(),b({offset:0})},children:[e("input",{ref:E,type:"search",name:"q",placeholder:n._({id:"wxlF9B"}),required:!0,autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellCheck:"false",dir:"auto",onInput:T}),e("input",{type:"image",class:"powered-button",src:Qn,width:"86",height:"30",alt:n._({id:"c1Q/eU"})})]})}),e("main",{ref:F,class:a==="loading"?"loading":"",children:[a==="default"&&e("div",{class:"ui-state",children:e("p",{class:"insignificant",children:e(V,{id:"9KEidY"})})}),a==="loading"&&!((L=o==null?void 0:o.data)!=null&&L.length)&&e("div",{class:"ui-state",children:e(at,{abrupt:!0})}),((B=o==null?void 0:o.data)==null?void 0:B.length)>0?e(Oe,{children:[e("ul",{children:o.data.map(d=>{const{id:m,images:w,title:f,alt_text:O}=d,{fixed_height_small:k,fixed_height_downsampled:K,fixed_height:ae,original:ce}=w,Q=k!=null&&k.url?k:K!=null&&K.url?K:ae;let{url:D,webp:W,width:H,height:te}=Q;+te>100&&(H=H/te*100,te=100);const Z=URL.parse(D),ue=Z.origin+Z.pathname;let P;if(W){const se=URL.parse(W);P=se.origin+se.pathname}return e("li",{children:e("button",{type:"button",onClick:()=>{const{mp4:se,url:fe}=ce,g=se||fe,S=URL.parse(g),z=S.origin+S.pathname;s(),t({url:z,type:se?"video/mp4":"image/gif",alt_text:O||f})},children:e("figure",{style:{"--figure-width":H+"px"},children:[e("picture",{children:[P&&e("source",{srcset:P,type:"image/webp"}),e("img",{src:ue,width:H,height:te,loading:"lazy",decoding:"async",alt:O,referrerpolicy:"no-referrer",onLoad:se=>{se.target.style.backgroundColor="transparent"}})]}),e("figcaption",{children:O||f})]})})},m)})}),e("p",{class:"pagination",children:[(($=o.pagination)==null?void 0:$.offset)>0&&e("button",{type:"button",class:"light small",disabled:a==="loading",onClick:()=>{var d;b({offset:((d=o.pagination)==null?void 0:d.offset)-yt})},children:[e(J,{icon:"chevron-left"}),e("span",{children:e(V,{id:"DHhJ7s"})})]}),e("span",{}),((ie=o.pagination)==null?void 0:ie.offset)+((j=o.pagination)==null?void 0:j.count)<((p=o.pagination)==null?void 0:p.total_count)&&e("button",{type:"button",class:"light small",disabled:a==="loading",onClick:()=>{var d;b({offset:((d=o.pagination)==null?void 0:d.offset)+yt})},children:[e("span",{children:e(V,{id:"hXzOVo"})})," ",e(J,{icon:"chevron-right"})]})]})]}):a==="results"&&e("div",{class:"ui-state",children:e("p",{children:"No results"})}),a==="error"&&e("div",{class:"ui-state",children:e("p",{children:e(V,{id:"PbFw9n"})})})]})]})}export{Mi as default}; -//# sourceMappingURL=compose-hDlR2o-x.js.map diff --git a/assets/compose-hDlR2o-x.js.map b/assets/compose-hDlR2o-x.js.map deleted file mode 100644 index 2cf2d7a..0000000 --- a/assets/compose-hDlR2o-x.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"mappings":"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","names":["Combobox","input","list","tabInsertsSuggestions","defaultFirstOption","event","keyboardBindings","trackComposition","commitWithElement","_a","visible","indexDiff","focusEl","els","focusIndex","indexOfItem","newIndex","target","el","scrollTo","combobox","commit","fireCommitEvent","container","inViewport","element","scrollTop","containerBottom","top","bottom","boundary","query","text","key","cursor","multiWord","lookBackIndex","lastMatchPosition","keyIndex","pre","CustomHTMLElement","InputStyleCloneUpdateEvent","CloneRegistry","_InputStyleCloneElement","__privateAdd","_InputStyleCloneElement_instances","_styleObserver","__privateMethod","updateStyles_fn","_resizeObserver","requestUpdateLayout_fn","_inputRef","_container","_xOffset","_yOffset","_isLayoutUpdating","_onInput","updateText_fn","_onDocumentScrollOrResize","usingInput_fn","clone","__privateSet","__privateGet","input_get","fn","updateLayout_fn","inputStyle","inputRect","cloneRect","prop","propertiesToCopy","InputStyleCloneElement","e","_InputRange","startOffset","endOffset","_InputRange_instances","_inputElement","_startOffset","_endOffset","selectionStart","selectionEnd","offset","clampOffset_fn","toStart","createCloneRange_fn","styleClone_get","cloneElement_get","range","textNode","InputRange","states","TextExpander","expander","match","menu","_b","position","caretRect","targetPosition","currentPosition","delta","currentStyle","item","beginning","remaining","detail","suffix","value","found","providers","provide","result","TextExpanderElement","keysAttr","keys","multiWordAttr","globalMultiWord","state","ansiRegex","onlyFirst","pattern","regex","stripAnsi","string","segmenter","stringLength","countAnsiEscapeCodes","length","_","poweredByGiphyURL","BYTES_UNITS","prettyBytes","bytes","unitIndex","Math","min","floor","log2","i18n","number","style","unit","unitDisplay","maximumFractionDigits","PHANPY_IMG_ALT_API_URL","IMG_ALT_API_URL","PHANPY_GIPHY_API_KEY","GIPHY_API_KEY","import","supportedLanguagesMap","supportedLanguages","reduce","acc","l","code","common","native","expiryOptions","i18nDuration","expirySeconds","Object","oneDay","expiresInFromExpiresAt","expiresAt","Date","getTime","now","find","s","document","createElement","role","className","windowMargin","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","left","width","boundingClientRect","innerWidth","window","insetInlineStart","isRTL","observe","DEFAULT_LANG","localeMatch","Intl","DateTimeFormat","resolvedOptions","locale","navigator","languages","map","urlRegexObj","RegExp","urlRegex","source","flags","usernameRegex","urlPlaceholder","countableText","inputText","replace","USERNAME_RE","MENTION_RE","HASHTAG_RE","SHORTCODE_RE_FRAGMENT","SCAN_RE","Segmenter","escapeHTML","highlightText","maxCharacters","Infinity","composerCharacterCount","withinLimitHTML","exceedLimitHTML","htmlSegments","segment","index","RTF","mem","RelativeTimeFormat","undefined","CUSTOM_EMOJIS_COUNT","Compose","onClose","replyToStatus","editStatus","draftStatus","standalone","hasOpener","useLingui","rtf","console","masto","instance","uiState","setUIState","useState","UID","uid","log","currentAccount","currentAccountInfo","maxMediaAttachments","charactersReservedPerUrl","imageMatrixLimit","supportedMimeTypes","imageSizeLimit","videoSizeLimit","videoMatrixLimit","videoFrameRateLimit","maxExpiration","maxOptions","maxCharactersPerOption","minExpiration","spoilerTextRef","useRef","textareaRef","store","prevLanguage","language","sensitive","setMediaAttachments","setLanguage","oninputTextarea","poll","account","focusTextarea","dispatchEvent","setTimeout","spoilerText","useEffect","visibility2","language2","sensitive2","visibility","current","m","allMentions","prefs","setSensitive","poll2","mediaAttachments","options","expiresIn","statusSource","dataset","mediaAttachments2","setVisibility","composablePoll","status","o","formRef","canClose","id","hasValue","hasMediaAttachments","isSelf","hasOnlyAcct","confirmClose","hasIDMediaAttachments","beforeUnloadCopy","handleBeforeUnload","sameWithSource","getCharCount","updateCharCount","supportsCloseWatcher","useHotkeys","yes","addEventListener","capture","modals","hasModal","hasOnlyComposer","prevBackgroundDraft","count","escDownRef","ignoreEventWhen","useCloseWatcher","draftKey","getCurrentAccountNS","backgroundDraft","useInterval","db","handleItems","username","acct","items","i2","file","debug","drafts","updatedAt","error","max","allowedFiles","i18n2","del","files","mediaFiles","alert","handleDragover","showMentionPicker","setShowMentionPicker","setShowEmoji2Picker","setShowGIFPicker","setAutoDetectedLanguages","topLanguages","restLanguages","commonB","type","size","url","codeA","commonA","codeB","autoDetectedLanguages","useMemo","onMinimize","saveUnsavedDraft","_jsxs","dataTransfer","_jsx","showEmoji2Picker","showGIFPicker","topSupportedLanguages","children","class","confirmText","passData","__STATES__","opener","composerState","Icon","settings","sort","avatarStatic","disabled","onClick","Status","replyToStatusMonthsAgo","Trans","formData","components","0","media","onKeyDown","onSubmit","description","params2","res","attachment","results","mediaPromises","hasNoDescriptions","params","removeNullUndefined","newStatus","saveStatus","i","e2","media_attributes","in_reply_to_id","statuses","visibilityIconsMap","opacity","pointerEvents","checked","onChange","icon","title","limit","action","Textarea","ref","placeholder","fileID","newAttachments","attachments","j","performSearch","q","v1","resolve","v2","fetch","onTrigger","defaultSearchTerm","Poll","newPoll","setPoll","onDescriptionChange","onInput","_Fragment","accept","multiple","Loader","CharCountMeter","commonText","localeCode2Text","restSupportedLanguages","textarea","textBeforeMention","spaceAfterMention","textAfterMention","newText","Modal","CustomEmojisModal","emojiShortcode","textBeforeEmoji","spaceBeforeEmoji","spaceAfterEmoji","textAfterEmoji","GIFPickerModal","alt_text","theToast","showToast","onSelect","autoResizeTextarea","scrollHeight","clientHeight","offsetHeight","height","_getCustomEmojis","visibleEmojis","searcher","getCustomEmojis","pmem","blob","keyArg","newMediaAttachments","lang","props","textareaProps","searcherRef","r","handleChange","text2","emojis","filter","Fuse","matchesArg","cacheKeyArg","emoji","detectLangs","shortcode","detectAll","langs","encodeHTML","forwardRef","html","textExpanderTextRef","history","displayNameWithEmoji","emojifyText","displayName","search","total","cur","name","shortenNumber","Promise","matched","then","v","more","textExpanderRef","handleValue","handleCommited","setText","slowHighlightPerf","composeHighlightRef","start","end","debouncedAutoDetectLanguage","useDebouncedCallback","dom","mark","resizeObserver","throttleHighlightText","lastLine","bullet","postSpaces","anything","newBullet","pos","dir","rows","cols","hidden","charCount","leftChars","ctrlKey","setRangeText","setSelectionRange","scaleDimension","matrix","matrixLimit","scalingFactor","newHeight","newWidth","MediaAttachment","supportsEdit","supports","onScroll","configuration","getCurrentInstanceConfiguration","maxError","setMaxError","checkMaxError","snapStates","imageMatrix","videoMatrix","setDescription","debouncedOnDescriptionChange","timer","details","setImageMatrix","setVideoMatrix","toastRef","showModal","imageSizeLimit2","descTextarea","videoSize","videoSizeLimit2","videoMatrixLimit2","videoMatrix2","maxErrorToast","maxErrorText","err","imageSize","suffixType","naturalWidth","naturalHeight","1","2","3","videoWidth","videoHeight","values","setShowModal","src","onLoad","onLoadedMetadata","onRemove","alt","subtype","Menu2","MenuItem","body","response","zIndex","menuButton","append","option","required","label","splice","str","char","obj","push","MentionModal","api","accounts","setAccounts","relationshipsMap","setRelationshipsMap","setSelectedIndex","accounts2","fetchRelationships","relationships","loadAccounts","inputRef","filterShortcodes","searchTerm","bLower","aStartsWith","bStartsWith","aContains","bothContain","bContains","socialAddress","selectedAccount","selectedIndex","selectAccount","listRef","selectedItem","loadRelationships","term","debouncedLoadAccounts","enableOnFormTags","relationship","AccountBlock","customEmojisList","recentlyUsedCustomEmojis","customEmojisCatList","emojisCat","customEmojis","othersCat","matches","setMatches","_c","scrollableRef","onFind","onSelectEmoji","useCallback","recentlyUsedCustomEmojis2","recentlyUsedEmojiIndex","emoji2","setCustomEmojis","category","queueMicrotask","CustomEmojisList","memo","setMax","CustomEmojiButton","showMore","showCode","parent","selfRect","rect","targetClassList","addEdges","GIFS_PER_PAGE","slice","fetchGIFs","qRef","closest","currentTarget","remove","debouncedOnInput","onPointerEnter","staticUrl","decoding","setResults","currentOffset","gif","images","fixed_height_small","fixed_height_downsampled","fixed_height","theImage","webp","urlObj","strippedURL","strippedWebP","preventDefault","original","theURL","mp4","url2","strippedURL2","webpObj","parse"],"ignoreList":[0,1,2,3,4],"sources":["../../node_modules/@github/combobox-nav/dist/index.js","../../node_modules/@github/text-expander-element/dist/index.js","../../node_modules/ansi-regex/index.js","../../node_modules/strip-ansi/index.js","../../node_modules/string-length/index.js","../../src/assets/powered-by-giphy.svg","../../src/utils/pretty-bytes.js","../../src/components/compose.jsx"],"sourcesContent":["export default class Combobox {\n constructor(input, list, { tabInsertsSuggestions, defaultFirstOption } = {}) {\n this.input = input;\n this.list = list;\n this.tabInsertsSuggestions = tabInsertsSuggestions !== null && tabInsertsSuggestions !== void 0 ? tabInsertsSuggestions : true;\n this.defaultFirstOption = defaultFirstOption !== null && defaultFirstOption !== void 0 ? defaultFirstOption : false;\n this.isComposing = false;\n if (!list.id) {\n list.id = `combobox-${Math.random().toString().slice(2, 6)}`;\n }\n this.ctrlBindings = !!navigator.userAgent.match(/Macintosh/);\n this.keyboardEventHandler = event => keyboardBindings(event, this);\n this.compositionEventHandler = event => trackComposition(event, this);\n this.inputHandler = this.clearSelection.bind(this);\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-controls', list.id);\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-haspopup', 'listbox');\n }\n destroy() {\n this.clearSelection();\n this.stop();\n this.input.removeAttribute('role');\n this.input.removeAttribute('aria-controls');\n this.input.removeAttribute('aria-expanded');\n this.input.removeAttribute('aria-autocomplete');\n this.input.removeAttribute('aria-haspopup');\n }\n start() {\n this.input.setAttribute('aria-expanded', 'true');\n this.input.addEventListener('compositionstart', this.compositionEventHandler);\n this.input.addEventListener('compositionend', this.compositionEventHandler);\n this.input.addEventListener('input', this.inputHandler);\n this.input.addEventListener('keydown', this.keyboardEventHandler);\n this.list.addEventListener('click', commitWithElement);\n this.indicateDefaultOption();\n }\n stop() {\n this.clearSelection();\n this.input.setAttribute('aria-expanded', 'false');\n this.input.removeEventListener('compositionstart', this.compositionEventHandler);\n this.input.removeEventListener('compositionend', this.compositionEventHandler);\n this.input.removeEventListener('input', this.inputHandler);\n this.input.removeEventListener('keydown', this.keyboardEventHandler);\n this.list.removeEventListener('click', commitWithElement);\n }\n indicateDefaultOption() {\n var _a;\n if (this.defaultFirstOption) {\n (_a = Array.from(this.list.querySelectorAll('[role=\"option\"]:not([aria-disabled=\"true\"])'))\n .filter(visible)[0]) === null || _a === void 0 ? void 0 : _a.setAttribute('data-combobox-option-default', 'true');\n }\n }\n navigate(indexDiff = 1) {\n const focusEl = Array.from(this.list.querySelectorAll('[aria-selected=\"true\"]')).filter(visible)[0];\n const els = Array.from(this.list.querySelectorAll('[role=\"option\"]')).filter(visible);\n const focusIndex = els.indexOf(focusEl);\n if ((focusIndex === els.length - 1 && indexDiff === 1) || (focusIndex === 0 && indexDiff === -1)) {\n this.clearSelection();\n this.input.focus();\n return;\n }\n let indexOfItem = indexDiff === 1 ? 0 : els.length - 1;\n if (focusEl && focusIndex >= 0) {\n const newIndex = focusIndex + indexDiff;\n if (newIndex >= 0 && newIndex < els.length)\n indexOfItem = newIndex;\n }\n const target = els[indexOfItem];\n if (!target)\n return;\n for (const el of els) {\n el.removeAttribute('data-combobox-option-default');\n if (target === el) {\n this.input.setAttribute('aria-activedescendant', target.id);\n target.setAttribute('aria-selected', 'true');\n scrollTo(this.list, target);\n }\n else {\n el.removeAttribute('aria-selected');\n }\n }\n }\n clearSelection() {\n this.input.removeAttribute('aria-activedescendant');\n for (const el of this.list.querySelectorAll('[aria-selected=\"true\"]')) {\n el.removeAttribute('aria-selected');\n }\n this.indicateDefaultOption();\n }\n}\nfunction keyboardBindings(event, combobox) {\n if (event.shiftKey || event.metaKey || event.altKey)\n return;\n if (!combobox.ctrlBindings && event.ctrlKey)\n return;\n if (combobox.isComposing)\n return;\n switch (event.key) {\n case 'Enter':\n if (commit(combobox.input, combobox.list)) {\n event.preventDefault();\n }\n break;\n case 'Tab':\n if (combobox.tabInsertsSuggestions && commit(combobox.input, combobox.list)) {\n event.preventDefault();\n }\n break;\n case 'Escape':\n combobox.clearSelection();\n break;\n case 'ArrowDown':\n combobox.navigate(1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n combobox.navigate(-1);\n event.preventDefault();\n break;\n case 'n':\n if (combobox.ctrlBindings && event.ctrlKey) {\n combobox.navigate(1);\n event.preventDefault();\n }\n break;\n case 'p':\n if (combobox.ctrlBindings && event.ctrlKey) {\n combobox.navigate(-1);\n event.preventDefault();\n }\n break;\n default:\n if (event.ctrlKey)\n break;\n combobox.clearSelection();\n }\n}\nfunction commitWithElement(event) {\n if (!(event.target instanceof Element))\n return;\n const target = event.target.closest('[role=\"option\"]');\n if (!target)\n return;\n if (target.getAttribute('aria-disabled') === 'true')\n return;\n fireCommitEvent(target);\n}\nfunction commit(input, list) {\n const target = list.querySelector('[aria-selected=\"true\"], [data-combobox-option-default=\"true\"]');\n if (!target)\n return false;\n if (target.getAttribute('aria-disabled') === 'true')\n return true;\n target.click();\n return true;\n}\nfunction fireCommitEvent(target) {\n target.dispatchEvent(new CustomEvent('combobox-commit', { bubbles: true }));\n}\nfunction visible(el) {\n return (!el.hidden &&\n !(el instanceof HTMLInputElement && el.type === 'hidden') &&\n (el.offsetWidth > 0 || el.offsetHeight > 0));\n}\nfunction trackComposition(event, combobox) {\n combobox.isComposing = event.type === 'compositionstart';\n const list = document.getElementById(combobox.input.getAttribute('aria-controls') || '');\n if (!list)\n return;\n combobox.clearSelection();\n}\nfunction scrollTo(container, target) {\n if (!inViewport(container, target)) {\n container.scrollTop = target.offsetTop;\n }\n}\nfunction inViewport(container, element) {\n const scrollTop = container.scrollTop;\n const containerBottom = scrollTop + container.clientHeight;\n const top = element.offsetTop;\n const bottom = top + element.clientHeight;\n return top >= scrollTop && bottom <= containerBottom;\n}\n","import Combobox from '@github/combobox-nav';\n\nconst boundary = /\\s|\\(|\\[/;\nfunction query(text, key, cursor, { multiWord, lookBackIndex, lastMatchPosition } = {\n multiWord: false,\n lookBackIndex: 0,\n lastMatchPosition: null\n}) {\n let keyIndex = text.lastIndexOf(key, cursor - 1);\n if (keyIndex === -1)\n return;\n if (keyIndex < lookBackIndex)\n return;\n if (multiWord) {\n if (lastMatchPosition != null) {\n if (lastMatchPosition === keyIndex)\n return;\n keyIndex = lastMatchPosition - key.length;\n }\n const charAfterKey = text[keyIndex + 1];\n if (charAfterKey === ' ' && cursor >= keyIndex + key.length + 1)\n return;\n const newLineIndex = text.lastIndexOf('\\n', cursor - 1);\n if (newLineIndex > keyIndex)\n return;\n const dotIndex = text.lastIndexOf('.', cursor - 1);\n if (dotIndex > keyIndex)\n return;\n }\n else {\n const spaceIndex = text.lastIndexOf(' ', cursor - 1);\n if (spaceIndex > keyIndex)\n return;\n }\n const pre = text[keyIndex - 1];\n if (pre && !boundary.test(pre))\n return;\n const queryString = text.substring(keyIndex + key.length, cursor);\n return {\n text: queryString,\n position: keyIndex + key.length\n };\n}\n\n/**\n * A custom element is implemented as a class which extends HTMLElement (in the\n * case of autonomous elements) or the interface you want to customize (in the\n * case of customized built-in elements).\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks\n */\nclass CustomHTMLElement extends HTMLElement {\n}\n\nclass InputStyleCloneUpdateEvent extends Event {\n constructor() {\n super(\"update\");\n }\n}\nconst CloneRegistry = new WeakMap();\n/**\n * Create an element that exactly matches an input pixel-for-pixel and automatically stays in sync with it. This\n * is a non-interactive overlay on to the input and can be used to affect the visual appearance of the input\n * without modifying its behavior. The clone element is hidden by default.\n *\n * This lower level API powers the `InputRange` but provides more advanced functionality including event updates.\n *\n * Emits `update` events whenever anything is recalculated: when the layout changes, when the user scrolls, when the\n * input is updated, etc. This event may be emitted more than once per change.\n *\n * @note There may be cases in which the clone cannot observe changes to the input and fails to automatically update.\n * For example, if the `value` property on the input is written to directly, no `input` event is emitted by the input\n * and the clone does not automatically update. In these cases, `forceUpdate` can be used to manually trigger an update.\n */\n// PRIOR ART: This approach was adapted from the following MIT-licensed sources:\n// - primer/react (Copyright (c) 2018 GitHub, Inc.): https://github.com/primer/react/blob/a0db832302702b869aa22b0c4049ad9305ef631f/src/drafts/utils/character-coordinates.ts\n// - component/textarea-caret-position (Copyright (c) 2015 Jonathan Ong me@jongleberry.com): https://github.com/component/textarea-caret-position/blob/b5db7a7e47dd149c2a66276183c69234e4dabe30/index.js\n// - koddsson/textarea-caret-position (Copyright (c) 2015 Jonathan Ong me@jongleberry.com): https://github.com/koddsson/textarea-caret-position/blob/eba40ec8488eed4d77815f109af22e1d9c0751d3/index.js\nclass InputStyleCloneElement extends CustomHTMLElement {\n #styleObserver = new MutationObserver(() => this.#updateStyles());\n #resizeObserver = new ResizeObserver(() => this.#requestUpdateLayout());\n // This class is unique in that it will prevent itself from getting garbage collected because of the subscribed\n // observers (if never detached). Because of this, we want to avoid preventing the existence of this class from also\n // preventing the garbage collection of the associated input. This also allows us to automatically detach if the\n // input gets collected.\n #inputRef;\n #container;\n /**\n * Get the clone for an input, reusing an existing one if available. This avoids creating unecessary clones, which\n * have a performance cost due to their high-frequency event-based updates. Because these elements are shared, they\n * should be mutated with caution.\n *\n * Upon initial creation the clone element will automatically be inserted into the DOM and begin observing the\n * linked input. Only one clone per input can ever exist at a time.\n * @param input The target input to clone.\n */\n static for(input) {\n let clone = CloneRegistry.get(input);\n if (!clone) {\n clone = new InputStyleCloneElement();\n clone.connect(input);\n CloneRegistry.set(input, clone);\n }\n return clone;\n }\n /**\n * Connect this instance to a target input element and insert this instance into the DOM in the correct location.\n *\n * NOTE: calling the static `for` method is nearly always preferable as it will reuse an existing clone if available.\n * However, if reusing clones is problematic (ie, if the clone needs to be mutated), a clone can be constructed\n * directly with `new InputStyleCloneElement()` and then bound to an input and inserted into the DOM with\n * `clone.connect(target)`.\n */\n connect(input) {\n this.#inputRef = new WeakRef(input);\n // We want position:absolute so it doesn't take space in the layout, but that doesn't work with display:table-cell\n // used in the HTMLInputElement approach. So we need a wrapper.\n this.#container = document.createElement(\"div\");\n this.#container.style.position = \"absolute\";\n this.#container.style.pointerEvents = \"none\";\n input.after(this.#container);\n this.#container.appendChild(this);\n }\n /**\n * Force a recalculation. Will emit an `update` event. This is typically not needed unless the input has changed in\n * an unobservable way, eg by directly writing to the `value` property.\n */\n forceUpdate() {\n this.#updateStyles();\n this.#updateText();\n }\n /** @private */\n connectedCallback() {\n this.#usingInput((input) => {\n this.style.pointerEvents = \"none\";\n this.style.userSelect = \"none\";\n this.style.overflow = \"hidden\";\n this.style.display = \"block\";\n // Important not to use display:none which would not render the content at all\n this.style.visibility = \"hidden\";\n if (input instanceof HTMLTextAreaElement) {\n this.style.whiteSpace = \"pre-wrap\";\n this.style.wordWrap = \"break-word\";\n }\n else {\n this.style.whiteSpace = \"nowrap\";\n // text in single-line inputs is vertically centered\n this.style.display = \"table-cell\";\n this.style.verticalAlign = \"middle\";\n }\n this.setAttribute(\"aria-hidden\", \"true\");\n this.#updateStyles();\n this.#updateText();\n this.#styleObserver.observe(input, {\n attributeFilter: [\n \"style\",\n \"dir\", // users can right-click in some browsers to change the text direction dynamically\n ],\n });\n this.#resizeObserver.observe(input);\n document.addEventListener(\"scroll\", this.#onDocumentScrollOrResize, { capture: true });\n window.addEventListener(\"resize\", this.#onDocumentScrollOrResize, { capture: true });\n // capture so this happens first, so other things can respond to `input` events after this data updates\n input.addEventListener(\"input\", this.#onInput, { capture: true });\n });\n }\n /** @private */\n disconnectedCallback() {\n this.#container?.remove();\n this.#styleObserver.disconnect();\n this.#resizeObserver.disconnect();\n document.removeEventListener(\"scroll\", this.#onDocumentScrollOrResize, { capture: true });\n window.removeEventListener(\"resize\", this.#onDocumentScrollOrResize, { capture: true });\n // Can't use `usingInput` here since that could infinitely recurse\n const input = this.#input;\n if (input) {\n input.removeEventListener(\"input\", this.#onInput, { capture: true });\n CloneRegistry.delete(input);\n }\n }\n // --- private ---\n get #input() {\n return this.#inputRef?.deref();\n }\n /** Perform `fn` using the `input` if it is still available. If not, clean up the clone instead. */\n #usingInput(fn) {\n const input = this.#input;\n if (!input)\n return this.remove();\n return fn(input);\n }\n /** Current relative x-adjustment in pixels, executed via CSS transform. */\n #xOffset = 0;\n /** Current relative y-adjustment in pixels, executed via CSS transform. */\n #yOffset = 0;\n /**\n * Update only geometric properties without recalculating styles. Typically call `#requestUpdateLayout` instead to\n * only update once per animation frame.\n */\n #updateLayout() {\n // This runs often, so keep it as fast as possible! Avoid all unecessary updates.\n this.#usingInput((input) => {\n const inputStyle = window.getComputedStyle(input);\n this.style.height = inputStyle.height;\n this.style.width = inputStyle.width;\n // Immediately re-adjust for browser inconsistencies in scrollbar handling, if necessary\n if (input.clientHeight !== this.clientHeight)\n this.style.height = `calc(${inputStyle.height} + ${input.clientHeight - this.clientHeight}px)`;\n if (input.clientWidth !== this.clientWidth)\n this.style.width = `calc(${inputStyle.width} + ${input.clientWidth - this.clientWidth}px)`;\n // Position on top of the input\n const inputRect = input.getBoundingClientRect();\n const cloneRect = this.getBoundingClientRect();\n this.#xOffset = this.#xOffset + inputRect.left - cloneRect.left;\n this.#yOffset = this.#yOffset + inputRect.top - cloneRect.top;\n this.style.transform = `translate(${this.#xOffset}px, ${this.#yOffset}px)`;\n this.scrollTop = input.scrollTop;\n this.scrollLeft = input.scrollLeft;\n this.dispatchEvent(new InputStyleCloneUpdateEvent());\n });\n }\n #isLayoutUpdating = false;\n /** Request a layout update. Will only happen once per animation frame, to avoid unecessary updates. */\n #requestUpdateLayout() {\n if (this.#isLayoutUpdating)\n return;\n this.#isLayoutUpdating = true;\n requestAnimationFrame(() => {\n this.#updateLayout();\n this.#isLayoutUpdating = false;\n });\n }\n /** Update the styles of the clone based on the styles of the input, then request a layout update. */\n #updateStyles() {\n this.#usingInput((input) => {\n const inputStyle = window.getComputedStyle(input);\n for (const prop of propertiesToCopy)\n this.style[prop] = inputStyle[prop];\n this.#requestUpdateLayout();\n });\n }\n /**\n * Update the text content of the clone based on the text content of the input. Triggers a layout update in case the\n * text update caused scrolling.\n */\n #updateText() {\n this.#usingInput((input) => {\n this.textContent = input.value;\n // This is often unecessary on a pure text update, but text updates could potentially cause layout updates like\n // scrolling or resizing. And we run the update on _every frame_ when scrolling, so this isn't that expensive.\n // We don't requestUpdateLayout here because this one should happen synchronously, so that clients can react\n // within their own `input` event handlers.\n this.#updateLayout();\n });\n }\n #onInput = () => this.#updateText();\n #onDocumentScrollOrResize = (event) => {\n this.#usingInput((input) => {\n if (event.target === document ||\n event.target === window ||\n (event.target instanceof Node && event.target.contains(input)))\n this.#requestUpdateLayout();\n });\n };\n}\n// Note that some browsers, such as Firefox, do not concatenate properties\n// into their shorthand (e.g. padding-top, padding-bottom etc. -> padding),\n// so we have to list every single property explicitly.\nconst propertiesToCopy = [\n // RTL / vertical writing modes support:\n \"direction\",\n \"writingMode\",\n \"unicodeBidi\",\n \"textOrientation\",\n \"boxSizing\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"borderStyle\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n \"fontStyle\",\n \"fontVariant\",\n \"fontWeight\",\n \"fontStretch\",\n \"fontSize\",\n \"fontSizeAdjust\",\n \"lineHeight\",\n \"fontFamily\",\n \"textAlign\",\n \"textTransform\",\n \"textIndent\",\n \"textDecoration\",\n \"letterSpacing\",\n \"wordSpacing\",\n \"tabSize\",\n \"MozTabSize\",\n];\n// Inspired by https://github.com/github/catalyst/blob/dc284dcf4f82329a9cac5c867462a8fa529b6c40/src/register.ts\ntry {\n customElements.define(\"input-style-clone\", InputStyleCloneElement);\n}\ncatch (e) {\n // Throws DOMException with NotSupportedError if already defined\n if (!(e instanceof DOMException && e.name === \"NotSupportedError\"))\n throw e;\n}\n\nclass InputRange {\n #inputElement;\n #startOffset;\n #endOffset;\n /**\n * Construct a new `InputRange`.\n * @param element The target input element that contains the content for the range.\n * @param startOffset The inclusive 0-based start index for the range. Will be adjusted to fit in the input contents.\n * @param endOffset The exclusive 0-based end index for the range. Will be adjusted to fit in the input contents.\n */\n constructor(element, startOffset = 0, endOffset = startOffset) {\n this.#inputElement = element;\n this.#startOffset = startOffset;\n this.#endOffset = endOffset;\n }\n /**\n * Create a new range from the current user selection. If the input is not focused, the range will just be the start\n * of the input (offsets `0` to `0`).\n *\n * This can be used to get the caret coordinates: if the resulting range is `collapsed`, the location of the\n * `getBoundingClientRect` will be the location of the caret caret (note, however, that the width will be `0` in\n * this case).\n */\n static fromSelection(input) {\n const { selectionStart, selectionEnd } = input;\n return new InputRange(input, selectionStart ?? undefined, selectionEnd ?? undefined);\n }\n /** Returns true if the start is equal to the end of this range. */\n get collapsed() {\n return this.startOffset === this.endOffset;\n }\n /** Always returns the containing input element. */\n get commonAncestorContainer() {\n return this.#inputElement;\n }\n /** Always returns the containing input element. */\n get endContainer() {\n return this.#inputElement;\n }\n /** Always returns the containing input element. */\n get startContainer() {\n return this.#inputElement;\n }\n get startOffset() {\n return this.#startOffset;\n }\n get endOffset() {\n return this.#endOffset;\n }\n /** Update the inclusive start offset. Will be adjusted to fit within the content size. */\n setStartOffset(offset) {\n this.#startOffset = this.#clampOffset(offset);\n }\n /** Update the exclusive end offset. Will be adjusted to fit within the content size. */\n setEndOffset(offset) {\n this.#endOffset = this.#clampOffset(offset);\n }\n /**\n * Collapse this range to one side.\n * @param toStart If `true`, will collapse to the start side. Otherwise, will collapse to the end.\n */\n collapse(toStart = false) {\n if (toStart)\n this.setEndOffset(this.startOffset);\n else\n this.setStartOffset(this.endOffset);\n }\n /** Returns a `DocumentFragment` containing a new `Text` node containing the content in the range. */\n cloneContents() {\n return this.#createCloneRange().cloneContents();\n }\n /** Create a copy of this range. */\n cloneRange() {\n return new InputRange(this.#inputElement, this.startOffset, this.endOffset);\n }\n /**\n * Obtain one rect that contains the entire contents of the range. If the range spans multiple lines, this box will\n * contain all pieces of the range but may also contain some space outside the range.\n * @see https://iansan5653.github.io/dom-input-range/demos/playground/\n */\n getBoundingClientRect() {\n return this.#createCloneRange().getBoundingClientRect();\n }\n /**\n * Obtain the rects that contain contents of this range. If the range spans multiple lines, there will be multiple\n * bounding boxes. These boxes can be used, for example, to draw a highlight over the range.\n * @see https://iansan5653.github.io/dom-input-range/demos/playground/\n */\n getClientRects() {\n return this.#createCloneRange().getClientRects();\n }\n /** Get the contents of the range as a string. */\n toString() {\n return this.#createCloneRange().toString();\n }\n /**\n * Get the underlying `InputStyleClone` instance powering these calculations. This can be used to listen for\n * updates to trigger layout recalculation.\n */\n getStyleClone() {\n return this.#styleClone;\n }\n // --- private ---\n get #styleClone() {\n return InputStyleCloneElement.for(this.#inputElement);\n }\n get #cloneElement() {\n return this.#styleClone;\n }\n #clampOffset(offset) {\n return Math.max(0, Math.min(offset, this.#inputElement.value.length));\n }\n #createCloneRange() {\n // It's tempting to create a single Range and reuse it across the lifetime of the class. However, this wouldn't be\n // accurate because the contents of the input can change and the contents of the range would become stale. So we\n // must create a new range every time we need it.\n const range = document.createRange();\n const textNode = this.#cloneElement.childNodes[0];\n if (textNode) {\n range.setStart(textNode, this.startOffset);\n range.setEnd(textNode, this.endOffset);\n }\n return range;\n }\n}\n\nconst states = new WeakMap();\nclass TextExpander {\n constructor(expander, input) {\n this.expander = expander;\n this.input = input;\n this.combobox = null;\n this.menu = null;\n this.match = null;\n this.justPasted = false;\n this.lookBackIndex = 0;\n this.oninput = this.onInput.bind(this);\n this.onpaste = this.onPaste.bind(this);\n this.onkeydown = this.onKeydown.bind(this);\n this.oncommit = this.onCommit.bind(this);\n this.onmousedown = this.onMousedown.bind(this);\n this.onblur = this.onBlur.bind(this);\n this.interactingWithList = false;\n input.addEventListener('paste', this.onpaste);\n input.addEventListener('input', this.oninput);\n input.addEventListener('keydown', this.onkeydown);\n input.addEventListener('blur', this.onblur);\n }\n destroy() {\n this.input.removeEventListener('paste', this.onpaste);\n this.input.removeEventListener('input', this.oninput);\n this.input.removeEventListener('keydown', this.onkeydown);\n this.input.removeEventListener('blur', this.onblur);\n }\n dismissMenu() {\n if (this.deactivate()) {\n this.lookBackIndex = this.input.selectionEnd || this.lookBackIndex;\n }\n }\n activate(match, menu) {\n var _a, _b;\n if (this.input !== document.activeElement && this.input !== ((_b = (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.shadowRoot) === null || _b === void 0 ? void 0 : _b.activeElement)) {\n return;\n }\n this.deactivate();\n this.menu = menu;\n if (!menu.id)\n menu.id = `text-expander-${Math.floor(Math.random() * 100000).toString()}`;\n this.expander.append(menu);\n this.combobox = new Combobox(this.input, menu);\n this.expander.dispatchEvent(new Event('text-expander-activate'));\n this.positionMenu(menu, match.position);\n this.combobox.start();\n menu.addEventListener('combobox-commit', this.oncommit);\n menu.addEventListener('mousedown', this.onmousedown);\n this.combobox.navigate(1);\n }\n positionMenu(menu, position) {\n const caretRect = new InputRange(this.input, position).getBoundingClientRect();\n const targetPosition = { left: caretRect.left, top: caretRect.top + caretRect.height };\n const currentPosition = menu.getBoundingClientRect();\n const delta = {\n left: targetPosition.left - currentPosition.left,\n top: targetPosition.top - currentPosition.top\n };\n if (delta.left !== 0 || delta.top !== 0) {\n const currentStyle = getComputedStyle(menu);\n menu.style.left = currentStyle.left ? `calc(${currentStyle.left} + ${delta.left}px)` : `${delta.left}px`;\n menu.style.top = currentStyle.top ? `calc(${currentStyle.top} + ${delta.top}px)` : `${delta.top}px`;\n }\n }\n deactivate() {\n const menu = this.menu;\n if (!menu || !this.combobox)\n return false;\n this.expander.dispatchEvent(new Event('text-expander-deactivate'));\n this.menu = null;\n menu.removeEventListener('combobox-commit', this.oncommit);\n menu.removeEventListener('mousedown', this.onmousedown);\n this.combobox.destroy();\n this.combobox = null;\n menu.remove();\n return true;\n }\n onCommit({ target }) {\n var _a;\n const item = target;\n if (!(item instanceof HTMLElement))\n return;\n if (!this.combobox)\n return;\n const match = this.match;\n if (!match)\n return;\n const beginning = this.input.value.substring(0, match.position - match.key.length);\n const remaining = this.input.value.substring(match.position + match.text.length);\n const detail = { item, key: match.key, value: null, continue: false };\n const canceled = !this.expander.dispatchEvent(new CustomEvent('text-expander-value', { cancelable: true, detail }));\n if (canceled)\n return;\n if (!detail.value)\n return;\n let suffix = (_a = this.expander.getAttribute('suffix')) !== null && _a !== void 0 ? _a : ' ';\n if (detail.continue) {\n suffix = '';\n }\n const value = `${detail.value}${suffix}`;\n this.input.value = beginning + value + remaining;\n const cursor = beginning.length + value.length;\n this.deactivate();\n this.input.focus({\n preventScroll: true\n });\n this.input.selectionStart = cursor;\n this.input.selectionEnd = cursor;\n if (!detail.continue) {\n this.lookBackIndex = cursor;\n this.match = null;\n }\n this.expander.dispatchEvent(new CustomEvent('text-expander-committed', { cancelable: false, detail: { input: this.input } }));\n }\n onBlur() {\n if (this.interactingWithList) {\n this.interactingWithList = false;\n return;\n }\n this.deactivate();\n }\n onPaste() {\n this.justPasted = true;\n }\n async onInput() {\n if (this.justPasted) {\n this.justPasted = false;\n return;\n }\n const match = this.findMatch();\n if (match) {\n this.match = match;\n const menu = await this.notifyProviders(match);\n if (!this.match)\n return;\n if (menu) {\n this.activate(match, menu);\n }\n else {\n this.deactivate();\n }\n }\n else {\n this.match = null;\n this.deactivate();\n }\n }\n findMatch() {\n const cursor = this.input.selectionEnd || 0;\n const text = this.input.value;\n if (cursor <= this.lookBackIndex) {\n this.lookBackIndex = cursor - 1;\n }\n for (const { key, multiWord } of this.expander.keys) {\n const found = query(text, key, cursor, {\n multiWord,\n lookBackIndex: this.lookBackIndex,\n lastMatchPosition: this.match ? this.match.position : null\n });\n if (found) {\n return { text: found.text, key, position: found.position };\n }\n }\n }\n async notifyProviders(match) {\n const providers = [];\n const provide = (result) => providers.push(result);\n const canceled = !this.expander.dispatchEvent(new CustomEvent('text-expander-change', { cancelable: true, detail: { provide, text: match.text, key: match.key } }));\n if (canceled)\n return;\n const all = await Promise.all(providers);\n const fragments = all.filter(x => x.matched).map(x => x.fragment);\n return fragments[0];\n }\n onMousedown() {\n this.interactingWithList = true;\n }\n onKeydown(event) {\n if (event.key === 'Escape') {\n this.match = null;\n if (this.deactivate()) {\n this.lookBackIndex = this.input.selectionEnd || this.lookBackIndex;\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n }\n }\n}\nclass TextExpanderElement extends HTMLElement {\n get keys() {\n const keysAttr = this.getAttribute('keys');\n const keys = keysAttr ? keysAttr.split(' ') : [];\n const multiWordAttr = this.getAttribute('multiword');\n const multiWord = multiWordAttr ? multiWordAttr.split(' ') : [];\n const globalMultiWord = multiWord.length === 0 && this.hasAttribute('multiword');\n return keys.map(key => ({ key, multiWord: globalMultiWord || multiWord.includes(key) }));\n }\n connectedCallback() {\n const input = this.querySelector('input[type=\"text\"], textarea');\n if (!(input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement))\n return;\n const state = new TextExpander(this, input);\n states.set(this, state);\n }\n disconnectedCallback() {\n const state = states.get(this);\n if (!state)\n return;\n state.destroy();\n states.delete(this);\n }\n dismiss() {\n const state = states.get(this);\n if (!state)\n return;\n state.dismissMenu();\n }\n}\n\nif (!window.customElements.get('text-expander')) {\n window.TextExpanderElement = TextExpanderElement;\n window.customElements.define('text-expander', TextExpanderElement);\n}\n\nexport default TextExpanderElement;\n","export default function ansiRegex({onlyFirst = false} = {}) {\n\tconst pattern = [\n\t '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n","import stripAnsi from 'strip-ansi';\n\nconst segmenter = new Intl.Segmenter();\n\nexport default function stringLength(string, {countAnsiEscapeCodes = false} = {}) {\n\tif (string === '') {\n\t\treturn 0;\n\t}\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string === '') {\n\t\treturn 0;\n\t}\n\n\tlet length = 0;\n\n\tfor (const _ of segmenter.segment(string)) { // eslint-disable-line no-unused-vars\n\t\tlength++;\n\t}\n\n\treturn length;\n}\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20version='1.0'%20viewBox='0%200%20641%20223'%3e%3cpath%20fill='%23aaa'%20d='M86%20214c-9-1-17-4-24-8l-6-3-5-5-5-4-4-6-4-6-3-8-2-8v-27l2-9%203-9%204-6%204-6%205-5%205-5%207-3%206-4%207-2%207-2%2012-1h12l7%201%208%202%207%204%207%203%205%205%205%204-10%2010-10%209-4-3-10-5-5-1H88l-5%202-6%203-3%204-4%204-2%205-2%206v6l-1%207%201%207%202%207%203%205%202%204%204%203%204%203%205%202%206%202h9l10-1%205-2%206-3v-16H91v-27h59v54l-1%203-2%203-5%204-4%204-5%203-5%202-8%202-8%202-10%201H92l-6-1zm266-62V91h34v46h44V91h34v121h-34v-46h-44v46h-34v-61zm-182-1V90h34v121h-34v-60zm59-1V90h35l36%201%205%202c3%200%208%202%2010%204l5%202%204%205%205%204%203%207%203%207%201%2013v13l-4%206-3%207-4%204-5%205-5%202-5%203-6%202-5%201-18%201h-18v32h-34v-61zm67-2%203-2%202-4%202-5v-5l-2-4-2-4-3-2-3-3h-30v31h30l3-2zm226%2039v-24l-8-12-18-28a1751%201751%200%200%200-20-31v-2h39l7%2012%2012%2021%206%209%2013-21%2013-21h38v2l-41%2061-7%2010v48h-34v-24zM109%2066l-4-1-5-5-5-4-1-5-3-9v-5l1-5c2-7%203-10%208-15l4-4%207-2%207-2h7l6%201%205%202%205%202%203%204%204%203%202%206%202%205v13l-2%205-2%206-4%204-3%203-5%202-4%202-9%201h-9l-5-2zm22-11%204-2%203-4%202-5V34l-2-4-2-4-3-2-4-3-5-1h-6l-4%202-5%202-2%204-3%205-1%203v4l1%205%202%205%202%202%205%203%204%202h10l4-2zM37%2039V11h33l3%201%203%202%204%203%203%203%201%205%201%204v5l-1%204-3%204-3%205-4%201-3%202-11%201H49v16H37V39zm31%200%203-2%201-2%201-2v-4l-1-3-3-2-2-2H49v18h15l4-1zm107%2025a512%20512%200%200%200-19-53h14l4%2014%206%2019%201%204%201-1%207-19%205-17h9l6%2019%207%2018v-1l2-6%205-17%204-13h14v1l-4%2012-16%2041v2h-5l-5-1-6-15-6-15-1%201-3%207-6%2015-2%208h-11l-1-3zm74-25V11h42v11h-29v2l-1%205v4h29v11h-28v11h2l15%201h13v11h-43V39zm55%200V11h33l5%203%205%202%202%204%202%205v10l-2%203-1%204-5%203-5%203%205%205%208%2010%203%204h-14l-7-9-8-10h-9v19h-12V39zm33-3%202-3v-6l-3-3-2-3h-18v16h1v1h17l2-2zm26%203V11h42v11h-29l-1%206v5h29v11h-28v5l-1%205%201%201v1h30v11h-43V39zm54%200V11h17l18%201%204%202%205%203%202%204%203%204%202%206%201%206v5c-1%206-3%2012-6%2015l-3%204-5%203-5%202-17%201h-16V39zm33%2014%205-5%202-3v-6l-1-6-1-3-1-3-4-3-3-2h-5l-6-1-3%201h-3v34h9l8-1%203-2zm50-14V11h34l5%202%204%202%202%203%202%203v9l-2%202-3%204-1%201%203%203%203%204%201%203%201%204-1%204-1%204-3%203-3%203-5%201-5%201h-31V39zm34%2015%202-1v-6l-2-2-2-2h-20v13h20l2-2zm-3-22%204-2v-6l-2-1-2-2h-19v12h16l4-1zm42%2024V45l-6-9-11-17-5-8h15l4%208%207%2011%202%203%207-11%207-11h14l-11%2016-11%2017v23h-12V56z'/%3e%3c/svg%3e\"","import { i18n } from '@lingui/core';\n\n// https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers\nconst BYTES_UNITS = [\n 'byte',\n 'kilobyte',\n 'megabyte',\n 'gigabyte',\n 'terabyte',\n 'petabyte',\n];\nexport default function prettyBytes(bytes) {\n const unitIndex = Math.min(\n Math.floor(Math.log2(bytes) / 10),\n BYTES_UNITS.length - 1,\n );\n const value = bytes / 1024 ** unitIndex;\n return i18n.number(value, {\n style: 'unit',\n unit: BYTES_UNITS[unitIndex],\n unitDisplay: 'narrow',\n maximumFractionDigits: 0,\n });\n}\n","import './compose.css';\nimport '@github/text-expander-element';\n\nimport { msg, plural, t, Trans } from '@lingui/macro';\nimport { useLingui } from '@lingui/react';\nimport { MenuItem } from '@szhsin/react-menu';\nimport { deepEqual } from 'fast-equals';\nimport Fuse from 'fuse.js';\nimport { forwardRef, memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport stringLength from 'string-length';\n// import { detectAll } from 'tinyld/light';\nimport { uid } from 'uid/single';\nimport { useDebouncedCallback, useThrottledCallback } from 'use-debounce';\nimport { useSnapshot } from 'valtio';\n\nimport poweredByGiphyURL from '../assets/powered-by-giphy.svg';\n\nimport Menu2 from '../components/menu2';\nimport supportedLanguages from '../data/status-supported-languages';\nimport urlRegex from '../data/url-regex';\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport emojifyText from '../utils/emojify-text';\nimport i18nDuration from '../utils/i18n-duration';\nimport isRTL from '../utils/is-rtl';\nimport localeMatch from '../utils/locale-match';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport mem from '../utils/mem';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport prettyBytes from '../utils/pretty-bytes';\nimport { fetchRelationships } from '../utils/relationships';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport store from '../utils/store';\nimport {\n getCurrentAccount,\n getCurrentAccountNS,\n getCurrentInstance,\n getCurrentInstanceConfiguration,\n} from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport useCloseWatcher from '../utils/useCloseWatcher';\nimport useInterval from '../utils/useInterval';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\n\nimport AccountBlock from './account-block';\n// import Avatar from './avatar';\nimport Icon from './icon';\nimport Loader from './loader';\nimport Modal from './modal';\nimport Status from './status';\n\nconst {\n PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL,\n PHANPY_GIPHY_API_KEY: GIPHY_API_KEY,\n} = import.meta.env;\n\nconst supportedLanguagesMap = supportedLanguages.reduce((acc, l) => {\n const [code, common, native] = l;\n acc[code] = {\n common,\n native,\n };\n return acc;\n}, {});\n\n/* NOTES:\n - Max character limit includes BOTH status text and Content Warning text\n*/\n\nconst expiryOptions = {\n 300: i18nDuration(5, 'minute'),\n 1_800: i18nDuration(30, 'minute'),\n 3_600: i18nDuration(1, 'hour'),\n 21_600: i18nDuration(6, 'hour'),\n 86_400: i18nDuration(1, 'day'),\n 259_200: i18nDuration(3, 'day'),\n 604_800: i18nDuration(1, 'week'),\n};\nconst expirySeconds = Object.keys(expiryOptions);\nconst oneDay = 24 * 60 * 60;\n\nconst expiresInFromExpiresAt = (expiresAt) => {\n if (!expiresAt) return oneDay;\n const delta = (new Date(expiresAt).getTime() - Date.now()) / 1000;\n return expirySeconds.find((s) => s >= delta) || oneDay;\n};\n\nconst menu = document.createElement('ul');\nmenu.role = 'listbox';\nmenu.className = 'text-expander-menu';\n\n// Set IntersectionObserver on menu, reposition it because text-expander doesn't handle it\nconst windowMargin = 16;\nconst observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const { left, width } = entry.boundingClientRect;\n const { innerWidth } = window;\n if (left + width > innerWidth) {\n const insetInlineStart = isRTL() ? 'right' : 'left';\n menu.style[insetInlineStart] = innerWidth - width - windowMargin + 'px';\n }\n }\n });\n});\nobserver.observe(menu);\n\nconst DEFAULT_LANG = localeMatch(\n [new Intl.DateTimeFormat().resolvedOptions().locale, ...navigator.languages],\n supportedLanguages.map((l) => l[0]),\n 'en',\n);\n\n// https://github.com/mastodon/mastodon/blob/c4a429ed47e85a6bbf0d470a41cc2f64cf120c19/app/javascript/mastodon/features/compose/util/counter.js\nconst urlRegexObj = new RegExp(urlRegex.source, urlRegex.flags);\nconst usernameRegex = /(^|[^\\/\\w])@(([a-z0-9_]+)@[a-z0-9\\.\\-]+[a-z0-9]+)/gi;\nconst urlPlaceholder = '$2xxxxxxxxxxxxxxxxxxxxxxx';\nfunction countableText(inputText) {\n return inputText\n .replace(urlRegexObj, urlPlaceholder)\n .replace(usernameRegex, '$1@$3');\n}\n\n// https://github.com/mastodon/mastodon/blob/c03bd2a238741a012aa4b98dc4902d6cf948ab63/app/models/account.rb#L69\nconst USERNAME_RE = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i;\nconst MENTION_RE = new RegExp(\n `(^|[^=\\\\/\\\\w])(@${USERNAME_RE.source}(?:@[\\\\p{L}\\\\w.-]+[\\\\w]+)?)`,\n 'uig',\n);\n\n// AI-generated, all other regexes are too complicated\nconst HASHTAG_RE = new RegExp(\n `(^|[^=\\\\/\\\\w])(#[a-z0-9_]+([a-z0-9_.]+[a-z0-9_]+)?)(?![\\\\/\\\\w])`,\n 'ig',\n);\n\n// https://github.com/mastodon/mastodon/blob/23e32a4b3031d1da8b911e0145d61b4dd47c4f96/app/models/custom_emoji.rb#L31\nconst SHORTCODE_RE_FRAGMENT = '[a-zA-Z0-9_]{2,}';\nconst SCAN_RE = new RegExp(\n `(^|[^=\\\\/\\\\w])(:${SHORTCODE_RE_FRAGMENT}:)(?=[^A-Za-z0-9_:]|$)`,\n 'g',\n);\n\nconst segmenter = new Intl.Segmenter();\nfunction escapeHTML(text) {\n return text\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\nfunction highlightText(text, { maxCharacters = Infinity }) {\n // Exceeded characters limit\n const { composerCharacterCount } = states;\n if (composerCharacterCount > maxCharacters) {\n // Highlight exceeded characters\n let withinLimitHTML = '',\n exceedLimitHTML = '';\n const htmlSegments = segmenter.segment(text);\n for (const { segment, index } of htmlSegments) {\n if (index < maxCharacters) {\n withinLimitHTML += segment;\n } else {\n exceedLimitHTML += segment;\n }\n }\n if (exceedLimitHTML) {\n exceedLimitHTML =\n '' +\n escapeHTML(exceedLimitHTML) +\n '';\n }\n return escapeHTML(withinLimitHTML) + exceedLimitHTML;\n }\n\n return escapeHTML(text)\n .replace(urlRegexObj, '$2$3') // URLs\n .replace(MENTION_RE, '$1$2') // Mentions\n .replace(HASHTAG_RE, '$1$2') // Hashtags\n .replace(\n SCAN_RE,\n '$1$2',\n ); // Emoji shortcodes\n}\n\n// const rtf = new Intl.RelativeTimeFormat();\nconst RTF = mem((locale) => new Intl.RelativeTimeFormat(locale || undefined));\n\nconst CUSTOM_EMOJIS_COUNT = 100;\n\nfunction Compose({\n onClose,\n replyToStatus,\n editStatus,\n draftStatus,\n standalone,\n hasOpener,\n}) {\n const { i18n } = useLingui();\n const rtf = RTF(i18n.locale);\n\n console.warn('RENDER COMPOSER');\n const { masto, instance } = api();\n const [uiState, setUIState] = useState('default');\n const UID = useRef(draftStatus?.uid || uid());\n console.log('Compose UID', UID.current);\n\n const currentAccount = getCurrentAccount();\n const currentAccountInfo = currentAccount.info;\n\n const configuration = getCurrentInstanceConfiguration();\n console.log('⚙️ Configuration', configuration);\n\n const {\n statuses: {\n maxCharacters,\n maxMediaAttachments,\n charactersReservedPerUrl,\n } = {},\n mediaAttachments: {\n supportedMimeTypes = [],\n imageSizeLimit,\n imageMatrixLimit,\n videoSizeLimit,\n videoMatrixLimit,\n videoFrameRateLimit,\n } = {},\n polls: {\n maxOptions,\n maxCharactersPerOption,\n maxExpiration,\n minExpiration,\n } = {},\n } = configuration || {};\n\n const textareaRef = useRef();\n const spoilerTextRef = useRef();\n const [visibility, setVisibility] = useState('public');\n const [sensitive, setSensitive] = useState(false);\n const [language, setLanguage] = useState(\n store.session.get('currentLanguage') || DEFAULT_LANG,\n );\n const prevLanguage = useRef(language);\n const [mediaAttachments, setMediaAttachments] = useState([]);\n const [poll, setPoll] = useState(null);\n\n const prefs = store.account.get('preferences') || {};\n\n const oninputTextarea = () => {\n if (!textareaRef.current) return;\n textareaRef.current.dispatchEvent(new Event('input'));\n };\n const focusTextarea = () => {\n setTimeout(() => {\n if (!textareaRef.current) return;\n // status starts with newline, focus on first position\n if (draftStatus?.status?.startsWith?.('\\n')) {\n textareaRef.current.selectionStart = 0;\n textareaRef.current.selectionEnd = 0;\n }\n console.debug('FOCUS textarea');\n textareaRef.current?.focus();\n }, 300);\n };\n\n useEffect(() => {\n if (replyToStatus) {\n const { spoilerText, visibility, language, sensitive } = replyToStatus;\n if (spoilerText && spoilerTextRef.current) {\n spoilerTextRef.current.value = spoilerText;\n }\n const mentions = new Set([\n replyToStatus.account.acct,\n ...replyToStatus.mentions.map((m) => m.acct),\n ]);\n const allMentions = [...mentions].filter(\n (m) => m !== currentAccountInfo.acct,\n );\n if (allMentions.length > 0) {\n textareaRef.current.value = `${allMentions\n .map((m) => `@${m}`)\n .join(' ')} `;\n oninputTextarea();\n }\n focusTextarea();\n setVisibility(\n visibility === 'public' && prefs['posting:default:visibility']\n ? prefs['posting:default:visibility'].toLowerCase()\n : visibility,\n );\n setLanguage(\n language ||\n prefs['posting:default:language']?.toLowerCase() ||\n DEFAULT_LANG,\n );\n setSensitive(sensitive && !!spoilerText);\n } else if (editStatus) {\n const { visibility, language, sensitive, poll, mediaAttachments } =\n editStatus;\n const composablePoll = !!poll?.options && {\n ...poll,\n options: poll.options.map((o) => o?.title || o),\n expiresIn: poll?.expiresIn || expiresInFromExpiresAt(poll.expiresAt),\n };\n setUIState('loading');\n (async () => {\n try {\n const statusSource = await masto.v1.statuses\n .$select(editStatus.id)\n .source.fetch();\n console.log({ statusSource });\n const { text, spoilerText } = statusSource;\n textareaRef.current.value = text;\n textareaRef.current.dataset.source = text;\n oninputTextarea();\n focusTextarea();\n spoilerTextRef.current.value = spoilerText;\n setVisibility(visibility);\n setLanguage(\n language ||\n prefs['posting:default:language']?.toLowerCase() ||\n DEFAULT_LANG,\n );\n setSensitive(sensitive);\n if (composablePoll) setPoll(composablePoll);\n setMediaAttachments(mediaAttachments);\n setUIState('default');\n } catch (e) {\n console.error(e);\n alert(e?.reason || e);\n setUIState('error');\n }\n })();\n } else {\n focusTextarea();\n console.log('Apply prefs', prefs);\n if (prefs['posting:default:visibility']) {\n setVisibility(prefs['posting:default:visibility'].toLowerCase());\n }\n if (prefs['posting:default:language']) {\n setLanguage(prefs['posting:default:language'].toLowerCase());\n }\n if (prefs['posting:default:sensitive']) {\n setSensitive(!!prefs['posting:default:sensitive']);\n }\n }\n if (draftStatus) {\n const {\n status,\n spoilerText,\n visibility,\n language,\n sensitive,\n poll,\n mediaAttachments,\n } = draftStatus;\n const composablePoll = !!poll?.options && {\n ...poll,\n options: poll.options.map((o) => o?.title || o),\n expiresIn: poll?.expiresIn || expiresInFromExpiresAt(poll.expiresAt),\n };\n textareaRef.current.value = status;\n oninputTextarea();\n focusTextarea();\n if (spoilerText) spoilerTextRef.current.value = spoilerText;\n if (visibility) setVisibility(visibility);\n setLanguage(\n language ||\n prefs['posting:default:language']?.toLowerCase() ||\n DEFAULT_LANG,\n );\n if (sensitive !== null) setSensitive(sensitive);\n if (composablePoll) setPoll(composablePoll);\n if (mediaAttachments) setMediaAttachments(mediaAttachments);\n }\n }, [draftStatus, editStatus, replyToStatus]);\n\n const formRef = useRef();\n\n const beforeUnloadCopy = t`You have unsaved changes. Discard this post?`;\n const canClose = () => {\n const { value, dataset } = textareaRef.current;\n\n // check if loading\n if (uiState === 'loading') {\n console.log('canClose', { uiState });\n return false;\n }\n\n // check for status and media attachments\n const hasValue = (value || '')\n .trim()\n .replace(/^\\p{White_Space}+|\\p{White_Space}+$/gu, '');\n const hasMediaAttachments = mediaAttachments.length > 0;\n if (!hasValue && !hasMediaAttachments) {\n console.log('canClose', { value, mediaAttachments });\n return true;\n }\n\n // check if all media attachments have IDs\n const hasIDMediaAttachments =\n mediaAttachments.length > 0 &&\n mediaAttachments.every((media) => media.id);\n if (hasIDMediaAttachments) {\n console.log('canClose', { hasIDMediaAttachments });\n return true;\n }\n\n // check if status contains only \"@acct\", if replying\n const isSelf = replyToStatus?.account.id === currentAccountInfo.id;\n const hasOnlyAcct =\n replyToStatus && value.trim() === `@${replyToStatus.account.acct}`;\n // TODO: check for mentions, or maybe just generic \"@username\", including multiple mentions like \"@username1@username2\"\n if (!isSelf && hasOnlyAcct) {\n console.log('canClose', { isSelf, hasOnlyAcct });\n return true;\n }\n\n // check if status is same with source\n const sameWithSource = value === dataset?.source;\n if (sameWithSource) {\n console.log('canClose', { sameWithSource });\n return true;\n }\n\n console.log('canClose', {\n value,\n hasMediaAttachments,\n hasIDMediaAttachments,\n poll,\n isSelf,\n hasOnlyAcct,\n sameWithSource,\n uiState,\n });\n\n return false;\n };\n\n const confirmClose = () => {\n if (!canClose()) {\n const yes = confirm(beforeUnloadCopy);\n return yes;\n }\n return true;\n };\n\n useEffect(() => {\n // Show warning if user tries to close window with unsaved changes\n const handleBeforeUnload = (e) => {\n if (!canClose()) {\n e.preventDefault();\n e.returnValue = beforeUnloadCopy;\n }\n };\n window.addEventListener('beforeunload', handleBeforeUnload, {\n capture: true,\n });\n return () =>\n window.removeEventListener('beforeunload', handleBeforeUnload, {\n capture: true,\n });\n }, []);\n\n const getCharCount = () => {\n const { value } = textareaRef.current;\n const { value: spoilerText } = spoilerTextRef.current;\n return stringLength(countableText(value)) + stringLength(spoilerText);\n };\n const updateCharCount = () => {\n const count = getCharCount();\n states.composerCharacterCount = count;\n };\n useEffect(updateCharCount, []);\n\n const supportsCloseWatcher = window.CloseWatcher;\n const escDownRef = useRef(false);\n useHotkeys(\n 'esc',\n () => {\n escDownRef.current = true;\n // This won't be true if this event is already handled and not propagated 🤞\n },\n {\n enabled: !supportsCloseWatcher,\n enableOnFormTags: true,\n },\n );\n useHotkeys(\n 'esc',\n () => {\n if (!standalone && escDownRef.current && confirmClose()) {\n onClose();\n }\n escDownRef.current = false;\n },\n {\n enabled: !supportsCloseWatcher,\n enableOnFormTags: true,\n // Use keyup because Esc keydown will close the confirm dialog on Safari\n keyup: true,\n ignoreEventWhen: (e) => {\n const modals = document.querySelectorAll('#modal-container > *');\n const hasModal = !!modals;\n const hasOnlyComposer =\n modals.length === 1 && modals[0].querySelector('#compose-container');\n return hasModal && !hasOnlyComposer;\n },\n },\n );\n useCloseWatcher(() => {\n if (!standalone && confirmClose()) {\n onClose();\n }\n }, [standalone, confirmClose, onClose]);\n\n const prevBackgroundDraft = useRef({});\n const draftKey = () => {\n const ns = getCurrentAccountNS();\n return `${ns}#${UID.current}`;\n };\n const saveUnsavedDraft = () => {\n // Not enabling this for editing status\n // I don't think this warrant a draft mode for a status that's already posted\n // Maybe it could be a big edit change but it should be rare\n if (editStatus) return;\n if (states.composerState.minimized) return;\n const key = draftKey();\n const backgroundDraft = {\n key,\n replyTo: replyToStatus\n ? {\n /* Smaller payload of replyToStatus. Reasons:\n - No point storing whole thing\n - Could have media attachments\n - Could be deleted/edited later\n */\n id: replyToStatus.id,\n account: {\n id: replyToStatus.account.id,\n username: replyToStatus.account.username,\n acct: replyToStatus.account.acct,\n },\n }\n : null,\n draftStatus: {\n uid: UID.current,\n status: textareaRef.current.value,\n spoilerText: spoilerTextRef.current.value,\n visibility,\n language,\n sensitive,\n poll,\n mediaAttachments,\n },\n };\n if (\n !deepEqual(backgroundDraft, prevBackgroundDraft.current) &&\n !canClose()\n ) {\n console.debug('not equal', backgroundDraft, prevBackgroundDraft.current);\n db.drafts\n .set(key, {\n ...backgroundDraft,\n state: 'unsaved',\n updatedAt: Date.now(),\n })\n .then(() => {\n console.debug('DRAFT saved', key, backgroundDraft);\n })\n .catch((e) => {\n console.error('DRAFT failed', key, e);\n });\n prevBackgroundDraft.current = structuredClone(backgroundDraft);\n }\n };\n useInterval(saveUnsavedDraft, 5000); // background save every 5s\n useEffect(() => {\n saveUnsavedDraft();\n // If unmounted, means user discarded the draft\n // Also means pop-out 🙈, but it's okay because the pop-out will persist the ID and re-create the draft\n return () => {\n db.drafts.del(draftKey());\n };\n }, []);\n\n useEffect(() => {\n const handleItems = (e) => {\n const { items } = e.clipboardData || e.dataTransfer;\n const files = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file && supportedMimeTypes.includes(file.type)) {\n files.push(file);\n }\n }\n }\n if (files.length > 0 && mediaAttachments.length >= maxMediaAttachments) {\n alert(\n plural(maxMediaAttachments, {\n one: 'You can only attach up to 1 file.',\n other: 'You can only attach up to # files.',\n }),\n );\n return;\n }\n console.log({ files });\n if (files.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n // Auto-cut-off files to avoid exceeding maxMediaAttachments\n const max = maxMediaAttachments - mediaAttachments.length;\n const allowedFiles = files.slice(0, max);\n if (allowedFiles.length <= 0) {\n alert(\n plural(maxMediaAttachments, {\n one: 'You can only attach up to 1 file.',\n other: 'You can only attach up to # files.',\n }),\n );\n return;\n }\n const mediaFiles = allowedFiles.map((file) => ({\n file,\n type: file.type,\n size: file.size,\n url: URL.createObjectURL(file),\n id: null,\n description: null,\n }));\n setMediaAttachments([...mediaAttachments, ...mediaFiles]);\n }\n };\n window.addEventListener('paste', handleItems);\n const handleDragover = (e) => {\n // Prevent default if there's files\n if (e.dataTransfer.items.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n window.addEventListener('dragover', handleDragover);\n window.addEventListener('drop', handleItems);\n return () => {\n window.removeEventListener('paste', handleItems);\n window.removeEventListener('dragover', handleDragover);\n window.removeEventListener('drop', handleItems);\n };\n }, [mediaAttachments]);\n\n const [showMentionPicker, setShowMentionPicker] = useState(false);\n const [showEmoji2Picker, setShowEmoji2Picker] = useState(false);\n const [showGIFPicker, setShowGIFPicker] = useState(false);\n\n const [autoDetectedLanguages, setAutoDetectedLanguages] = useState(null);\n const [topSupportedLanguages, restSupportedLanguages] = useMemo(() => {\n const topLanguages = [];\n const restLanguages = [];\n const { contentTranslationHideLanguages = [] } = states.settings;\n supportedLanguages.forEach((l) => {\n const [code] = l;\n if (\n code === language ||\n code === prevLanguage.current ||\n code === DEFAULT_LANG ||\n contentTranslationHideLanguages.includes(code) ||\n (autoDetectedLanguages?.length && autoDetectedLanguages.includes(code))\n ) {\n topLanguages.push(l);\n } else {\n restLanguages.push(l);\n }\n });\n topLanguages.sort(([codeA, commonA], [codeB, commonB]) => {\n if (codeA === language) return -1;\n if (codeB === language) return 1;\n return commonA.localeCompare(commonB);\n });\n restLanguages.sort(([codeA, commonA], [codeB, commonB]) =>\n commonA.localeCompare(commonB),\n );\n return [topLanguages, restLanguages];\n }, [language, autoDetectedLanguages]);\n\n const replyToStatusMonthsAgo = useMemo(\n () =>\n !!replyToStatus?.createdAt &&\n Math.floor(\n (Date.now() - new Date(replyToStatus.createdAt)) /\n (1000 * 60 * 60 * 24 * 30),\n ),\n [replyToStatus],\n );\n\n const onMinimize = () => {\n saveUnsavedDraft();\n states.composerState.minimized = true;\n };\n\n return (\n
    \n
    \n
    \n {currentAccountInfo?.avatarStatic && (\n // \n \n )}\n {!standalone ? (\n \n {\n // If there are non-ID media attachments (not yet uploaded), show confirmation dialog because they are not going to be passed to the new window\n // const containNonIDMediaAttachments =\n // mediaAttachments.length > 0 &&\n // mediaAttachments.some((media) => !media.id);\n // if (containNonIDMediaAttachments) {\n // const yes = confirm(\n // 'You have media attachments that are not yet uploaded. Opening a new window will discard them and you will need to re-attach them. Are you sure you want to continue?',\n // );\n // if (!yes) {\n // return;\n // }\n // }\n\n // const mediaAttachmentsWithIDs = mediaAttachments.filter(\n // (media) => media.id,\n // );\n\n const newWin = openCompose({\n editStatus,\n replyToStatus,\n draftStatus: {\n uid: UID.current,\n status: textareaRef.current.value,\n spoilerText: spoilerTextRef.current.value,\n visibility,\n language,\n sensitive,\n poll,\n mediaAttachments,\n },\n });\n\n if (!newWin) {\n return;\n }\n\n onClose();\n }}\n >\n \n \n \n \n {' '}\n {\n if (confirmClose()) {\n onClose();\n }\n }}\n >\n \n \n \n ) : (\n hasOpener && (\n {\n // If there are non-ID media attachments (not yet uploaded), show confirmation dialog because they are not going to be passed to the new window\n // const containNonIDMediaAttachments =\n // mediaAttachments.length > 0 &&\n // mediaAttachments.some((media) => !media.id);\n // if (containNonIDMediaAttachments) {\n // const yes = confirm(\n // 'You have media attachments that are not yet uploaded. Opening a new window will discard them and you will need to re-attach them. Are you sure you want to continue?',\n // );\n // if (!yes) {\n // return;\n // }\n // }\n\n if (!window.opener) {\n alert(t`Looks like you closed the parent window.`);\n return;\n }\n\n if (window.opener.__STATES__.showCompose) {\n if (window.opener.__STATES__.composerState?.publishing) {\n alert(\n t`Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later.`,\n );\n return;\n }\n\n let confirmText = t`Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?`;\n const yes = confirm(confirmText);\n if (!yes) return;\n }\n\n // const mediaAttachmentsWithIDs = mediaAttachments.filter(\n // (media) => media.id,\n // );\n\n onClose({\n fn: () => {\n const passData = {\n editStatus,\n replyToStatus,\n draftStatus: {\n uid: UID.current,\n status: textareaRef.current.value,\n spoilerText: spoilerTextRef.current.value,\n visibility,\n language,\n sensitive,\n poll,\n mediaAttachments,\n },\n };\n window.opener.__COMPOSE__ = passData; // Pass it here instead of `showCompose` due to some weird proxy issue again\n if (window.opener.__STATES__.showCompose) {\n window.opener.__STATES__.showCompose = false;\n setTimeout(() => {\n window.opener.__STATES__.showCompose = true;\n }, 10);\n } else {\n window.opener.__STATES__.showCompose = true;\n }\n if (window.opener.__STATES__.composerState.minimized) {\n // Maximize it\n window.opener.__STATES__.composerState.minimized = false;\n }\n },\n });\n }}\n >\n \n \n )\n )}\n
    \n {!!replyToStatus && (\n
    \n \n
    \n {replyToStatusMonthsAgo > 0 ? (\n \n Replying to @\n {replyToStatus.account.acct || replyToStatus.account.username}\n ’s post (\n \n {rtf.format(-replyToStatusMonthsAgo, 'month')}\n \n )\n \n ) : (\n \n Replying to @\n {replyToStatus.account.acct || replyToStatus.account.username}\n ’s post\n \n )}\n
    \n
    \n )}\n {!!editStatus && (\n
    \n \n
    \n Editing source post\n
    \n
    \n )}\n {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n formRef.current.dispatchEvent(\n new Event('submit', { cancelable: true }),\n );\n }\n }}\n onSubmit={(e) => {\n e.preventDefault();\n\n const formData = new FormData(e.target);\n const entries = Object.fromEntries(formData.entries());\n console.log('ENTRIES', entries);\n let { status, visibility, sensitive, spoilerText } = entries;\n\n // Pre-cleanup\n sensitive = sensitive === 'on'; // checkboxes return \"on\" if checked\n\n // Validation\n /* Let the backend validate this\n if (stringLength(status) > maxCharacters) {\n alert(`Status is too long! Max characters: ${maxCharacters}`);\n return;\n }\n if (\n sensitive &&\n stringLength(status) + stringLength(spoilerText) > maxCharacters\n ) {\n alert(\n `Status and content warning is too long! Max characters: ${maxCharacters}`,\n );\n return;\n }\n */\n if (poll) {\n if (poll.options.length < 2) {\n alert(t`Poll must have at least 2 options`);\n return;\n }\n if (poll.options.some((option) => option === '')) {\n alert(t`Some poll choices are empty`);\n return;\n }\n }\n // TODO: check for URLs and use `charactersReservedPerUrl` to calculate max characters\n\n if (mediaAttachments.length > 0) {\n // If there are media attachments, check if they have no descriptions\n const hasNoDescriptions = mediaAttachments.some(\n (media) => !media.description?.trim?.(),\n );\n if (hasNoDescriptions) {\n const yes = confirm(\n t`Some media have no descriptions. Continue?`,\n );\n if (!yes) return;\n }\n }\n\n // Post-cleanup\n spoilerText = (sensitive && spoilerText) || undefined;\n status = status === '' ? undefined : status;\n\n // states.composerState.minimized = true;\n states.composerState.publishing = true;\n setUIState('loading');\n (async () => {\n try {\n console.log('MEDIA ATTACHMENTS', mediaAttachments);\n if (mediaAttachments.length > 0) {\n // Upload media attachments first\n const mediaPromises = mediaAttachments.map((attachment) => {\n const { file, description, id } = attachment;\n console.log('UPLOADING', attachment);\n if (id) {\n // If already uploaded\n return attachment;\n } else {\n const params = removeNullUndefined({\n file,\n description,\n });\n return masto.v2.media.create(params).then((res) => {\n if (res.id) {\n attachment.id = res.id;\n }\n return res;\n });\n }\n });\n const results = await Promise.allSettled(mediaPromises);\n\n // If any failed, return\n if (\n results.some((result) => {\n return result.status === 'rejected' || !result.value?.id;\n })\n ) {\n states.composerState.publishing = false;\n states.composerState.publishingError = true;\n setUIState('error');\n // Alert all the reasons\n results.forEach((result) => {\n if (result.status === 'rejected') {\n console.error(result);\n alert(result.reason || t`Attachment #${i} failed`);\n }\n });\n return;\n }\n\n console.log({ results, mediaAttachments });\n }\n\n /* NOTE:\n Using snakecase here because masto.js's `isObject` returns false for `params`, ONLY happens when opening in pop-out window. This is maybe due to `window.masto` variable being passed from the parent window. The check that failed is `x.constructor === Object`, so maybe the `Object` in new window is different than parent window's?\n Code: https://github.com/neet/masto.js/blob/dd0d649067b6a2b6e60fbb0a96597c373a255b00/src/serializers/is-object.ts#L2\n\n // TODO: Note above is no longer true in Masto.js v6. Revisit this.\n */\n let params = {\n status,\n // spoilerText,\n spoiler_text: spoilerText,\n language,\n sensitive,\n poll,\n // mediaIds: mediaAttachments.map((attachment) => attachment.id),\n media_ids: mediaAttachments.map(\n (attachment) => attachment.id,\n ),\n };\n if (editStatus && supports('@mastodon/edit-media-attributes')) {\n params.media_attributes = mediaAttachments.map(\n (attachment) => {\n return {\n id: attachment.id,\n description: attachment.description,\n // focus\n // thumbnail\n };\n },\n );\n } else if (!editStatus) {\n params.visibility = visibility;\n // params.inReplyToId = replyToStatus?.id || undefined;\n params.in_reply_to_id = replyToStatus?.id || undefined;\n }\n params = removeNullUndefined(params);\n console.log('POST', params);\n\n let newStatus;\n if (editStatus) {\n newStatus = await masto.v1.statuses\n .$select(editStatus.id)\n .update(params);\n saveStatus(newStatus, instance, {\n skipThreading: true,\n });\n } else {\n try {\n newStatus = await masto.v1.statuses.create(params, {\n requestInit: {\n headers: {\n 'Idempotency-Key': UID.current,\n },\n },\n });\n } catch (_) {\n // If idempotency key fails, try again without it\n newStatus = await masto.v1.statuses.create(params);\n }\n }\n states.composerState.minimized = false;\n states.composerState.publishing = false;\n setUIState('default');\n\n // Close\n onClose({\n // type: post, reply, edit\n type: editStatus ? 'edit' : replyToStatus ? 'reply' : 'post',\n newStatus,\n instance,\n });\n } catch (e) {\n states.composerState.publishing = false;\n states.composerState.publishingError = true;\n console.error(e);\n alert(e?.reason || e);\n setUIState('error');\n }\n })();\n }}\n >\n
    \n {\n updateCharCount();\n }}\n />\n \n {\n const sensitive = e.target.checked;\n setSensitive(sensitive);\n if (sensitive) {\n spoilerTextRef.current?.focus();\n } else {\n textareaRef.current?.focus();\n }\n }}\n />\n \n {' '}\n \n \n {\n setVisibility(e.target.value);\n }}\n disabled={uiState === 'loading' || !!editStatus}\n dir=\"auto\"\n >\n \n {(supports('@pleroma/local-visibility-post') ||\n supports('@akkoma/local-visibility-post')) && (\n \n )}\n \n \n \n \n {' '}\n
    \n {\n updateCharCount();\n }}\n maxCharacters={maxCharacters}\n performSearch={(params) => {\n const { type, q, limit } = params;\n if (type === 'accounts') {\n return masto.v1.accounts.search.list({\n q,\n limit,\n resolve: false,\n });\n }\n return masto.v2.search.fetch(params);\n }}\n onTrigger={(action) => {\n if (action?.name === 'custom-emojis') {\n setShowEmoji2Picker({\n defaultSearchTerm: action?.defaultSearchTerm || null,\n });\n } else if (action?.name === 'mention') {\n setShowMentionPicker({\n defaultSearchTerm: action?.defaultSearchTerm || null,\n });\n } else if (\n action?.name === 'auto-detect-language' &&\n action?.languages\n ) {\n setAutoDetectedLanguages(action.languages);\n }\n }}\n />\n {mediaAttachments?.length > 0 && (\n
    \n {mediaAttachments.map((attachment, i) => {\n const { id, file } = attachment;\n const fileID = file?.size + file?.type + file?.name;\n return (\n {\n setMediaAttachments((attachments) => {\n const newAttachments = [...attachments];\n newAttachments[i] = {\n ...newAttachments[i],\n description: value,\n };\n return newAttachments;\n });\n }}\n onRemove={() => {\n setMediaAttachments((attachments) => {\n return attachments.filter((_, j) => j !== i);\n });\n }}\n />\n );\n })}\n \n
    \n )}\n {!!poll && (\n {\n if (poll) {\n const newPoll = { ...poll };\n setPoll(newPoll);\n } else {\n setPoll(null);\n }\n }}\n />\n )}\n \n \n \n {/* If maxOptions is not defined or defined and is greater than 1, show poll button */}\n {maxOptions == null ||\n (maxOptions > 1 && (\n <>\n {\n setPoll({\n options: ['', ''],\n expiresIn: 24 * 60 * 60, // 1 day\n multiple: false,\n });\n }}\n >\n \n \n \n ))}\n {/* {\n setShowMentionPicker(true);\n }}\n >\n \n */}\n {\n setShowEmoji2Picker(true);\n }}\n >\n \n \n {!!states.settings.composerGIFPicker && (\n = maxMediaAttachments ||\n !!poll\n }\n onClick={() => {\n setShowGIFPicker(true);\n }}\n >\n GIF\n \n )}\n \n
    \n {uiState === 'loading' ? (\n \n ) : (\n
    \n \n
    \n {showMentionPicker && (\n {\n if (e.target === e.currentTarget) {\n setShowMentionPicker(false);\n }\n }}\n >\n {\n setShowMentionPicker(false);\n }}\n defaultSearchTerm={showMentionPicker?.defaultSearchTerm}\n onSelect={(socialAddress) => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n const { selectionStart, selectionEnd } = textarea;\n const text = textarea.value;\n const textBeforeMention = text.slice(0, selectionStart);\n const spaceBeforeMention = textBeforeMention\n ? /[\\s\\t\\n\\r]$/.test(textBeforeMention)\n ? ''\n : ' '\n : '';\n const textAfterMention = text.slice(selectionEnd);\n const spaceAfterMention = /^[\\s\\t\\n\\r]/.test(textAfterMention)\n ? ''\n : ' ';\n const newText =\n textBeforeMention +\n spaceBeforeMention +\n '@' +\n socialAddress +\n spaceAfterMention +\n textAfterMention;\n textarea.value = newText;\n textarea.selectionStart = textarea.selectionEnd =\n selectionEnd +\n 1 +\n socialAddress.length +\n spaceAfterMention.length;\n textarea.focus();\n textarea.dispatchEvent(new Event('input'));\n }}\n />\n \n )}\n {showEmoji2Picker && (\n {\n if (e.target === e.currentTarget) {\n setShowEmoji2Picker(false);\n }\n }}\n >\n {\n setShowEmoji2Picker(false);\n }}\n defaultSearchTerm={showEmoji2Picker?.defaultSearchTerm}\n onSelect={(emojiShortcode) => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n const { selectionStart, selectionEnd } = textarea;\n const text = textarea.value;\n const textBeforeEmoji = text.slice(0, selectionStart);\n const spaceBeforeEmoji = textBeforeEmoji\n ? /[\\s\\t\\n\\r]$/.test(textBeforeEmoji)\n ? ''\n : ' '\n : '';\n const textAfterEmoji = text.slice(selectionEnd);\n const spaceAfterEmoji = /^[\\s\\t\\n\\r]/.test(textAfterEmoji)\n ? ''\n : ' ';\n const newText =\n textBeforeEmoji +\n spaceBeforeEmoji +\n emojiShortcode +\n spaceAfterEmoji +\n textAfterEmoji;\n textarea.value = newText;\n textarea.selectionStart = textarea.selectionEnd =\n selectionEnd + emojiShortcode.length + spaceAfterEmoji.length;\n textarea.focus();\n textarea.dispatchEvent(new Event('input'));\n }}\n />\n \n )}\n {showGIFPicker && (\n {\n if (e.target === e.currentTarget) {\n setShowGIFPicker(false);\n }\n }}\n >\n setShowGIFPicker(false)}\n onSelect={({ url, type, alt_text }) => {\n console.log('GIF URL', url);\n if (mediaAttachments.length >= maxMediaAttachments) {\n alert(\n plural(maxMediaAttachments, {\n one: 'You can only attach up to 1 file.',\n other: 'You can only attach up to # files.',\n }),\n );\n return;\n }\n // Download the GIF and insert it as media attachment\n (async () => {\n let theToast;\n try {\n theToast = showToast({\n text: t`Downloading GIF…`,\n duration: -1,\n });\n const blob = await fetch(url, {\n referrerPolicy: 'no-referrer',\n }).then((res) => res.blob());\n const file = new File(\n [blob],\n type === 'video/mp4' ? 'video.mp4' : 'image.gif',\n {\n type,\n },\n );\n const newMediaAttachments = [\n ...mediaAttachments,\n {\n file,\n type,\n size: file.size,\n id: null,\n description: alt_text || '',\n },\n ];\n setMediaAttachments(newMediaAttachments);\n theToast?.hideToast?.();\n } catch (err) {\n console.error(err);\n theToast?.hideToast?.();\n showToast(t`Failed to download GIF`);\n }\n })();\n }}\n />\n \n )}\n
    \n );\n}\n\nfunction autoResizeTextarea(textarea) {\n if (!textarea) return;\n const { value, offsetHeight, scrollHeight, clientHeight } = textarea;\n if (offsetHeight < window.innerHeight) {\n // NOTE: This check is needed because the offsetHeight return 50000 (really large number) on first render\n // No idea why it does that, will re-investigate in far future\n const offset = offsetHeight - clientHeight;\n const height = value ? scrollHeight + offset + 'px' : null;\n textarea.style.height = height;\n }\n}\n\nasync function _getCustomEmojis(instance, masto) {\n const emojis = await masto.v1.customEmojis.list();\n const visibleEmojis = emojis.filter((e) => e.visibleInPicker);\n const searcher = new Fuse(visibleEmojis, {\n keys: ['shortcode'],\n findAllMatches: true,\n });\n return [visibleEmojis, searcher];\n}\nconst getCustomEmojis = pmem(_getCustomEmojis, {\n // Limit by time to reduce memory usage\n // Cached by instance\n matchesArg: (cacheKeyArg, keyArg) => cacheKeyArg.instance === keyArg.instance,\n maxAge: 30 * 60 * 1000, // 30 minutes\n});\n\nconst detectLangs = async (text) => {\n const { detectAll } = await import('tinyld/light');\n const langs = detectAll(text);\n if (langs?.length) {\n // return max 2\n return langs.slice(0, 2).map((lang) => lang.lang);\n }\n return null;\n};\n\nconst Textarea = forwardRef((props, ref) => {\n const { masto, instance } = api();\n const [text, setText] = useState(ref.current?.value || '');\n const {\n maxCharacters,\n performSearch = () => {},\n onTrigger = () => {},\n ...textareaProps\n } = props;\n // const snapStates = useSnapshot(states);\n // const charCount = snapStates.composerCharacterCount;\n\n // const customEmojis = useRef();\n const searcherRef = useRef();\n useEffect(() => {\n getCustomEmojis(instance, masto)\n .then((r) => {\n const [emojis, searcher] = r;\n searcherRef.current = searcher;\n })\n .catch((e) => {\n console.error(e);\n });\n }, []);\n\n const textExpanderRef = useRef();\n const textExpanderTextRef = useRef('');\n useEffect(() => {\n let handleChange, handleValue, handleCommited;\n if (textExpanderRef.current) {\n handleChange = (e) => {\n // console.log('text-expander-change', e);\n const { key, provide, text } = e.detail;\n textExpanderTextRef.current = text;\n\n if (text === '') {\n provide(\n Promise.resolve({\n matched: false,\n }),\n );\n return;\n }\n\n if (key === ':') {\n // const emojis = customEmojis.current.filter((emoji) =>\n // emoji.shortcode.startsWith(text),\n // );\n // const emojis = filterShortcodes(customEmojis.current, text);\n const results = searcherRef.current?.search(text, {\n limit: 5,\n });\n let html = '';\n results.forEach(({ item: emoji }) => {\n const { shortcode, url } = emoji;\n html += `\n
  • \n \"\" \n ${encodeHTML(shortcode)}\n
  • `;\n });\n html += `
  • ${t`More…`}
  • `;\n // console.log({ emojis, html });\n menu.innerHTML = html;\n provide(\n Promise.resolve({\n matched: results.length > 0,\n fragment: menu,\n }),\n );\n return;\n }\n\n const type = {\n '@': 'accounts',\n '#': 'hashtags',\n }[key];\n provide(\n new Promise((resolve) => {\n const searchResults = performSearch({\n type,\n q: text,\n limit: 5,\n });\n searchResults.then((value) => {\n if (text !== textExpanderTextRef.current) {\n return;\n }\n console.log({ value, type, v: value[type] });\n const results = value[type] || value;\n console.log('RESULTS', value, results);\n let html = '';\n results.forEach((result) => {\n const {\n name,\n avatarStatic,\n displayName,\n username,\n acct,\n emojis,\n history,\n } = result;\n const displayNameWithEmoji = emojifyText(displayName, emojis);\n // const item = menuItem.cloneNode();\n if (acct) {\n html += `\n
  • \n \n \"\"\n \n \n ${displayNameWithEmoji || username}\n
    @${encodeHTML(\n acct,\n )}\n
    \n
  • \n `;\n } else {\n const total = history?.reduce?.(\n (acc, cur) => acc + +cur.uses,\n 0,\n );\n html += `\n
  • \n #${encodeHTML(name)}\n ${\n total\n ? `${shortenNumber(total)}`\n : ''\n }\n
  • \n `;\n }\n });\n if (type === 'accounts') {\n html += `
  • ${t`More…`}
  • `;\n }\n menu.innerHTML = html;\n console.log('MENU', results, menu);\n resolve({\n matched: results.length > 0,\n fragment: menu,\n });\n });\n }),\n );\n };\n\n textExpanderRef.current.addEventListener(\n 'text-expander-change',\n handleChange,\n );\n\n handleValue = (e) => {\n const { key, item } = e.detail;\n const { value, more } = item.dataset;\n if (key === ':') {\n e.detail.value = value ? `:${value}:` : '​'; // zero-width space\n if (more) {\n // Prevent adding space after the above value\n e.detail.continue = true;\n\n setTimeout(() => {\n onTrigger?.({\n name: 'custom-emojis',\n defaultSearchTerm: more,\n });\n }, 300);\n }\n } else if (key === '@') {\n e.detail.value = value ? `@${value} ` : '​'; // zero-width space\n if (more) {\n e.detail.continue = true;\n setTimeout(() => {\n onTrigger?.({\n name: 'mention',\n defaultSearchTerm: more,\n });\n }, 300);\n }\n } else {\n e.detail.value = `${key}${value}`;\n }\n };\n\n textExpanderRef.current.addEventListener(\n 'text-expander-value',\n handleValue,\n );\n\n handleCommited = (e) => {\n const { input } = e.detail;\n setText(input.value);\n // fire input event\n if (ref.current) {\n const event = new Event('input', { bubbles: true });\n ref.current.dispatchEvent(event);\n }\n };\n\n textExpanderRef.current.addEventListener(\n 'text-expander-committed',\n handleCommited,\n );\n }\n\n return () => {\n if (textExpanderRef.current) {\n textExpanderRef.current.removeEventListener(\n 'text-expander-change',\n handleChange,\n );\n textExpanderRef.current.removeEventListener(\n 'text-expander-value',\n handleValue,\n );\n textExpanderRef.current.removeEventListener(\n 'text-expander-committed',\n handleCommited,\n );\n }\n };\n }, []);\n\n useEffect(() => {\n // Resize observer for textarea\n const textarea = ref.current;\n if (!textarea) return;\n const resizeObserver = new ResizeObserver(() => {\n // Get height of textarea, set height to textExpander\n if (textExpanderRef.current) {\n const { height } = textarea.getBoundingClientRect();\n textExpanderRef.current.style.height = height + 'px';\n }\n });\n resizeObserver.observe(textarea);\n }, []);\n\n const slowHighlightPerf = useRef(0); // increment if slow\n const composeHighlightRef = useRef();\n const throttleHighlightText = useThrottledCallback((text) => {\n if (!composeHighlightRef.current) return;\n if (slowHighlightPerf.current > 3) {\n // After 3 times of lag, disable highlighting\n composeHighlightRef.current.innerHTML = '';\n composeHighlightRef.current = null; // Destroy the whole thing\n throttleHighlightText?.cancel?.();\n return;\n }\n let start;\n let end;\n if (slowHighlightPerf.current <= 3) start = Date.now();\n composeHighlightRef.current.innerHTML =\n highlightText(text, {\n maxCharacters,\n }) + '\\n';\n if (slowHighlightPerf.current <= 3) end = Date.now();\n console.debug('HIGHLIGHT PERF', { start, end, diff: end - start });\n if (start && end && end - start > 50) {\n // if slow, increment\n slowHighlightPerf.current++;\n }\n // Newline to prevent multiple line breaks at the end from being collapsed, no idea why\n }, 500);\n\n const debouncedAutoDetectLanguage = useDebouncedCallback(() => {\n // Make use of the highlightRef to get the DOM\n // Clone the dom\n const dom = composeHighlightRef.current?.cloneNode(true);\n if (!dom) return;\n // Remove mark\n dom.querySelectorAll('mark').forEach((mark) => {\n mark.remove();\n });\n const text = dom.innerText?.trim();\n if (!text) return;\n (async () => {\n const langs = await detectLangs(text);\n if (langs?.length) {\n onTrigger?.({\n name: 'auto-detect-language',\n languages: langs,\n });\n }\n })();\n }, 2000);\n\n return (\n \n {\n // Get line before cursor position after pressing 'Enter'\n const { key, target } = e;\n if (key === 'Enter' && !(e.ctrlKey || e.metaKey)) {\n try {\n const { value, selectionStart } = target;\n const textBeforeCursor = value.slice(0, selectionStart);\n const lastLine = textBeforeCursor.split('\\n').slice(-1)[0];\n if (lastLine) {\n // If line starts with \"- \" or \"12. \"\n if (/^\\s*(-|\\d+\\.)\\s/.test(lastLine)) {\n // insert \"- \" at cursor position\n const [_, preSpaces, bullet, postSpaces, anything] =\n lastLine.match(/^(\\s*)(-|\\d+\\.)(\\s+)(.+)?/) || [];\n if (anything) {\n e.preventDefault();\n const [number] = bullet.match(/\\d+/) || [];\n const newBullet = number ? `${+number + 1}.` : '-';\n const text = `\\n${preSpaces}${newBullet}${postSpaces}`;\n target.setRangeText(text, selectionStart, selectionStart);\n const pos = selectionStart + text.length;\n target.setSelectionRange(pos, pos);\n } else {\n // trim the line before the cursor, then insert new line\n const pos = selectionStart - lastLine.length;\n target.setRangeText('', pos, selectionStart);\n }\n autoResizeTextarea(target);\n target.dispatchEvent(new Event('input'));\n }\n }\n } catch (e) {\n // silent fail\n console.error(e);\n }\n }\n if (composeHighlightRef.current) {\n composeHighlightRef.current.scrollTop = target.scrollTop;\n }\n }}\n onInput={(e) => {\n const { target } = e;\n // Replace zero-width space\n const text = target.value.replace(/\\u200b/g, '');\n setText(text);\n autoResizeTextarea(target);\n props.onInput?.(e);\n throttleHighlightText(text);\n debouncedAutoDetectLanguage();\n }}\n style={{\n width: '100%',\n height: '4em',\n // '--text-weight': (1 + charCount / 140).toFixed(1) || 1,\n }}\n onScroll={(e) => {\n if (composeHighlightRef.current) {\n const { scrollTop } = e.target;\n composeHighlightRef.current.scrollTop = scrollTop;\n }\n }}\n />\n \n \n );\n});\n\nfunction CharCountMeter({ maxCharacters = 500, hidden }) {\n const snapStates = useSnapshot(states);\n const charCount = snapStates.composerCharacterCount;\n const leftChars = maxCharacters - charCount;\n if (hidden) {\n return \n );\n}\n\nfunction scaleDimension(matrix, matrixLimit, width, height) {\n // matrix = number of pixels\n // matrixLimit = max number of pixels\n // Calculate new width and height, downsize to within the limit, preserve aspect ratio, no decimals\n const scalingFactor = Math.sqrt(matrixLimit / matrix);\n const newWidth = Math.floor(width * scalingFactor);\n const newHeight = Math.floor(height * scalingFactor);\n return { newWidth, newHeight };\n}\n\nfunction MediaAttachment({\n attachment,\n disabled,\n lang,\n onDescriptionChange = () => {},\n onRemove = () => {},\n}) {\n const { i18n } = useLingui();\n const [uiState, setUIState] = useState('default');\n const supportsEdit = supports('@mastodon/edit-media-attributes');\n const { type, id, file } = attachment;\n const url = useMemo(\n () => (file ? URL.createObjectURL(file) : attachment.url),\n [file, attachment.url],\n );\n console.log({ attachment });\n\n const checkMaxError = !!file?.size;\n const configuration = checkMaxError ? getCurrentInstanceConfiguration() : {};\n const {\n mediaAttachments: {\n imageSizeLimit,\n imageMatrixLimit,\n videoSizeLimit,\n videoMatrixLimit,\n videoFrameRateLimit,\n } = {},\n } = configuration || {};\n\n const [maxError, setMaxError] = useState(() => {\n if (!checkMaxError) return null;\n if (\n type.startsWith('image') &&\n imageSizeLimit &&\n file.size > imageSizeLimit\n ) {\n return {\n type: 'imageSizeLimit',\n details: {\n imageSize: file.size,\n imageSizeLimit,\n },\n };\n } else if (\n type.startsWith('video') &&\n videoSizeLimit &&\n file.size > videoSizeLimit\n ) {\n return {\n type: 'videoSizeLimit',\n details: {\n videoSize: file.size,\n videoSizeLimit,\n },\n };\n }\n return null;\n });\n\n const [imageMatrix, setImageMatrix] = useState({});\n useEffect(() => {\n if (!checkMaxError || !imageMatrixLimit) return;\n if (imageMatrix?.matrix > imageMatrixLimit) {\n setMaxError({\n type: 'imageMatrixLimit',\n details: {\n imageMatrix: imageMatrix?.matrix,\n imageMatrixLimit,\n width: imageMatrix?.width,\n height: imageMatrix?.height,\n },\n });\n }\n }, [imageMatrix, imageMatrixLimit, checkMaxError]);\n\n const [videoMatrix, setVideoMatrix] = useState({});\n useEffect(() => {\n if (!checkMaxError || !videoMatrixLimit) return;\n if (videoMatrix?.matrix > videoMatrixLimit) {\n setMaxError({\n type: 'videoMatrixLimit',\n details: {\n videoMatrix: videoMatrix?.matrix,\n videoMatrixLimit,\n width: videoMatrix?.width,\n height: videoMatrix?.height,\n },\n });\n }\n }, [videoMatrix, videoMatrixLimit, checkMaxError]);\n\n const [description, setDescription] = useState(attachment.description);\n const [suffixType, subtype] = type.split('/');\n const debouncedOnDescriptionChange = useDebouncedCallback(\n onDescriptionChange,\n 250,\n );\n useEffect(() => {\n debouncedOnDescriptionChange(description);\n }, [description, debouncedOnDescriptionChange]);\n\n const [showModal, setShowModal] = useState(false);\n const textareaRef = useRef(null);\n useEffect(() => {\n let timer;\n if (showModal && textareaRef.current) {\n timer = setTimeout(() => {\n textareaRef.current.focus();\n }, 100);\n }\n return () => {\n clearTimeout(timer);\n };\n }, [showModal]);\n\n const descTextarea = (\n <>\n {!!id && !supportsEdit ? (\n
    \n \n Uploaded\n \n

    \n {attachment.description || No description}\n

    \n
    \n ) : (\n {\n const { value } = e.target;\n setDescription(value);\n // debouncedOnDescriptionChange(value);\n }}\n >\n )}\n \n );\n\n const toastRef = useRef(null);\n useEffect(() => {\n return () => {\n toastRef.current?.hideToast?.();\n };\n }, []);\n\n const maxErrorToast = useRef(null);\n\n const maxErrorText = (err) => {\n const { type, details } = err;\n switch (type) {\n case 'imageSizeLimit': {\n const { imageSize, imageSizeLimit } = details;\n return t`File size too large. Uploading might encounter issues. Try reduce the file size from ${prettyBytes(\n imageSize,\n )} to ${prettyBytes(imageSizeLimit)} or lower.`;\n }\n case 'imageMatrixLimit': {\n const { imageMatrix, imageMatrixLimit, width, height } = details;\n const { newWidth, newHeight } = scaleDimension(\n imageMatrix,\n imageMatrixLimit,\n width,\n height,\n );\n return t`Dimension too large. Uploading might encounter issues. Try reduce dimension from ${i18n.number(\n width,\n )}×${i18n.number(height)}px to ${i18n.number(newWidth)}×${i18n.number(\n newHeight,\n )}px.`;\n }\n case 'videoSizeLimit': {\n const { videoSize, videoSizeLimit } = details;\n return t`File size too large. Uploading might encounter issues. Try reduce the file size from ${prettyBytes(\n videoSize,\n )} to ${prettyBytes(videoSizeLimit)} or lower.`;\n }\n case 'videoMatrixLimit': {\n const { videoMatrix, videoMatrixLimit, width, height } = details;\n const { newWidth, newHeight } = scaleDimension(\n videoMatrix,\n videoMatrixLimit,\n width,\n height,\n );\n return t`Dimension too large. Uploading might encounter issues. Try reduce dimension from ${i18n.number(\n width,\n )}×${i18n.number(height)}px to ${i18n.number(newWidth)}×${i18n.number(\n newHeight,\n )}px.`;\n }\n case 'videoFrameRateLimit': {\n // Not possible to detect this on client-side for now\n return t`Frame rate too high. Uploading might encounter issues.`;\n }\n }\n };\n\n return (\n <>\n
    \n {\n setShowModal(true);\n }}\n >\n {suffixType === 'image' ? (\n {\n if (!checkMaxError) return;\n const { naturalWidth, naturalHeight } = e.target;\n setImageMatrix({\n matrix: naturalWidth * naturalHeight,\n width: naturalWidth,\n height: naturalHeight,\n });\n }}\n />\n ) : suffixType === 'video' || suffixType === 'gifv' ? (\n {\n if (!checkMaxError) return;\n const { videoWidth, videoHeight } = e.target;\n if (videoWidth && videoHeight) {\n setVideoMatrix({\n matrix: videoWidth * videoHeight,\n width: videoWidth,\n height: videoHeight,\n });\n }\n }}\n />\n ) : suffixType === 'audio' ? (\n
    \n {descTextarea}\n
    \n \n \n \n {!!maxError && (\n {\n if (maxErrorToast.current) {\n maxErrorToast.current.hideToast();\n }\n maxErrorToast.current = showToast({\n text: maxErrorText(maxError),\n duration: 10_000,\n });\n }}\n >\n \n \n )}\n
    \n \n {showModal && (\n {\n setShowModal(false);\n }}\n >\n
    \n {\n setShowModal(false);\n }}\n >\n \n \n
    \n

    \n {\n {\n image: t`Edit image description`,\n video: t`Edit video description`,\n audio: t`Edit audio description`,\n }[suffixType]\n }\n

    \n
    \n
    \n
    \n {suffixType === 'image' ? (\n \"\"\n ) : suffixType === 'video' || suffixType === 'gifv' ? (\n
    \n
    \n {descTextarea}\n
    \n {suffixType === 'image' &&\n /^(png|jpe?g|gif|webp)$/i.test(subtype) &&\n !!states.settings.mediaAltGenerator &&\n !!IMG_ALT_API_URL && (\n \n \n \n }\n >\n {\n setUIState('loading');\n toastRef.current = showToast({\n text: t`Generating description. Please wait…`,\n duration: -1,\n });\n // POST with multipart\n (async function () {\n try {\n const body = new FormData();\n body.append('image', file);\n const response = await fetch(IMG_ALT_API_URL, {\n method: 'POST',\n body,\n }).then((r) => r.json());\n if (response.error) {\n throw new Error(response.error);\n }\n setDescription(response.description);\n } catch (e) {\n console.error(e);\n showToast(\n e.message\n ? t`Failed to generate description: ${e.message}`\n : t`Failed to generate description`,\n );\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n \n {lang && lang !== 'en' ? (\n \n Generate description…\n
    \n (English)\n
    \n ) : (\n \n Generate description…\n \n )}\n \n {!!lang && lang !== 'en' && (\n {\n setUIState('loading');\n toastRef.current = showToast({\n text: t`Generating description. Please wait…`,\n duration: -1,\n });\n // POST with multipart\n (async function () {\n try {\n const body = new FormData();\n body.append('image', file);\n const params = `?lang=${lang}`;\n const response = await fetch(\n IMG_ALT_API_URL + params,\n {\n method: 'POST',\n body,\n },\n ).then((r) => r.json());\n if (response.error) {\n throw new Error(response.error);\n }\n setDescription(response.description);\n } catch (e) {\n console.error(e);\n showToast(\n t`Failed to generate description${\n e?.message ? `: ${e.message}` : ''\n }`,\n );\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n \n \n Generate description…\n
    \n \n ({localeCode2Text(lang)}){' '}\n \n — experimental\n \n \n
    \n \n )}\n \n )}\n {\n setShowModal(false);\n }}\n disabled={uiState === 'loading'}\n >\n Done\n \n
    \n
    \n
    \n
    \n \n )}\n \n );\n}\n\nfunction Poll({\n lang,\n poll,\n disabled,\n onInput = () => {},\n maxOptions,\n maxExpiration,\n minExpiration,\n maxCharactersPerOption,\n}) {\n const { _ } = useLingui();\n const { options, expiresIn, multiple } = poll;\n\n return (\n
    \n
    \n {options.map((option, i) => (\n
    \n {\n const { value } = e.target;\n options[i] = value;\n onInput(poll);\n }}\n />\n {\n options.splice(i, 1);\n onInput(poll);\n }}\n >\n \n \n
    \n ))}\n
    \n
    \n = maxOptions}\n onClick={() => {\n options.push('');\n onInput(poll);\n }}\n >\n +\n {' '}\n \n \n
    \n
    \n {\n onInput(null);\n }}\n >\n Remove poll\n \n
    \n
    \n );\n}\n\nfunction filterShortcodes(emojis, searchTerm) {\n searchTerm = searchTerm.toLowerCase();\n\n // Return an array of shortcodes that start with or contain the search term, sorted by relevance and limited to the first 5\n return emojis\n .sort((a, b) => {\n let aLower = a.shortcode.toLowerCase();\n let bLower = b.shortcode.toLowerCase();\n\n let aStartsWith = aLower.startsWith(searchTerm);\n let bStartsWith = bLower.startsWith(searchTerm);\n let aContains = aLower.includes(searchTerm);\n let bContains = bLower.includes(searchTerm);\n let bothStartWith = aStartsWith && bStartsWith;\n let bothContain = aContains && bContains;\n\n return bothStartWith\n ? a.length - b.length\n : aStartsWith\n ? -1\n : bStartsWith\n ? 1\n : bothContain\n ? a.length - b.length\n : aContains\n ? -1\n : bContains\n ? 1\n : 0;\n })\n .slice(0, 5);\n}\n\nfunction encodeHTML(str) {\n return str.replace(/[&<>\"']/g, function (char) {\n return '&#' + char.charCodeAt(0) + ';';\n });\n}\n\nfunction removeNullUndefined(obj) {\n for (let key in obj) {\n if (obj[key] === null || obj[key] === undefined) {\n delete obj[key];\n }\n }\n return obj;\n}\n\nfunction MentionModal({\n onClose = () => {},\n onSelect = () => {},\n defaultSearchTerm,\n}) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [accounts, setAccounts] = useState([]);\n const [relationshipsMap, setRelationshipsMap] = useState({});\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const loadRelationships = async (accounts) => {\n if (!accounts?.length) return;\n const relationships = await fetchRelationships(accounts, relationshipsMap);\n if (relationships) {\n setRelationshipsMap({\n ...relationshipsMap,\n ...relationships,\n });\n }\n };\n\n const loadAccounts = (term) => {\n if (!term) return;\n setUIState('loading');\n (async () => {\n try {\n const accounts = await masto.v1.accounts.search.list({\n q: term,\n limit: 40,\n resolve: false,\n });\n setAccounts(accounts);\n loadRelationships(accounts);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n console.error(e);\n }\n })();\n };\n\n const debouncedLoadAccounts = useDebouncedCallback(loadAccounts, 1000);\n\n useEffect(() => {\n loadAccounts();\n }, [loadAccounts]);\n\n const inputRef = useRef();\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n // Put cursor at the end\n if (inputRef.current.value) {\n inputRef.current.selectionStart = inputRef.current.value.length;\n inputRef.current.selectionEnd = inputRef.current.value.length;\n }\n }\n }, []);\n\n useEffect(() => {\n if (defaultSearchTerm) {\n loadAccounts(defaultSearchTerm);\n }\n }, [defaultSearchTerm]);\n\n const selectAccount = (account) => {\n const socialAddress = account.acct;\n onSelect(socialAddress);\n onClose();\n };\n\n useHotkeys(\n 'enter',\n () => {\n const selectedAccount = accounts[selectedIndex];\n if (selectedAccount) {\n selectAccount(selectedAccount);\n }\n },\n {\n preventDefault: true,\n enableOnFormTags: ['input'],\n },\n );\n\n const listRef = useRef();\n useHotkeys(\n 'down',\n () => {\n if (selectedIndex < accounts.length - 1) {\n setSelectedIndex(selectedIndex + 1);\n } else {\n setSelectedIndex(0);\n }\n setTimeout(() => {\n const selectedItem = listRef.current.querySelector('.selected');\n if (selectedItem) {\n selectedItem.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n });\n }\n }, 1);\n },\n {\n preventDefault: true,\n enableOnFormTags: ['input'],\n },\n );\n\n useHotkeys(\n 'up',\n () => {\n if (selectedIndex > 0) {\n setSelectedIndex(selectedIndex - 1);\n } else {\n setSelectedIndex(accounts.length - 1);\n }\n setTimeout(() => {\n const selectedItem = listRef.current.querySelector('.selected');\n if (selectedItem) {\n selectedItem.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n });\n }\n }, 1);\n },\n {\n preventDefault: true,\n enableOnFormTags: ['input'],\n },\n );\n\n return (\n
    \n {!!onClose && (\n \n )}\n
    \n {\n e.preventDefault();\n debouncedLoadAccounts.flush?.();\n // const searchTerm = inputRef.current.value;\n // debouncedLoadAccounts(searchTerm);\n }}\n >\n {\n const { value } = e.target;\n debouncedLoadAccounts(value);\n }}\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellCheck=\"false\"\n dir=\"auto\"\n defaultValue={defaultSearchTerm || ''}\n />\n \n
    \n
    \n {accounts?.length > 0 ? (\n \n {accounts.map((account, i) => {\n const relationship = relationshipsMap[account.id];\n return (\n \n \n {\n selectAccount(account);\n }}\n >\n \n \n \n );\n })}\n \n ) : uiState === 'loading' ? (\n
    \n \n
    \n ) : uiState === 'error' ? (\n
    \n

    \n Error loading accounts\n

    \n
    \n ) : null}\n
    \n
    \n );\n}\n\nfunction CustomEmojisModal({\n masto,\n instance,\n onClose = () => {},\n onSelect = () => {},\n defaultSearchTerm,\n}) {\n const [uiState, setUIState] = useState('default');\n const customEmojisList = useRef([]);\n const [customEmojis, setCustomEmojis] = useState([]);\n const recentlyUsedCustomEmojis = useMemo(\n () => store.account.get('recentlyUsedCustomEmojis') || [],\n );\n const searcherRef = useRef();\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const [emojis, searcher] = await getCustomEmojis(instance, masto);\n console.log('emojis', emojis);\n searcherRef.current = searcher;\n setCustomEmojis(emojis);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n console.error(e);\n }\n })();\n }, []);\n\n const customEmojisCatList = useMemo(() => {\n // Group emojis by category\n const emojisCat = {\n '--recent--': recentlyUsedCustomEmojis.filter((emoji) =>\n customEmojis.find((e) => e.shortcode === emoji.shortcode),\n ),\n };\n const othersCat = [];\n customEmojis.forEach((emoji) => {\n customEmojisList.current?.push?.(emoji);\n if (!emoji.category) {\n othersCat.push(emoji);\n return;\n }\n if (!emojisCat[emoji.category]) {\n emojisCat[emoji.category] = [];\n }\n emojisCat[emoji.category].push(emoji);\n });\n if (othersCat.length) {\n emojisCat['--others--'] = othersCat;\n }\n return emojisCat;\n }, [customEmojis]);\n\n const scrollableRef = useRef();\n const [matches, setMatches] = useState(null);\n const onFind = useCallback(\n (e) => {\n const { value } = e.target;\n if (value) {\n const results = searcherRef.current?.search(value, {\n limit: CUSTOM_EMOJIS_COUNT,\n });\n setMatches(results.map((r) => r.item));\n scrollableRef.current?.scrollTo?.(0, 0);\n } else {\n setMatches(null);\n }\n },\n [customEmojis],\n );\n useEffect(() => {\n if (defaultSearchTerm && customEmojis?.length) {\n onFind({ target: { value: defaultSearchTerm } });\n }\n }, [defaultSearchTerm, onFind, customEmojis]);\n\n const onSelectEmoji = useCallback(\n (emoji) => {\n onSelect?.(emoji);\n onClose?.();\n\n queueMicrotask(() => {\n let recentlyUsedCustomEmojis =\n store.account.get('recentlyUsedCustomEmojis') || [];\n const recentlyUsedEmojiIndex = recentlyUsedCustomEmojis.findIndex(\n (e) => e.shortcode === emoji.shortcode,\n );\n if (recentlyUsedEmojiIndex !== -1) {\n // Move emoji to index 0\n recentlyUsedCustomEmojis.splice(recentlyUsedEmojiIndex, 1);\n recentlyUsedCustomEmojis.unshift(emoji);\n } else {\n recentlyUsedCustomEmojis.unshift(emoji);\n // Remove unavailable ones\n recentlyUsedCustomEmojis = recentlyUsedCustomEmojis.filter((e) =>\n customEmojisList.current?.find?.(\n (emoji) => emoji.shortcode === e.shortcode,\n ),\n );\n // Limit to 10\n recentlyUsedCustomEmojis = recentlyUsedCustomEmojis.slice(0, 10);\n }\n\n // Store back\n store.account.set('recentlyUsedCustomEmojis', recentlyUsedCustomEmojis);\n });\n },\n [onSelect],\n );\n\n const inputRef = useRef();\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n // Put cursor at the end\n if (inputRef.current.value) {\n inputRef.current.selectionStart = inputRef.current.value.length;\n inputRef.current.selectionEnd = inputRef.current.value.length;\n }\n }\n }, []);\n\n return (\n
    \n {!!onClose && (\n \n )}\n
    \n
    \n \n Custom emojis\n {' '}\n {uiState === 'loading' ? (\n \n ) : (\n • {instance}\n )}\n
    \n {\n e.preventDefault();\n const emoji = matches[0];\n if (emoji) {\n onSelectEmoji(`:${emoji.shortcode}:`);\n }\n }}\n >\n \n \n
    \n
    \n {matches !== null ? (\n
      \n {matches.map((emoji) => (\n
    • \n {\n onSelectEmoji(`:${emoji.shortcode}:`);\n }}\n showCode\n />\n
    • \n ))}\n
    \n ) : (\n
    \n {uiState === 'error' && (\n
    \n

    \n Error loading custom emojis\n

    \n
    \n )}\n {uiState === 'default' &&\n Object.entries(customEmojisCatList).map(\n ([category, emojis]) =>\n !!emojis?.length && (\n
    \n
    \n {{\n '--recent--': t`Recently used`,\n '--others--': t`Others`,\n }[category] || category}\n
    \n \n
    \n ),\n )}\n
    \n )}\n
    \n
    \n );\n}\n\nconst CustomEmojisList = memo(({ emojis, onSelect }) => {\n const { i18n } = useLingui();\n const [max, setMax] = useState(CUSTOM_EMOJIS_COUNT);\n const showMore = emojis.length > max;\n return (\n
    \n {emojis.slice(0, max).map((emoji) => (\n {\n onSelect(`:${emoji.shortcode}:`);\n }}\n />\n ))}\n {showMore && (\n setMax(max + CUSTOM_EMOJIS_COUNT)}\n >\n {i18n.number(emojis.length - max)} more…\n \n )}\n
    \n );\n});\n\nconst CustomEmojiButton = memo(({ emoji, onClick, showCode }) => {\n const addEdges = (e) => {\n // Add edge-left or edge-right class based on self position relative to scrollable parent\n // If near left edge, add edge-left, if near right edge, add edge-right\n const buffer = 88;\n const parent = e.currentTarget.closest('main');\n if (parent) {\n const rect = parent.getBoundingClientRect();\n const selfRect = e.currentTarget.getBoundingClientRect();\n const targetClassList = e.currentTarget.classList;\n if (selfRect.left < rect.left + buffer) {\n targetClassList.add('edge-left');\n targetClassList.remove('edge-right');\n } else if (selfRect.right > rect.right - buffer) {\n targetClassList.add('edge-right');\n targetClassList.remove('edge-left');\n } else {\n targetClassList.remove('edge-left', 'edge-right');\n }\n }\n };\n\n return (\n \n \n {!!emoji.staticUrl && (\n \n )}\n \n \n {showCode && (\n <>\n {' '}\n {emoji.shortcode}\n \n )}\n \n );\n});\n\nconst GIFS_PER_PAGE = 20;\nfunction GIFPickerModal({ onClose = () => {}, onSelect = () => {} }) {\n const { i18n } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [results, setResults] = useState([]);\n const formRef = useRef(null);\n const qRef = useRef(null);\n const currentOffset = useRef(0);\n const scrollableRef = useRef(null);\n\n function fetchGIFs({ offset }) {\n console.log('fetchGIFs', { offset });\n if (!qRef.current?.value) return;\n setUIState('loading');\n scrollableRef.current?.scrollTo?.({\n top: 0,\n left: 0,\n behavior: 'smooth',\n });\n (async () => {\n try {\n const query = {\n api_key: GIPHY_API_KEY,\n q: qRef.current.value,\n rating: 'g',\n limit: GIFS_PER_PAGE,\n bundle: 'messaging_non_clips',\n offset,\n lang: i18n.locale || 'en',\n };\n const response = await fetch(\n 'https://api.giphy.com/v1/gifs/search?' + new URLSearchParams(query),\n {\n referrerPolicy: 'no-referrer',\n },\n ).then((r) => r.json());\n currentOffset.current = response.pagination?.offset || 0;\n setResults(response);\n setUIState('results');\n } catch (e) {\n setUIState('error');\n console.error(e);\n }\n })();\n }\n\n useEffect(() => {\n qRef.current?.focus();\n }, []);\n\n const debouncedOnInput = useDebouncedCallback(() => {\n fetchGIFs({ offset: 0 });\n }, 1000);\n\n return (\n
    \n {!!onClose && (\n \n )}\n
    \n {\n e.preventDefault();\n fetchGIFs({ offset: 0 });\n }}\n >\n \n \n \n
    \n
    \n {uiState === 'default' && (\n
    \n

    \n Type to search GIFs\n

    \n
    \n )}\n {uiState === 'loading' && !results?.data?.length && (\n
    \n \n
    \n )}\n {results?.data?.length > 0 ? (\n <>\n
      \n {results.data.map((gif) => {\n const { id, images, title, alt_text } = gif;\n const {\n fixed_height_small,\n fixed_height_downsampled,\n fixed_height,\n original,\n } = images;\n const theImage = fixed_height_small?.url\n ? fixed_height_small\n : fixed_height_downsampled?.url\n ? fixed_height_downsampled\n : fixed_height;\n let { url, webp, width, height } = theImage;\n if (+height > 100) {\n width = (width / height) * 100;\n height = 100;\n }\n const urlObj = URL.parse(url);\n const strippedURL = urlObj.origin + urlObj.pathname;\n let strippedWebP;\n if (webp) {\n const webpObj = URL.parse(webp);\n strippedWebP = webpObj.origin + webpObj.pathname;\n }\n return (\n
    • \n {\n const { mp4, url } = original;\n const theURL = mp4 || url;\n const urlObj = URL.parse(theURL);\n const strippedURL = urlObj.origin + urlObj.pathname;\n onClose();\n onSelect({\n url: strippedURL,\n type: mp4 ? 'video/mp4' : 'image/gif',\n alt_text: alt_text || title,\n });\n }}\n >\n \n \n {strippedWebP && (\n \n )}\n {\n e.target.style.backgroundColor = 'transparent';\n }}\n />\n \n
      {alt_text || title}
      \n \n \n
    • \n );\n })}\n
    \n

    \n {results.pagination?.offset > 0 && (\n {\n fetchGIFs({\n offset: results.pagination?.offset - GIFS_PER_PAGE,\n });\n }}\n >\n \n \n Previous\n \n \n )}\n \n {results.pagination?.offset + results.pagination?.count <\n results.pagination?.total_count && (\n {\n fetchGIFs({\n offset: results.pagination?.offset + GIFS_PER_PAGE,\n });\n }}\n >\n \n Next\n {' '}\n \n \n )}\n

    \n \n ) : (\n uiState === 'results' && (\n
    \n

    No results

    \n
    \n )\n )}\n {uiState === 'error' && (\n
    \n

    \n Error loading GIFs\n

    \n
    \n )}\n
    \n
    \n );\n}\n\nexport default Compose;\n"],"file":"assets/compose-hDlR2o-x.js"} \ No newline at end of file diff --git a/assets/compose-xua1VIA2.js b/assets/compose-xua1VIA2.js new file mode 100644 index 0000000..8a8d891 --- /dev/null +++ b/assets/compose-xua1VIA2.js @@ -0,0 +1,26 @@ +var Dt=s=>{throw TypeError(s)};var mt=(s,t,n)=>t.has(s)||Dt("Cannot "+n);var B=(s,t,n)=>(mt(s,t,"read from private field"),n?n.call(s):t.get(s)),oe=(s,t,n)=>t.has(s)?Dt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(s):t.set(s,n),me=(s,t,n,a)=>(mt(s,t,"write to private field"),a?a.call(s,n):t.set(s,n),n),Y=(s,t,n)=>(mt(s,t,"access private method"),n);import{i as ge,z as vn,s as le,V as Jt,j as Ke,a as _t,h as q,A as V,M as bn,aD as Qt,d as Se,y as te,x as yn,aE as xn,l as je,c as e,T as K,b as wn,f as Pe,w as at,r as kn,af as En,P as Fn,u as Cn,t as $t,C as en}from"./useTitle-B8ZF9tfB.js";import{j as Fe,F as zn,_ as _n,a as $e,a8 as Ln,x as jt,u as An,k as tn,b as Sn,I as Z,z as Pt,i as Je,a9 as In,l as xt,M as Qe,s as ze,a4 as Mn,a0 as Bn,q as Tn,P as Rn,X as rt,c as Dn,d as Ot,y as $n}from"./fuse-RZOrQKm7.js";class jn{constructor(t,n,{tabInsertsSuggestions:a,defaultFirstOption:c}={}){this.input=t,this.list=n,this.tabInsertsSuggestions=a??!0,this.defaultFirstOption=c??!1,this.isComposing=!1,n.id||(n.id=`combobox-${Math.random().toString().slice(2,6)}`),this.ctrlBindings=!!navigator.userAgent.match(/Macintosh/),this.keyboardEventHandler=l=>Pn(l,this),this.compositionEventHandler=l=>Hn(l,this),this.inputHandler=this.clearSelection.bind(this),t.setAttribute("role","combobox"),t.setAttribute("aria-controls",n.id),t.setAttribute("aria-expanded","false"),t.setAttribute("aria-autocomplete","list"),t.setAttribute("aria-haspopup","listbox")}destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute("role"),this.input.removeAttribute("aria-controls"),this.input.removeAttribute("aria-expanded"),this.input.removeAttribute("aria-autocomplete"),this.input.removeAttribute("aria-haspopup")}start(){this.input.setAttribute("aria-expanded","true"),this.input.addEventListener("compositionstart",this.compositionEventHandler),this.input.addEventListener("compositionend",this.compositionEventHandler),this.input.addEventListener("input",this.inputHandler),this.input.addEventListener("keydown",this.keyboardEventHandler),this.list.addEventListener("click",Ht),this.indicateDefaultOption()}stop(){this.clearSelection(),this.input.setAttribute("aria-expanded","false"),this.input.removeEventListener("compositionstart",this.compositionEventHandler),this.input.removeEventListener("compositionend",this.compositionEventHandler),this.input.removeEventListener("input",this.inputHandler),this.input.removeEventListener("keydown",this.keyboardEventHandler),this.list.removeEventListener("click",Ht)}indicateDefaultOption(){var t;this.defaultFirstOption&&((t=Array.from(this.list.querySelectorAll('[role="option"]:not([aria-disabled="true"])')).filter(gt)[0])===null||t===void 0||t.setAttribute("data-combobox-option-default","true"))}navigate(t=1){const n=Array.from(this.list.querySelectorAll('[aria-selected="true"]')).filter(gt)[0],a=Array.from(this.list.querySelectorAll('[role="option"]')).filter(gt),c=a.indexOf(n);if(c===a.length-1&&t===1||c===0&&t===-1){this.clearSelection(),this.input.focus();return}let l=t===1?0:a.length-1;if(n&&c>=0){const x=c+t;x>=0&&x0||s.offsetHeight>0)}function Hn(s,t){t.isComposing=s.type==="compositionstart",document.getElementById(t.input.getAttribute("aria-controls")||"")&&t.clearSelection()}function Nn(s,t){qn(s,t)||(s.scrollTop=t.offsetTop)}function qn(s,t){const n=s.scrollTop,a=n+s.clientHeight,c=t.offsetTop,l=c+t.clientHeight;return c>=n&&l<=a}const Kn=/\s|\(|\[/;function Wn(s,t,n,{multiWord:a,lookBackIndex:c,lastMatchPosition:l}={multiWord:!1,lookBackIndex:0,lastMatchPosition:null}){let o=s.lastIndexOf(t,n-1);if(o===-1||o=o+t.length+1||s.lastIndexOf(` +`,n-1)>o||s.lastIndexOf(".",n-1)>o)return}else if(s.lastIndexOf(" ",n-1)>o)return;const x=s[o-1];return x&&!Kn.test(x)?void 0:{text:s.substring(o+t.length,n),position:o+t.length}}class Un extends HTMLElement{}class Vn extends Event{constructor(){super("update")}}const ft=new WeakMap;var Oe,He,Ne,xe,W,wt,Ae,Ie,Me,kt,Be,et,tt,nt,qe,_e;const At=class At extends Un{constructor(){super(...arguments);oe(this,W);oe(this,Oe,new MutationObserver(()=>Y(this,W,tt).call(this)));oe(this,He,new ResizeObserver(()=>Y(this,W,et).call(this)));oe(this,Ne);oe(this,xe);oe(this,Ie,0);oe(this,Me,0);oe(this,Be,!1);oe(this,qe,()=>Y(this,W,nt).call(this));oe(this,_e,n=>{Y(this,W,Ae).call(this,a=>{(n.target===document||n.target===window||n.target instanceof Node&&n.target.contains(a))&&Y(this,W,et).call(this)})})}static for(n){let a=ft.get(n);return a||(a=new At,a.connect(n),ft.set(n,a)),a}connect(n){me(this,Ne,new WeakRef(n)),me(this,xe,document.createElement("div")),B(this,xe).style.position="absolute",B(this,xe).style.pointerEvents="none",n.after(B(this,xe)),B(this,xe).appendChild(this)}forceUpdate(){Y(this,W,tt).call(this),Y(this,W,nt).call(this)}connectedCallback(){Y(this,W,Ae).call(this,n=>{this.style.pointerEvents="none",this.style.userSelect="none",this.style.overflow="hidden",this.style.display="block",this.style.visibility="hidden",n instanceof HTMLTextAreaElement?(this.style.whiteSpace="pre-wrap",this.style.wordWrap="break-word"):(this.style.whiteSpace="nowrap",this.style.display="table-cell",this.style.verticalAlign="middle"),this.setAttribute("aria-hidden","true"),Y(this,W,tt).call(this),Y(this,W,nt).call(this),B(this,Oe).observe(n,{attributeFilter:["style","dir"]}),B(this,He).observe(n),document.addEventListener("scroll",B(this,_e),{capture:!0}),window.addEventListener("resize",B(this,_e),{capture:!0}),n.addEventListener("input",B(this,qe),{capture:!0})})}disconnectedCallback(){var a;(a=B(this,xe))==null||a.remove(),B(this,Oe).disconnect(),B(this,He).disconnect(),document.removeEventListener("scroll",B(this,_e),{capture:!0}),window.removeEventListener("resize",B(this,_e),{capture:!0});const n=B(this,W,wt);n&&(n.removeEventListener("input",B(this,qe),{capture:!0}),ft.delete(n))}};Oe=new WeakMap,He=new WeakMap,Ne=new WeakMap,xe=new WeakMap,W=new WeakSet,wt=function(){var n;return(n=B(this,Ne))==null?void 0:n.deref()},Ae=function(n){const a=B(this,W,wt);return a?n(a):this.remove()},Ie=new WeakMap,Me=new WeakMap,kt=function(){Y(this,W,Ae).call(this,n=>{const a=window.getComputedStyle(n);this.style.height=a.height,this.style.width=a.width,n.clientHeight!==this.clientHeight&&(this.style.height=`calc(${a.height} + ${n.clientHeight-this.clientHeight}px)`),n.clientWidth!==this.clientWidth&&(this.style.width=`calc(${a.width} + ${n.clientWidth-this.clientWidth}px)`);const c=n.getBoundingClientRect(),l=this.getBoundingClientRect();me(this,Ie,B(this,Ie)+c.left-l.left),me(this,Me,B(this,Me)+c.top-l.top),this.style.transform=`translate(${B(this,Ie)}px, ${B(this,Me)}px)`,this.scrollTop=n.scrollTop,this.scrollLeft=n.scrollLeft,this.dispatchEvent(new Vn)})},Be=new WeakMap,et=function(){B(this,Be)||(me(this,Be,!0),requestAnimationFrame(()=>{Y(this,W,kt).call(this),me(this,Be,!1)}))},tt=function(){Y(this,W,Ae).call(this,n=>{const a=window.getComputedStyle(n);for(const c of Gn)this.style[c]=a[c];Y(this,W,et).call(this)})},nt=function(){Y(this,W,Ae).call(this,n=>{this.textContent=n.value,Y(this,W,kt).call(this)})},qe=new WeakMap,_e=new WeakMap;let it=At;const Gn=["direction","writingMode","unicodeBidi","textOrientation","boxSizing","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"];try{customElements.define("input-style-clone",it)}catch(s){if(!(s instanceof DOMException&&s.name==="NotSupportedError"))throw s}var be,Te,Re,ce,Ft,nn,Ct,De;const st=class st{constructor(t,n=0,a=n){oe(this,ce);oe(this,be);oe(this,Te);oe(this,Re);me(this,be,t),me(this,Te,n),me(this,Re,a)}static fromSelection(t){const{selectionStart:n,selectionEnd:a}=t;return new st(t,n??void 0,a??void 0)}get collapsed(){return this.startOffset===this.endOffset}get commonAncestorContainer(){return B(this,be)}get endContainer(){return B(this,be)}get startContainer(){return B(this,be)}get startOffset(){return B(this,Te)}get endOffset(){return B(this,Re)}setStartOffset(t){me(this,Te,Y(this,ce,Ct).call(this,t))}setEndOffset(t){me(this,Re,Y(this,ce,Ct).call(this,t))}collapse(t=!1){t?this.setEndOffset(this.startOffset):this.setStartOffset(this.endOffset)}cloneContents(){return Y(this,ce,De).call(this).cloneContents()}cloneRange(){return new st(B(this,be),this.startOffset,this.endOffset)}getBoundingClientRect(){return Y(this,ce,De).call(this).getBoundingClientRect()}getClientRects(){return Y(this,ce,De).call(this).getClientRects()}toString(){return Y(this,ce,De).call(this).toString()}getStyleClone(){return B(this,ce,Ft)}};be=new WeakMap,Te=new WeakMap,Re=new WeakMap,ce=new WeakSet,Ft=function(){return it.for(B(this,be))},nn=function(){return B(this,ce,Ft)},Ct=function(t){return Math.max(0,Math.min(t,B(this,be).value.length))},De=function(){const t=document.createRange(),n=B(this,ce,nn).childNodes[0];return n&&(t.setStart(n,this.startOffset),t.setEnd(n,this.endOffset)),t};let Et=st;const Ze=new WeakMap;class Yn{constructor(t,n){this.expander=t,this.input=n,this.combobox=null,this.menu=null,this.match=null,this.justPasted=!1,this.lookBackIndex=0,this.oninput=this.onInput.bind(this),this.onpaste=this.onPaste.bind(this),this.onkeydown=this.onKeydown.bind(this),this.oncommit=this.onCommit.bind(this),this.onmousedown=this.onMousedown.bind(this),this.onblur=this.onBlur.bind(this),this.interactingWithList=!1,n.addEventListener("paste",this.onpaste),n.addEventListener("input",this.oninput),n.addEventListener("keydown",this.onkeydown),n.addEventListener("blur",this.onblur)}destroy(){this.input.removeEventListener("paste",this.onpaste),this.input.removeEventListener("input",this.oninput),this.input.removeEventListener("keydown",this.onkeydown),this.input.removeEventListener("blur",this.onblur)}dismissMenu(){this.deactivate()&&(this.lookBackIndex=this.input.selectionEnd||this.lookBackIndex)}activate(t,n){var a,c;this.input!==document.activeElement&&this.input!==((c=(a=document.activeElement)===null||a===void 0?void 0:a.shadowRoot)===null||c===void 0?void 0:c.activeElement)||(this.deactivate(),this.menu=n,n.id||(n.id=`text-expander-${Math.floor(Math.random()*1e5).toString()}`),this.expander.append(n),this.combobox=new jn(this.input,n),this.expander.dispatchEvent(new Event("text-expander-activate")),this.positionMenu(n,t.position),this.combobox.start(),n.addEventListener("combobox-commit",this.oncommit),n.addEventListener("mousedown",this.onmousedown),this.combobox.navigate(1))}positionMenu(t,n){const a=new Et(this.input,n).getBoundingClientRect(),c={left:a.left,top:a.top+a.height},l=t.getBoundingClientRect(),o={left:c.left-l.left,top:c.top-l.top};if(o.left!==0||o.top!==0){const x=getComputedStyle(t);t.style.left=x.left?`calc(${x.left} + ${o.left}px)`:`${o.left}px`,t.style.top=x.top?`calc(${x.top} + ${o.top}px)`:`${o.top}px`}}deactivate(){const t=this.menu;return!t||!this.combobox?!1:(this.expander.dispatchEvent(new Event("text-expander-deactivate")),this.menu=null,t.removeEventListener("combobox-commit",this.oncommit),t.removeEventListener("mousedown",this.onmousedown),this.combobox.destroy(),this.combobox=null,t.remove(),!0)}onCommit({target:t}){var n;const a=t;if(!(a instanceof HTMLElement)||!this.combobox)return;const c=this.match;if(!c)return;const l=this.input.value.substring(0,c.position-c.key.length),o=this.input.value.substring(c.position+c.text.length),x={item:a,key:c.key,value:null,continue:!1};if(!this.expander.dispatchEvent(new CustomEvent("text-expander-value",{cancelable:!0,detail:x}))||!x.value)return;let z=(n=this.expander.getAttribute("suffix"))!==null&&n!==void 0?n:" ";x.continue&&(z="");const N=`${x.value}${z}`;this.input.value=l+N+o;const g=l.length+N.length;this.deactivate(),this.input.focus({preventScroll:!0}),this.input.selectionStart=g,this.input.selectionEnd=g,x.continue||(this.lookBackIndex=g,this.match=null),this.expander.dispatchEvent(new CustomEvent("text-expander-committed",{cancelable:!1,detail:{input:this.input}}))}onBlur(){if(this.interactingWithList){this.interactingWithList=!1;return}this.deactivate()}onPaste(){this.justPasted=!0}async onInput(){if(this.justPasted){this.justPasted=!1;return}const t=this.findMatch();if(t){this.match=t;const n=await this.notifyProviders(t);if(!this.match)return;n?this.activate(t,n):this.deactivate()}else this.match=null,this.deactivate()}findMatch(){const t=this.input.selectionEnd||0,n=this.input.value;t<=this.lookBackIndex&&(this.lookBackIndex=t-1);for(const{key:a,multiWord:c}of this.expander.keys){const l=Wn(n,a,t,{multiWord:c,lookBackIndex:this.lookBackIndex,lastMatchPosition:this.match?this.match.position:null});if(l)return{text:l.text,key:a,position:l.position}}}async notifyProviders(t){const n=[],a=x=>n.push(x);return this.expander.dispatchEvent(new CustomEvent("text-expander-change",{cancelable:!0,detail:{provide:a,text:t.text,key:t.key}}))?(await Promise.all(n)).filter(x=>x.matched).map(x=>x.fragment)[0]:void 0}onMousedown(){this.interactingWithList=!0}onKeydown(t){t.key==="Escape"&&(this.match=null,this.deactivate()&&(this.lookBackIndex=this.input.selectionEnd||this.lookBackIndex,t.stopImmediatePropagation(),t.preventDefault()))}}class qt extends HTMLElement{get keys(){const t=this.getAttribute("keys"),n=t?t.split(" "):[],a=this.getAttribute("multiword"),c=a?a.split(" "):[],l=c.length===0&&this.hasAttribute("multiword");return n.map(o=>({key:o,multiWord:l||c.includes(o)}))}set keys(t){this.setAttribute("keys",t)}connectedCallback(){const t=this.querySelector('input[type="text"], textarea');if(!(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement))return;const n=new Yn(this,t);Ze.set(this,n)}disconnectedCallback(){const t=Ze.get(this);t&&(t.destroy(),Ze.delete(this))}dismiss(){const t=Ze.get(this);t&&t.dismissMenu()}}window.customElements.get("text-expander")||(window.TextExpanderElement=qt,window.customElements.define("text-expander",qt));function Zn({onlyFirst:s=!1}={}){const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,s?void 0:"g")}const Xn=Zn();function Jn(s){if(typeof s!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof s}\``);return s.replace(Xn,"")}const Qn=new Intl.Segmenter;function Kt(s,{countAnsiEscapeCodes:t=!1}={}){if(s===""||(t||(s=Jn(s)),s===""))return 0;let n=0;for(const a of Qn.segment(s))n++;return n}const ei="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20version='1.0'%20viewBox='0%200%20641%20223'%3e%3cpath%20fill='%23aaa'%20d='M86%20214c-9-1-17-4-24-8l-6-3-5-5-5-4-4-6-4-6-3-8-2-8v-27l2-9%203-9%204-6%204-6%205-5%205-5%207-3%206-4%207-2%207-2%2012-1h12l7%201%208%202%207%204%207%203%205%205%205%204-10%2010-10%209-4-3-10-5-5-1H88l-5%202-6%203-3%204-4%204-2%205-2%206v6l-1%207%201%207%202%207%203%205%202%204%204%203%204%203%205%202%206%202h9l10-1%205-2%206-3v-16H91v-27h59v54l-1%203-2%203-5%204-4%204-5%203-5%202-8%202-8%202-10%201H92l-6-1zm266-62V91h34v46h44V91h34v121h-34v-46h-44v46h-34v-61zm-182-1V90h34v121h-34v-60zm59-1V90h35l36%201%205%202c3%200%208%202%2010%204l5%202%204%205%205%204%203%207%203%207%201%2013v13l-4%206-3%207-4%204-5%205-5%202-5%203-6%202-5%201-18%201h-18v32h-34v-61zm67-2%203-2%202-4%202-5v-5l-2-4-2-4-3-2-3-3h-30v31h30l3-2zm226%2039v-24l-8-12-18-28a1751%201751%200%200%200-20-31v-2h39l7%2012%2012%2021%206%209%2013-21%2013-21h38v2l-41%2061-7%2010v48h-34v-24zM109%2066l-4-1-5-5-5-4-1-5-3-9v-5l1-5c2-7%203-10%208-15l4-4%207-2%207-2h7l6%201%205%202%205%202%203%204%204%203%202%206%202%205v13l-2%205-2%206-4%204-3%203-5%202-4%202-9%201h-9l-5-2zm22-11%204-2%203-4%202-5V34l-2-4-2-4-3-2-4-3-5-1h-6l-4%202-5%202-2%204-3%205-1%203v4l1%205%202%205%202%202%205%203%204%202h10l4-2zM37%2039V11h33l3%201%203%202%204%203%203%203%201%205%201%204v5l-1%204-3%204-3%205-4%201-3%202-11%201H49v16H37V39zm31%200%203-2%201-2%201-2v-4l-1-3-3-2-2-2H49v18h15l4-1zm107%2025a512%20512%200%200%200-19-53h14l4%2014%206%2019%201%204%201-1%207-19%205-17h9l6%2019%207%2018v-1l2-6%205-17%204-13h14v1l-4%2012-16%2041v2h-5l-5-1-6-15-6-15-1%201-3%207-6%2015-2%208h-11l-1-3zm74-25V11h42v11h-29v2l-1%205v4h29v11h-28v11h2l15%201h13v11h-43V39zm55%200V11h33l5%203%205%202%202%204%202%205v10l-2%203-1%204-5%203-5%203%205%205%208%2010%203%204h-14l-7-9-8-10h-9v19h-12V39zm33-3%202-3v-6l-3-3-2-3h-18v16h1v1h17l2-2zm26%203V11h42v11h-29l-1%206v5h29v11h-28v5l-1%205%201%201v1h30v11h-43V39zm54%200V11h17l18%201%204%202%205%203%202%204%203%204%202%206%201%206v5c-1%206-3%2012-6%2015l-3%204-5%203-5%202-17%201h-16V39zm33%2014%205-5%202-3v-6l-1-6-1-3-1-3-4-3-3-2h-5l-6-1-3%201h-3v34h9l8-1%203-2zm50-14V11h34l5%202%204%202%202%203%202%203v9l-2%202-3%204-1%201%203%203%203%204%201%203%201%204-1%204-1%204-3%203-3%203-5%201-5%201h-31V39zm34%2015%202-1v-6l-2-2-2-2h-20v13h20l2-2zm-3-22%204-2v-6l-2-1-2-2h-19v12h16l4-1zm42%2024V45l-6-9-11-17-5-8h15l4%208%207%2011%202%203%207-11%207-11h14l-11%2016-11%2017v23h-12V56z'/%3e%3c/svg%3e",Lt=[["aa","Afar","Afaraf"],["ab","Abkhaz","аҧсуа бызшәа"],["ae","Avestan","avesta"],["af","Afrikaans","Afrikaans"],["ak","Akan","Akan"],["am","Amharic","አማርኛ"],["an","Aragonese","aragonés"],["ar","Arabic","اللغة العربية"],["as","Assamese","অসমীয়া"],["av","Avaric","авар мацӀ"],["ay","Aymara","aymar aru"],["az","Azerbaijani","azərbaycan dili"],["ba","Bashkir","башҡорт теле"],["be","Belarusian","беларуская мова"],["bg","Bulgarian","български език"],["bh","Bihari","भोजपुरी"],["bi","Bislama","Bislama"],["bm","Bambara","bamanankan"],["bn","Bengali","বাংলা"],["bo","Tibetan","བོད་ཡིག"],["br","Breton","brezhoneg"],["bs","Bosnian","bosanski jezik"],["ca","Catalan","Català"],["ce","Chechen","нохчийн мотт"],["ch","Chamorro","Chamoru"],["co","Corsican","corsu"],["cr","Cree","ᓀᐦᐃᔭᐍᐏᐣ"],["cs","Czech","čeština"],["cu","Old Church Slavonic","ѩзыкъ словѣньскъ"],["cv","Chuvash","чӑваш чӗлхи"],["cy","Welsh","Cymraeg"],["da","Danish","dansk"],["de","German","Deutsch"],["dv","Divehi","Dhivehi"],["dz","Dzongkha","རྫོང་ཁ"],["ee","Ewe","Eʋegbe"],["el","Greek","Ελληνικά"],["en","English","English"],["eo","Esperanto","Esperanto"],["es","Spanish","Español"],["et","Estonian","eesti"],["eu","Basque","euskara"],["fa","Persian","فارسی"],["ff","Fula","Fulfulde"],["fi","Finnish","suomi"],["fj","Fijian","Vakaviti"],["fo","Faroese","føroyskt"],["fr","French","Français"],["fy","Western Frisian","Frysk"],["ga","Irish","Gaeilge"],["gd","Scottish Gaelic","Gàidhlig"],["gl","Galician","galego"],["gu","Gujarati","ગુજરાતી"],["gv","Manx","Gaelg"],["ha","Hausa","هَوُسَ"],["he","Hebrew","עברית"],["hi","Hindi","हिन्दी"],["ho","Hiri Motu","Hiri Motu"],["hr","Croatian","Hrvatski"],["ht","Haitian","Kreyòl ayisyen"],["hu","Hungarian","magyar"],["hy","Armenian","Հայերեն"],["hz","Herero","Otjiherero"],["ia","Interlingua","Interlingua"],["id","Indonesian","Bahasa Indonesia"],["ie","Interlingue","Interlingue"],["ig","Igbo","Asụsụ Igbo"],["ii","Nuosu","ꆈꌠ꒿ Nuosuhxop"],["ik","Inupiaq","Iñupiaq"],["io","Ido","Ido"],["is","Icelandic","Íslenska"],["it","Italian","Italiano"],["iu","Inuktitut","ᐃᓄᒃᑎᑐᑦ"],["ja","Japanese","日本語"],["jv","Javanese","basa Jawa"],["ka","Georgian","ქართული"],["kg","Kongo","Kikongo"],["ki","Kikuyu","Gĩkũyũ"],["kj","Kwanyama","Kuanyama"],["kk","Kazakh","қазақ тілі"],["kl","Kalaallisut","kalaallisut"],["km","Khmer","ខេមរភាសា"],["kn","Kannada","ಕನ್ನಡ"],["ko","Korean","한국어"],["kr","Kanuri","Kanuri"],["ks","Kashmiri","कश्मीरी"],["ku","Kurmanji (Kurdish)","Kurmancî"],["kv","Komi","коми кыв"],["kw","Cornish","Kernewek"],["ky","Kyrgyz","Кыргызча"],["la","Latin","latine"],["lb","Luxembourgish","Lëtzebuergesch"],["lg","Ganda","Luganda"],["li","Limburgish","Limburgs"],["ln","Lingala","Lingála"],["lo","Lao","ລາວ"],["lt","Lithuanian","lietuvių kalba"],["lu","Luba-Katanga","Tshiluba"],["lv","Latvian","latviešu valoda"],["mg","Malagasy","fiteny malagasy"],["mh","Marshallese","Kajin M̧ajeļ"],["mi","Māori","te reo Māori"],["mk","Macedonian","македонски јазик"],["ml","Malayalam","മലയാളം"],["mn","Mongolian","Монгол хэл"],["mr","Marathi","मराठी"],["ms","Malay","Bahasa Melayu"],["ms-Arab","Jawi Malay","بهاس ملايو"],["mt","Maltese","Malti"],["my","Burmese","ဗမာစာ"],["na","Nauru","Ekakairũ Naoero"],["nb","Norwegian Bokmål","Norsk bokmål"],["nd","Northern Ndebele","isiNdebele"],["ne","Nepali","नेपाली"],["ng","Ndonga","Owambo"],["nl","Dutch","Nederlands"],["nn","Norwegian Nynorsk","Norsk Nynorsk"],["no","Norwegian","Norsk"],["nr","Southern Ndebele","isiNdebele"],["nv","Navajo","Diné bizaad"],["ny","Chichewa","chiCheŵa"],["oc","Occitan","occitan"],["oj","Ojibwe","ᐊᓂᔑᓈᐯᒧᐎᓐ"],["om","Oromo","Afaan Oromoo"],["or","Oriya","ଓଡ଼ିଆ"],["os","Ossetian","ирон æвзаг"],["pa","Punjabi","ਪੰਜਾਬੀ"],["pi","Pāli","पाऴि"],["pl","Polish","Polski"],["ps","Pashto","پښتو"],["pt","Portuguese","Português"],["qu","Quechua","Runa Simi"],["rm","Romansh","rumantsch grischun"],["rn","Kirundi","Ikirundi"],["ro","Romanian","Română"],["ru","Russian","Русский"],["rw","Kinyarwanda","Ikinyarwanda"],["sa","Sanskrit","संस्कृतम्"],["sc","Sardinian","sardu"],["sd","Sindhi","सिन्धी"],["se","Northern Sami","Davvisámegiella"],["sg","Sango","yângâ tî sängö"],["si","Sinhala","සිංහල"],["sk","Slovak","slovenčina"],["sl","Slovenian","slovenščina"],["sn","Shona","chiShona"],["so","Somali","Soomaaliga"],["sq","Albanian","Shqip"],["sr","Serbian","српски језик"],["ss","Swati","SiSwati"],["st","Southern Sotho","Sesotho"],["su","Sundanese","Basa Sunda"],["sv","Swedish","Svenska"],["sw","Swahili","Kiswahili"],["ta","Tamil","தமிழ்"],["te","Telugu","తెలుగు"],["tg","Tajik","тоҷикӣ"],["th","Thai","ไทย"],["ti","Tigrinya","ትግርኛ"],["tk","Turkmen","Türkmen"],["tl","Tagalog","Wikang Tagalog"],["tn","Tswana","Setswana"],["to","Tonga","faka Tonga"],["tr","Turkish","Türkçe"],["ts","Tsonga","Xitsonga"],["tt","Tatar","татар теле"],["tw","Twi","Twi"],["ty","Tahitian","Reo Tahiti"],["ug","Uyghur","ئۇيغۇرچە‎"],["uk","Ukrainian","Українська"],["ur","Urdu","اردو"],["uz","Uzbek","Ўзбек"],["ve","Venda","Tshivenḓa"],["vi","Vietnamese","Tiếng Việt"],["vo","Volapük","Volapük"],["wa","Walloon","walon"],["wo","Wolof","Wollof"],["xh","Xhosa","isiXhosa"],["yi","Yiddish","ייִדיש"],["yo","Yoruba","Yorùbá"],["za","Zhuang","Saɯ cueŋƅ"],["zh","Chinese","中文"],["zu","Zulu","isiZulu"],["zh-CN","Chinese (China)","简体中文"],["zh-HK","Chinese (Hong Kong)","繁體中文(香港)"],["zh-TW","Chinese (Taiwan)","繁體中文(臺灣)"],["zh-YUE","Cantonese","廣東話"],["ast","Asturian","Asturianu"],["chr","Cherokee","ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ"],["ckb","Sorani (Kurdish)","سۆرانی"],["cnr","Montenegrin","crnogorski"],["csb","Kashubian","Kaszëbsczi"],["jbo","Lojban","la .lojban."],["kab","Kabyle","Taqbaylit"],["ldn","Láadan","Láadan"],["lfn","Lingua Franca Nova","lingua franca nova"],["moh","Mohawk","Kanienʼkéha"],["nds","Low German","Plattdüütsch"],["pdc","Pennsylvania Dutch","Pennsilfaani-Deitsch"],["sco","Scots","Scots"],["sma","Southern Sami","Åarjelsaemien Gïele"],["smj","Lule Sami","Julevsámegiella"],["szl","Silesian","ślůnsko godka"],["tok","Toki Pona","toki pona"],["vai","Vai","ꕙꔤ"],["xal","Kalmyk","Хальмг келн"],["zba","Balaibalan","باليبلن"],["zgh","Standard Moroccan Tamazight","ⵜⴰⵎⴰⵣⵉⵖⵜ"]],ti="(((?:[^A-Za-z0-9@@$##\\uFFFE\\uFEFF\\uFFFF]|[\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069]|^))((https?:\\/\\/)((?:(?:(?:[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/](?:[_-]|[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/])*)?[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/]\\.)*(?:(?:[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/](?:-|[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/])*)?[^/\\!'#%&'\\(\\)*\\+,\\\\\\-\\.\\/:;<=>\\?@\\[\\]\\^_{|}~\\$//\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000//\\uFFFE\\uFEFF\\uFFFF//\\u202A-\\u202E\\u061C\\u200E\\u200F\\u2066\\u2067\\u2068\\u2069/]\\.)(?:(?:(?:삼성|닷컴|닷넷|香格里拉|餐厅|食品|飞利浦|電訊盈科|集团|通販|购物|谷歌|诺基亚|联通|网络|网站|网店|网址|组织机构|移动|珠宝|点看|游戏|淡马锡|机构|書籍|时尚|新闻|政府|政务|招聘|手表|手机|我爱你|慈善|微博|广东|工行|家電|娱乐|天主教|大拿|大众汽车|在线|嘉里大酒店|嘉里|商标|商店|商城|公益|公司|八卦|健康|信息|佛山|企业|中文网|中信|世界|ポイント|ファッション|セール|ストア|コム|グーグル|クラウド|みんな|คอม|संगठन|नेट|कॉम|همراه|موقع|موبايلي|كوم|كاثوليك|عرب|شبكة|بيتك|بازار|العليان|ارامكو|اتصالات|ابوظبي|קום|сайт|рус|орг|онлайн|москва|ком|католик|дети|zuerich|zone|zippo|zip|zero|zara|zappos|yun|youtube|you|yokohama|yoga|yodobashi|yandex|yamaxun|yahoo|yachts|xyz|xxx|xperia|xin|xihuan|xfinity|xerox|xbox|wtf|wtc|wow|world|works|work|woodside|wolterskluwer|wme|winners|wine|windows|win|williamhill|wiki|wien|whoswho|weir|weibo|wedding|wed|website|weber|webcam|weatherchannel|weather|watches|watch|warman|wanggou|wang|walter|walmart|wales|vuelos|voyage|voto|voting|vote|volvo|volkswagen|vodka|vlaanderen|vivo|viva|vistaprint|vista|vision|visa|virgin|vip|vin|villas|viking|vig|video|viajes|vet|versicherung|vermögensberatung|vermögensberater|verisign|ventures|vegas|vanguard|vana|vacations|ups|uol|uno|university|unicom|uconnect|ubs|ubank|tvs|tushu|tunes|tui|tube|trv|trust|travelersinsurance|travelers|travelchannel|travel|training|trading|trade|toys|toyota|town|tours|total|toshiba|toray|top|tools|tokyo|today|tmall|tkmaxx|tjx|tjmaxx|tirol|tires|tips|tiffany|tienda|tickets|tiaa|theatre|theater|thd|teva|tennis|temasek|telefonica|telecity|tel|technology|tech|team|tdk|tci|taxi|tax|tattoo|tatar|tatamotors|target|taobao|talk|taipei|tab|systems|symantec|sydney|swiss|swiftcover|swatch|suzuki|surgery|surf|support|supply|supplies|sucks|style|study|studio|stream|store|storage|stockholm|stcgroup|stc|statoil|statefarm|statebank|starhub|star|staples|stada|srt|srl|spreadbetting|spot|sport|spiegel|space|soy|sony|song|solutions|solar|sohu|software|softbank|social|soccer|sncf|smile|smart|sling|skype|sky|skin|ski|site|singles|sina|silk|shriram|showtime|show|shouji|shopping|shop|shoes|shiksha|shia|shell|shaw|sharp|shangrila|sfr|sexy|sex|sew|seven|ses|services|sener|select|seek|security|secure|seat|search|scot|scor|scjohnson|science|schwarz|schule|school|scholarships|schmidt|schaeffler|scb|sca|sbs|sbi|saxo|save|sas|sarl|sapo|sap|sanofi|sandvikcoromant|sandvik|samsung|samsclub|salon|sale|sakura|safety|safe|saarland|ryukyu|rwe|run|ruhr|rugby|rsvp|room|rogers|rodeo|rocks|rocher|rmit|rip|rio|ril|rightathome|ricoh|richardli|rich|rexroth|reviews|review|restaurant|rest|republican|report|repair|rentals|rent|ren|reliance|reit|reisen|reise|rehab|redumbrella|redstone|red|recipes|realty|realtor|realestate|read|raid|radio|racing|qvc|quest|quebec|qpon|pwc|pub|prudential|pru|protection|property|properties|promo|progressive|prof|productions|prod|pro|prime|press|praxi|pramerica|post|porn|politie|poker|pohl|pnc|plus|plumbing|playstation|play|place|pizza|pioneer|pink|ping|pin|pid|pictures|pictet|pics|piaget|physio|photos|photography|photo|phone|philips|phd|pharmacy|pfizer|pet|pccw|pay|passagens|party|parts|partners|pars|paris|panerai|panasonic|pamperedchef|page|ovh|ott|otsuka|osaka|origins|orientexpress|organic|org|orange|oracle|open|ooo|onyourside|online|onl|ong|one|omega|ollo|oldnavy|olayangroup|olayan|okinawa|office|off|observer|obi|nyc|ntt|nrw|nra|nowtv|nowruz|now|norton|northwesternmutual|nokia|nissay|nissan|ninja|nikon|nike|nico|nhk|ngo|nfl|nexus|nextdirect|next|news|newholland|new|neustar|network|netflix|netbank|net|nec|nba|navy|natura|nationwide|name|nagoya|nadex|nab|mutuelle|mutual|museum|mtr|mtpc|mtn|msd|movistar|movie|mov|motorcycles|moto|moscow|mortgage|mormon|mopar|montblanc|monster|money|monash|mom|moi|moe|moda|mobily|mobile|mobi|mma|mls|mlb|mitsubishi|mit|mint|mini|mil|microsoft|miami|metlife|merckmsd|meo|menu|men|memorial|meme|melbourne|meet|media|med|mckinsey|mcdonalds|mcd|mba|mattel|maserati|marshalls|marriott|markets|marketing|market|map|mango|management|man|makeup|maison|maif|madrid|macys|luxury|luxe|lupin|lundbeck|ltda|ltd|lplfinancial|lpl|love|lotto|lotte|london|lol|loft|locus|locker|loans|loan|llp|llc|lixil|living|live|lipsy|link|linde|lincoln|limo|limited|lilly|like|lighting|lifestyle|lifeinsurance|life|lidl|liaison|lgbt|lexus|lego|legal|lefrak|leclerc|lease|lds|lawyer|law|latrobe|latino|lat|lasalle|lanxess|landrover|land|lancome|lancia|lancaster|lamer|lamborghini|ladbrokes|lacaixa|kyoto|kuokgroup|kred|krd|kpn|kpmg|kosher|komatsu|koeln|kiwi|kitchen|kindle|kinder|kim|kia|kfh|kerryproperties|kerrylogistics|kerryhotels|kddi|kaufen|juniper|juegos|jprs|jpmorgan|joy|jot|joburg|jobs|jnj|jmp|jll|jlc|jio|jewelry|jetzt|jeep|jcp|jcb|java|jaguar|iwc|iveco|itv|itau|istanbul|ist|ismaili|iselect|irish|ipiranga|investments|intuit|international|intel|int|insure|insurance|institute|ink|ing|info|infiniti|industries|inc|immobilien|immo|imdb|imamat|ikano|iinet|ifm|ieee|icu|ice|icbc|ibm|hyundai|hyatt|hughes|htc|hsbc|how|house|hotmail|hotels|hoteles|hot|hosting|host|hospital|horse|honeywell|honda|homesense|homes|homegoods|homedepot|holiday|holdings|hockey|hkt|hiv|hitachi|hisamitsu|hiphop|hgtv|hermes|here|helsinki|help|healthcare|health|hdfcbank|hdfc|hbo|haus|hangout|hamburg|hair|guru|guitars|guide|guge|gucci|guardian|group|grocery|gripe|green|gratis|graphics|grainger|gov|got|gop|google|goog|goodyear|goodhands|goo|golf|goldpoint|gold|godaddy|gmx|gmo|gmbh|gmail|globo|global|gle|glass|glade|giving|gives|gifts|gift|ggee|george|genting|gent|gea|gdn|gbiz|gay|garden|gap|games|game|gallup|gallo|gallery|gal|fyi|futbol|furniture|fund|fun|fujixerox|fujitsu|ftr|frontier|frontdoor|frogans|frl|fresenius|free|fox|foundation|forum|forsale|forex|ford|football|foodnetwork|food|foo|fly|flsmidth|flowers|florist|flir|flights|flickr|fitness|fit|fishing|fish|firmdale|firestone|fire|financial|finance|final|film|fido|fidelity|fiat|ferrero|ferrari|feedback|fedex|fast|fashion|farmers|farm|fans|fan|family|faith|fairwinds|fail|fage|extraspace|express|exposed|expert|exchange|everbank|events|eus|eurovision|etisalat|esurance|estate|esq|erni|ericsson|equipment|epson|epost|enterprises|engineering|engineer|energy|emerck|email|education|edu|edeka|eco|eat|earth|dvr|dvag|durban|dupont|duns|dunlop|duck|dubai|dtv|drive|download|dot|doosan|domains|doha|dog|dodge|doctor|docs|dnp|diy|dish|discover|discount|directory|direct|digital|diet|diamonds|dhl|dev|design|desi|dentist|dental|democrat|delta|deloitte|dell|delivery|degree|deals|dealer|deal|dds|dclk|day|datsun|dating|date|data|dance|dad|dabur|cyou|cymru|cuisinella|csc|cruises|cruise|crs|crown|cricket|creditunion|creditcard|credit|cpa|courses|coupons|coupon|country|corsica|coop|cool|cookingchannel|cooking|contractors|contact|consulting|construction|condos|comsec|computer|compare|company|community|commbank|comcast|com|cologne|college|coffee|codes|coach|clubmed|club|cloud|clothing|clinique|clinic|click|cleaning|claims|cityeats|city|citic|citi|citadel|cisco|circle|cipriani|church|chrysler|chrome|christmas|chloe|chintai|cheap|chat|chase|charity|channel|chanel|cfd|cfa|cern|ceo|center|ceb|cbs|cbre|cbn|cba|catholic|catering|cat|casino|cash|caseih|case|casa|cartier|cars|careers|career|care|cards|caravan|car|capitalone|capital|capetown|canon|cancerresearch|camp|camera|cam|calvinklein|call|cal|cafe|cab|bzh|buzz|buy|business|builders|build|bugatti|budapest|brussels|brother|broker|broadway|bridgestone|bradesco|box|boutique|bot|boston|bostik|bosch|boots|booking|book|boo|bond|bom|bofa|boehringer|boats|bnpparibas|bnl|bmw|bms|blue|bloomberg|blog|blockbuster|blanco|blackfriday|black|biz|bio|bingo|bing|bike|bid|bible|bharti|bet|bestbuy|best|berlin|bentley|beer|beauty|beats|bcn|bcg|bbva|bbt|bbc|bayern|bauhaus|basketball|baseball|bargains|barefoot|barclays|barclaycard|barcelona|bar|bank|band|bananarepublic|banamex|baidu|baby|azure|axa|aws|avianca|autos|auto|author|auspost|audio|audible|audi|auction|attorney|athleta|associates|asia|asda|arte|art|arpa|army|archi|aramco|arab|aquarelle|apple|app|apartments|aol|anz|anquan|android|analytics|amsterdam|amica|amfam|amex|americanfamily|americanexpress|alstom|alsace|ally|allstate|allfinanz|alipay|alibaba|alfaromeo|akdn|airtel|airforce|airbus|aigo|aig|agency|agakhan|africa|afl|afamilycompany|aetna|aero|aeg|adult|ads|adac|actor|active|aco|accountants|accountant|accenture|academy|abudhabi|abogado|able|abc|abbvie|abbott|abb|abarth|aarp|aaa|onion)(?=[^0-9a-zA-Z@+-]|$))|(?:(?:한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ລາວ|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|موريتانيا|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|البحرين|الاردن|հայ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ευ|ελ|zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|re|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac)(?=[^0-9a-zA-Z@+-]|$))|(?:xn--[\\-0-9a-z]+))))(?::([0-9]+))?(\\/(?:(?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*(?:\\((?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+|(?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*\\([a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+\\)[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*))\\)[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*)*[\\+\\-a-z\\u0400-\\u04FF0-9=_#\\/\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]|(?:\\((?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+|(?:[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*\\([a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+\\)[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]*))\\)))|(?:@[a-z\\u0400-\\u04FF0-9!\\*';:=\\+,\\.\\$\\/%#\\[\\]\\-\\u2013_~@\\|&\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u024F\\u0253\\u0254\\u0256\\u0257\\u0259\\u025B\\u0263\\u0268\\u026F\\u0272\\u0289\\u028B\\u02BB\\u0300-\\u036F\\u1E00-\\u1EFF]+\\/))*)?(\\?[a-z0-9!?\\*'@\\(\\);:&=\\+\\$\\/%#\\[\\]\\-_\\.,~|]*[a-z0-9\\-_&=#\\/])?))",ni="gi",Wt={source:ti,flags:ni},Ut=["byte","kilobyte","megabyte","gigabyte","terabyte","petabyte"];function Xe(s){const t=Math.min(Math.floor(Math.log2(s)/10),Ut.length-1),n=s/1024**t;return ge.number(n,{style:"unit",unit:Ut[t],unitDisplay:"narrow",maximumFractionDigits:0})}const ii={BASE_URL:"./",DEV:!1,MODE:"production",PHANPY_CLIENT_NAME:"Phanpy",PHANPY_LINGVA_INSTANCES:"lingva.phanpy.social lingva.lunar.icu lingva.garudalinux.org translate.plausibility.cloud",PHANPY_PRIVACY_POLICY_URL:"https://github.com/cheeaun/phanpy/blob/main/PRIVACY.MD",PHANPY_WEBSITE:"https://phanpy.social",PROD:!0,SSR:!1,VITE_APP_ENV:"production"},{PHANPY_IMG_ALT_API_URL:vt,PHANPY_GIPHY_API_KEY:si}=ii,ai=Lt.reduce((s,t)=>{const[n,a,c]=t;return s[n]={common:a,native:c},s},{}),sn={300:Fe(5,"minute"),1800:Fe(30,"minute"),3600:Fe(1,"hour"),21600:Fe(6,"hour"),86400:Fe(1,"day"),259200:Fe(3,"day"),604800:Fe(1,"week")},ri=Object.keys(sn),Vt=24*60*60,Gt=s=>{if(!s)return Vt;const t=(new Date(s).getTime()-Date.now())/1e3;return ri.find(n=>n>=t)||Vt},Ee=document.createElement("ul");Ee.role="listbox";Ee.className="text-expander-menu";const oi=16,li=new IntersectionObserver(s=>{s.forEach(t=>{if(t.isIntersecting){const{left:n,width:a}=t.boundingClientRect,{innerWidth:c}=window;if(n+a>c){const l=zn()?"right":"left";Ee.style[l]=c-a-oi+"px"}}})});li.observe(Ee);const Ce=vn([new Intl.DateTimeFormat().resolvedOptions().locale,...navigator.languages],Lt.map(s=>s[0]),"en"),an=new RegExp(Wt.source,Wt.flags),ci=/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/gi,ui="$2xxxxxxxxxxxxxxxxxxxxxxx";function di(s){return s.replace(an,ui).replace(ci,"$1@$3")}const hi=/[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i,pi=new RegExp(`(^|[^=\\/\\w])(@${hi.source}(?:@[\\p{L}\\w.-]+[\\w]+)?)`,"uig"),mi=new RegExp("(^|[^=\\/\\w])(#[a-z0-9_]+([a-z0-9_.]+[a-z0-9_]+)?)(?![\\/\\w])","ig"),gi="[a-zA-Z0-9_]{2,}",fi=new RegExp(`(^|[^=\\/\\w])(:${gi}:)(?=[^A-Za-z0-9_:]|$)`,"g"),vi=new Intl.Segmenter;function bt(s){return s.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function bi(s,{maxCharacters:t=1/0}){const{composerCharacterCount:n}=le;if(n>t){let a="",c="";const l=vi.segment(s);for(const{segment:o,index:x}of l)x"),bt(a)+c}return bt(s).replace(an,'$2$3').replace(pi,'$1$2').replace(mi,'$1$2').replace(fi,'$1$2')}const yi=Jt(s=>new Intl.RelativeTimeFormat(s||void 0)),xi=Jt(s=>new Intl.ListFormat(s||void 0)),zt=100;function Ti({onClose:s,replyToStatus:t,editStatus:n,draftStatus:a,standalone:c,hasOpener:l}){var Rt;const{i18n:o}=Ke(),x=yi(o.locale),_=xi(o.locale),{masto:z,instance:N}=_t(),[g,M]=q("default"),C=V((a==null?void 0:a.uid)||_n()),$=bn(),T=$.info,ne=Qt(),{statuses:{maxCharacters:ee,maxMediaAttachments:u,charactersReservedPerUrl:h}={},mediaAttachments:{supportedMimeTypes:m,imageSizeLimit:w,imageMatrixLimit:f,videoSizeLimit:j,videoMatrixLimit:k,videoFrameRateLimit:G}={},polls:{maxOptions:re,maxCharactersPerOption:ue,maxExpiration:X,minExpiration:pe}={}}=ne||{},S=V(),O=V(),[U,ie]=q("public"),[se,ae]=q(!1),[D,de]=q(Se.session.get("currentLanguage")||Ce),R=V(D),[v,L]=q([]),[P,J]=q(null),Q=Se.account.get("preferences")||{},fe=()=>{S.current&&S.current.dispatchEvent(new Event("input"))},we=()=>{setTimeout(()=>{var r,d,y;S.current&&((d=(r=a==null?void 0:a.status)==null?void 0:r.startsWith)!=null&&d.call(r,` +`)&&(S.current.selectionStart=0,S.current.selectionEnd=0),(y=S.current)==null||y.focus())},300)};te(()=>{var r,d;if(t){const{spoilerText:y,visibility:p,language:A,sensitive:F}=t;y&&O.current&&(O.current.value=y);const b=[...new Set([t.account.acct,...t.mentions.map(E=>E.acct)])].filter(E=>E!==T.acct);b.length>0&&(S.current.value=`${b.map(E=>`@${E}`).join(" ")} `,fe()),we(),ie(p==="public"&&Q["posting:default:visibility"]?Q["posting:default:visibility"].toLowerCase():p),de(A||((r=Q["posting:default:language"])==null?void 0:r.toLowerCase())||Ce),ae(F&&!!y)}else if(n){const{visibility:y,language:p,sensitive:A,poll:F,mediaAttachments:I}=n,b=!!(F!=null&&F.options)&&{...F,options:F.options.map(E=>(E==null?void 0:E.title)||E),expiresIn:(F==null?void 0:F.expiresIn)||Gt(F.expiresAt)};M("loading"),(async()=>{var E;try{const H=await z.v1.statuses.$select(n.id).source.fetch(),{text:he,spoilerText:ve}=H;S.current.value=he,S.current.dataset.source=he,fe(),we(),O.current.value=ve,ie(y),de(p||((E=Q["posting:default:language"])==null?void 0:E.toLowerCase())||Ce),ae(A),b&&J(b),L(I),M("default")}catch(H){alert((H==null?void 0:H.reason)||H),M("error")}})()}else we(),Q["posting:default:visibility"]&&ie(Q["posting:default:visibility"].toLowerCase()),Q["posting:default:language"]&&de(Q["posting:default:language"].toLowerCase()),Q["posting:default:sensitive"]&&ae(!!Q["posting:default:sensitive"]);if(a){const{status:y,spoilerText:p,visibility:A,language:F,sensitive:I,poll:b,mediaAttachments:E}=a,H=!!(b!=null&&b.options)&&{...b,options:b.options.map(he=>(he==null?void 0:he.title)||he),expiresIn:(b==null?void 0:b.expiresIn)||Gt(b.expiresAt)};S.current.value=y,fe(),we(),p&&(O.current.value=p),A&&ie(A),de(F||((d=Q["posting:default:language"])==null?void 0:d.toLowerCase())||Ce),I!==null&&ae(I),H&&J(H),E&&L(E)}},[a,n,t]);const Le=V(),St=o._({id:"hR9gtK"}),ot=()=>{const{value:r,dataset:d}=S.current;if(g==="loading")return!1;const y=(r||"").trim().replace(new RegExp("^\\p{White_Space}+|\\p{White_Space}+$","gu"),""),p=v.length>0;if(!y&&!p||v.length>0&&v.every(E=>E.id))return!0;const F=(t==null?void 0:t.account.id)===T.id,I=t&&r.trim()===`@${t.account.acct}`;return!!(!F&&I||r===(d==null?void 0:d.source))},We=()=>ot()?!0:confirm(St);te(()=>{const r=d=>{ot()||(d.preventDefault(),d.returnValue=St)};return window.addEventListener("beforeunload",r,{capture:!0}),()=>window.removeEventListener("beforeunload",r,{capture:!0})},[]);const ln=()=>{const{value:r}=S.current,{value:d}=O.current;return Kt(di(r))+Kt(d)},lt=()=>{const r=ln();le.composerCharacterCount=r};te(lt,[]);const It=window.CloseWatcher,ct=V(!1);$e("esc",()=>{ct.current=!0},{enabled:!It,enableOnFormTags:!0}),$e("esc",()=>{!c&&ct.current&&We()&&s(),ct.current=!1},{enabled:!It,enableOnFormTags:!0,keyup:!0,ignoreEventWhen:r=>{const d=document.querySelectorAll("#modal-container > *"),y=!!d,p=d.length===1&&d[0].querySelector("#compose-container");return y&&!p}}),Ln(()=>{!c&&We()&&s()},[c,We,s]);const Mt=V({}),Bt=()=>`${yn()}#${C.current}`,ut=()=>{if(n||le.composerState.minimized)return;const r=Bt(),d={key:r,replyTo:t?{id:t.id,account:{id:t.account.id,username:t.account.username,acct:t.account.acct}}:null,draftStatus:{uid:C.current,status:S.current.value,spoilerText:O.current.value,visibility:U,language:D,sensitive:se,poll:P,mediaAttachments:v}};!xn(d,Mt.current)&&!ot()&&(jt.drafts.set(r,{...d,state:"unsaved",updatedAt:Date.now()}).then(()=>{}).catch(y=>{}),Mt.current=structuredClone(d))};An(ut,5e3),te(()=>(ut(),()=>{jt.drafts.del(Bt())}),[]),te(()=>{const r=y=>{const{items:p}=y.clipboardData||y.dataTransfer,A=[],F=[];for(let I=0;I0&&alert(o._({id:"rpXAF6",values:{0:F.length,1:F[0].name,2:_.format(F.map(I=>I.name))}})),A.length>0&&v.length>=u){alert(o._({id:"ctFhjs",values:{maxMediaAttachments:u}}));return}if(A.length>0){y.preventDefault(),y.stopPropagation();let I=A;if(u!==void 0){const E=u-v.length;if(I=I.slice(0,E),I.length<=0){alert(o._({id:"ctFhjs",values:{maxMediaAttachments:u}}));return}}const b=I.map(E=>({file:E,type:E.type,size:E.size,url:URL.createObjectURL(E),id:null,description:null}));L([...v,...b])}};window.addEventListener("paste",r);const d=y=>{y.dataTransfer.items.length>0&&(y.preventDefault(),y.stopPropagation())};return window.addEventListener("dragover",d),window.addEventListener("drop",r),()=>{window.removeEventListener("paste",r),window.removeEventListener("dragover",d),window.removeEventListener("drop",r)}},[v]);const[Ue,dt]=q(!1),[Ve,Ge]=q(!1),[cn,ht]=q(!1),[ye,un]=q(null),[dn,hn]=je(()=>{const r=[],d=[],{contentTranslationHideLanguages:y=[]}=le.settings;return Lt.forEach(p=>{const[A]=p;A===D||A===R.current||A===Ce||y.includes(A)||ye!=null&&ye.length&&ye.includes(A)?r.push(p):d.push(p)}),r.sort(([p,A],[F,I])=>p===D?-1:F===D?1:A.localeCompare(I)),d.sort(([p,A],[F,I])=>A.localeCompare(I)),[r,d]},[D,ye]),Tt=je(()=>!!(t!=null&&t.createdAt)&&Math.floor((Date.now()-new Date(t.createdAt))/(1e3*60*60*24*30)),[t]),pn=()=>{ut(),le.composerState.minimized=!0};return e("div",{id:"compose-container-outer",children:[e("div",{id:"compose-container",class:c?"standalone":"",children:[e("div",{class:"compose-top",children:[(T==null?void 0:T.avatarStatic)&&e(tn,{account:T,accountInstance:$.instanceURL,hideDisplayName:!0,useAvatarStatic:!0}),c?l&&e("button",{type:"button",class:"light pop-button",disabled:g==="loading",onClick:()=>{var r;if(!window.opener){alert(o._({id:"qiPXgY"}));return}if(window.opener.__STATES__.showCompose){if((r=window.opener.__STATES__.composerState)!=null&&r.publishing){alert(o._({id:"Z2l5Bt"}));return}let d=o._({id:"AB/GtR"});if(!confirm(d))return}s({fn:()=>{const d={editStatus:n,replyToStatus:t,draftStatus:{uid:C.current,status:S.current.value,spoilerText:O.current.value,visibility:U,language:D,sensitive:se,poll:P,mediaAttachments:v}};window.opener.__COMPOSE__=d,window.opener.__STATES__.showCompose?(window.opener.__STATES__.showCompose=!1,setTimeout(()=>{window.opener.__STATES__.showCompose=!0},10)):window.opener.__STATES__.showCompose=!0,window.opener.__STATES__.composerState.minimized&&(window.opener.__STATES__.composerState.minimized=!1)}})},children:e(Z,{icon:"popin",alt:o._({id:"/5ZKeE"})})}):e("span",{class:"compose-controls",children:[e("button",{type:"button",class:"plain4 pop-button",disabled:g==="loading",onClick:()=>{Sn({editStatus:n,replyToStatus:t,draftStatus:{uid:C.current,status:S.current.value,spoilerText:O.current.value,visibility:U,language:D,sensitive:se,poll:P,mediaAttachments:v}})&&s()},children:e(Z,{icon:"popout",alt:o._({id:"JsU2En"})})}),e("button",{type:"button",class:"plain4 min-button",onClick:pn,children:e(Z,{icon:"minimize",alt:o._({id:"3TSz9S"})})})," ",e("button",{type:"button",class:"light close-button",disabled:g==="loading",onClick:()=>{We()&&s()},children:e(Z,{icon:"x",alt:o._({id:"yz7wBu"})})})]})]}),!!t&&e("div",{class:"status-preview",children:[e(Pt,{status:t,size:"s",previewMode:!0}),e("div",{class:"status-preview-legend reply-to",children:Tt>0?e(K,{id:"Q1Huya",values:{0:t.account.acct||t.account.username,1:x.format(-Tt,"month")},components:{0:e("strong",{})}}):e(K,{id:"dwLCPZ",values:{0:t.account.acct||t.account.username}})})]}),!!n&&e("div",{class:"status-preview",children:[e(Pt,{status:n,size:"s",previewMode:!0}),e("div",{class:"status-preview-legend",children:e(K,{id:"wKtOLH"})})]}),e("form",{ref:Le,class:`form-visibility-${U}`,style:{pointerEvents:g==="loading"?"none":"auto",opacity:g==="loading"?.5:1},onKeyDown:r=>{r.key==="Enter"&&(r.ctrlKey||r.metaKey)&&Le.current.dispatchEvent(new Event("submit",{cancelable:!0}))},onSubmit:r=>{r.preventDefault();const d=new FormData(r.target),y=Object.fromEntries(d.entries());let{status:p,visibility:A,sensitive:F,spoilerText:I}=y;if(F=F==="on",P){if(P.options.length<2){alert(o._({id:"zhrMYj"}));return}if(P.options.some(b=>b==="")){alert(o._({id:"uNVxXX"}));return}}v.length>0&&v.some(E=>{var H,he;return!((he=(H=E.description)==null?void 0:H.trim)!=null&&he.call(H))})&&!confirm(o._({id:"MQYucx"}))||(I=F&&I||void 0,p=p===""?void 0:p,le.composerState.publishing=!0,M("loading"),(async()=>{try{if(v.length>0){const H=v.map(ve=>{const{file:Ye,description:mn,id:gn}=ve;if(gn)return ve;{const fn=Xt({file:Ye,description:mn});return z.v2.media.create(fn).then(pt=>(pt.id&&(ve.id=pt.id),pt))}}),he=await Promise.allSettled(H);if(he.some(ve=>{var Ye;return ve.status==="rejected"||!((Ye=ve.value)!=null&&Ye.id)})){le.composerState.publishing=!1,le.composerState.publishingError=!0,M("error"),he.forEach(ve=>{ve.status==="rejected"&&alert(ve.reason||o._({id:"eIiurD",values:{i}}))});return}}let b={status:p,spoiler_text:I,language:D,sensitive:F,poll:P,media_ids:v.map(H=>H.id)};n&&Je("@mastodon/edit-media-attributes")?b.media_attributes=v.map(H=>({id:H.id,description:H.description})):n||(b.visibility=A,b.in_reply_to_id=(t==null?void 0:t.id)||void 0),b=Xt(b);let E;if(n)E=await z.v1.statuses.$select(n.id).update(b),wn(E,N,{skipThreading:!0});else try{E=await z.v1.statuses.create(b,{requestInit:{headers:{"Idempotency-Key":C.current}}})}catch{E=await z.v1.statuses.create(b)}le.composerState.minimized=!1,le.composerState.publishing=!1,M("default"),s({type:n?"edit":t?"reply":"post",newStatus:E,instance:N})}catch(b){le.composerState.publishing=!1,le.composerState.publishingError=!0,alert((b==null?void 0:b.reason)||b),M("error")}})())},children:[e("div",{class:"toolbar stretch",children:[e("input",{ref:O,type:"text",name:"spoilerText",placeholder:o._({id:"gnKo7f"}),disabled:g==="loading",class:"spoiler-text-field",lang:D,spellCheck:"true",dir:"auto",style:{opacity:se?1:0,pointerEvents:se?"auto":"none"},onInput:()=>{lt()}}),e("label",{class:`toolbar-button ${se?"highlight":""}`,title:o._({id:"zKu2Aq"}),children:[e("input",{name:"sensitive",type:"checkbox",checked:se,disabled:g==="loading",onChange:r=>{var y,p;const d=r.target.checked;ae(d),d?(y=O.current)==null||y.focus():(p=S.current)==null||p.focus()}}),e(Z,{icon:`eye-${se?"close":"open"}`})]})," ",e("label",{class:`toolbar-button ${U!=="public"&&!se?"show-field":""} ${U!=="public"?"highlight":""}`,title:U,children:[e(Z,{icon:In[U],alt:U}),e("select",{name:"visibility",value:U,onChange:r=>{ie(r.target.value)},disabled:g==="loading"||!!n,dir:"auto",children:[e("option",{value:"public",children:e(K,{id:"7d1a0d"})}),(Je("@pleroma/local-visibility-post")||Je("@akkoma/local-visibility-post"))&&e("option",{value:"local",children:e(K,{id:"d5zxa4"})}),e("option",{value:"unlisted",children:e(K,{id:"WDcQq9"})}),e("option",{value:"private",children:e(K,{id:"o34OrG"})}),e("option",{value:"direct",children:e(K,{id:"IV4QaU"})})]})]})," "]}),e(Ei,{ref:S,placeholder:t?o._({id:"Sjj+EN"}):n?o._({id:"qzVesX"}):o._({id:"owpNF1"}),required:(v==null?void 0:v.length)===0,disabled:g==="loading",lang:D,onInput:()=>{lt()},maxCharacters:ee,performSearch:r=>{const{type:d,q:y,limit:p}=r;return d==="accounts"?z.v1.accounts.search.list({q:y,limit:p,resolve:!1}):z.v2.search.fetch(r)},onTrigger:r=>{(r==null?void 0:r.name)==="custom-emojis"?Ge({defaultSearchTerm:(r==null?void 0:r.defaultSearchTerm)||null}):(r==null?void 0:r.name)==="mention"?dt({defaultSearchTerm:(r==null?void 0:r.defaultSearchTerm)||null}):(r==null?void 0:r.name)==="auto-detect-language"&&(r!=null&&r.languages)&&un(r.languages)}}),(v==null?void 0:v.length)>0&&e("div",{class:"media-attachments",children:[v.map((r,d)=>{const{id:y,file:p}=r,A=(p==null?void 0:p.size)+(p==null?void 0:p.type)+(p==null?void 0:p.name);return e(Ci,{attachment:r,disabled:g==="loading",lang:D,onDescriptionChange:F=>{L(I=>{const b=[...I];return b[d]={...b[d],description:F},b})},onRemove:()=>{L(F=>F.filter((I,b)=>b!==d))}},y||A||d)}),e("label",{class:"media-sensitive",children:[e("input",{name:"sensitive",type:"checkbox",checked:se,disabled:g==="loading",onChange:r=>{const d=r.target.checked;ae(d)}})," ",e("span",{children:e(K,{id:"jER18a"})})," ",e(Z,{icon:`eye-${se?"close":"open"}`})]})]}),!!P&&e(zi,{lang:D,maxOptions:re,maxExpiration:X,minExpiration:pe,maxCharactersPerOption:ue,poll:P,disabled:g==="loading",onInput:r=>{if(r){const d={...r};J(d)}else J(null)}}),e("div",{class:"toolbar wrap",style:{justifyContent:"flex-end"},children:[e("span",{children:[e("label",{class:"toolbar-button",children:[e("input",{type:"file",accept:m==null?void 0:m.join(","),multiple:u===void 0||u-v>=2,disabled:g==="loading"||v.length>=u||!!P,onChange:r=>{const d=r.target.files;if(!d)return;const y=Array.from(d).map(p=>({file:p,type:p.type,size:p.size,url:URL.createObjectURL(p),id:null,description:null}));v.length+y.length>u?alert(o._({id:"ctFhjs",values:{maxMediaAttachments:u}})):L(p=>p.concat(y)),r.target.value=""}}),e(Z,{icon:"attachment"})]}),re==null||re>1&&e(Pe,{children:e("button",{type:"button",class:"toolbar-button",disabled:g==="loading"||!!P||!!v.length,onClick:()=>{J({options:["",""],expiresIn:24*60*60,multiple:!1})},children:e(Z,{icon:"poll",alt:o._({id:"cZJ92q"})})})}),e("button",{type:"button",class:"toolbar-button",disabled:g==="loading",onClick:()=>{Ge(!0)},children:e(Z,{icon:"emoji2",alt:o._({id:"ggiJLM"})})}),!!le.settings.composerGIFPicker&&e("button",{type:"button",class:"toolbar-button gif-picker-button",disabled:g==="loading"||u!==void 0&&v.length>=u||!!P,onClick:()=>{ht(!0)},children:e("span",{children:"GIF"})})]}),e("div",{class:"spacer"}),g==="loading"?e(at,{abrupt:!0}):e(Fi,{maxCharacters:ee,hidden:g==="loading"}),e("label",{class:`toolbar-button ${D!==R.current||ye!=null&&ye.length&&!ye.includes(D)?"highlight":""}`,children:[e("span",{class:"icon-text",children:(Rt=ai[D])==null?void 0:Rt.native}),e("select",{name:"language",value:D,onChange:r=>{const{value:d}=r.target;de(d||Ce),Se.session.set("currentLanguage",d||Ce)},disabled:g==="loading",dir:"auto",children:[dn.map(([r,d,y])=>{const p=xt({code:r,fallback:d});return e("option",{value:r,children:p!==y?`${y} - ${p}`:p},r)}),e("hr",{}),hn.map(([r,d,y])=>{const p=xt({code:r,fallback:d});return e("option",{value:r,children:p!==y?`${y} - ${p}`:p},r)})]})]})," ",e("button",{type:"submit",class:"large",disabled:g==="loading",children:t?o._({id:"ImOQa9"}):n?o._({id:"EkH9pt"}):o._({id:"GMe2XV"})})]})]})]}),Ue&&e(Qe,{onClick:r=>{r.target===r.currentTarget&&dt(!1)},children:e(_i,{masto:z,instance:N,onClose:()=>{dt(!1)},defaultSearchTerm:Ue==null?void 0:Ue.defaultSearchTerm,onSelect:r=>{const d=S.current;if(!d)return;const{selectionStart:y,selectionEnd:p}=d,A=d.value,F=A.slice(0,y),I=F?/[\s\t\n\r]$/.test(F)?"":" ":"",b=A.slice(p),E=/^[\s\t\n\r]/.test(b)?"":" ",H=F+I+"@"+r+E+b;d.value=H,d.selectionStart=d.selectionEnd=p+1+r.length+E.length,d.focus(),d.dispatchEvent(new Event("input"))}})}),Ve&&e(Qe,{onClick:r=>{r.target===r.currentTarget&&Ge(!1)},children:e(Li,{masto:z,instance:N,onClose:()=>{Ge(!1)},defaultSearchTerm:Ve==null?void 0:Ve.defaultSearchTerm,onSelect:r=>{const d=S.current;if(!d)return;const{selectionStart:y,selectionEnd:p}=d,A=d.value,F=A.slice(0,y),I=F?/[\s\t\n\r]$/.test(F)?"":" ":"",b=A.slice(p),E=/^[\s\t\n\r]/.test(b)?"":" ",H=F+I+r+E+b;d.value=H,d.selectionStart=d.selectionEnd=p+r.length+E.length,d.focus(),d.dispatchEvent(new Event("input"))}})}),cn&&e(Qe,{onClick:r=>{r.target===r.currentTarget&&ht(!1)},children:e(Si,{onClose:()=>ht(!1),onSelect:({url:r,type:d,alt_text:y})=>{if(v.length>=u){alert(o._({id:"ctFhjs",values:{maxMediaAttachments:u}}));return}(async()=>{var A,F;let p;try{p=ze({text:o._({id:"/Cw4Tx"}),duration:-1});const I=await fetch(r,{referrerPolicy:"no-referrer"}).then(H=>H.blob()),b=new File([I],d==="video/mp4"?"video.mp4":"image.gif",{type:d}),E=[...v,{file:b,type:d,size:b.size,id:null,description:y||""}];L(E),(A=p==null?void 0:p.hideToast)==null||A.call(p)}catch{(F=p==null?void 0:p.hideToast)==null||F.call(p),ze(o._({id:"VKDnAx"}))}})()}})})]})}function Yt(s){if(!s)return;const{value:t,offsetHeight:n,scrollHeight:a,clientHeight:c}=s;if(nl.visibleInPicker),c=new Mn(a,{keys:["shortcode"],findAllMatches:!0});return[a,c]}const rn=kn(wi,{matchesArg:(s,t)=>s.instance===t.instance,maxAge:30*60*1e3}),ki=async s=>{const{detectAll:t}=await En(async()=>{const{detectAll:a}=await import("./tinyld-light-tbgyvj3S.js");return{detectAll:a}},[],import.meta.url),n=t(s);return n!=null&&n.length?n.slice(0,2).map(a=>a.lang):null},Ei=Fn((s,t)=>{var ee;const{masto:n,instance:a}=_t(),[c,l]=q(((ee=t.current)==null?void 0:ee.value)||""),{maxCharacters:o,performSearch:x=()=>{},onTrigger:_=()=>{},...z}=s,N=V();te(()=>{rn(a,n).then(u=>{const[h,m]=u;N.current=m}).catch(u=>{})},[]);const g=V(),M=V("");te(()=>{let u,h,m;return g.current&&(u=w=>{var re;const{key:f,provide:j,text:k}=w.detail;if(M.current=k,k===""){j(Promise.resolve({matched:!1}));return}if(f===":"){const ue=(re=N.current)==null?void 0:re.search(k,{limit:5});let X="";ue.forEach(({item:pe})=>{const{shortcode:S,url:O}=pe;X+=` +
  • + + ${ke(S)} +
  • `}),X+=`
  • ${ge._({id:"24misb"})}
  • `,Ee.innerHTML=X,j(Promise.resolve({matched:ue.length>0,fragment:Ee}));return}const G={"@":"accounts","#":"hashtags"}[f];j(new Promise(ue=>{x({type:G,q:k,limit:5}).then(pe=>{if(k!==M.current)return;const S=pe[G]||pe;let O="";S.forEach(U=>{var P;const{name:ie,avatarStatic:se,displayName:ae,username:D,acct:de,emojis:R,history:v}=U,L=Bn(ae,R);if(de)O+=` +
  • + + + + + ${L||D} +
    @${ke(de)} +
    +
  • + `;else{const J=(P=v==null?void 0:v.reduce)==null?void 0:P.call(v,(Q,fe)=>Q+ +fe.uses,0);O+=` +
  • + #${ke(ie)} + ${J?`${Tn(J)}`:""} +
  • + `}}),G==="accounts"&&(O+=`
  • ${ge._({id:"24misb"})}
  • `),Ee.innerHTML=O,ue({matched:S.length>0,fragment:Ee})})}))},g.current.addEventListener("text-expander-change",u),h=w=>{const{key:f,item:j}=w.detail,{value:k,more:G}=j.dataset;f===":"?(w.detail.value=k?`:${k}:`:"​",G&&(w.detail.continue=!0,setTimeout(()=>{_==null||_({name:"custom-emojis",defaultSearchTerm:G})},300))):f==="@"?(w.detail.value=k?`@${k} `:"​",G&&(w.detail.continue=!0,setTimeout(()=>{_==null||_({name:"mention",defaultSearchTerm:G})},300))):w.detail.value=`${f}${k}`},g.current.addEventListener("text-expander-value",h),m=w=>{const{input:f}=w.detail;if(l(f.value),t.current){const j=new Event("input",{bubbles:!0});t.current.dispatchEvent(j)}},g.current.addEventListener("text-expander-committed",m)),()=>{g.current&&(g.current.removeEventListener("text-expander-change",u),g.current.removeEventListener("text-expander-value",h),g.current.removeEventListener("text-expander-committed",m))}},[]),te(()=>{const u=t.current;if(!u)return;new ResizeObserver(()=>{if(g.current){const{height:m}=u.getBoundingClientRect();g.current.style.height=m+"px"}}).observe(u)},[]);const C=V(0),$=V(),T=Rn(u=>{var w;if(!$.current)return;if(C.current>3){$.current.innerHTML="",$.current=null,(w=T==null?void 0:T.cancel)==null||w.call(T);return}let h,m;C.current<=3&&(h=Date.now()),$.current.innerHTML=bi(u,{maxCharacters:o})+` +`,C.current<=3&&(m=Date.now()),h&&m&&m-h>50&&C.current++},500),ne=rt(()=>{var m,w;const u=(m=$.current)==null?void 0:m.cloneNode(!0);if(!u)return;u.querySelectorAll("mark").forEach(f=>{f.remove()});const h=(w=u.innerText)==null?void 0:w.trim();h&&(async()=>{const f=await ki(h);f!=null&&f.length&&(_==null||_({name:"auto-detect-language",languages:f}))})()},2e3);return e("text-expander",{ref:g,keys:"@ # :",class:"compose-field-container",children:[e("textarea",{class:"compose-field",autoCapitalize:"sentences",autoComplete:"on",autoCorrect:"on",spellCheck:"true",dir:"auto",rows:"6",cols:"50",...z,ref:t,name:"status",value:c,onKeyDown:u=>{const{key:h,target:m}=u;if(h==="Enter"&&!(u.ctrlKey||u.metaKey))try{const{value:w,selectionStart:f}=m,k=w.slice(0,f).split(` +`).slice(-1)[0];if(k&&/^\s*(-|\d+\.)\s/.test(k)){const[G,re,ue,X,pe]=k.match(/^(\s*)(-|\d+\.)(\s+)(.+)?/)||[];if(pe){u.preventDefault();const[S]=ue.match(/\d+/)||[],O=S?`${+S+1}.`:"-",U=` +${re}${O}${X}`;m.setRangeText(U,f,f);const ie=f+U.length;m.setSelectionRange(ie,ie)}else{const S=f-k.length;m.setRangeText("",S,f)}Yt(m),m.dispatchEvent(new Event("input"))}}catch{}$.current&&($.current.scrollTop=m.scrollTop)},onInput:u=>{var w;const{target:h}=u,m=h.value.replace(/\u200b/g,"");l(m),Yt(h),(w=s.onInput)==null||w.call(s,u),T(m),ne()},style:{width:"100%",height:"4em"},onScroll:u=>{if($.current){const{scrollTop:h}=u.target;$.current.scrollTop=h}}}),e("div",{ref:$,class:"compose-highlight","aria-hidden":"true"})]})});function Fi({maxCharacters:s=500,hidden:t}){const a=Cn(le).composerCharacterCount,c=s-a;return t?e("span",{class:"char-counter",hidden:!0}):e("span",{class:"char-counter",title:`${c}/${s}`,style:{"--percentage":a/s*100},children:[e("meter",{class:`${c<=-10?"explode":c<=0?"danger":c<=20?"warning":""}`,value:a,max:s}),e("span",{class:"counter",children:c})]})}function Zt(s,t,n,a){const c=Math.sqrt(t/s),l=Math.floor(n*c),o=Math.floor(a*c);return{newWidth:l,newHeight:o}}function Ci({attachment:s,disabled:t,lang:n,onDescriptionChange:a=()=>{},onRemove:c=()=>{}}){const{i18n:l}=Ke(),[o,x]=q("default"),_=Je("@mastodon/edit-media-attributes"),{type:z,id:N,file:g}=s,M=je(()=>g?URL.createObjectURL(g):s.url,[g,s.url]),C=!!(g!=null&&g.size),$=C?Qt():{},{mediaAttachments:{imageSizeLimit:T,imageMatrixLimit:ne,videoSizeLimit:ee,videoMatrixLimit:u,videoFrameRateLimit:h}={}}=$||{},[m,w]=q(()=>C?z.startsWith("image")&&T&&g.size>T?{type:"imageSizeLimit",details:{imageSize:g.size,imageSizeLimit:T}}:z.startsWith("video")&&ee&&g.size>ee?{type:"videoSizeLimit",details:{videoSize:g.size,videoSizeLimit:ee}}:null:null),[f,j]=q({});te(()=>{!C||!ne||(f==null?void 0:f.matrix)>ne&&w({type:"imageMatrixLimit",details:{imageMatrix:f==null?void 0:f.matrix,imageMatrixLimit:ne,width:f==null?void 0:f.width,height:f==null?void 0:f.height}})},[f,ne,C]);const[k,G]=q({});te(()=>{!C||!u||(k==null?void 0:k.matrix)>u&&w({type:"videoMatrixLimit",details:{videoMatrix:k==null?void 0:k.matrix,videoMatrixLimit:u,width:k==null?void 0:k.width,height:k==null?void 0:k.height}})},[k,u,C]);const[re,ue]=q(s.description),[X,pe]=z.split("/"),S=rt(a,250);te(()=>{S(re)},[re,S]);const[O,U]=q(!1),ie=V(null);te(()=>{let R;return O&&ie.current&&(R=setTimeout(()=>{ie.current.focus()},100)),()=>{clearTimeout(R)}},[O]);const se=e(Pe,{children:N&&!_?e("div",{class:"media-desc",children:[e("span",{class:"tag",children:e(K,{id:"3wG7HI"})}),e("p",{title:re,children:s.description||e("i",{children:"No description"})})]}):e("textarea",{ref:ie,value:re||"",lang:n,placeholder:{image:l._({id:"Lh8B0N"}),video:l._({id:"mN4S+e"}),audio:l._({id:"ieZytw"})}[X],autoCapitalize:"sentences",autoComplete:"on",autoCorrect:"on",spellCheck:"true",dir:"auto",disabled:t||o==="loading",class:o==="loading"?"loading":"",maxlength:"1500",onInput:R=>{const{value:v}=R.target;ue(v)}})}),ae=V(null);te(()=>()=>{var R,v;(v=(R=ae.current)==null?void 0:R.hideToast)==null||v.call(R)},[]);const D=V(null),de=R=>{const{type:v,details:L}=R;switch(v){case"imageSizeLimit":{const{imageSize:P,imageSizeLimit:J}=L;return l._({id:"d83/LB",values:{0:Xe(P),1:Xe(J)}})}case"imageMatrixLimit":{const{imageMatrix:P,imageMatrixLimit:J,width:Q,height:fe}=L,{newWidth:we,newHeight:Le}=Zt(P,J,Q,fe);return l._({id:"DuvOX/",values:{0:l.number(Q),1:l.number(fe),2:l.number(we),3:l.number(Le)}})}case"videoSizeLimit":{const{videoSize:P,videoSizeLimit:J}=L;return l._({id:"d83/LB",values:{0:Xe(P),1:Xe(J)}})}case"videoMatrixLimit":{const{videoMatrix:P,videoMatrixLimit:J,width:Q,height:fe}=L,{newWidth:we,newHeight:Le}=Zt(P,J,Q,fe);return l._({id:"DuvOX/",values:{0:l.number(Q),1:l.number(fe),2:l.number(we),3:l.number(Le)}})}case"videoFrameRateLimit":return l._({id:"S1fBwy"})}};return e(Pe,{children:[e("div",{class:"media-attachment",children:[e("div",{class:"media-preview",tabIndex:"0",onClick:()=>{U(!0)},children:X==="image"?e("img",{src:M,alt:"",onLoad:R=>{if(!C)return;const{naturalWidth:v,naturalHeight:L}=R.target;j({matrix:v*L,width:v,height:L})}}):X==="video"||X==="gifv"?e("video",{src:M+"#t=0.1",playsinline:!0,muted:!0,disablePictureInPicture:!0,preload:"metadata",onLoadedMetadata:R=>{if(!C)return;const{videoWidth:v,videoHeight:L}=R.target;v&&L&&G({matrix:v*L,width:v,height:L})}}):X==="audio"?e("audio",{src:M,controls:!0}):null}),se,e("div",{class:"media-aside",children:[e("button",{type:"button",class:"plain close-button",disabled:t,onClick:c,children:e(Z,{icon:"x",alt:l._({id:"t/YqKh"})})}),!!m&&e("button",{type:"button",class:"media-error",title:de(m),onClick:()=>{D.current&&D.current.hideToast(),D.current=ze({text:de(m),duration:1e4})},children:e(Z,{icon:"alert",alt:l._({id:"SlfejT"})})})]})]}),O&&e(Qe,{onClose:()=>{U(!1)},children:e("div",{id:"media-sheet",class:"sheet sheet-max",children:[e("button",{type:"button",class:"sheet-close",onClick:()=>{U(!1)},children:e(Z,{icon:"x",alt:l._({id:"yz7wBu"})})}),e("header",{children:e("h2",{children:{image:l._({id:"oMslIB"}),video:l._({id:"WZw+zB"}),audio:l._({id:"KMtgtM"})}[X]})}),e("main",{tabIndex:"-1",children:[e("div",{class:"media-preview",children:X==="image"?e("img",{src:M,alt:""}):X==="video"||X==="gifv"?e("video",{src:M,playsinline:!0,controls:!0}):X==="audio"?e("audio",{src:M,controls:!0}):null}),e("div",{class:"media-form",children:[se,e("footer",{children:[X==="image"&&/^(png|jpe?g|gif|webp)$/i.test(pe)&&!!le.settings.mediaAltGenerator&&!!vt&&e(Dn,{portal:{target:document.body},containerProps:{style:{zIndex:1001}},align:"center",position:"anchor",overflow:"auto",menuButton:e("button",{type:"button",class:"plain",children:e(Z,{icon:"more",size:"l",alt:l._({id:"2FYpfJ"})})}),children:[e(Ot,{disabled:o==="loading",onClick:()=>{x("loading"),ae.current=ze({text:l._({id:"8zsp51"}),duration:-1}),async function(){var R,v;try{const L=new FormData;L.append("image",g);const P=await fetch(vt,{method:"POST",body:L}).then(J=>J.json());if(P.error)throw new Error(P.error);ue(P.description)}catch(L){ze(L.message?l._({id:"wy0Iwj",values:{0:L.message}}):l._({id:"xhYfVj"}))}finally{x("default"),(v=(R=ae.current)==null?void 0:R.hideToast)==null||v.call(R)}}()},children:[e(Z,{icon:"sparkles2"}),n&&n!=="en"?e("small",{children:[e(K,{id:"o5sTJw"}),e("br",{}),"(English)"]}):e("span",{children:e(K,{id:"o5sTJw"})})]}),!!n&&n!=="en"&&e(Ot,{disabled:o==="loading",onClick:()=>{x("loading"),ae.current=ze({text:l._({id:"8zsp51"}),duration:-1}),async function(){var R,v;try{const L=new FormData;L.append("image",g);const P=`?lang=${n}`,J=await fetch(vt+P,{method:"POST",body:L}).then(Q=>Q.json());if(J.error)throw new Error(J.error);ue(J.description)}catch(L){ze(l._({id:"eNTGfp",values:{0:L!=null&&L.message?`: ${L.message}`:""}}))}finally{x("default"),(v=(R=ae.current)==null?void 0:R.hideToast)==null||v.call(R)}}()},children:[e(Z,{icon:"sparkles2"}),e("small",{children:[e(K,{id:"o5sTJw"}),e("br",{}),e(K,{id:"m+pAEQ",values:{0:xt(n)},components:{0:e("span",{class:"more-insignificant"})}})]})]})]}),e("button",{type:"button",class:"light block",onClick:()=>{U(!1)},disabled:o==="loading",children:e(K,{id:"DPfwMq"})})]})]})]})]})})]})}function zi({lang:s,poll:t,disabled:n,onInput:a=()=>{},maxOptions:c,maxExpiration:l,minExpiration:o,maxCharactersPerOption:x}){const{_}=Ke(),{options:z,expiresIn:N,multiple:g}=t;return e("div",{class:`poll ${g?"multiple":""}`,children:[e("div",{class:"poll-choices",children:z.map((M,C)=>e("div",{class:"poll-choice",children:[e("input",{required:!0,type:"text",value:M,disabled:n,maxlength:x,placeholder:ge._({id:"LDUSXg",values:{0:C+1}}),lang:s,spellCheck:"true",dir:"auto",onInput:$=>{const{value:T}=$.target;z[C]=T,a(t)}}),e("button",{type:"button",class:"plain2 poll-button",disabled:n||z.length<=1,onClick:()=>{z.splice(C,1),a(t)},children:e(Z,{icon:"x",size:"s",alt:ge._({id:"t/YqKh"})})})]},C))}),e("div",{class:"poll-toolbar",children:[e("button",{type:"button",class:"plain2 poll-button",disabled:n||z.length>=c,onClick:()=>{z.push(""),a(t)},children:"+"})," ",e("label",{class:"multiple-choices",children:[e("input",{type:"checkbox",checked:g,disabled:n,onChange:M=>{const{checked:C}=M.target;t.multiple=C,a(t)}})," ",e(K,{id:"T57mm9"})]}),e("label",{class:"expires-in",children:[e(K,{id:"lkz6PL"})," ",e("select",{value:N,disabled:n,onChange:M=>{const{value:C}=M.target;t.expiresIn=C,a(t)},children:Object.entries(sn).filter(([M])=>M>=o&&M<=l).map(([M,C])=>e("option",{value:M,children:C()},M))})]})]}),e("div",{class:"poll-toolbar",children:e("button",{type:"button",class:"plain remove-poll-button",disabled:n,onClick:()=>{a(null)},children:e(K,{id:"CDpQAX"})})})]})}function ke(s){return s.replace(/[&<>"']/g,function(t){return"&#"+t.charCodeAt(0)+";"})}function Xt(s){for(let t in s)(s[t]===null||s[t]===void 0)&&delete s[t];return s}function _i({onClose:s=()=>{},onSelect:t=()=>{},defaultSearchTerm:n}){const{masto:a}=_t(),[c,l]=q("default"),[o,x]=q([]),[_,z]=q({}),[N,g]=q(0),M=async u=>{if(!(u!=null&&u.length))return;const h=await $n(u,_);h&&z({..._,...h})},C=u=>{u&&(l("loading"),(async()=>{try{const h=await a.v1.accounts.search.list({q:u,limit:40,resolve:!1});x(h),M(h),l("default")}catch{l("error")}})())},$=rt(C,1e3);te(()=>{C()},[C]);const T=V();te(()=>{T.current&&(T.current.focus(),T.current.value&&(T.current.selectionStart=T.current.value.length,T.current.selectionEnd=T.current.value.length))},[]),te(()=>{n&&C(n)},[n]);const ne=u=>{const h=u.acct;t(h),s()};$e("enter",()=>{const u=o[N];u&&ne(u)},{preventDefault:!0,enableOnFormTags:["input"]});const ee=V();return $e("down",()=>{N{const u=ee.current.querySelector(".selected");u&&u.scrollIntoView({behavior:"smooth",block:"center",inline:"center"})},1)},{preventDefault:!0,enableOnFormTags:["input"]}),$e("up",()=>{N>0?g(N-1):g(o.length-1),setTimeout(()=>{const u=ee.current.querySelector(".selected");u&&u.scrollIntoView({behavior:"smooth",block:"center",inline:"center"})},1)},{preventDefault:!0,enableOnFormTags:["input"]}),e("div",{id:"mention-sheet",class:"sheet",children:[!!s&&e("button",{type:"button",class:"sheet-close",onClick:s,children:e(Z,{icon:"x",alt:ge._({id:"yz7wBu"})})}),e("header",{children:e("form",{onSubmit:u=>{var h;u.preventDefault(),(h=$.flush)==null||h.call($)},children:e("input",{ref:T,required:!0,type:"search",class:"block",placeholder:ge._({id:"eH1bqp"}),onInput:u=>{const{value:h}=u.target;$(h)},autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellCheck:"false",dir:"auto",defaultValue:n||""})})}),e("main",{children:(o==null?void 0:o.length)>0?e("ul",{ref:ee,class:`accounts-list ${c==="loading"?"loading":""}`,children:o.map((u,h)=>{const m=_[u.id];return e("li",{class:h===N?"selected":"",children:[e(tn,{avatarSize:"xxl",account:u,relationship:m,showStats:!0,showActivity:!0}),e("button",{type:"button",class:"plain2",onClick:()=>{ne(u)},children:e(Z,{icon:"plus",size:"xl",alt:ge._({id:"m16xKo"})})})]},u.id)})}):c==="loading"?e("div",{class:"ui-state",children:e(at,{abrupt:!0})}):c==="error"?e("div",{class:"ui-state",children:e("p",{children:e(K,{id:"AThL/k"})})}):null})]})}function Li({masto:s,instance:t,onClose:n=()=>{},onSelect:a=()=>{},defaultSearchTerm:c}){const[l,o]=q("default"),x=V([]),[_,z]=q([]),N=je(()=>Se.account.get("recentlyUsedCustomEmojis")||[]),g=V();te(()=>{o("loading"),(async()=>{try{const[h,m]=await rn(t,s);g.current=m,z(h),o("default")}catch{o("error")}})()},[]);const M=je(()=>{const h={"--recent--":N.filter(w=>_.find(f=>f.shortcode===w.shortcode))},m=[];return _.forEach(w=>{var f,j;if((j=(f=x.current)==null?void 0:f.push)==null||j.call(f,w),!w.category){m.push(w);return}h[w.category]||(h[w.category]=[]),h[w.category].push(w)}),m.length&&(h["--others--"]=m),h},[_]),C=V(),[$,T]=q(null),ne=$t(h=>{var w,f,j;const{value:m}=h.target;if(m){const k=(w=g.current)==null?void 0:w.search(m,{limit:zt});T(k.map(G=>G.item)),(j=(f=C.current)==null?void 0:f.scrollTo)==null||j.call(f,0,0)}else T(null)},[_]);te(()=>{c&&(_!=null&&_.length)&&ne({target:{value:c}})},[c,ne,_]);const ee=$t(h=>{a==null||a(h),n==null||n(),queueMicrotask(()=>{let m=Se.account.get("recentlyUsedCustomEmojis")||[];const w=m.findIndex(f=>f.shortcode===h.shortcode);w!==-1?(m.splice(w,1),m.unshift(h)):(m.unshift(h),m=m.filter(f=>{var j,k;return(k=(j=x.current)==null?void 0:j.find)==null?void 0:k.call(j,G=>G.shortcode===f.shortcode)}),m=m.slice(0,10)),Se.account.set("recentlyUsedCustomEmojis",m)})},[a]),u=V();return te(()=>{u.current&&(u.current.focus(),u.current.value&&(u.current.selectionStart=u.current.value.length,u.current.selectionEnd=u.current.value.length))},[]),e("div",{id:"custom-emojis-sheet",class:"sheet",children:[!!n&&e("button",{type:"button",class:"sheet-close",onClick:n,children:e(Z,{icon:"x",alt:ge._({id:"yz7wBu"})})}),e("header",{children:[e("div",{children:[e("b",{children:e(K,{id:"8i6Ueo"})})," ",l==="loading"?e(at,{}):e("small",{class:"insignificant",children:[" • ",t]})]}),e("form",{onSubmit:h=>{h.preventDefault();const m=$[0];m&&ee(`:${m.shortcode}:`)},children:e("input",{ref:u,type:"search",placeholder:ge._({id:"EarrCe"}),onInput:ne,autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellCheck:"false",dir:"auto",defaultValue:c||""})})]}),e("main",{ref:C,children:$!==null?e("ul",{class:"custom-emojis-matches custom-emojis-list",children:$.map(h=>e("li",{class:"custom-emojis-match",children:e(on,{emoji:h,onClick:()=>{ee(`:${h.shortcode}:`)},showCode:!0})},h.shortcode))}):e("div",{class:"custom-emojis-list",children:[l==="error"&&e("div",{class:"ui-state",children:e("p",{children:e(K,{id:"Kzwsg2"})})}),l==="default"&&Object.entries(M).map(([h,m])=>!!(m!=null&&m.length)&&e("div",{class:"section-container",children:[e("div",{class:"section-header",children:{"--recent--":ge._({id:"uabU9X"}),"--others--":ge._({id:"NuKR0h"})}[h]||h}),e(Ai,{emojis:m,onSelect:ee})]}))]})})]})}const Ai=en(({emojis:s,onSelect:t})=>{const{i18n:n}=Ke(),[a,c]=q(zt),l=s.length>a;return e("section",{children:[s.slice(0,a).map(o=>e(on,{emoji:o,onClick:()=>{t(`:${o.shortcode}:`)}},o.shortcode)),l&&e("button",{type:"button",class:"plain small",onClick:()=>c(a+zt),children:e(K,{id:"iAB71E",values:{0:n.number(s.length-a)}})})]})}),on=en(({emoji:s,onClick:t,showCode:n})=>{const a=c=>{const o=c.currentTarget.closest("main");if(o){const x=o.getBoundingClientRect(),_=c.currentTarget.getBoundingClientRect(),z=c.currentTarget.classList;_.leftx.right-88?(z.add("edge-right"),z.remove("edge-left")):z.remove("edge-left","edge-right")}};return e("button",{type:"button",className:"plain4",onClick:t,"data-title":n?void 0:s.shortcode,onPointerEnter:a,onFocus:a,children:[e("picture",{children:[!!s.staticUrl&&e("source",{srcSet:s.staticUrl,media:"(prefers-reduced-motion: reduce)"}),e("img",{className:"shortcode-emoji",src:s.url||s.staticUrl,alt:s.shortcode,width:"24",height:"24",loading:"lazy",decoding:"async"})]}),n&&e(Pe,{children:[" ",e("code",{children:s.shortcode})]})]})}),yt=20;function Si({onClose:s=()=>{},onSelect:t=()=>{}}){var C,$,T,ne,ee,u;const{i18n:n}=Ke(),[a,c]=q("default"),[l,o]=q([]),x=V(null),_=V(null),z=V(0),N=V(null);function g({offset:h}){var m,w,f;(m=_.current)!=null&&m.value&&(c("loading"),(f=(w=N.current)==null?void 0:w.scrollTo)==null||f.call(w,{top:0,left:0,behavior:"smooth"}),(async()=>{var j;try{const k={api_key:si,q:_.current.value,rating:"g",limit:yt,bundle:"messaging_non_clips",offset:h,lang:n.locale||"en"},G=await fetch("https://api.giphy.com/v1/gifs/search?"+new URLSearchParams(k),{referrerPolicy:"no-referrer"}).then(re=>re.json());z.current=((j=G.pagination)==null?void 0:j.offset)||0,o(G),c("results")}catch{c("error")}})())}te(()=>{var h;(h=_.current)==null||h.focus()},[]);const M=rt(()=>{g({offset:0})},1e3);return e("div",{id:"gif-picker-sheet",class:"sheet",children:[!!s&&e("button",{type:"button",class:"sheet-close",onClick:s,children:e(Z,{icon:"x",alt:n._({id:"yz7wBu"})})}),e("header",{children:e("form",{ref:x,onSubmit:h=>{h.preventDefault(),g({offset:0})},children:[e("input",{ref:_,type:"search",name:"q",placeholder:n._({id:"wxlF9B"}),required:!0,autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellCheck:"false",dir:"auto",onInput:M}),e("input",{type:"image",class:"powered-button",src:ei,width:"86",height:"30",alt:n._({id:"c1Q/eU"})})]})}),e("main",{ref:N,class:a==="loading"?"loading":"",children:[a==="default"&&e("div",{class:"ui-state",children:e("p",{class:"insignificant",children:e(K,{id:"9KEidY"})})}),a==="loading"&&!((C=l==null?void 0:l.data)!=null&&C.length)&&e("div",{class:"ui-state",children:e(at,{abrupt:!0})}),(($=l==null?void 0:l.data)==null?void 0:$.length)>0?e(Pe,{children:[e("ul",{children:l.data.map(h=>{const{id:m,images:w,title:f,alt_text:j}=h,{fixed_height_small:k,fixed_height_downsampled:G,fixed_height:re,original:ue}=w,X=k!=null&&k.url?k:G!=null&&G.url?G:re;let{url:pe,webp:S,width:O,height:U}=X;+U>100&&(O=O/U*100,U=100);const ie=URL.parse(pe),se=ie.origin+ie.pathname;let ae;if(S){const D=URL.parse(S);ae=D.origin+D.pathname}return e("li",{children:e("button",{type:"button",onClick:()=>{const{mp4:D,url:de}=ue,R=D||de,v=URL.parse(R),L=v.origin+v.pathname;s(),t({url:L,type:D?"video/mp4":"image/gif",alt_text:j||f})},children:e("figure",{style:{"--figure-width":O+"px"},children:[e("picture",{children:[ae&&e("source",{srcset:ae,type:"image/webp"}),e("img",{src:se,width:O,height:U,loading:"lazy",decoding:"async",alt:j,referrerpolicy:"no-referrer",onLoad:D=>{D.target.style.backgroundColor="transparent"}})]}),e("figcaption",{children:j||f})]})})},m)})}),e("p",{class:"pagination",children:[((T=l.pagination)==null?void 0:T.offset)>0&&e("button",{type:"button",class:"light small",disabled:a==="loading",onClick:()=>{var h;g({offset:((h=l.pagination)==null?void 0:h.offset)-yt})},children:[e(Z,{icon:"chevron-left"}),e("span",{children:e(K,{id:"DHhJ7s"})})]}),e("span",{}),((ne=l.pagination)==null?void 0:ne.offset)+((ee=l.pagination)==null?void 0:ee.count)<((u=l.pagination)==null?void 0:u.total_count)&&e("button",{type:"button",class:"light small",disabled:a==="loading",onClick:()=>{var h;g({offset:((h=l.pagination)==null?void 0:h.offset)+yt})},children:[e("span",{children:e(K,{id:"hXzOVo"})})," ",e(Z,{icon:"chevron-right"})]})]})]}):a==="results"&&e("div",{class:"ui-state",children:e("p",{children:"No results"})}),a==="error"&&e("div",{class:"ui-state",children:e("p",{children:e(K,{id:"PbFw9n"})})})]})]})}export{Ti as default}; +//# sourceMappingURL=compose-xua1VIA2.js.map diff --git a/assets/compose-xua1VIA2.js.map b/assets/compose-xua1VIA2.js.map new file mode 100644 index 0000000..f443d99 --- /dev/null +++ b/assets/compose-xua1VIA2.js.map @@ -0,0 +1 @@ +{"version":3,"mappings":"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","names":["Combobox","input","list","tabInsertsSuggestions","defaultFirstOption","event","keyboardBindings","trackComposition","commitWithElement","_a","visible","indexDiff","focusEl","els","focusIndex","indexOfItem","newIndex","target","el","scrollTo","combobox","commit","fireCommitEvent","container","inViewport","element","scrollTop","containerBottom","top","bottom","boundary","query","text","key","cursor","multiWord","lookBackIndex","lastMatchPosition","keyIndex","pre","CustomHTMLElement","InputStyleCloneUpdateEvent","CloneRegistry","_InputStyleCloneElement","__privateAdd","_InputStyleCloneElement_instances","_styleObserver","__privateMethod","updateStyles_fn","_resizeObserver","requestUpdateLayout_fn","_inputRef","_container","_xOffset","_yOffset","_isLayoutUpdating","_onInput","updateText_fn","_onDocumentScrollOrResize","usingInput_fn","clone","__privateSet","__privateGet","input_get","fn","updateLayout_fn","inputStyle","inputRect","cloneRect","prop","propertiesToCopy","InputStyleCloneElement","e","_InputRange","startOffset","endOffset","_InputRange_instances","_inputElement","_startOffset","_endOffset","selectionStart","selectionEnd","offset","clampOffset_fn","toStart","createCloneRange_fn","styleClone_get","cloneElement_get","range","textNode","InputRange","states","TextExpander","expander","match","menu","_b","position","caretRect","targetPosition","currentPosition","delta","currentStyle","item","beginning","remaining","detail","suffix","value","found","providers","provide","result","TextExpanderElement","keysAttr","keys","multiWordAttr","globalMultiWord","state","ansiRegex","onlyFirst","pattern","regex","stripAnsi","string","segmenter","stringLength","countAnsiEscapeCodes","length","_","poweredByGiphyURL","BYTES_UNITS","prettyBytes","bytes","unitIndex","Math","min","floor","log2","i18n","number","style","unit","unitDisplay","maximumFractionDigits","PHANPY_IMG_ALT_API_URL","IMG_ALT_API_URL","PHANPY_GIPHY_API_KEY","GIPHY_API_KEY","import","supportedLanguagesMap","supportedLanguages","reduce","acc","l","code","common","native","expiryOptions","i18nDuration","expirySeconds","Object","oneDay","expiresInFromExpiresAt","expiresAt","Date","getTime","now","find","s","document","createElement","role","className","windowMargin","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","left","width","boundingClientRect","innerWidth","window","insetInlineStart","isRTL","observe","DEFAULT_LANG","localeMatch","Intl","DateTimeFormat","resolvedOptions","locale","navigator","languages","map","urlRegexObj","RegExp","urlRegex","source","flags","usernameRegex","urlPlaceholder","countableText","inputText","replace","USERNAME_RE","MENTION_RE","HASHTAG_RE","SHORTCODE_RE_FRAGMENT","SCAN_RE","Segmenter","escapeHTML","highlightText","maxCharacters","Infinity","composerCharacterCount","withinLimitHTML","exceedLimitHTML","htmlSegments","segment","index","RTF","mem","RelativeTimeFormat","undefined","LF","ListFormat","CUSTOM_EMOJIS_COUNT","Compose","onClose","replyToStatus","editStatus","draftStatus","standalone","hasOpener","useLingui","rtf","lf","console","masto","instance","uiState","setUIState","useState","UID","uid","log","currentAccount","currentAccountInfo","maxMediaAttachments","charactersReservedPerUrl","imageMatrixLimit","supportedMimeTypes","imageSizeLimit","videoSizeLimit","videoMatrixLimit","videoFrameRateLimit","maxExpiration","maxOptions","maxCharactersPerOption","minExpiration","spoilerTextRef","useRef","textareaRef","store","prevLanguage","language","sensitive","setMediaAttachments","setLanguage","oninputTextarea","poll","account","focusTextarea","dispatchEvent","setTimeout","spoilerText","useEffect","visibility2","language2","sensitive2","visibility","current","m","allMentions","prefs","setSensitive","poll2","mediaAttachments","options","expiresIn","statusSource","dataset","mediaAttachments2","setVisibility","composablePoll","status","o","formRef","canClose","id","hasValue","hasMediaAttachments","isSelf","hasOnlyAcct","confirmClose","hasIDMediaAttachments","beforeUnloadCopy","handleBeforeUnload","sameWithSource","getCharCount","updateCharCount","supportsCloseWatcher","useHotkeys","yes","addEventListener","capture","modals","hasModal","hasOnlyComposer","prevBackgroundDraft","count","escDownRef","ignoreEventWhen","useCloseWatcher","draftKey","getCurrentAccountNS","backgroundDraft","useInterval","db","handleItems","username","acct","i2","items","unsupportedFiles","i18n2","drafts","set","updatedAt","f","debug","error","files","clipboardData","max","file","alert","mediaFiles","allowedFiles","1","2","handleDragover","setShowMentionPicker","showEmoji2Picker","showGIFPicker","useMemo","contentTranslationHideLanguages","autoDetectedLanguages","topLanguages","restLanguages","commonB","type","size","url","codeA","commonA","codeB","onMinimize","saveUnsavedDraft","_jsxs","dataTransfer","_jsx","showMentionPicker","topSupportedLanguages","children","class","confirmText","passData","__STATES__","opener","composerState","Icon","settings","sort","avatarStatic","disabled","onClick","Status","replyToStatusMonthsAgo","Trans","formData","components","0","media","onKeyDown","onSubmit","description","params2","res","attachment","results","mediaPromises","hasNoDescriptions","params","removeNullUndefined","newStatus","saveStatus","i","e2","media_attributes","in_reply_to_id","statuses","visibilityIconsMap","opacity","pointerEvents","checked","onChange","icon","title","limit","action","setShowEmoji2Picker","setAutoDetectedLanguages","Textarea","ref","placeholder","fileID","newAttachments","attachments","j","performSearch","q","v1","resolve","v2","fetch","onTrigger","defaultSearchTerm","Poll","newPoll","setPoll","onDescriptionChange","onInput","_Fragment","accept","setShowGIFPicker","Loader","CharCountMeter","commonText","localeCode2Text","restSupportedLanguages","textarea","textBeforeMention","spaceAfterMention","textAfterMention","newText","Modal","CustomEmojisModal","emojiShortcode","textBeforeEmoji","spaceBeforeEmoji","spaceAfterEmoji","textAfterEmoji","GIFPickerModal","alt_text","theToast","showToast","onSelect","autoResizeTextarea","scrollHeight","clientHeight","offsetHeight","height","_getCustomEmojis","visibleEmojis","searcher","getCustomEmojis","pmem","blob","keyArg","newMediaAttachments","lang","props","textareaProps","searcherRef","r","handleChange","text2","emojis","filter","Fuse","matchesArg","cacheKeyArg","emoji","detectLangs","shortcode","detectAll","langs","encodeHTML","forwardRef","html","textExpanderTextRef","history","displayNameWithEmoji","emojifyText","displayName","search","total","cur","name","shortenNumber","Promise","matched","then","v","more","textExpanderRef","handleValue","handleCommited","setText","slowHighlightPerf","composeHighlightRef","start","end","debouncedAutoDetectLanguage","useDebouncedCallback","dom","mark","resizeObserver","throttleHighlightText","lastLine","bullet","postSpaces","anything","newBullet","pos","dir","rows","cols","hidden","charCount","leftChars","ctrlKey","setRangeText","setSelectionRange","scaleDimension","matrix","matrixLimit","scalingFactor","newHeight","newWidth","MediaAttachment","supportsEdit","supports","onScroll","configuration","getCurrentInstanceConfiguration","maxError","setMaxError","checkMaxError","snapStates","imageMatrix","videoMatrix","setDescription","debouncedOnDescriptionChange","timer","details","setImageMatrix","setVideoMatrix","toastRef","showModal","imageSizeLimit2","descTextarea","videoSize","videoSizeLimit2","videoMatrixLimit2","videoMatrix2","maxErrorToast","maxErrorText","err","imageSize","suffixType","naturalWidth","naturalHeight","3","videoWidth","videoHeight","values","setShowModal","src","onLoad","onLoadedMetadata","onRemove","alt","subtype","Menu2","MenuItem","body","response","zIndex","menuButton","append","multiple","option","required","label","splice","str","char","obj","push","MentionModal","api","accounts","setAccounts","relationshipsMap","setRelationshipsMap","setSelectedIndex","accounts2","fetchRelationships","relationships","loadAccounts","inputRef","filterShortcodes","searchTerm","bLower","aStartsWith","bStartsWith","aContains","bothContain","bContains","socialAddress","selectedAccount","selectedIndex","selectAccount","listRef","selectedItem","loadRelationships","term","debouncedLoadAccounts","enableOnFormTags","relationship","AccountBlock","customEmojisList","recentlyUsedCustomEmojis","customEmojisCatList","emojisCat","customEmojis","othersCat","matches","setMatches","_c","scrollableRef","onFind","onSelectEmoji","useCallback","recentlyUsedCustomEmojis2","recentlyUsedEmojiIndex","emoji2","setCustomEmojis","category","queueMicrotask","CustomEmojisList","memo","setMax","CustomEmojiButton","showMore","showCode","parent","selfRect","rect","targetClassList","addEdges","GIFS_PER_PAGE","slice","fetchGIFs","qRef","closest","currentTarget","remove","debouncedOnInput","onPointerEnter","staticUrl","decoding","setResults","currentOffset","gif","images","fixed_height_small","fixed_height_downsampled","fixed_height","theImage","webp","urlObj","strippedURL","strippedWebP","preventDefault","original","theURL","mp4","url2","strippedURL2","webpObj","parse"],"ignoreList":[0,1,2,3,4],"sources":["../../node_modules/@github/combobox-nav/dist/index.js","../../node_modules/@github/text-expander-element/dist/index.js","../../node_modules/ansi-regex/index.js","../../node_modules/strip-ansi/index.js","../../node_modules/string-length/index.js","../../src/assets/powered-by-giphy.svg","../../src/utils/pretty-bytes.js","../../src/components/compose.jsx"],"sourcesContent":["export default class Combobox {\n constructor(input, list, { tabInsertsSuggestions, defaultFirstOption } = {}) {\n this.input = input;\n this.list = list;\n this.tabInsertsSuggestions = tabInsertsSuggestions !== null && tabInsertsSuggestions !== void 0 ? tabInsertsSuggestions : true;\n this.defaultFirstOption = defaultFirstOption !== null && defaultFirstOption !== void 0 ? defaultFirstOption : false;\n this.isComposing = false;\n if (!list.id) {\n list.id = `combobox-${Math.random().toString().slice(2, 6)}`;\n }\n this.ctrlBindings = !!navigator.userAgent.match(/Macintosh/);\n this.keyboardEventHandler = event => keyboardBindings(event, this);\n this.compositionEventHandler = event => trackComposition(event, this);\n this.inputHandler = this.clearSelection.bind(this);\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-controls', list.id);\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-haspopup', 'listbox');\n }\n destroy() {\n this.clearSelection();\n this.stop();\n this.input.removeAttribute('role');\n this.input.removeAttribute('aria-controls');\n this.input.removeAttribute('aria-expanded');\n this.input.removeAttribute('aria-autocomplete');\n this.input.removeAttribute('aria-haspopup');\n }\n start() {\n this.input.setAttribute('aria-expanded', 'true');\n this.input.addEventListener('compositionstart', this.compositionEventHandler);\n this.input.addEventListener('compositionend', this.compositionEventHandler);\n this.input.addEventListener('input', this.inputHandler);\n this.input.addEventListener('keydown', this.keyboardEventHandler);\n this.list.addEventListener('click', commitWithElement);\n this.indicateDefaultOption();\n }\n stop() {\n this.clearSelection();\n this.input.setAttribute('aria-expanded', 'false');\n this.input.removeEventListener('compositionstart', this.compositionEventHandler);\n this.input.removeEventListener('compositionend', this.compositionEventHandler);\n this.input.removeEventListener('input', this.inputHandler);\n this.input.removeEventListener('keydown', this.keyboardEventHandler);\n this.list.removeEventListener('click', commitWithElement);\n }\n indicateDefaultOption() {\n var _a;\n if (this.defaultFirstOption) {\n (_a = Array.from(this.list.querySelectorAll('[role=\"option\"]:not([aria-disabled=\"true\"])'))\n .filter(visible)[0]) === null || _a === void 0 ? void 0 : _a.setAttribute('data-combobox-option-default', 'true');\n }\n }\n navigate(indexDiff = 1) {\n const focusEl = Array.from(this.list.querySelectorAll('[aria-selected=\"true\"]')).filter(visible)[0];\n const els = Array.from(this.list.querySelectorAll('[role=\"option\"]')).filter(visible);\n const focusIndex = els.indexOf(focusEl);\n if ((focusIndex === els.length - 1 && indexDiff === 1) || (focusIndex === 0 && indexDiff === -1)) {\n this.clearSelection();\n this.input.focus();\n return;\n }\n let indexOfItem = indexDiff === 1 ? 0 : els.length - 1;\n if (focusEl && focusIndex >= 0) {\n const newIndex = focusIndex + indexDiff;\n if (newIndex >= 0 && newIndex < els.length)\n indexOfItem = newIndex;\n }\n const target = els[indexOfItem];\n if (!target)\n return;\n for (const el of els) {\n el.removeAttribute('data-combobox-option-default');\n if (target === el) {\n this.input.setAttribute('aria-activedescendant', target.id);\n target.setAttribute('aria-selected', 'true');\n scrollTo(this.list, target);\n }\n else {\n el.removeAttribute('aria-selected');\n }\n }\n }\n clearSelection() {\n this.input.removeAttribute('aria-activedescendant');\n for (const el of this.list.querySelectorAll('[aria-selected=\"true\"]')) {\n el.removeAttribute('aria-selected');\n }\n this.indicateDefaultOption();\n }\n}\nfunction keyboardBindings(event, combobox) {\n if (event.shiftKey || event.metaKey || event.altKey)\n return;\n if (!combobox.ctrlBindings && event.ctrlKey)\n return;\n if (combobox.isComposing)\n return;\n switch (event.key) {\n case 'Enter':\n if (commit(combobox.input, combobox.list)) {\n event.preventDefault();\n }\n break;\n case 'Tab':\n if (combobox.tabInsertsSuggestions && commit(combobox.input, combobox.list)) {\n event.preventDefault();\n }\n break;\n case 'Escape':\n combobox.clearSelection();\n break;\n case 'ArrowDown':\n combobox.navigate(1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n combobox.navigate(-1);\n event.preventDefault();\n break;\n case 'n':\n if (combobox.ctrlBindings && event.ctrlKey) {\n combobox.navigate(1);\n event.preventDefault();\n }\n break;\n case 'p':\n if (combobox.ctrlBindings && event.ctrlKey) {\n combobox.navigate(-1);\n event.preventDefault();\n }\n break;\n default:\n if (event.ctrlKey)\n break;\n combobox.clearSelection();\n }\n}\nfunction commitWithElement(event) {\n if (!(event.target instanceof Element))\n return;\n const target = event.target.closest('[role=\"option\"]');\n if (!target)\n return;\n if (target.getAttribute('aria-disabled') === 'true')\n return;\n fireCommitEvent(target);\n}\nfunction commit(input, list) {\n const target = list.querySelector('[aria-selected=\"true\"], [data-combobox-option-default=\"true\"]');\n if (!target)\n return false;\n if (target.getAttribute('aria-disabled') === 'true')\n return true;\n target.click();\n return true;\n}\nfunction fireCommitEvent(target) {\n target.dispatchEvent(new CustomEvent('combobox-commit', { bubbles: true }));\n}\nfunction visible(el) {\n return (!el.hidden &&\n !(el instanceof HTMLInputElement && el.type === 'hidden') &&\n (el.offsetWidth > 0 || el.offsetHeight > 0));\n}\nfunction trackComposition(event, combobox) {\n combobox.isComposing = event.type === 'compositionstart';\n const list = document.getElementById(combobox.input.getAttribute('aria-controls') || '');\n if (!list)\n return;\n combobox.clearSelection();\n}\nfunction scrollTo(container, target) {\n if (!inViewport(container, target)) {\n container.scrollTop = target.offsetTop;\n }\n}\nfunction inViewport(container, element) {\n const scrollTop = container.scrollTop;\n const containerBottom = scrollTop + container.clientHeight;\n const top = element.offsetTop;\n const bottom = top + element.clientHeight;\n return top >= scrollTop && bottom <= containerBottom;\n}\n","import Combobox from '@github/combobox-nav';\n\nconst boundary = /\\s|\\(|\\[/;\nfunction query(text, key, cursor, { multiWord, lookBackIndex, lastMatchPosition } = {\n multiWord: false,\n lookBackIndex: 0,\n lastMatchPosition: null\n}) {\n let keyIndex = text.lastIndexOf(key, cursor - 1);\n if (keyIndex === -1)\n return;\n if (keyIndex < lookBackIndex)\n return;\n if (multiWord) {\n if (lastMatchPosition != null) {\n if (lastMatchPosition === keyIndex)\n return;\n keyIndex = lastMatchPosition - key.length;\n }\n const charAfterKey = text[keyIndex + 1];\n if (charAfterKey === ' ' && cursor >= keyIndex + key.length + 1)\n return;\n const newLineIndex = text.lastIndexOf('\\n', cursor - 1);\n if (newLineIndex > keyIndex)\n return;\n const dotIndex = text.lastIndexOf('.', cursor - 1);\n if (dotIndex > keyIndex)\n return;\n }\n else {\n const spaceIndex = text.lastIndexOf(' ', cursor - 1);\n if (spaceIndex > keyIndex)\n return;\n }\n const pre = text[keyIndex - 1];\n if (pre && !boundary.test(pre))\n return;\n const queryString = text.substring(keyIndex + key.length, cursor);\n return {\n text: queryString,\n position: keyIndex + key.length\n };\n}\n\n/**\n * A custom element is implemented as a class which extends HTMLElement (in the\n * case of autonomous elements) or the interface you want to customize (in the\n * case of customized built-in elements).\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks\n */\nclass CustomHTMLElement extends HTMLElement {\n}\n\nclass InputStyleCloneUpdateEvent extends Event {\n constructor() {\n super(\"update\");\n }\n}\nconst CloneRegistry = new WeakMap();\n/**\n * Create an element that exactly matches an input pixel-for-pixel and automatically stays in sync with it. This\n * is a non-interactive overlay on to the input and can be used to affect the visual appearance of the input\n * without modifying its behavior. The clone element is hidden by default.\n *\n * This lower level API powers the `InputRange` but provides more advanced functionality including event updates.\n *\n * Emits `update` events whenever anything is recalculated: when the layout changes, when the user scrolls, when the\n * input is updated, etc. This event may be emitted more than once per change.\n *\n * @note There may be cases in which the clone cannot observe changes to the input and fails to automatically update.\n * For example, if the `value` property on the input is written to directly, no `input` event is emitted by the input\n * and the clone does not automatically update. In these cases, `forceUpdate` can be used to manually trigger an update.\n */\n// PRIOR ART: This approach was adapted from the following MIT-licensed sources:\n// - primer/react (Copyright (c) 2018 GitHub, Inc.): https://github.com/primer/react/blob/a0db832302702b869aa22b0c4049ad9305ef631f/src/drafts/utils/character-coordinates.ts\n// - component/textarea-caret-position (Copyright (c) 2015 Jonathan Ong me@jongleberry.com): https://github.com/component/textarea-caret-position/blob/b5db7a7e47dd149c2a66276183c69234e4dabe30/index.js\n// - koddsson/textarea-caret-position (Copyright (c) 2015 Jonathan Ong me@jongleberry.com): https://github.com/koddsson/textarea-caret-position/blob/eba40ec8488eed4d77815f109af22e1d9c0751d3/index.js\nclass InputStyleCloneElement extends CustomHTMLElement {\n #styleObserver = new MutationObserver(() => this.#updateStyles());\n #resizeObserver = new ResizeObserver(() => this.#requestUpdateLayout());\n // This class is unique in that it will prevent itself from getting garbage collected because of the subscribed\n // observers (if never detached). Because of this, we want to avoid preventing the existence of this class from also\n // preventing the garbage collection of the associated input. This also allows us to automatically detach if the\n // input gets collected.\n #inputRef;\n #container;\n /**\n * Get the clone for an input, reusing an existing one if available. This avoids creating unecessary clones, which\n * have a performance cost due to their high-frequency event-based updates. Because these elements are shared, they\n * should be mutated with caution.\n *\n * Upon initial creation the clone element will automatically be inserted into the DOM and begin observing the\n * linked input. Only one clone per input can ever exist at a time.\n * @param input The target input to clone.\n */\n static for(input) {\n let clone = CloneRegistry.get(input);\n if (!clone) {\n clone = new InputStyleCloneElement();\n clone.connect(input);\n CloneRegistry.set(input, clone);\n }\n return clone;\n }\n /**\n * Connect this instance to a target input element and insert this instance into the DOM in the correct location.\n *\n * NOTE: calling the static `for` method is nearly always preferable as it will reuse an existing clone if available.\n * However, if reusing clones is problematic (ie, if the clone needs to be mutated), a clone can be constructed\n * directly with `new InputStyleCloneElement()` and then bound to an input and inserted into the DOM with\n * `clone.connect(target)`.\n */\n connect(input) {\n this.#inputRef = new WeakRef(input);\n // We want position:absolute so it doesn't take space in the layout, but that doesn't work with display:table-cell\n // used in the HTMLInputElement approach. So we need a wrapper.\n this.#container = document.createElement(\"div\");\n this.#container.style.position = \"absolute\";\n this.#container.style.pointerEvents = \"none\";\n input.after(this.#container);\n this.#container.appendChild(this);\n }\n /**\n * Force a recalculation. Will emit an `update` event. This is typically not needed unless the input has changed in\n * an unobservable way, eg by directly writing to the `value` property.\n */\n forceUpdate() {\n this.#updateStyles();\n this.#updateText();\n }\n /** @private */\n connectedCallback() {\n this.#usingInput((input) => {\n this.style.pointerEvents = \"none\";\n this.style.userSelect = \"none\";\n this.style.overflow = \"hidden\";\n this.style.display = \"block\";\n // Important not to use display:none which would not render the content at all\n this.style.visibility = \"hidden\";\n if (input instanceof HTMLTextAreaElement) {\n this.style.whiteSpace = \"pre-wrap\";\n this.style.wordWrap = \"break-word\";\n }\n else {\n this.style.whiteSpace = \"nowrap\";\n // text in single-line inputs is vertically centered\n this.style.display = \"table-cell\";\n this.style.verticalAlign = \"middle\";\n }\n this.setAttribute(\"aria-hidden\", \"true\");\n this.#updateStyles();\n this.#updateText();\n this.#styleObserver.observe(input, {\n attributeFilter: [\n \"style\",\n \"dir\", // users can right-click in some browsers to change the text direction dynamically\n ],\n });\n this.#resizeObserver.observe(input);\n document.addEventListener(\"scroll\", this.#onDocumentScrollOrResize, { capture: true });\n window.addEventListener(\"resize\", this.#onDocumentScrollOrResize, { capture: true });\n // capture so this happens first, so other things can respond to `input` events after this data updates\n input.addEventListener(\"input\", this.#onInput, { capture: true });\n });\n }\n /** @private */\n disconnectedCallback() {\n this.#container?.remove();\n this.#styleObserver.disconnect();\n this.#resizeObserver.disconnect();\n document.removeEventListener(\"scroll\", this.#onDocumentScrollOrResize, { capture: true });\n window.removeEventListener(\"resize\", this.#onDocumentScrollOrResize, { capture: true });\n // Can't use `usingInput` here since that could infinitely recurse\n const input = this.#input;\n if (input) {\n input.removeEventListener(\"input\", this.#onInput, { capture: true });\n CloneRegistry.delete(input);\n }\n }\n // --- private ---\n get #input() {\n return this.#inputRef?.deref();\n }\n /** Perform `fn` using the `input` if it is still available. If not, clean up the clone instead. */\n #usingInput(fn) {\n const input = this.#input;\n if (!input)\n return this.remove();\n return fn(input);\n }\n /** Current relative x-adjustment in pixels, executed via CSS transform. */\n #xOffset = 0;\n /** Current relative y-adjustment in pixels, executed via CSS transform. */\n #yOffset = 0;\n /**\n * Update only geometric properties without recalculating styles. Typically call `#requestUpdateLayout` instead to\n * only update once per animation frame.\n */\n #updateLayout() {\n // This runs often, so keep it as fast as possible! Avoid all unecessary updates.\n this.#usingInput((input) => {\n const inputStyle = window.getComputedStyle(input);\n this.style.height = inputStyle.height;\n this.style.width = inputStyle.width;\n // Immediately re-adjust for browser inconsistencies in scrollbar handling, if necessary\n if (input.clientHeight !== this.clientHeight)\n this.style.height = `calc(${inputStyle.height} + ${input.clientHeight - this.clientHeight}px)`;\n if (input.clientWidth !== this.clientWidth)\n this.style.width = `calc(${inputStyle.width} + ${input.clientWidth - this.clientWidth}px)`;\n // Position on top of the input\n const inputRect = input.getBoundingClientRect();\n const cloneRect = this.getBoundingClientRect();\n this.#xOffset = this.#xOffset + inputRect.left - cloneRect.left;\n this.#yOffset = this.#yOffset + inputRect.top - cloneRect.top;\n this.style.transform = `translate(${this.#xOffset}px, ${this.#yOffset}px)`;\n this.scrollTop = input.scrollTop;\n this.scrollLeft = input.scrollLeft;\n this.dispatchEvent(new InputStyleCloneUpdateEvent());\n });\n }\n #isLayoutUpdating = false;\n /** Request a layout update. Will only happen once per animation frame, to avoid unecessary updates. */\n #requestUpdateLayout() {\n if (this.#isLayoutUpdating)\n return;\n this.#isLayoutUpdating = true;\n requestAnimationFrame(() => {\n this.#updateLayout();\n this.#isLayoutUpdating = false;\n });\n }\n /** Update the styles of the clone based on the styles of the input, then request a layout update. */\n #updateStyles() {\n this.#usingInput((input) => {\n const inputStyle = window.getComputedStyle(input);\n for (const prop of propertiesToCopy)\n this.style[prop] = inputStyle[prop];\n this.#requestUpdateLayout();\n });\n }\n /**\n * Update the text content of the clone based on the text content of the input. Triggers a layout update in case the\n * text update caused scrolling.\n */\n #updateText() {\n this.#usingInput((input) => {\n this.textContent = input.value;\n // This is often unecessary on a pure text update, but text updates could potentially cause layout updates like\n // scrolling or resizing. And we run the update on _every frame_ when scrolling, so this isn't that expensive.\n // We don't requestUpdateLayout here because this one should happen synchronously, so that clients can react\n // within their own `input` event handlers.\n this.#updateLayout();\n });\n }\n #onInput = () => this.#updateText();\n #onDocumentScrollOrResize = (event) => {\n this.#usingInput((input) => {\n if (event.target === document ||\n event.target === window ||\n (event.target instanceof Node && event.target.contains(input)))\n this.#requestUpdateLayout();\n });\n };\n}\n// Note that some browsers, such as Firefox, do not concatenate properties\n// into their shorthand (e.g. padding-top, padding-bottom etc. -> padding),\n// so we have to list every single property explicitly.\nconst propertiesToCopy = [\n // RTL / vertical writing modes support:\n \"direction\",\n \"writingMode\",\n \"unicodeBidi\",\n \"textOrientation\",\n \"boxSizing\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"borderStyle\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n \"fontStyle\",\n \"fontVariant\",\n \"fontWeight\",\n \"fontStretch\",\n \"fontSize\",\n \"fontSizeAdjust\",\n \"lineHeight\",\n \"fontFamily\",\n \"textAlign\",\n \"textTransform\",\n \"textIndent\",\n \"textDecoration\",\n \"letterSpacing\",\n \"wordSpacing\",\n \"tabSize\",\n \"MozTabSize\",\n];\n// Inspired by https://github.com/github/catalyst/blob/dc284dcf4f82329a9cac5c867462a8fa529b6c40/src/register.ts\ntry {\n customElements.define(\"input-style-clone\", InputStyleCloneElement);\n}\ncatch (e) {\n // Throws DOMException with NotSupportedError if already defined\n if (!(e instanceof DOMException && e.name === \"NotSupportedError\"))\n throw e;\n}\n\nclass InputRange {\n #inputElement;\n #startOffset;\n #endOffset;\n /**\n * Construct a new `InputRange`.\n * @param element The target input element that contains the content for the range.\n * @param startOffset The inclusive 0-based start index for the range. Will be adjusted to fit in the input contents.\n * @param endOffset The exclusive 0-based end index for the range. Will be adjusted to fit in the input contents.\n */\n constructor(element, startOffset = 0, endOffset = startOffset) {\n this.#inputElement = element;\n this.#startOffset = startOffset;\n this.#endOffset = endOffset;\n }\n /**\n * Create a new range from the current user selection. If the input is not focused, the range will just be the start\n * of the input (offsets `0` to `0`).\n *\n * This can be used to get the caret coordinates: if the resulting range is `collapsed`, the location of the\n * `getBoundingClientRect` will be the location of the caret caret (note, however, that the width will be `0` in\n * this case).\n */\n static fromSelection(input) {\n const { selectionStart, selectionEnd } = input;\n return new InputRange(input, selectionStart ?? undefined, selectionEnd ?? undefined);\n }\n /** Returns true if the start is equal to the end of this range. */\n get collapsed() {\n return this.startOffset === this.endOffset;\n }\n /** Always returns the containing input element. */\n get commonAncestorContainer() {\n return this.#inputElement;\n }\n /** Always returns the containing input element. */\n get endContainer() {\n return this.#inputElement;\n }\n /** Always returns the containing input element. */\n get startContainer() {\n return this.#inputElement;\n }\n get startOffset() {\n return this.#startOffset;\n }\n get endOffset() {\n return this.#endOffset;\n }\n /** Update the inclusive start offset. Will be adjusted to fit within the content size. */\n setStartOffset(offset) {\n this.#startOffset = this.#clampOffset(offset);\n }\n /** Update the exclusive end offset. Will be adjusted to fit within the content size. */\n setEndOffset(offset) {\n this.#endOffset = this.#clampOffset(offset);\n }\n /**\n * Collapse this range to one side.\n * @param toStart If `true`, will collapse to the start side. Otherwise, will collapse to the end.\n */\n collapse(toStart = false) {\n if (toStart)\n this.setEndOffset(this.startOffset);\n else\n this.setStartOffset(this.endOffset);\n }\n /** Returns a `DocumentFragment` containing a new `Text` node containing the content in the range. */\n cloneContents() {\n return this.#createCloneRange().cloneContents();\n }\n /** Create a copy of this range. */\n cloneRange() {\n return new InputRange(this.#inputElement, this.startOffset, this.endOffset);\n }\n /**\n * Obtain one rect that contains the entire contents of the range. If the range spans multiple lines, this box will\n * contain all pieces of the range but may also contain some space outside the range.\n * @see https://iansan5653.github.io/dom-input-range/demos/playground/\n */\n getBoundingClientRect() {\n return this.#createCloneRange().getBoundingClientRect();\n }\n /**\n * Obtain the rects that contain contents of this range. If the range spans multiple lines, there will be multiple\n * bounding boxes. These boxes can be used, for example, to draw a highlight over the range.\n * @see https://iansan5653.github.io/dom-input-range/demos/playground/\n */\n getClientRects() {\n return this.#createCloneRange().getClientRects();\n }\n /** Get the contents of the range as a string. */\n toString() {\n return this.#createCloneRange().toString();\n }\n /**\n * Get the underlying `InputStyleClone` instance powering these calculations. This can be used to listen for\n * updates to trigger layout recalculation.\n */\n getStyleClone() {\n return this.#styleClone;\n }\n // --- private ---\n get #styleClone() {\n return InputStyleCloneElement.for(this.#inputElement);\n }\n get #cloneElement() {\n return this.#styleClone;\n }\n #clampOffset(offset) {\n return Math.max(0, Math.min(offset, this.#inputElement.value.length));\n }\n #createCloneRange() {\n // It's tempting to create a single Range and reuse it across the lifetime of the class. However, this wouldn't be\n // accurate because the contents of the input can change and the contents of the range would become stale. So we\n // must create a new range every time we need it.\n const range = document.createRange();\n const textNode = this.#cloneElement.childNodes[0];\n if (textNode) {\n range.setStart(textNode, this.startOffset);\n range.setEnd(textNode, this.endOffset);\n }\n return range;\n }\n}\n\nconst states = new WeakMap();\nclass TextExpander {\n constructor(expander, input) {\n this.expander = expander;\n this.input = input;\n this.combobox = null;\n this.menu = null;\n this.match = null;\n this.justPasted = false;\n this.lookBackIndex = 0;\n this.oninput = this.onInput.bind(this);\n this.onpaste = this.onPaste.bind(this);\n this.onkeydown = this.onKeydown.bind(this);\n this.oncommit = this.onCommit.bind(this);\n this.onmousedown = this.onMousedown.bind(this);\n this.onblur = this.onBlur.bind(this);\n this.interactingWithList = false;\n input.addEventListener('paste', this.onpaste);\n input.addEventListener('input', this.oninput);\n input.addEventListener('keydown', this.onkeydown);\n input.addEventListener('blur', this.onblur);\n }\n destroy() {\n this.input.removeEventListener('paste', this.onpaste);\n this.input.removeEventListener('input', this.oninput);\n this.input.removeEventListener('keydown', this.onkeydown);\n this.input.removeEventListener('blur', this.onblur);\n }\n dismissMenu() {\n if (this.deactivate()) {\n this.lookBackIndex = this.input.selectionEnd || this.lookBackIndex;\n }\n }\n activate(match, menu) {\n var _a, _b;\n if (this.input !== document.activeElement && this.input !== ((_b = (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.shadowRoot) === null || _b === void 0 ? void 0 : _b.activeElement)) {\n return;\n }\n this.deactivate();\n this.menu = menu;\n if (!menu.id)\n menu.id = `text-expander-${Math.floor(Math.random() * 100000).toString()}`;\n this.expander.append(menu);\n this.combobox = new Combobox(this.input, menu);\n this.expander.dispatchEvent(new Event('text-expander-activate'));\n this.positionMenu(menu, match.position);\n this.combobox.start();\n menu.addEventListener('combobox-commit', this.oncommit);\n menu.addEventListener('mousedown', this.onmousedown);\n this.combobox.navigate(1);\n }\n positionMenu(menu, position) {\n const caretRect = new InputRange(this.input, position).getBoundingClientRect();\n const targetPosition = { left: caretRect.left, top: caretRect.top + caretRect.height };\n const currentPosition = menu.getBoundingClientRect();\n const delta = {\n left: targetPosition.left - currentPosition.left,\n top: targetPosition.top - currentPosition.top\n };\n if (delta.left !== 0 || delta.top !== 0) {\n const currentStyle = getComputedStyle(menu);\n menu.style.left = currentStyle.left ? `calc(${currentStyle.left} + ${delta.left}px)` : `${delta.left}px`;\n menu.style.top = currentStyle.top ? `calc(${currentStyle.top} + ${delta.top}px)` : `${delta.top}px`;\n }\n }\n deactivate() {\n const menu = this.menu;\n if (!menu || !this.combobox)\n return false;\n this.expander.dispatchEvent(new Event('text-expander-deactivate'));\n this.menu = null;\n menu.removeEventListener('combobox-commit', this.oncommit);\n menu.removeEventListener('mousedown', this.onmousedown);\n this.combobox.destroy();\n this.combobox = null;\n menu.remove();\n return true;\n }\n onCommit({ target }) {\n var _a;\n const item = target;\n if (!(item instanceof HTMLElement))\n return;\n if (!this.combobox)\n return;\n const match = this.match;\n if (!match)\n return;\n const beginning = this.input.value.substring(0, match.position - match.key.length);\n const remaining = this.input.value.substring(match.position + match.text.length);\n const detail = { item, key: match.key, value: null, continue: false };\n const canceled = !this.expander.dispatchEvent(new CustomEvent('text-expander-value', { cancelable: true, detail }));\n if (canceled)\n return;\n if (!detail.value)\n return;\n let suffix = (_a = this.expander.getAttribute('suffix')) !== null && _a !== void 0 ? _a : ' ';\n if (detail.continue) {\n suffix = '';\n }\n const value = `${detail.value}${suffix}`;\n this.input.value = beginning + value + remaining;\n const cursor = beginning.length + value.length;\n this.deactivate();\n this.input.focus({\n preventScroll: true\n });\n this.input.selectionStart = cursor;\n this.input.selectionEnd = cursor;\n if (!detail.continue) {\n this.lookBackIndex = cursor;\n this.match = null;\n }\n this.expander.dispatchEvent(new CustomEvent('text-expander-committed', { cancelable: false, detail: { input: this.input } }));\n }\n onBlur() {\n if (this.interactingWithList) {\n this.interactingWithList = false;\n return;\n }\n this.deactivate();\n }\n onPaste() {\n this.justPasted = true;\n }\n async onInput() {\n if (this.justPasted) {\n this.justPasted = false;\n return;\n }\n const match = this.findMatch();\n if (match) {\n this.match = match;\n const menu = await this.notifyProviders(match);\n if (!this.match)\n return;\n if (menu) {\n this.activate(match, menu);\n }\n else {\n this.deactivate();\n }\n }\n else {\n this.match = null;\n this.deactivate();\n }\n }\n findMatch() {\n const cursor = this.input.selectionEnd || 0;\n const text = this.input.value;\n if (cursor <= this.lookBackIndex) {\n this.lookBackIndex = cursor - 1;\n }\n for (const { key, multiWord } of this.expander.keys) {\n const found = query(text, key, cursor, {\n multiWord,\n lookBackIndex: this.lookBackIndex,\n lastMatchPosition: this.match ? this.match.position : null\n });\n if (found) {\n return { text: found.text, key, position: found.position };\n }\n }\n }\n async notifyProviders(match) {\n const providers = [];\n const provide = (result) => providers.push(result);\n const canceled = !this.expander.dispatchEvent(new CustomEvent('text-expander-change', { cancelable: true, detail: { provide, text: match.text, key: match.key } }));\n if (canceled)\n return;\n const all = await Promise.all(providers);\n const fragments = all.filter(x => x.matched).map(x => x.fragment);\n return fragments[0];\n }\n onMousedown() {\n this.interactingWithList = true;\n }\n onKeydown(event) {\n if (event.key === 'Escape') {\n this.match = null;\n if (this.deactivate()) {\n this.lookBackIndex = this.input.selectionEnd || this.lookBackIndex;\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n }\n }\n}\nclass TextExpanderElement extends HTMLElement {\n get keys() {\n const keysAttr = this.getAttribute('keys');\n const keys = keysAttr ? keysAttr.split(' ') : [];\n const multiWordAttr = this.getAttribute('multiword');\n const multiWord = multiWordAttr ? multiWordAttr.split(' ') : [];\n const globalMultiWord = multiWord.length === 0 && this.hasAttribute('multiword');\n return keys.map(key => ({ key, multiWord: globalMultiWord || multiWord.includes(key) }));\n }\n set keys(value) {\n this.setAttribute('keys', value);\n }\n connectedCallback() {\n const input = this.querySelector('input[type=\"text\"], textarea');\n if (!(input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement))\n return;\n const state = new TextExpander(this, input);\n states.set(this, state);\n }\n disconnectedCallback() {\n const state = states.get(this);\n if (!state)\n return;\n state.destroy();\n states.delete(this);\n }\n dismiss() {\n const state = states.get(this);\n if (!state)\n return;\n state.dismissMenu();\n }\n}\n\nif (!window.customElements.get('text-expander')) {\n window.TextExpanderElement = TextExpanderElement;\n window.customElements.define('text-expander', TextExpanderElement);\n}\n\nexport { TextExpanderElement as default };\n","export default function ansiRegex({onlyFirst = false} = {}) {\n\tconst pattern = [\n\t '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n","import stripAnsi from 'strip-ansi';\n\nconst segmenter = new Intl.Segmenter();\n\nexport default function stringLength(string, {countAnsiEscapeCodes = false} = {}) {\n\tif (string === '') {\n\t\treturn 0;\n\t}\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string === '') {\n\t\treturn 0;\n\t}\n\n\tlet length = 0;\n\n\tfor (const _ of segmenter.segment(string)) { // eslint-disable-line no-unused-vars\n\t\tlength++;\n\t}\n\n\treturn length;\n}\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20version='1.0'%20viewBox='0%200%20641%20223'%3e%3cpath%20fill='%23aaa'%20d='M86%20214c-9-1-17-4-24-8l-6-3-5-5-5-4-4-6-4-6-3-8-2-8v-27l2-9%203-9%204-6%204-6%205-5%205-5%207-3%206-4%207-2%207-2%2012-1h12l7%201%208%202%207%204%207%203%205%205%205%204-10%2010-10%209-4-3-10-5-5-1H88l-5%202-6%203-3%204-4%204-2%205-2%206v6l-1%207%201%207%202%207%203%205%202%204%204%203%204%203%205%202%206%202h9l10-1%205-2%206-3v-16H91v-27h59v54l-1%203-2%203-5%204-4%204-5%203-5%202-8%202-8%202-10%201H92l-6-1zm266-62V91h34v46h44V91h34v121h-34v-46h-44v46h-34v-61zm-182-1V90h34v121h-34v-60zm59-1V90h35l36%201%205%202c3%200%208%202%2010%204l5%202%204%205%205%204%203%207%203%207%201%2013v13l-4%206-3%207-4%204-5%205-5%202-5%203-6%202-5%201-18%201h-18v32h-34v-61zm67-2%203-2%202-4%202-5v-5l-2-4-2-4-3-2-3-3h-30v31h30l3-2zm226%2039v-24l-8-12-18-28a1751%201751%200%200%200-20-31v-2h39l7%2012%2012%2021%206%209%2013-21%2013-21h38v2l-41%2061-7%2010v48h-34v-24zM109%2066l-4-1-5-5-5-4-1-5-3-9v-5l1-5c2-7%203-10%208-15l4-4%207-2%207-2h7l6%201%205%202%205%202%203%204%204%203%202%206%202%205v13l-2%205-2%206-4%204-3%203-5%202-4%202-9%201h-9l-5-2zm22-11%204-2%203-4%202-5V34l-2-4-2-4-3-2-4-3-5-1h-6l-4%202-5%202-2%204-3%205-1%203v4l1%205%202%205%202%202%205%203%204%202h10l4-2zM37%2039V11h33l3%201%203%202%204%203%203%203%201%205%201%204v5l-1%204-3%204-3%205-4%201-3%202-11%201H49v16H37V39zm31%200%203-2%201-2%201-2v-4l-1-3-3-2-2-2H49v18h15l4-1zm107%2025a512%20512%200%200%200-19-53h14l4%2014%206%2019%201%204%201-1%207-19%205-17h9l6%2019%207%2018v-1l2-6%205-17%204-13h14v1l-4%2012-16%2041v2h-5l-5-1-6-15-6-15-1%201-3%207-6%2015-2%208h-11l-1-3zm74-25V11h42v11h-29v2l-1%205v4h29v11h-28v11h2l15%201h13v11h-43V39zm55%200V11h33l5%203%205%202%202%204%202%205v10l-2%203-1%204-5%203-5%203%205%205%208%2010%203%204h-14l-7-9-8-10h-9v19h-12V39zm33-3%202-3v-6l-3-3-2-3h-18v16h1v1h17l2-2zm26%203V11h42v11h-29l-1%206v5h29v11h-28v5l-1%205%201%201v1h30v11h-43V39zm54%200V11h17l18%201%204%202%205%203%202%204%203%204%202%206%201%206v5c-1%206-3%2012-6%2015l-3%204-5%203-5%202-17%201h-16V39zm33%2014%205-5%202-3v-6l-1-6-1-3-1-3-4-3-3-2h-5l-6-1-3%201h-3v34h9l8-1%203-2zm50-14V11h34l5%202%204%202%202%203%202%203v9l-2%202-3%204-1%201%203%203%203%204%201%203%201%204-1%204-1%204-3%203-3%203-5%201-5%201h-31V39zm34%2015%202-1v-6l-2-2-2-2h-20v13h20l2-2zm-3-22%204-2v-6l-2-1-2-2h-19v12h16l4-1zm42%2024V45l-6-9-11-17-5-8h15l4%208%207%2011%202%203%207-11%207-11h14l-11%2016-11%2017v23h-12V56z'/%3e%3c/svg%3e\"","import { i18n } from '@lingui/core';\n\n// https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers\nconst BYTES_UNITS = [\n 'byte',\n 'kilobyte',\n 'megabyte',\n 'gigabyte',\n 'terabyte',\n 'petabyte',\n];\nexport default function prettyBytes(bytes) {\n const unitIndex = Math.min(\n Math.floor(Math.log2(bytes) / 10),\n BYTES_UNITS.length - 1,\n );\n const value = bytes / 1024 ** unitIndex;\n return i18n.number(value, {\n style: 'unit',\n unit: BYTES_UNITS[unitIndex],\n unitDisplay: 'narrow',\n maximumFractionDigits: 0,\n });\n}\n","import './compose.css';\nimport '@github/text-expander-element';\n\nimport { msg, plural, t, Trans } from '@lingui/macro';\nimport { useLingui } from '@lingui/react';\nimport { MenuItem } from '@szhsin/react-menu';\nimport { deepEqual } from 'fast-equals';\nimport Fuse from 'fuse.js';\nimport { forwardRef, memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport stringLength from 'string-length';\n// import { detectAll } from 'tinyld/light';\nimport { uid } from 'uid/single';\nimport { useDebouncedCallback, useThrottledCallback } from 'use-debounce';\nimport { useSnapshot } from 'valtio';\n\nimport poweredByGiphyURL from '../assets/powered-by-giphy.svg';\n\nimport Menu2 from '../components/menu2';\nimport supportedLanguages from '../data/status-supported-languages';\nimport urlRegex from '../data/url-regex';\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport emojifyText from '../utils/emojify-text';\nimport i18nDuration from '../utils/i18n-duration';\nimport isRTL from '../utils/is-rtl';\nimport localeMatch from '../utils/locale-match';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport mem from '../utils/mem';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport prettyBytes from '../utils/pretty-bytes';\nimport { fetchRelationships } from '../utils/relationships';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport store from '../utils/store';\nimport {\n getCurrentAccount,\n getCurrentAccountNS,\n getCurrentInstance,\n getCurrentInstanceConfiguration,\n} from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport useCloseWatcher from '../utils/useCloseWatcher';\nimport useInterval from '../utils/useInterval';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\n\nimport AccountBlock from './account-block';\n// import Avatar from './avatar';\nimport Icon from './icon';\nimport Loader from './loader';\nimport Modal from './modal';\nimport Status from './status';\n\nconst {\n PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL,\n PHANPY_GIPHY_API_KEY: GIPHY_API_KEY,\n} = import.meta.env;\n\nconst supportedLanguagesMap = supportedLanguages.reduce((acc, l) => {\n const [code, common, native] = l;\n acc[code] = {\n common,\n native,\n };\n return acc;\n}, {});\n\n/* NOTES:\n - Max character limit includes BOTH status text and Content Warning text\n*/\n\nconst expiryOptions = {\n 300: i18nDuration(5, 'minute'),\n 1_800: i18nDuration(30, 'minute'),\n 3_600: i18nDuration(1, 'hour'),\n 21_600: i18nDuration(6, 'hour'),\n 86_400: i18nDuration(1, 'day'),\n 259_200: i18nDuration(3, 'day'),\n 604_800: i18nDuration(1, 'week'),\n};\nconst expirySeconds = Object.keys(expiryOptions);\nconst oneDay = 24 * 60 * 60;\n\nconst expiresInFromExpiresAt = (expiresAt) => {\n if (!expiresAt) return oneDay;\n const delta = (new Date(expiresAt).getTime() - Date.now()) / 1000;\n return expirySeconds.find((s) => s >= delta) || oneDay;\n};\n\nconst menu = document.createElement('ul');\nmenu.role = 'listbox';\nmenu.className = 'text-expander-menu';\n\n// Set IntersectionObserver on menu, reposition it because text-expander doesn't handle it\nconst windowMargin = 16;\nconst observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const { left, width } = entry.boundingClientRect;\n const { innerWidth } = window;\n if (left + width > innerWidth) {\n const insetInlineStart = isRTL() ? 'right' : 'left';\n menu.style[insetInlineStart] = innerWidth - width - windowMargin + 'px';\n }\n }\n });\n});\nobserver.observe(menu);\n\nconst DEFAULT_LANG = localeMatch(\n [new Intl.DateTimeFormat().resolvedOptions().locale, ...navigator.languages],\n supportedLanguages.map((l) => l[0]),\n 'en',\n);\n\n// https://github.com/mastodon/mastodon/blob/c4a429ed47e85a6bbf0d470a41cc2f64cf120c19/app/javascript/mastodon/features/compose/util/counter.js\nconst urlRegexObj = new RegExp(urlRegex.source, urlRegex.flags);\nconst usernameRegex = /(^|[^\\/\\w])@(([a-z0-9_]+)@[a-z0-9\\.\\-]+[a-z0-9]+)/gi;\nconst urlPlaceholder = '$2xxxxxxxxxxxxxxxxxxxxxxx';\nfunction countableText(inputText) {\n return inputText\n .replace(urlRegexObj, urlPlaceholder)\n .replace(usernameRegex, '$1@$3');\n}\n\n// https://github.com/mastodon/mastodon/blob/c03bd2a238741a012aa4b98dc4902d6cf948ab63/app/models/account.rb#L69\nconst USERNAME_RE = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i;\nconst MENTION_RE = new RegExp(\n `(^|[^=\\\\/\\\\w])(@${USERNAME_RE.source}(?:@[\\\\p{L}\\\\w.-]+[\\\\w]+)?)`,\n 'uig',\n);\n\n// AI-generated, all other regexes are too complicated\nconst HASHTAG_RE = new RegExp(\n `(^|[^=\\\\/\\\\w])(#[a-z0-9_]+([a-z0-9_.]+[a-z0-9_]+)?)(?![\\\\/\\\\w])`,\n 'ig',\n);\n\n// https://github.com/mastodon/mastodon/blob/23e32a4b3031d1da8b911e0145d61b4dd47c4f96/app/models/custom_emoji.rb#L31\nconst SHORTCODE_RE_FRAGMENT = '[a-zA-Z0-9_]{2,}';\nconst SCAN_RE = new RegExp(\n `(^|[^=\\\\/\\\\w])(:${SHORTCODE_RE_FRAGMENT}:)(?=[^A-Za-z0-9_:]|$)`,\n 'g',\n);\n\nconst segmenter = new Intl.Segmenter();\nfunction escapeHTML(text) {\n return text\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\nfunction highlightText(text, { maxCharacters = Infinity }) {\n // Exceeded characters limit\n const { composerCharacterCount } = states;\n if (composerCharacterCount > maxCharacters) {\n // Highlight exceeded characters\n let withinLimitHTML = '',\n exceedLimitHTML = '';\n const htmlSegments = segmenter.segment(text);\n for (const { segment, index } of htmlSegments) {\n if (index < maxCharacters) {\n withinLimitHTML += segment;\n } else {\n exceedLimitHTML += segment;\n }\n }\n if (exceedLimitHTML) {\n exceedLimitHTML =\n '' +\n escapeHTML(exceedLimitHTML) +\n '';\n }\n return escapeHTML(withinLimitHTML) + exceedLimitHTML;\n }\n\n return escapeHTML(text)\n .replace(urlRegexObj, '$2$3') // URLs\n .replace(MENTION_RE, '$1$2') // Mentions\n .replace(HASHTAG_RE, '$1$2') // Hashtags\n .replace(\n SCAN_RE,\n '$1$2',\n ); // Emoji shortcodes\n}\n\n// const rtf = new Intl.RelativeTimeFormat();\nconst RTF = mem((locale) => new Intl.RelativeTimeFormat(locale || undefined));\nconst LF = mem((locale) => new Intl.ListFormat(locale || undefined));\n\nconst CUSTOM_EMOJIS_COUNT = 100;\n\nfunction Compose({\n onClose,\n replyToStatus,\n editStatus,\n draftStatus,\n standalone,\n hasOpener,\n}) {\n const { i18n } = useLingui();\n const rtf = RTF(i18n.locale);\n const lf = LF(i18n.locale);\n\n console.warn('RENDER COMPOSER');\n const { masto, instance } = api();\n const [uiState, setUIState] = useState('default');\n const UID = useRef(draftStatus?.uid || uid());\n console.log('Compose UID', UID.current);\n\n const currentAccount = getCurrentAccount();\n const currentAccountInfo = currentAccount.info;\n\n const configuration = getCurrentInstanceConfiguration();\n console.log('⚙️ Configuration', configuration);\n\n const {\n statuses: {\n maxCharacters,\n maxMediaAttachments, // Beware: it can be undefined!\n charactersReservedPerUrl,\n } = {},\n mediaAttachments: {\n supportedMimeTypes,\n imageSizeLimit,\n imageMatrixLimit,\n videoSizeLimit,\n videoMatrixLimit,\n videoFrameRateLimit,\n } = {},\n polls: {\n maxOptions,\n maxCharactersPerOption,\n maxExpiration,\n minExpiration,\n } = {},\n } = configuration || {};\n\n const textareaRef = useRef();\n const spoilerTextRef = useRef();\n const [visibility, setVisibility] = useState('public');\n const [sensitive, setSensitive] = useState(false);\n const [language, setLanguage] = useState(\n store.session.get('currentLanguage') || DEFAULT_LANG,\n );\n const prevLanguage = useRef(language);\n const [mediaAttachments, setMediaAttachments] = useState([]);\n const [poll, setPoll] = useState(null);\n\n const prefs = store.account.get('preferences') || {};\n\n const oninputTextarea = () => {\n if (!textareaRef.current) return;\n textareaRef.current.dispatchEvent(new Event('input'));\n };\n const focusTextarea = () => {\n setTimeout(() => {\n if (!textareaRef.current) return;\n // status starts with newline, focus on first position\n if (draftStatus?.status?.startsWith?.('\\n')) {\n textareaRef.current.selectionStart = 0;\n textareaRef.current.selectionEnd = 0;\n }\n console.debug('FOCUS textarea');\n textareaRef.current?.focus();\n }, 300);\n };\n\n useEffect(() => {\n if (replyToStatus) {\n const { spoilerText, visibility, language, sensitive } = replyToStatus;\n if (spoilerText && spoilerTextRef.current) {\n spoilerTextRef.current.value = spoilerText;\n }\n const mentions = new Set([\n replyToStatus.account.acct,\n ...replyToStatus.mentions.map((m) => m.acct),\n ]);\n const allMentions = [...mentions].filter(\n (m) => m !== currentAccountInfo.acct,\n );\n if (allMentions.length > 0) {\n textareaRef.current.value = `${allMentions\n .map((m) => `@${m}`)\n .join(' ')} `;\n oninputTextarea();\n }\n focusTextarea();\n setVisibility(\n visibility === 'public' && prefs['posting:default:visibility']\n ? prefs['posting:default:visibility'].toLowerCase()\n : visibility,\n );\n setLanguage(\n language ||\n prefs['posting:default:language']?.toLowerCase() ||\n DEFAULT_LANG,\n );\n setSensitive(sensitive && !!spoilerText);\n } else if (editStatus) {\n const { visibility, language, sensitive, poll, mediaAttachments } =\n editStatus;\n const composablePoll = !!poll?.options && {\n ...poll,\n options: poll.options.map((o) => o?.title || o),\n expiresIn: poll?.expiresIn || expiresInFromExpiresAt(poll.expiresAt),\n };\n setUIState('loading');\n (async () => {\n try {\n const statusSource = await masto.v1.statuses\n .$select(editStatus.id)\n .source.fetch();\n console.log({ statusSource });\n const { text, spoilerText } = statusSource;\n textareaRef.current.value = text;\n textareaRef.current.dataset.source = text;\n oninputTextarea();\n focusTextarea();\n spoilerTextRef.current.value = spoilerText;\n setVisibility(visibility);\n setLanguage(\n language ||\n prefs['posting:default:language']?.toLowerCase() ||\n DEFAULT_LANG,\n );\n setSensitive(sensitive);\n if (composablePoll) setPoll(composablePoll);\n setMediaAttachments(mediaAttachments);\n setUIState('default');\n } catch (e) {\n console.error(e);\n alert(e?.reason || e);\n setUIState('error');\n }\n })();\n } else {\n focusTextarea();\n console.log('Apply prefs', prefs);\n if (prefs['posting:default:visibility']) {\n setVisibility(prefs['posting:default:visibility'].toLowerCase());\n }\n if (prefs['posting:default:language']) {\n setLanguage(prefs['posting:default:language'].toLowerCase());\n }\n if (prefs['posting:default:sensitive']) {\n setSensitive(!!prefs['posting:default:sensitive']);\n }\n }\n if (draftStatus) {\n const {\n status,\n spoilerText,\n visibility,\n language,\n sensitive,\n poll,\n mediaAttachments,\n } = draftStatus;\n const composablePoll = !!poll?.options && {\n ...poll,\n options: poll.options.map((o) => o?.title || o),\n expiresIn: poll?.expiresIn || expiresInFromExpiresAt(poll.expiresAt),\n };\n textareaRef.current.value = status;\n oninputTextarea();\n focusTextarea();\n if (spoilerText) spoilerTextRef.current.value = spoilerText;\n if (visibility) setVisibility(visibility);\n setLanguage(\n language ||\n prefs['posting:default:language']?.toLowerCase() ||\n DEFAULT_LANG,\n );\n if (sensitive !== null) setSensitive(sensitive);\n if (composablePoll) setPoll(composablePoll);\n if (mediaAttachments) setMediaAttachments(mediaAttachments);\n }\n }, [draftStatus, editStatus, replyToStatus]);\n\n const formRef = useRef();\n\n const beforeUnloadCopy = t`You have unsaved changes. Discard this post?`;\n const canClose = () => {\n const { value, dataset } = textareaRef.current;\n\n // check if loading\n if (uiState === 'loading') {\n console.log('canClose', { uiState });\n return false;\n }\n\n // check for status and media attachments\n const hasValue = (value || '')\n .trim()\n .replace(/^\\p{White_Space}+|\\p{White_Space}+$/gu, '');\n const hasMediaAttachments = mediaAttachments.length > 0;\n if (!hasValue && !hasMediaAttachments) {\n console.log('canClose', { value, mediaAttachments });\n return true;\n }\n\n // check if all media attachments have IDs\n const hasIDMediaAttachments =\n mediaAttachments.length > 0 &&\n mediaAttachments.every((media) => media.id);\n if (hasIDMediaAttachments) {\n console.log('canClose', { hasIDMediaAttachments });\n return true;\n }\n\n // check if status contains only \"@acct\", if replying\n const isSelf = replyToStatus?.account.id === currentAccountInfo.id;\n const hasOnlyAcct =\n replyToStatus && value.trim() === `@${replyToStatus.account.acct}`;\n // TODO: check for mentions, or maybe just generic \"@username\", including multiple mentions like \"@username1@username2\"\n if (!isSelf && hasOnlyAcct) {\n console.log('canClose', { isSelf, hasOnlyAcct });\n return true;\n }\n\n // check if status is same with source\n const sameWithSource = value === dataset?.source;\n if (sameWithSource) {\n console.log('canClose', { sameWithSource });\n return true;\n }\n\n console.log('canClose', {\n value,\n hasMediaAttachments,\n hasIDMediaAttachments,\n poll,\n isSelf,\n hasOnlyAcct,\n sameWithSource,\n uiState,\n });\n\n return false;\n };\n\n const confirmClose = () => {\n if (!canClose()) {\n const yes = confirm(beforeUnloadCopy);\n return yes;\n }\n return true;\n };\n\n useEffect(() => {\n // Show warning if user tries to close window with unsaved changes\n const handleBeforeUnload = (e) => {\n if (!canClose()) {\n e.preventDefault();\n e.returnValue = beforeUnloadCopy;\n }\n };\n window.addEventListener('beforeunload', handleBeforeUnload, {\n capture: true,\n });\n return () =>\n window.removeEventListener('beforeunload', handleBeforeUnload, {\n capture: true,\n });\n }, []);\n\n const getCharCount = () => {\n const { value } = textareaRef.current;\n const { value: spoilerText } = spoilerTextRef.current;\n return stringLength(countableText(value)) + stringLength(spoilerText);\n };\n const updateCharCount = () => {\n const count = getCharCount();\n states.composerCharacterCount = count;\n };\n useEffect(updateCharCount, []);\n\n const supportsCloseWatcher = window.CloseWatcher;\n const escDownRef = useRef(false);\n useHotkeys(\n 'esc',\n () => {\n escDownRef.current = true;\n // This won't be true if this event is already handled and not propagated 🤞\n },\n {\n enabled: !supportsCloseWatcher,\n enableOnFormTags: true,\n },\n );\n useHotkeys(\n 'esc',\n () => {\n if (!standalone && escDownRef.current && confirmClose()) {\n onClose();\n }\n escDownRef.current = false;\n },\n {\n enabled: !supportsCloseWatcher,\n enableOnFormTags: true,\n // Use keyup because Esc keydown will close the confirm dialog on Safari\n keyup: true,\n ignoreEventWhen: (e) => {\n const modals = document.querySelectorAll('#modal-container > *');\n const hasModal = !!modals;\n const hasOnlyComposer =\n modals.length === 1 && modals[0].querySelector('#compose-container');\n return hasModal && !hasOnlyComposer;\n },\n },\n );\n useCloseWatcher(() => {\n if (!standalone && confirmClose()) {\n onClose();\n }\n }, [standalone, confirmClose, onClose]);\n\n const prevBackgroundDraft = useRef({});\n const draftKey = () => {\n const ns = getCurrentAccountNS();\n return `${ns}#${UID.current}`;\n };\n const saveUnsavedDraft = () => {\n // Not enabling this for editing status\n // I don't think this warrant a draft mode for a status that's already posted\n // Maybe it could be a big edit change but it should be rare\n if (editStatus) return;\n if (states.composerState.minimized) return;\n const key = draftKey();\n const backgroundDraft = {\n key,\n replyTo: replyToStatus\n ? {\n /* Smaller payload of replyToStatus. Reasons:\n - No point storing whole thing\n - Could have media attachments\n - Could be deleted/edited later\n */\n id: replyToStatus.id,\n account: {\n id: replyToStatus.account.id,\n username: replyToStatus.account.username,\n acct: replyToStatus.account.acct,\n },\n }\n : null,\n draftStatus: {\n uid: UID.current,\n status: textareaRef.current.value,\n spoilerText: spoilerTextRef.current.value,\n visibility,\n language,\n sensitive,\n poll,\n mediaAttachments,\n },\n };\n if (\n !deepEqual(backgroundDraft, prevBackgroundDraft.current) &&\n !canClose()\n ) {\n console.debug('not equal', backgroundDraft, prevBackgroundDraft.current);\n db.drafts\n .set(key, {\n ...backgroundDraft,\n state: 'unsaved',\n updatedAt: Date.now(),\n })\n .then(() => {\n console.debug('DRAFT saved', key, backgroundDraft);\n })\n .catch((e) => {\n console.error('DRAFT failed', key, e);\n });\n prevBackgroundDraft.current = structuredClone(backgroundDraft);\n }\n };\n useInterval(saveUnsavedDraft, 5000); // background save every 5s\n useEffect(() => {\n saveUnsavedDraft();\n // If unmounted, means user discarded the draft\n // Also means pop-out 🙈, but it's okay because the pop-out will persist the ID and re-create the draft\n return () => {\n db.drafts.del(draftKey());\n };\n }, []);\n\n useEffect(() => {\n const handleItems = (e) => {\n const { items } = e.clipboardData || e.dataTransfer;\n const files = [];\n const unsupportedFiles = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (\n supportedMimeTypes !== undefined &&\n !supportedMimeTypes.includes(file.type)\n ) {\n unsupportedFiles.push(file);\n } else {\n files.push(file);\n }\n }\n }\n if (unsupportedFiles.length > 0) {\n alert(\n plural(unsupportedFiles.length, {\n one: `File ${unsupportedFiles[0].name} is not supported.`,\n other: `Files ${lf.format(\n unsupportedFiles.map((f) => f.name),\n )} are not supported.`,\n }),\n );\n }\n if (files.length > 0 && mediaAttachments.length >= maxMediaAttachments) {\n alert(\n plural(maxMediaAttachments, {\n one: 'You can only attach up to 1 file.',\n other: 'You can only attach up to # files.',\n }),\n );\n return;\n }\n console.log({ files });\n if (files.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n // Auto-cut-off files to avoid exceeding maxMediaAttachments\n let allowedFiles = files;\n if (maxMediaAttachments !== undefined) {\n const max = maxMediaAttachments - mediaAttachments.length;\n allowedFiles = allowedFiles.slice(0, max);\n if (allowedFiles.length <= 0) {\n alert(\n plural(maxMediaAttachments, {\n one: 'You can only attach up to 1 file.',\n other: 'You can only attach up to # files.',\n }),\n );\n return;\n }\n }\n const mediaFiles = allowedFiles.map((file) => ({\n file,\n type: file.type,\n size: file.size,\n url: URL.createObjectURL(file),\n id: null,\n description: null,\n }));\n setMediaAttachments([...mediaAttachments, ...mediaFiles]);\n }\n };\n window.addEventListener('paste', handleItems);\n const handleDragover = (e) => {\n // Prevent default if there's files\n if (e.dataTransfer.items.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n window.addEventListener('dragover', handleDragover);\n window.addEventListener('drop', handleItems);\n return () => {\n window.removeEventListener('paste', handleItems);\n window.removeEventListener('dragover', handleDragover);\n window.removeEventListener('drop', handleItems);\n };\n }, [mediaAttachments]);\n\n const [showMentionPicker, setShowMentionPicker] = useState(false);\n const [showEmoji2Picker, setShowEmoji2Picker] = useState(false);\n const [showGIFPicker, setShowGIFPicker] = useState(false);\n\n const [autoDetectedLanguages, setAutoDetectedLanguages] = useState(null);\n const [topSupportedLanguages, restSupportedLanguages] = useMemo(() => {\n const topLanguages = [];\n const restLanguages = [];\n const { contentTranslationHideLanguages = [] } = states.settings;\n supportedLanguages.forEach((l) => {\n const [code] = l;\n if (\n code === language ||\n code === prevLanguage.current ||\n code === DEFAULT_LANG ||\n contentTranslationHideLanguages.includes(code) ||\n (autoDetectedLanguages?.length && autoDetectedLanguages.includes(code))\n ) {\n topLanguages.push(l);\n } else {\n restLanguages.push(l);\n }\n });\n topLanguages.sort(([codeA, commonA], [codeB, commonB]) => {\n if (codeA === language) return -1;\n if (codeB === language) return 1;\n return commonA.localeCompare(commonB);\n });\n restLanguages.sort(([codeA, commonA], [codeB, commonB]) =>\n commonA.localeCompare(commonB),\n );\n return [topLanguages, restLanguages];\n }, [language, autoDetectedLanguages]);\n\n const replyToStatusMonthsAgo = useMemo(\n () =>\n !!replyToStatus?.createdAt &&\n Math.floor(\n (Date.now() - new Date(replyToStatus.createdAt)) /\n (1000 * 60 * 60 * 24 * 30),\n ),\n [replyToStatus],\n );\n\n const onMinimize = () => {\n saveUnsavedDraft();\n states.composerState.minimized = true;\n };\n\n return (\n
    \n
    \n
    \n {currentAccountInfo?.avatarStatic && (\n // \n \n )}\n {!standalone ? (\n \n {\n // If there are non-ID media attachments (not yet uploaded), show confirmation dialog because they are not going to be passed to the new window\n // const containNonIDMediaAttachments =\n // mediaAttachments.length > 0 &&\n // mediaAttachments.some((media) => !media.id);\n // if (containNonIDMediaAttachments) {\n // const yes = confirm(\n // 'You have media attachments that are not yet uploaded. Opening a new window will discard them and you will need to re-attach them. Are you sure you want to continue?',\n // );\n // if (!yes) {\n // return;\n // }\n // }\n\n // const mediaAttachmentsWithIDs = mediaAttachments.filter(\n // (media) => media.id,\n // );\n\n const newWin = openCompose({\n editStatus,\n replyToStatus,\n draftStatus: {\n uid: UID.current,\n status: textareaRef.current.value,\n spoilerText: spoilerTextRef.current.value,\n visibility,\n language,\n sensitive,\n poll,\n mediaAttachments,\n },\n });\n\n if (!newWin) {\n return;\n }\n\n onClose();\n }}\n >\n \n \n \n \n {' '}\n {\n if (confirmClose()) {\n onClose();\n }\n }}\n >\n \n \n \n ) : (\n hasOpener && (\n {\n // If there are non-ID media attachments (not yet uploaded), show confirmation dialog because they are not going to be passed to the new window\n // const containNonIDMediaAttachments =\n // mediaAttachments.length > 0 &&\n // mediaAttachments.some((media) => !media.id);\n // if (containNonIDMediaAttachments) {\n // const yes = confirm(\n // 'You have media attachments that are not yet uploaded. Opening a new window will discard them and you will need to re-attach them. Are you sure you want to continue?',\n // );\n // if (!yes) {\n // return;\n // }\n // }\n\n if (!window.opener) {\n alert(t`Looks like you closed the parent window.`);\n return;\n }\n\n if (window.opener.__STATES__.showCompose) {\n if (window.opener.__STATES__.composerState?.publishing) {\n alert(\n t`Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later.`,\n );\n return;\n }\n\n let confirmText = t`Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?`;\n const yes = confirm(confirmText);\n if (!yes) return;\n }\n\n // const mediaAttachmentsWithIDs = mediaAttachments.filter(\n // (media) => media.id,\n // );\n\n onClose({\n fn: () => {\n const passData = {\n editStatus,\n replyToStatus,\n draftStatus: {\n uid: UID.current,\n status: textareaRef.current.value,\n spoilerText: spoilerTextRef.current.value,\n visibility,\n language,\n sensitive,\n poll,\n mediaAttachments,\n },\n };\n window.opener.__COMPOSE__ = passData; // Pass it here instead of `showCompose` due to some weird proxy issue again\n if (window.opener.__STATES__.showCompose) {\n window.opener.__STATES__.showCompose = false;\n setTimeout(() => {\n window.opener.__STATES__.showCompose = true;\n }, 10);\n } else {\n window.opener.__STATES__.showCompose = true;\n }\n if (window.opener.__STATES__.composerState.minimized) {\n // Maximize it\n window.opener.__STATES__.composerState.minimized = false;\n }\n },\n });\n }}\n >\n \n \n )\n )}\n
    \n {!!replyToStatus && (\n
    \n \n
    \n {replyToStatusMonthsAgo > 0 ? (\n \n Replying to @\n {replyToStatus.account.acct || replyToStatus.account.username}\n ’s post (\n \n {rtf.format(-replyToStatusMonthsAgo, 'month')}\n \n )\n \n ) : (\n \n Replying to @\n {replyToStatus.account.acct || replyToStatus.account.username}\n ’s post\n \n )}\n
    \n
    \n )}\n {!!editStatus && (\n
    \n \n
    \n Editing source post\n
    \n
    \n )}\n {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n formRef.current.dispatchEvent(\n new Event('submit', { cancelable: true }),\n );\n }\n }}\n onSubmit={(e) => {\n e.preventDefault();\n\n const formData = new FormData(e.target);\n const entries = Object.fromEntries(formData.entries());\n console.log('ENTRIES', entries);\n let { status, visibility, sensitive, spoilerText } = entries;\n\n // Pre-cleanup\n sensitive = sensitive === 'on'; // checkboxes return \"on\" if checked\n\n // Validation\n /* Let the backend validate this\n if (stringLength(status) > maxCharacters) {\n alert(`Status is too long! Max characters: ${maxCharacters}`);\n return;\n }\n if (\n sensitive &&\n stringLength(status) + stringLength(spoilerText) > maxCharacters\n ) {\n alert(\n `Status and content warning is too long! Max characters: ${maxCharacters}`,\n );\n return;\n }\n */\n if (poll) {\n if (poll.options.length < 2) {\n alert(t`Poll must have at least 2 options`);\n return;\n }\n if (poll.options.some((option) => option === '')) {\n alert(t`Some poll choices are empty`);\n return;\n }\n }\n // TODO: check for URLs and use `charactersReservedPerUrl` to calculate max characters\n\n if (mediaAttachments.length > 0) {\n // If there are media attachments, check if they have no descriptions\n const hasNoDescriptions = mediaAttachments.some(\n (media) => !media.description?.trim?.(),\n );\n if (hasNoDescriptions) {\n const yes = confirm(\n t`Some media have no descriptions. Continue?`,\n );\n if (!yes) return;\n }\n }\n\n // Post-cleanup\n spoilerText = (sensitive && spoilerText) || undefined;\n status = status === '' ? undefined : status;\n\n // states.composerState.minimized = true;\n states.composerState.publishing = true;\n setUIState('loading');\n (async () => {\n try {\n console.log('MEDIA ATTACHMENTS', mediaAttachments);\n if (mediaAttachments.length > 0) {\n // Upload media attachments first\n const mediaPromises = mediaAttachments.map((attachment) => {\n const { file, description, id } = attachment;\n console.log('UPLOADING', attachment);\n if (id) {\n // If already uploaded\n return attachment;\n } else {\n const params = removeNullUndefined({\n file,\n description,\n });\n return masto.v2.media.create(params).then((res) => {\n if (res.id) {\n attachment.id = res.id;\n }\n return res;\n });\n }\n });\n const results = await Promise.allSettled(mediaPromises);\n\n // If any failed, return\n if (\n results.some((result) => {\n return result.status === 'rejected' || !result.value?.id;\n })\n ) {\n states.composerState.publishing = false;\n states.composerState.publishingError = true;\n setUIState('error');\n // Alert all the reasons\n results.forEach((result) => {\n if (result.status === 'rejected') {\n console.error(result);\n alert(result.reason || t`Attachment #${i} failed`);\n }\n });\n return;\n }\n\n console.log({ results, mediaAttachments });\n }\n\n /* NOTE:\n Using snakecase here because masto.js's `isObject` returns false for `params`, ONLY happens when opening in pop-out window. This is maybe due to `window.masto` variable being passed from the parent window. The check that failed is `x.constructor === Object`, so maybe the `Object` in new window is different than parent window's?\n Code: https://github.com/neet/masto.js/blob/dd0d649067b6a2b6e60fbb0a96597c373a255b00/src/serializers/is-object.ts#L2\n\n // TODO: Note above is no longer true in Masto.js v6. Revisit this.\n */\n let params = {\n status,\n // spoilerText,\n spoiler_text: spoilerText,\n language,\n sensitive,\n poll,\n // mediaIds: mediaAttachments.map((attachment) => attachment.id),\n media_ids: mediaAttachments.map(\n (attachment) => attachment.id,\n ),\n };\n if (editStatus && supports('@mastodon/edit-media-attributes')) {\n params.media_attributes = mediaAttachments.map(\n (attachment) => {\n return {\n id: attachment.id,\n description: attachment.description,\n // focus\n // thumbnail\n };\n },\n );\n } else if (!editStatus) {\n params.visibility = visibility;\n // params.inReplyToId = replyToStatus?.id || undefined;\n params.in_reply_to_id = replyToStatus?.id || undefined;\n }\n params = removeNullUndefined(params);\n console.log('POST', params);\n\n let newStatus;\n if (editStatus) {\n newStatus = await masto.v1.statuses\n .$select(editStatus.id)\n .update(params);\n saveStatus(newStatus, instance, {\n skipThreading: true,\n });\n } else {\n try {\n newStatus = await masto.v1.statuses.create(params, {\n requestInit: {\n headers: {\n 'Idempotency-Key': UID.current,\n },\n },\n });\n } catch (_) {\n // If idempotency key fails, try again without it\n newStatus = await masto.v1.statuses.create(params);\n }\n }\n states.composerState.minimized = false;\n states.composerState.publishing = false;\n setUIState('default');\n\n // Close\n onClose({\n // type: post, reply, edit\n type: editStatus ? 'edit' : replyToStatus ? 'reply' : 'post',\n newStatus,\n instance,\n });\n } catch (e) {\n states.composerState.publishing = false;\n states.composerState.publishingError = true;\n console.error(e);\n alert(e?.reason || e);\n setUIState('error');\n }\n })();\n }}\n >\n
    \n {\n updateCharCount();\n }}\n />\n \n {\n const sensitive = e.target.checked;\n setSensitive(sensitive);\n if (sensitive) {\n spoilerTextRef.current?.focus();\n } else {\n textareaRef.current?.focus();\n }\n }}\n />\n \n {' '}\n \n \n {\n setVisibility(e.target.value);\n }}\n disabled={uiState === 'loading' || !!editStatus}\n dir=\"auto\"\n >\n \n {(supports('@pleroma/local-visibility-post') ||\n supports('@akkoma/local-visibility-post')) && (\n \n )}\n \n \n \n \n {' '}\n
    \n {\n updateCharCount();\n }}\n maxCharacters={maxCharacters}\n performSearch={(params) => {\n const { type, q, limit } = params;\n if (type === 'accounts') {\n return masto.v1.accounts.search.list({\n q,\n limit,\n resolve: false,\n });\n }\n return masto.v2.search.fetch(params);\n }}\n onTrigger={(action) => {\n if (action?.name === 'custom-emojis') {\n setShowEmoji2Picker({\n defaultSearchTerm: action?.defaultSearchTerm || null,\n });\n } else if (action?.name === 'mention') {\n setShowMentionPicker({\n defaultSearchTerm: action?.defaultSearchTerm || null,\n });\n } else if (\n action?.name === 'auto-detect-language' &&\n action?.languages\n ) {\n setAutoDetectedLanguages(action.languages);\n }\n }}\n />\n {mediaAttachments?.length > 0 && (\n
    \n {mediaAttachments.map((attachment, i) => {\n const { id, file } = attachment;\n const fileID = file?.size + file?.type + file?.name;\n return (\n {\n setMediaAttachments((attachments) => {\n const newAttachments = [...attachments];\n newAttachments[i] = {\n ...newAttachments[i],\n description: value,\n };\n return newAttachments;\n });\n }}\n onRemove={() => {\n setMediaAttachments((attachments) => {\n return attachments.filter((_, j) => j !== i);\n });\n }}\n />\n );\n })}\n \n
    \n )}\n {!!poll && (\n {\n if (poll) {\n const newPoll = { ...poll };\n setPoll(newPoll);\n } else {\n setPoll(null);\n }\n }}\n />\n )}\n \n \n \n {/* If maxOptions is not defined or defined and is greater than 1, show poll button */}\n {maxOptions == null ||\n (maxOptions > 1 && (\n <>\n {\n setPoll({\n options: ['', ''],\n expiresIn: 24 * 60 * 60, // 1 day\n multiple: false,\n });\n }}\n >\n \n \n \n ))}\n {/* {\n setShowMentionPicker(true);\n }}\n >\n \n */}\n {\n setShowEmoji2Picker(true);\n }}\n >\n \n \n {!!states.settings.composerGIFPicker && (\n = maxMediaAttachments) ||\n !!poll\n }\n onClick={() => {\n setShowGIFPicker(true);\n }}\n >\n GIF\n \n )}\n \n
    \n {uiState === 'loading' ? (\n \n ) : (\n
    \n \n
    \n {showMentionPicker && (\n {\n if (e.target === e.currentTarget) {\n setShowMentionPicker(false);\n }\n }}\n >\n {\n setShowMentionPicker(false);\n }}\n defaultSearchTerm={showMentionPicker?.defaultSearchTerm}\n onSelect={(socialAddress) => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n const { selectionStart, selectionEnd } = textarea;\n const text = textarea.value;\n const textBeforeMention = text.slice(0, selectionStart);\n const spaceBeforeMention = textBeforeMention\n ? /[\\s\\t\\n\\r]$/.test(textBeforeMention)\n ? ''\n : ' '\n : '';\n const textAfterMention = text.slice(selectionEnd);\n const spaceAfterMention = /^[\\s\\t\\n\\r]/.test(textAfterMention)\n ? ''\n : ' ';\n const newText =\n textBeforeMention +\n spaceBeforeMention +\n '@' +\n socialAddress +\n spaceAfterMention +\n textAfterMention;\n textarea.value = newText;\n textarea.selectionStart = textarea.selectionEnd =\n selectionEnd +\n 1 +\n socialAddress.length +\n spaceAfterMention.length;\n textarea.focus();\n textarea.dispatchEvent(new Event('input'));\n }}\n />\n \n )}\n {showEmoji2Picker && (\n {\n if (e.target === e.currentTarget) {\n setShowEmoji2Picker(false);\n }\n }}\n >\n {\n setShowEmoji2Picker(false);\n }}\n defaultSearchTerm={showEmoji2Picker?.defaultSearchTerm}\n onSelect={(emojiShortcode) => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n const { selectionStart, selectionEnd } = textarea;\n const text = textarea.value;\n const textBeforeEmoji = text.slice(0, selectionStart);\n const spaceBeforeEmoji = textBeforeEmoji\n ? /[\\s\\t\\n\\r]$/.test(textBeforeEmoji)\n ? ''\n : ' '\n : '';\n const textAfterEmoji = text.slice(selectionEnd);\n const spaceAfterEmoji = /^[\\s\\t\\n\\r]/.test(textAfterEmoji)\n ? ''\n : ' ';\n const newText =\n textBeforeEmoji +\n spaceBeforeEmoji +\n emojiShortcode +\n spaceAfterEmoji +\n textAfterEmoji;\n textarea.value = newText;\n textarea.selectionStart = textarea.selectionEnd =\n selectionEnd + emojiShortcode.length + spaceAfterEmoji.length;\n textarea.focus();\n textarea.dispatchEvent(new Event('input'));\n }}\n />\n \n )}\n {showGIFPicker && (\n {\n if (e.target === e.currentTarget) {\n setShowGIFPicker(false);\n }\n }}\n >\n setShowGIFPicker(false)}\n onSelect={({ url, type, alt_text }) => {\n console.log('GIF URL', url);\n if (mediaAttachments.length >= maxMediaAttachments) {\n alert(\n plural(maxMediaAttachments, {\n one: 'You can only attach up to 1 file.',\n other: 'You can only attach up to # files.',\n }),\n );\n return;\n }\n // Download the GIF and insert it as media attachment\n (async () => {\n let theToast;\n try {\n theToast = showToast({\n text: t`Downloading GIF…`,\n duration: -1,\n });\n const blob = await fetch(url, {\n referrerPolicy: 'no-referrer',\n }).then((res) => res.blob());\n const file = new File(\n [blob],\n type === 'video/mp4' ? 'video.mp4' : 'image.gif',\n {\n type,\n },\n );\n const newMediaAttachments = [\n ...mediaAttachments,\n {\n file,\n type,\n size: file.size,\n id: null,\n description: alt_text || '',\n },\n ];\n setMediaAttachments(newMediaAttachments);\n theToast?.hideToast?.();\n } catch (err) {\n console.error(err);\n theToast?.hideToast?.();\n showToast(t`Failed to download GIF`);\n }\n })();\n }}\n />\n \n )}\n
    \n );\n}\n\nfunction autoResizeTextarea(textarea) {\n if (!textarea) return;\n const { value, offsetHeight, scrollHeight, clientHeight } = textarea;\n if (offsetHeight < window.innerHeight) {\n // NOTE: This check is needed because the offsetHeight return 50000 (really large number) on first render\n // No idea why it does that, will re-investigate in far future\n const offset = offsetHeight - clientHeight;\n const height = value ? scrollHeight + offset + 'px' : null;\n textarea.style.height = height;\n }\n}\n\nasync function _getCustomEmojis(instance, masto) {\n const emojis = await masto.v1.customEmojis.list();\n const visibleEmojis = emojis.filter((e) => e.visibleInPicker);\n const searcher = new Fuse(visibleEmojis, {\n keys: ['shortcode'],\n findAllMatches: true,\n });\n return [visibleEmojis, searcher];\n}\nconst getCustomEmojis = pmem(_getCustomEmojis, {\n // Limit by time to reduce memory usage\n // Cached by instance\n matchesArg: (cacheKeyArg, keyArg) => cacheKeyArg.instance === keyArg.instance,\n maxAge: 30 * 60 * 1000, // 30 minutes\n});\n\nconst detectLangs = async (text) => {\n const { detectAll } = await import('tinyld/light');\n const langs = detectAll(text);\n if (langs?.length) {\n // return max 2\n return langs.slice(0, 2).map((lang) => lang.lang);\n }\n return null;\n};\n\nconst Textarea = forwardRef((props, ref) => {\n const { masto, instance } = api();\n const [text, setText] = useState(ref.current?.value || '');\n const {\n maxCharacters,\n performSearch = () => {},\n onTrigger = () => {},\n ...textareaProps\n } = props;\n // const snapStates = useSnapshot(states);\n // const charCount = snapStates.composerCharacterCount;\n\n // const customEmojis = useRef();\n const searcherRef = useRef();\n useEffect(() => {\n getCustomEmojis(instance, masto)\n .then((r) => {\n const [emojis, searcher] = r;\n searcherRef.current = searcher;\n })\n .catch((e) => {\n console.error(e);\n });\n }, []);\n\n const textExpanderRef = useRef();\n const textExpanderTextRef = useRef('');\n useEffect(() => {\n let handleChange, handleValue, handleCommited;\n if (textExpanderRef.current) {\n handleChange = (e) => {\n // console.log('text-expander-change', e);\n const { key, provide, text } = e.detail;\n textExpanderTextRef.current = text;\n\n if (text === '') {\n provide(\n Promise.resolve({\n matched: false,\n }),\n );\n return;\n }\n\n if (key === ':') {\n // const emojis = customEmojis.current.filter((emoji) =>\n // emoji.shortcode.startsWith(text),\n // );\n // const emojis = filterShortcodes(customEmojis.current, text);\n const results = searcherRef.current?.search(text, {\n limit: 5,\n });\n let html = '';\n results.forEach(({ item: emoji }) => {\n const { shortcode, url } = emoji;\n html += `\n
  • \n \"\" \n ${encodeHTML(shortcode)}\n
  • `;\n });\n html += `
  • ${t`More…`}
  • `;\n // console.log({ emojis, html });\n menu.innerHTML = html;\n provide(\n Promise.resolve({\n matched: results.length > 0,\n fragment: menu,\n }),\n );\n return;\n }\n\n const type = {\n '@': 'accounts',\n '#': 'hashtags',\n }[key];\n provide(\n new Promise((resolve) => {\n const searchResults = performSearch({\n type,\n q: text,\n limit: 5,\n });\n searchResults.then((value) => {\n if (text !== textExpanderTextRef.current) {\n return;\n }\n console.log({ value, type, v: value[type] });\n const results = value[type] || value;\n console.log('RESULTS', value, results);\n let html = '';\n results.forEach((result) => {\n const {\n name,\n avatarStatic,\n displayName,\n username,\n acct,\n emojis,\n history,\n } = result;\n const displayNameWithEmoji = emojifyText(displayName, emojis);\n // const item = menuItem.cloneNode();\n if (acct) {\n html += `\n
  • \n \n \"\"\n \n \n ${displayNameWithEmoji || username}\n
    @${encodeHTML(\n acct,\n )}\n
    \n
  • \n `;\n } else {\n const total = history?.reduce?.(\n (acc, cur) => acc + +cur.uses,\n 0,\n );\n html += `\n
  • \n #${encodeHTML(name)}\n ${\n total\n ? `${shortenNumber(total)}`\n : ''\n }\n
  • \n `;\n }\n });\n if (type === 'accounts') {\n html += `
  • ${t`More…`}
  • `;\n }\n menu.innerHTML = html;\n console.log('MENU', results, menu);\n resolve({\n matched: results.length > 0,\n fragment: menu,\n });\n });\n }),\n );\n };\n\n textExpanderRef.current.addEventListener(\n 'text-expander-change',\n handleChange,\n );\n\n handleValue = (e) => {\n const { key, item } = e.detail;\n const { value, more } = item.dataset;\n if (key === ':') {\n e.detail.value = value ? `:${value}:` : '​'; // zero-width space\n if (more) {\n // Prevent adding space after the above value\n e.detail.continue = true;\n\n setTimeout(() => {\n onTrigger?.({\n name: 'custom-emojis',\n defaultSearchTerm: more,\n });\n }, 300);\n }\n } else if (key === '@') {\n e.detail.value = value ? `@${value} ` : '​'; // zero-width space\n if (more) {\n e.detail.continue = true;\n setTimeout(() => {\n onTrigger?.({\n name: 'mention',\n defaultSearchTerm: more,\n });\n }, 300);\n }\n } else {\n e.detail.value = `${key}${value}`;\n }\n };\n\n textExpanderRef.current.addEventListener(\n 'text-expander-value',\n handleValue,\n );\n\n handleCommited = (e) => {\n const { input } = e.detail;\n setText(input.value);\n // fire input event\n if (ref.current) {\n const event = new Event('input', { bubbles: true });\n ref.current.dispatchEvent(event);\n }\n };\n\n textExpanderRef.current.addEventListener(\n 'text-expander-committed',\n handleCommited,\n );\n }\n\n return () => {\n if (textExpanderRef.current) {\n textExpanderRef.current.removeEventListener(\n 'text-expander-change',\n handleChange,\n );\n textExpanderRef.current.removeEventListener(\n 'text-expander-value',\n handleValue,\n );\n textExpanderRef.current.removeEventListener(\n 'text-expander-committed',\n handleCommited,\n );\n }\n };\n }, []);\n\n useEffect(() => {\n // Resize observer for textarea\n const textarea = ref.current;\n if (!textarea) return;\n const resizeObserver = new ResizeObserver(() => {\n // Get height of textarea, set height to textExpander\n if (textExpanderRef.current) {\n const { height } = textarea.getBoundingClientRect();\n textExpanderRef.current.style.height = height + 'px';\n }\n });\n resizeObserver.observe(textarea);\n }, []);\n\n const slowHighlightPerf = useRef(0); // increment if slow\n const composeHighlightRef = useRef();\n const throttleHighlightText = useThrottledCallback((text) => {\n if (!composeHighlightRef.current) return;\n if (slowHighlightPerf.current > 3) {\n // After 3 times of lag, disable highlighting\n composeHighlightRef.current.innerHTML = '';\n composeHighlightRef.current = null; // Destroy the whole thing\n throttleHighlightText?.cancel?.();\n return;\n }\n let start;\n let end;\n if (slowHighlightPerf.current <= 3) start = Date.now();\n composeHighlightRef.current.innerHTML =\n highlightText(text, {\n maxCharacters,\n }) + '\\n';\n if (slowHighlightPerf.current <= 3) end = Date.now();\n console.debug('HIGHLIGHT PERF', { start, end, diff: end - start });\n if (start && end && end - start > 50) {\n // if slow, increment\n slowHighlightPerf.current++;\n }\n // Newline to prevent multiple line breaks at the end from being collapsed, no idea why\n }, 500);\n\n const debouncedAutoDetectLanguage = useDebouncedCallback(() => {\n // Make use of the highlightRef to get the DOM\n // Clone the dom\n const dom = composeHighlightRef.current?.cloneNode(true);\n if (!dom) return;\n // Remove mark\n dom.querySelectorAll('mark').forEach((mark) => {\n mark.remove();\n });\n const text = dom.innerText?.trim();\n if (!text) return;\n (async () => {\n const langs = await detectLangs(text);\n if (langs?.length) {\n onTrigger?.({\n name: 'auto-detect-language',\n languages: langs,\n });\n }\n })();\n }, 2000);\n\n return (\n \n {\n // Get line before cursor position after pressing 'Enter'\n const { key, target } = e;\n if (key === 'Enter' && !(e.ctrlKey || e.metaKey)) {\n try {\n const { value, selectionStart } = target;\n const textBeforeCursor = value.slice(0, selectionStart);\n const lastLine = textBeforeCursor.split('\\n').slice(-1)[0];\n if (lastLine) {\n // If line starts with \"- \" or \"12. \"\n if (/^\\s*(-|\\d+\\.)\\s/.test(lastLine)) {\n // insert \"- \" at cursor position\n const [_, preSpaces, bullet, postSpaces, anything] =\n lastLine.match(/^(\\s*)(-|\\d+\\.)(\\s+)(.+)?/) || [];\n if (anything) {\n e.preventDefault();\n const [number] = bullet.match(/\\d+/) || [];\n const newBullet = number ? `${+number + 1}.` : '-';\n const text = `\\n${preSpaces}${newBullet}${postSpaces}`;\n target.setRangeText(text, selectionStart, selectionStart);\n const pos = selectionStart + text.length;\n target.setSelectionRange(pos, pos);\n } else {\n // trim the line before the cursor, then insert new line\n const pos = selectionStart - lastLine.length;\n target.setRangeText('', pos, selectionStart);\n }\n autoResizeTextarea(target);\n target.dispatchEvent(new Event('input'));\n }\n }\n } catch (e) {\n // silent fail\n console.error(e);\n }\n }\n if (composeHighlightRef.current) {\n composeHighlightRef.current.scrollTop = target.scrollTop;\n }\n }}\n onInput={(e) => {\n const { target } = e;\n // Replace zero-width space\n const text = target.value.replace(/\\u200b/g, '');\n setText(text);\n autoResizeTextarea(target);\n props.onInput?.(e);\n throttleHighlightText(text);\n debouncedAutoDetectLanguage();\n }}\n style={{\n width: '100%',\n height: '4em',\n // '--text-weight': (1 + charCount / 140).toFixed(1) || 1,\n }}\n onScroll={(e) => {\n if (composeHighlightRef.current) {\n const { scrollTop } = e.target;\n composeHighlightRef.current.scrollTop = scrollTop;\n }\n }}\n />\n \n \n );\n});\n\nfunction CharCountMeter({ maxCharacters = 500, hidden }) {\n const snapStates = useSnapshot(states);\n const charCount = snapStates.composerCharacterCount;\n const leftChars = maxCharacters - charCount;\n if (hidden) {\n return \n );\n}\n\nfunction scaleDimension(matrix, matrixLimit, width, height) {\n // matrix = number of pixels\n // matrixLimit = max number of pixels\n // Calculate new width and height, downsize to within the limit, preserve aspect ratio, no decimals\n const scalingFactor = Math.sqrt(matrixLimit / matrix);\n const newWidth = Math.floor(width * scalingFactor);\n const newHeight = Math.floor(height * scalingFactor);\n return { newWidth, newHeight };\n}\n\nfunction MediaAttachment({\n attachment,\n disabled,\n lang,\n onDescriptionChange = () => {},\n onRemove = () => {},\n}) {\n const { i18n } = useLingui();\n const [uiState, setUIState] = useState('default');\n const supportsEdit = supports('@mastodon/edit-media-attributes');\n const { type, id, file } = attachment;\n const url = useMemo(\n () => (file ? URL.createObjectURL(file) : attachment.url),\n [file, attachment.url],\n );\n console.log({ attachment });\n\n const checkMaxError = !!file?.size;\n const configuration = checkMaxError ? getCurrentInstanceConfiguration() : {};\n const {\n mediaAttachments: {\n imageSizeLimit,\n imageMatrixLimit,\n videoSizeLimit,\n videoMatrixLimit,\n videoFrameRateLimit,\n } = {},\n } = configuration || {};\n\n const [maxError, setMaxError] = useState(() => {\n if (!checkMaxError) return null;\n if (\n type.startsWith('image') &&\n imageSizeLimit &&\n file.size > imageSizeLimit\n ) {\n return {\n type: 'imageSizeLimit',\n details: {\n imageSize: file.size,\n imageSizeLimit,\n },\n };\n } else if (\n type.startsWith('video') &&\n videoSizeLimit &&\n file.size > videoSizeLimit\n ) {\n return {\n type: 'videoSizeLimit',\n details: {\n videoSize: file.size,\n videoSizeLimit,\n },\n };\n }\n return null;\n });\n\n const [imageMatrix, setImageMatrix] = useState({});\n useEffect(() => {\n if (!checkMaxError || !imageMatrixLimit) return;\n if (imageMatrix?.matrix > imageMatrixLimit) {\n setMaxError({\n type: 'imageMatrixLimit',\n details: {\n imageMatrix: imageMatrix?.matrix,\n imageMatrixLimit,\n width: imageMatrix?.width,\n height: imageMatrix?.height,\n },\n });\n }\n }, [imageMatrix, imageMatrixLimit, checkMaxError]);\n\n const [videoMatrix, setVideoMatrix] = useState({});\n useEffect(() => {\n if (!checkMaxError || !videoMatrixLimit) return;\n if (videoMatrix?.matrix > videoMatrixLimit) {\n setMaxError({\n type: 'videoMatrixLimit',\n details: {\n videoMatrix: videoMatrix?.matrix,\n videoMatrixLimit,\n width: videoMatrix?.width,\n height: videoMatrix?.height,\n },\n });\n }\n }, [videoMatrix, videoMatrixLimit, checkMaxError]);\n\n const [description, setDescription] = useState(attachment.description);\n const [suffixType, subtype] = type.split('/');\n const debouncedOnDescriptionChange = useDebouncedCallback(\n onDescriptionChange,\n 250,\n );\n useEffect(() => {\n debouncedOnDescriptionChange(description);\n }, [description, debouncedOnDescriptionChange]);\n\n const [showModal, setShowModal] = useState(false);\n const textareaRef = useRef(null);\n useEffect(() => {\n let timer;\n if (showModal && textareaRef.current) {\n timer = setTimeout(() => {\n textareaRef.current.focus();\n }, 100);\n }\n return () => {\n clearTimeout(timer);\n };\n }, [showModal]);\n\n const descTextarea = (\n <>\n {!!id && !supportsEdit ? (\n
    \n \n Uploaded\n \n

    \n {attachment.description || No description}\n

    \n
    \n ) : (\n {\n const { value } = e.target;\n setDescription(value);\n // debouncedOnDescriptionChange(value);\n }}\n >\n )}\n \n );\n\n const toastRef = useRef(null);\n useEffect(() => {\n return () => {\n toastRef.current?.hideToast?.();\n };\n }, []);\n\n const maxErrorToast = useRef(null);\n\n const maxErrorText = (err) => {\n const { type, details } = err;\n switch (type) {\n case 'imageSizeLimit': {\n const { imageSize, imageSizeLimit } = details;\n return t`File size too large. Uploading might encounter issues. Try reduce the file size from ${prettyBytes(\n imageSize,\n )} to ${prettyBytes(imageSizeLimit)} or lower.`;\n }\n case 'imageMatrixLimit': {\n const { imageMatrix, imageMatrixLimit, width, height } = details;\n const { newWidth, newHeight } = scaleDimension(\n imageMatrix,\n imageMatrixLimit,\n width,\n height,\n );\n return t`Dimension too large. Uploading might encounter issues. Try reduce dimension from ${i18n.number(\n width,\n )}×${i18n.number(height)}px to ${i18n.number(newWidth)}×${i18n.number(\n newHeight,\n )}px.`;\n }\n case 'videoSizeLimit': {\n const { videoSize, videoSizeLimit } = details;\n return t`File size too large. Uploading might encounter issues. Try reduce the file size from ${prettyBytes(\n videoSize,\n )} to ${prettyBytes(videoSizeLimit)} or lower.`;\n }\n case 'videoMatrixLimit': {\n const { videoMatrix, videoMatrixLimit, width, height } = details;\n const { newWidth, newHeight } = scaleDimension(\n videoMatrix,\n videoMatrixLimit,\n width,\n height,\n );\n return t`Dimension too large. Uploading might encounter issues. Try reduce dimension from ${i18n.number(\n width,\n )}×${i18n.number(height)}px to ${i18n.number(newWidth)}×${i18n.number(\n newHeight,\n )}px.`;\n }\n case 'videoFrameRateLimit': {\n // Not possible to detect this on client-side for now\n return t`Frame rate too high. Uploading might encounter issues.`;\n }\n }\n };\n\n return (\n <>\n
    \n {\n setShowModal(true);\n }}\n >\n {suffixType === 'image' ? (\n {\n if (!checkMaxError) return;\n const { naturalWidth, naturalHeight } = e.target;\n setImageMatrix({\n matrix: naturalWidth * naturalHeight,\n width: naturalWidth,\n height: naturalHeight,\n });\n }}\n />\n ) : suffixType === 'video' || suffixType === 'gifv' ? (\n {\n if (!checkMaxError) return;\n const { videoWidth, videoHeight } = e.target;\n if (videoWidth && videoHeight) {\n setVideoMatrix({\n matrix: videoWidth * videoHeight,\n width: videoWidth,\n height: videoHeight,\n });\n }\n }}\n />\n ) : suffixType === 'audio' ? (\n
    \n {descTextarea}\n
    \n \n \n \n {!!maxError && (\n {\n if (maxErrorToast.current) {\n maxErrorToast.current.hideToast();\n }\n maxErrorToast.current = showToast({\n text: maxErrorText(maxError),\n duration: 10_000,\n });\n }}\n >\n \n \n )}\n
    \n \n {showModal && (\n {\n setShowModal(false);\n }}\n >\n
    \n {\n setShowModal(false);\n }}\n >\n \n \n
    \n

    \n {\n {\n image: t`Edit image description`,\n video: t`Edit video description`,\n audio: t`Edit audio description`,\n }[suffixType]\n }\n

    \n
    \n
    \n
    \n {suffixType === 'image' ? (\n \"\"\n ) : suffixType === 'video' || suffixType === 'gifv' ? (\n
    \n
    \n {descTextarea}\n
    \n {suffixType === 'image' &&\n /^(png|jpe?g|gif|webp)$/i.test(subtype) &&\n !!states.settings.mediaAltGenerator &&\n !!IMG_ALT_API_URL && (\n \n \n \n }\n >\n {\n setUIState('loading');\n toastRef.current = showToast({\n text: t`Generating description. Please wait…`,\n duration: -1,\n });\n // POST with multipart\n (async function () {\n try {\n const body = new FormData();\n body.append('image', file);\n const response = await fetch(IMG_ALT_API_URL, {\n method: 'POST',\n body,\n }).then((r) => r.json());\n if (response.error) {\n throw new Error(response.error);\n }\n setDescription(response.description);\n } catch (e) {\n console.error(e);\n showToast(\n e.message\n ? t`Failed to generate description: ${e.message}`\n : t`Failed to generate description`,\n );\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n \n {lang && lang !== 'en' ? (\n \n Generate description…\n
    \n (English)\n
    \n ) : (\n \n Generate description…\n \n )}\n \n {!!lang && lang !== 'en' && (\n {\n setUIState('loading');\n toastRef.current = showToast({\n text: t`Generating description. Please wait…`,\n duration: -1,\n });\n // POST with multipart\n (async function () {\n try {\n const body = new FormData();\n body.append('image', file);\n const params = `?lang=${lang}`;\n const response = await fetch(\n IMG_ALT_API_URL + params,\n {\n method: 'POST',\n body,\n },\n ).then((r) => r.json());\n if (response.error) {\n throw new Error(response.error);\n }\n setDescription(response.description);\n } catch (e) {\n console.error(e);\n showToast(\n t`Failed to generate description${\n e?.message ? `: ${e.message}` : ''\n }`,\n );\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n \n \n Generate description…\n
    \n \n ({localeCode2Text(lang)}){' '}\n \n — experimental\n \n \n
    \n \n )}\n \n )}\n {\n setShowModal(false);\n }}\n disabled={uiState === 'loading'}\n >\n Done\n \n
    \n
    \n
    \n
    \n \n )}\n \n );\n}\n\nfunction Poll({\n lang,\n poll,\n disabled,\n onInput = () => {},\n maxOptions,\n maxExpiration,\n minExpiration,\n maxCharactersPerOption,\n}) {\n const { _ } = useLingui();\n const { options, expiresIn, multiple } = poll;\n\n return (\n
    \n
    \n {options.map((option, i) => (\n
    \n {\n const { value } = e.target;\n options[i] = value;\n onInput(poll);\n }}\n />\n {\n options.splice(i, 1);\n onInput(poll);\n }}\n >\n \n \n
    \n ))}\n
    \n
    \n = maxOptions}\n onClick={() => {\n options.push('');\n onInput(poll);\n }}\n >\n +\n {' '}\n \n \n
    \n
    \n {\n onInput(null);\n }}\n >\n Remove poll\n \n
    \n
    \n );\n}\n\nfunction filterShortcodes(emojis, searchTerm) {\n searchTerm = searchTerm.toLowerCase();\n\n // Return an array of shortcodes that start with or contain the search term, sorted by relevance and limited to the first 5\n return emojis\n .sort((a, b) => {\n let aLower = a.shortcode.toLowerCase();\n let bLower = b.shortcode.toLowerCase();\n\n let aStartsWith = aLower.startsWith(searchTerm);\n let bStartsWith = bLower.startsWith(searchTerm);\n let aContains = aLower.includes(searchTerm);\n let bContains = bLower.includes(searchTerm);\n let bothStartWith = aStartsWith && bStartsWith;\n let bothContain = aContains && bContains;\n\n return bothStartWith\n ? a.length - b.length\n : aStartsWith\n ? -1\n : bStartsWith\n ? 1\n : bothContain\n ? a.length - b.length\n : aContains\n ? -1\n : bContains\n ? 1\n : 0;\n })\n .slice(0, 5);\n}\n\nfunction encodeHTML(str) {\n return str.replace(/[&<>\"']/g, function (char) {\n return '&#' + char.charCodeAt(0) + ';';\n });\n}\n\nfunction removeNullUndefined(obj) {\n for (let key in obj) {\n if (obj[key] === null || obj[key] === undefined) {\n delete obj[key];\n }\n }\n return obj;\n}\n\nfunction MentionModal({\n onClose = () => {},\n onSelect = () => {},\n defaultSearchTerm,\n}) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [accounts, setAccounts] = useState([]);\n const [relationshipsMap, setRelationshipsMap] = useState({});\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const loadRelationships = async (accounts) => {\n if (!accounts?.length) return;\n const relationships = await fetchRelationships(accounts, relationshipsMap);\n if (relationships) {\n setRelationshipsMap({\n ...relationshipsMap,\n ...relationships,\n });\n }\n };\n\n const loadAccounts = (term) => {\n if (!term) return;\n setUIState('loading');\n (async () => {\n try {\n const accounts = await masto.v1.accounts.search.list({\n q: term,\n limit: 40,\n resolve: false,\n });\n setAccounts(accounts);\n loadRelationships(accounts);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n console.error(e);\n }\n })();\n };\n\n const debouncedLoadAccounts = useDebouncedCallback(loadAccounts, 1000);\n\n useEffect(() => {\n loadAccounts();\n }, [loadAccounts]);\n\n const inputRef = useRef();\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n // Put cursor at the end\n if (inputRef.current.value) {\n inputRef.current.selectionStart = inputRef.current.value.length;\n inputRef.current.selectionEnd = inputRef.current.value.length;\n }\n }\n }, []);\n\n useEffect(() => {\n if (defaultSearchTerm) {\n loadAccounts(defaultSearchTerm);\n }\n }, [defaultSearchTerm]);\n\n const selectAccount = (account) => {\n const socialAddress = account.acct;\n onSelect(socialAddress);\n onClose();\n };\n\n useHotkeys(\n 'enter',\n () => {\n const selectedAccount = accounts[selectedIndex];\n if (selectedAccount) {\n selectAccount(selectedAccount);\n }\n },\n {\n preventDefault: true,\n enableOnFormTags: ['input'],\n },\n );\n\n const listRef = useRef();\n useHotkeys(\n 'down',\n () => {\n if (selectedIndex < accounts.length - 1) {\n setSelectedIndex(selectedIndex + 1);\n } else {\n setSelectedIndex(0);\n }\n setTimeout(() => {\n const selectedItem = listRef.current.querySelector('.selected');\n if (selectedItem) {\n selectedItem.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n });\n }\n }, 1);\n },\n {\n preventDefault: true,\n enableOnFormTags: ['input'],\n },\n );\n\n useHotkeys(\n 'up',\n () => {\n if (selectedIndex > 0) {\n setSelectedIndex(selectedIndex - 1);\n } else {\n setSelectedIndex(accounts.length - 1);\n }\n setTimeout(() => {\n const selectedItem = listRef.current.querySelector('.selected');\n if (selectedItem) {\n selectedItem.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n });\n }\n }, 1);\n },\n {\n preventDefault: true,\n enableOnFormTags: ['input'],\n },\n );\n\n return (\n
    \n {!!onClose && (\n \n )}\n
    \n {\n e.preventDefault();\n debouncedLoadAccounts.flush?.();\n // const searchTerm = inputRef.current.value;\n // debouncedLoadAccounts(searchTerm);\n }}\n >\n {\n const { value } = e.target;\n debouncedLoadAccounts(value);\n }}\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellCheck=\"false\"\n dir=\"auto\"\n defaultValue={defaultSearchTerm || ''}\n />\n \n
    \n
    \n {accounts?.length > 0 ? (\n \n {accounts.map((account, i) => {\n const relationship = relationshipsMap[account.id];\n return (\n \n \n {\n selectAccount(account);\n }}\n >\n \n \n \n );\n })}\n \n ) : uiState === 'loading' ? (\n
    \n \n
    \n ) : uiState === 'error' ? (\n
    \n

    \n Error loading accounts\n

    \n
    \n ) : null}\n
    \n
    \n );\n}\n\nfunction CustomEmojisModal({\n masto,\n instance,\n onClose = () => {},\n onSelect = () => {},\n defaultSearchTerm,\n}) {\n const [uiState, setUIState] = useState('default');\n const customEmojisList = useRef([]);\n const [customEmojis, setCustomEmojis] = useState([]);\n const recentlyUsedCustomEmojis = useMemo(\n () => store.account.get('recentlyUsedCustomEmojis') || [],\n );\n const searcherRef = useRef();\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const [emojis, searcher] = await getCustomEmojis(instance, masto);\n console.log('emojis', emojis);\n searcherRef.current = searcher;\n setCustomEmojis(emojis);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n console.error(e);\n }\n })();\n }, []);\n\n const customEmojisCatList = useMemo(() => {\n // Group emojis by category\n const emojisCat = {\n '--recent--': recentlyUsedCustomEmojis.filter((emoji) =>\n customEmojis.find((e) => e.shortcode === emoji.shortcode),\n ),\n };\n const othersCat = [];\n customEmojis.forEach((emoji) => {\n customEmojisList.current?.push?.(emoji);\n if (!emoji.category) {\n othersCat.push(emoji);\n return;\n }\n if (!emojisCat[emoji.category]) {\n emojisCat[emoji.category] = [];\n }\n emojisCat[emoji.category].push(emoji);\n });\n if (othersCat.length) {\n emojisCat['--others--'] = othersCat;\n }\n return emojisCat;\n }, [customEmojis]);\n\n const scrollableRef = useRef();\n const [matches, setMatches] = useState(null);\n const onFind = useCallback(\n (e) => {\n const { value } = e.target;\n if (value) {\n const results = searcherRef.current?.search(value, {\n limit: CUSTOM_EMOJIS_COUNT,\n });\n setMatches(results.map((r) => r.item));\n scrollableRef.current?.scrollTo?.(0, 0);\n } else {\n setMatches(null);\n }\n },\n [customEmojis],\n );\n useEffect(() => {\n if (defaultSearchTerm && customEmojis?.length) {\n onFind({ target: { value: defaultSearchTerm } });\n }\n }, [defaultSearchTerm, onFind, customEmojis]);\n\n const onSelectEmoji = useCallback(\n (emoji) => {\n onSelect?.(emoji);\n onClose?.();\n\n queueMicrotask(() => {\n let recentlyUsedCustomEmojis =\n store.account.get('recentlyUsedCustomEmojis') || [];\n const recentlyUsedEmojiIndex = recentlyUsedCustomEmojis.findIndex(\n (e) => e.shortcode === emoji.shortcode,\n );\n if (recentlyUsedEmojiIndex !== -1) {\n // Move emoji to index 0\n recentlyUsedCustomEmojis.splice(recentlyUsedEmojiIndex, 1);\n recentlyUsedCustomEmojis.unshift(emoji);\n } else {\n recentlyUsedCustomEmojis.unshift(emoji);\n // Remove unavailable ones\n recentlyUsedCustomEmojis = recentlyUsedCustomEmojis.filter((e) =>\n customEmojisList.current?.find?.(\n (emoji) => emoji.shortcode === e.shortcode,\n ),\n );\n // Limit to 10\n recentlyUsedCustomEmojis = recentlyUsedCustomEmojis.slice(0, 10);\n }\n\n // Store back\n store.account.set('recentlyUsedCustomEmojis', recentlyUsedCustomEmojis);\n });\n },\n [onSelect],\n );\n\n const inputRef = useRef();\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n // Put cursor at the end\n if (inputRef.current.value) {\n inputRef.current.selectionStart = inputRef.current.value.length;\n inputRef.current.selectionEnd = inputRef.current.value.length;\n }\n }\n }, []);\n\n return (\n
    \n {!!onClose && (\n \n )}\n
    \n
    \n \n Custom emojis\n {' '}\n {uiState === 'loading' ? (\n \n ) : (\n • {instance}\n )}\n
    \n {\n e.preventDefault();\n const emoji = matches[0];\n if (emoji) {\n onSelectEmoji(`:${emoji.shortcode}:`);\n }\n }}\n >\n \n \n
    \n
    \n {matches !== null ? (\n
      \n {matches.map((emoji) => (\n
    • \n {\n onSelectEmoji(`:${emoji.shortcode}:`);\n }}\n showCode\n />\n
    • \n ))}\n
    \n ) : (\n
    \n {uiState === 'error' && (\n
    \n

    \n Error loading custom emojis\n

    \n
    \n )}\n {uiState === 'default' &&\n Object.entries(customEmojisCatList).map(\n ([category, emojis]) =>\n !!emojis?.length && (\n
    \n
    \n {{\n '--recent--': t`Recently used`,\n '--others--': t`Others`,\n }[category] || category}\n
    \n \n
    \n ),\n )}\n
    \n )}\n
    \n
    \n );\n}\n\nconst CustomEmojisList = memo(({ emojis, onSelect }) => {\n const { i18n } = useLingui();\n const [max, setMax] = useState(CUSTOM_EMOJIS_COUNT);\n const showMore = emojis.length > max;\n return (\n
    \n {emojis.slice(0, max).map((emoji) => (\n {\n onSelect(`:${emoji.shortcode}:`);\n }}\n />\n ))}\n {showMore && (\n setMax(max + CUSTOM_EMOJIS_COUNT)}\n >\n {i18n.number(emojis.length - max)} more…\n \n )}\n
    \n );\n});\n\nconst CustomEmojiButton = memo(({ emoji, onClick, showCode }) => {\n const addEdges = (e) => {\n // Add edge-left or edge-right class based on self position relative to scrollable parent\n // If near left edge, add edge-left, if near right edge, add edge-right\n const buffer = 88;\n const parent = e.currentTarget.closest('main');\n if (parent) {\n const rect = parent.getBoundingClientRect();\n const selfRect = e.currentTarget.getBoundingClientRect();\n const targetClassList = e.currentTarget.classList;\n if (selfRect.left < rect.left + buffer) {\n targetClassList.add('edge-left');\n targetClassList.remove('edge-right');\n } else if (selfRect.right > rect.right - buffer) {\n targetClassList.add('edge-right');\n targetClassList.remove('edge-left');\n } else {\n targetClassList.remove('edge-left', 'edge-right');\n }\n }\n };\n\n return (\n \n \n {!!emoji.staticUrl && (\n \n )}\n \n \n {showCode && (\n <>\n {' '}\n {emoji.shortcode}\n \n )}\n \n );\n});\n\nconst GIFS_PER_PAGE = 20;\nfunction GIFPickerModal({ onClose = () => {}, onSelect = () => {} }) {\n const { i18n } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [results, setResults] = useState([]);\n const formRef = useRef(null);\n const qRef = useRef(null);\n const currentOffset = useRef(0);\n const scrollableRef = useRef(null);\n\n function fetchGIFs({ offset }) {\n console.log('fetchGIFs', { offset });\n if (!qRef.current?.value) return;\n setUIState('loading');\n scrollableRef.current?.scrollTo?.({\n top: 0,\n left: 0,\n behavior: 'smooth',\n });\n (async () => {\n try {\n const query = {\n api_key: GIPHY_API_KEY,\n q: qRef.current.value,\n rating: 'g',\n limit: GIFS_PER_PAGE,\n bundle: 'messaging_non_clips',\n offset,\n lang: i18n.locale || 'en',\n };\n const response = await fetch(\n 'https://api.giphy.com/v1/gifs/search?' + new URLSearchParams(query),\n {\n referrerPolicy: 'no-referrer',\n },\n ).then((r) => r.json());\n currentOffset.current = response.pagination?.offset || 0;\n setResults(response);\n setUIState('results');\n } catch (e) {\n setUIState('error');\n console.error(e);\n }\n })();\n }\n\n useEffect(() => {\n qRef.current?.focus();\n }, []);\n\n const debouncedOnInput = useDebouncedCallback(() => {\n fetchGIFs({ offset: 0 });\n }, 1000);\n\n return (\n
    \n {!!onClose && (\n \n )}\n
    \n {\n e.preventDefault();\n fetchGIFs({ offset: 0 });\n }}\n >\n \n \n \n
    \n
    \n {uiState === 'default' && (\n
    \n

    \n Type to search GIFs\n

    \n
    \n )}\n {uiState === 'loading' && !results?.data?.length && (\n
    \n \n
    \n )}\n {results?.data?.length > 0 ? (\n <>\n
      \n {results.data.map((gif) => {\n const { id, images, title, alt_text } = gif;\n const {\n fixed_height_small,\n fixed_height_downsampled,\n fixed_height,\n original,\n } = images;\n const theImage = fixed_height_small?.url\n ? fixed_height_small\n : fixed_height_downsampled?.url\n ? fixed_height_downsampled\n : fixed_height;\n let { url, webp, width, height } = theImage;\n if (+height > 100) {\n width = (width / height) * 100;\n height = 100;\n }\n const urlObj = URL.parse(url);\n const strippedURL = urlObj.origin + urlObj.pathname;\n let strippedWebP;\n if (webp) {\n const webpObj = URL.parse(webp);\n strippedWebP = webpObj.origin + webpObj.pathname;\n }\n return (\n
    • \n {\n const { mp4, url } = original;\n const theURL = mp4 || url;\n const urlObj = URL.parse(theURL);\n const strippedURL = urlObj.origin + urlObj.pathname;\n onClose();\n onSelect({\n url: strippedURL,\n type: mp4 ? 'video/mp4' : 'image/gif',\n alt_text: alt_text || title,\n });\n }}\n >\n \n \n {strippedWebP && (\n \n )}\n {\n e.target.style.backgroundColor = 'transparent';\n }}\n />\n \n
      {alt_text || title}
      \n \n \n
    • \n );\n })}\n
    \n

    \n {results.pagination?.offset > 0 && (\n {\n fetchGIFs({\n offset: results.pagination?.offset - GIFS_PER_PAGE,\n });\n }}\n >\n \n \n Previous\n \n \n )}\n \n {results.pagination?.offset + results.pagination?.count <\n results.pagination?.total_count && (\n {\n fetchGIFs({\n offset: results.pagination?.offset + GIFS_PER_PAGE,\n });\n }}\n >\n \n Next\n {' '}\n \n \n )}\n

    \n \n ) : (\n uiState === 'results' && (\n
    \n

    No results

    \n
    \n )\n )}\n {uiState === 'error' && (\n
    \n

    \n Error loading GIFs\n

    \n
    \n )}\n
    \n
    \n );\n}\n\nexport default Compose;\n"],"file":"assets/compose-xua1VIA2.js"} \ No newline at end of file diff --git a/assets/fuse-uYeGZ3ik.js b/assets/fuse-RZOrQKm7.js similarity index 74% rename from assets/fuse-uYeGZ3ik.js rename to assets/fuse-RZOrQKm7.js index b175fed..4c5b005 100644 --- a/assets/fuse-uYeGZ3ik.js +++ b/assets/fuse-RZOrQKm7.js @@ -1,20 +1,20 @@ -import{ad as lt,Q as ze,c as r,h as W,t as Pe,A as $,_ as Wt,y as J,ae as wa,E as gr,i as k,af as A,ag as xa,ah as io,ai as ka,l as le,P as Ct,p as Ui,aj as Sa,ak as ji,O as Ki,f as N,C as Qt,V as Me,q as Ia,s as H,al as Aa,j as go,a as so,z as yn,B as Ca,T as O,am as Wi,an as Pa,ao as Zi,r as vo,w as Gi,g as vr,ap as La,aq as Ne,ar as Ma,as as Ra,at as Un,J as st,u as Sn,d as Jr,b as ft,W as qi,au as Oa,av as Da,aw as $a}from"./useTitle-6AJYXxJy.js";function Xo(){return Xo=Object.assign?Object.assign.bind():function(e){for(var t=1;t'),!0):t?e.some(function(n){return t.includes(n)})||e.includes("*"):!0}var ja=function(t,n,o){o===void 0&&(o=!1);var i=n.alt,s=n.meta,a=n.mod,c=n.shift,l=n.ctrl,u=n.keys,f=t.key,d=t.code,m=t.ctrlKey,h=t.metaKey,p=t.shiftKey,g=t.altKey,v=pt(d),T=f.toLowerCase();if(!(u!=null&&u.includes(v))&&!(u!=null&&u.includes(T))&&!["ctrl","control","unknown","meta","alt","shift","os"].includes(v))return!1;if(!o){if(i===!g&&T!=="alt"||c===!p&&T!=="shift")return!1;if(a){if(!h&&!m)return!1}else if(s===!h&&T!=="meta"&&T!=="os"||l===!m&&T!=="ctrl"&&T!=="control")return!1}return u&&u.length===1&&(u.includes(T)||u.includes(v))?!0:u?za(u):!u},Ka=lt(void 0),Wa=function(){return ze(Ka)};function es(e,t){return e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce(function(n,o){return n&&es(e[o],t[o])},!0):e===t}var Za=lt({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),Ga=function(){return ze(Za)};function qa(e){var t=$(void 0);return es(t.current,e)||(t.current=e),t.current}var ei=function(t){t.stopPropagation(),t.preventDefault(),t.stopImmediatePropagation()},Ya=typeof window<"u"?Wt:J;function Ht(e,t,n,o){var i=W(null),s=i[0],a=i[1],c=$(!1),l=n instanceof Array?o instanceof Array?void 0:o:n,u=_r(e)?e.join(l==null?void 0:l.splitKey):e,f=n instanceof Array?n:o instanceof Array?o:void 0,d=Pe(t,f??[]),m=$(d);f?m.current=d:m.current=t;var h=qa(l),p=Ga(),g=p.enabledScopes,v=Wa();return Ya(function(){if(!((h==null?void 0:h.enabled)===!1||!Ua(g,h==null?void 0:h.scopes))){var T=function(b,I){var D;if(I===void 0&&(I=!1),!(Ba(b)&&!Ji(b,h==null?void 0:h.enableOnFormTags))){if(s!==null){var R=s.getRootNode();if((R instanceof Document||R instanceof ShadowRoot)&&R.activeElement!==s&&!s.contains(R.activeElement)){ei(b);return}}(D=b.target)!=null&&D.isContentEditable&&!(h!=null&&h.enableOnContentEditable)||Ao(u,h==null?void 0:h.splitKey).forEach(function(S){var C,L=Co(S,h==null?void 0:h.combinationKey);if(ja(b,L,h==null?void 0:h.ignoreModifiers)||(C=L.keys)!=null&&C.includes("*")){if(h!=null&&h.ignoreEventWhen!=null&&h.ignoreEventWhen(b)||I&&c.current)return;if(Va(b,L,h==null?void 0:h.preventDefault),!Ha(b,L,h==null?void 0:h.enabled)){ei(b);return}m.current(b,L),I||(c.current=!0)}})}},y=function(b){b.key!==void 0&&(Xi(pt(b.code)),((h==null?void 0:h.keydown)===void 0&&(h==null?void 0:h.keyup)!==!0||h!=null&&h.keydown)&&T(b))},x=function(b){b.key!==void 0&&(Qi(pt(b.code)),c.current=!1,h!=null&&h.keyup&&T(b,!0))},w=s||(l==null?void 0:l.document)||document;return w.addEventListener("keyup",x),w.addEventListener("keydown",y),v&&Ao(u,h==null?void 0:h.splitKey).forEach(function(E){return v.addHotkey(Co(E,h==null?void 0:h.combinationKey,h==null?void 0:h.description))}),function(){w.removeEventListener("keyup",x),w.removeEventListener("keydown",y),v&&Ao(u,h==null?void 0:h.splitKey).forEach(function(E){return v.removeHotkey(Co(E,h==null?void 0:h.combinationKey,h==null?void 0:h.description))})}}},[s,u,h,g]),a}var yr={exports:{}};/*! +import{ad as lt,Q as ze,c as r,h as W,t as Pe,A as $,_ as Wt,y as J,ae as wa,E as gr,i as k,af as A,ag as xa,ah as io,ai as ka,l as le,P as Ct,p as Ui,aj as Sa,ak as ji,O as Ki,f as N,C as Qt,V as Me,q as Ia,s as H,al as Aa,j as go,a as so,z as yn,B as Ca,T as O,am as Wi,an as Pa,ao as Zi,r as vo,w as Gi,g as vr,ap as La,aq as Ne,ar as Ma,as as Ra,at as Un,J as st,u as Sn,d as Jr,b as ft,W as qi,au as Oa,av as Da,aw as $a}from"./useTitle-B8ZF9tfB.js";function Xo(){return Xo=Object.assign?Object.assign.bind():function(e){for(var t=1;t'),!0):t?e.some(function(n){return t.includes(n)})||e.includes("*"):!0}var ja=function(t,n,o){o===void 0&&(o=!1);var i=n.alt,s=n.meta,a=n.mod,c=n.shift,l=n.ctrl,u=n.keys,f=t.key,d=t.code,m=t.ctrlKey,h=t.metaKey,p=t.shiftKey,g=t.altKey,v=pt(d),T=f.toLowerCase();if(!(u!=null&&u.includes(v))&&!(u!=null&&u.includes(T))&&!["ctrl","control","unknown","meta","alt","shift","os"].includes(v))return!1;if(!o){if(i===!g&&T!=="alt"||c===!p&&T!=="shift")return!1;if(a){if(!h&&!m)return!1}else if(s===!h&&T!=="meta"&&T!=="os"||l===!m&&T!=="ctrl"&&T!=="control")return!1}return u&&u.length===1&&(u.includes(T)||u.includes(v))?!0:u?za(u):!u},Ka=lt(void 0),Wa=function(){return ze(Ka)};function es(e,t){return e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce(function(n,o){return n&&es(e[o],t[o])},!0):e===t}var Za=lt({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),Ga=function(){return ze(Za)};function qa(e){var t=$(void 0);return es(t.current,e)||(t.current=e),t.current}var ei=function(t){t.stopPropagation(),t.preventDefault(),t.stopImmediatePropagation()},Ya=typeof window<"u"?Wt:J;function Ht(e,t,n,o){var i=W(null),s=i[0],a=i[1],c=$(!1),l=n instanceof Array?o instanceof Array?void 0:o:n,u=_r(e)?e.join(l==null?void 0:l.splitKey):e,f=n instanceof Array?n:o instanceof Array?o:void 0,d=Pe(t,f??[]),m=$(d);f?m.current=d:m.current=t;var h=qa(l),p=Ga(),g=p.enabledScopes,v=Wa();return Ya(function(){if(!((h==null?void 0:h.enabled)===!1||!Ua(g,h==null?void 0:h.scopes))){var T=function(b,I){var D;if(I===void 0&&(I=!1),!(Ba(b)&&!Ji(b,h==null?void 0:h.enableOnFormTags))){if(s!==null){var R=s.getRootNode();if((R instanceof Document||R instanceof ShadowRoot)&&R.activeElement!==s&&!s.contains(R.activeElement)){ei(b);return}}(D=b.target)!=null&&D.isContentEditable&&!(h!=null&&h.enableOnContentEditable)||Ao(u,h==null?void 0:h.splitKey).forEach(function(S){var C,L=Co(S,h==null?void 0:h.combinationKey);if(ja(b,L,h==null?void 0:h.ignoreModifiers)||(C=L.keys)!=null&&C.includes("*")){if(h!=null&&h.ignoreEventWhen!=null&&h.ignoreEventWhen(b)||I&&c.current)return;if(Va(b,L,h==null?void 0:h.preventDefault),!Ha(b,L,h==null?void 0:h.enabled)){ei(b);return}m.current(b,L),I||(c.current=!0)}})}},y=function(b){b.key!==void 0&&(Xi(pt(b.code)),((h==null?void 0:h.keydown)===void 0&&(h==null?void 0:h.keyup)!==!0||h!=null&&h.keydown)&&T(b))},x=function(b){b.key!==void 0&&(Qi(pt(b.code)),c.current=!1,h!=null&&h.keyup&&T(b,!0))},w=s||(l==null?void 0:l.document)||document;return w.addEventListener("keyup",x),w.addEventListener("keydown",y),v&&Ao(u,h==null?void 0:h.splitKey).forEach(function(E){return v.addHotkey(Co(E,h==null?void 0:h.combinationKey,h==null?void 0:h.description))}),function(){w.removeEventListener("keyup",x),w.removeEventListener("keydown",y),v&&Ao(u,h==null?void 0:h.splitKey).forEach(function(E){return v.removeHotkey(Co(E,h==null?void 0:h.combinationKey,h==null?void 0:h.description))})}}},[s,u,h,g]),a}var yr={exports:{}};/*! * Toastify js 1.12.0 * https://github.com/apvarun/toastify-js * @license MIT licensed * * Copyright (C) 2018 Varun A P - */var Df=yr.exports;(function(e){(function(t,n){e.exports?e.exports=n():t.Toastify=n()})(wa,function(t){var n=function(a){return new n.lib.init(a)},o="1.12.0";n.defaults={oldestFirst:!0,text:"Toastify is awesome!",node:void 0,duration:3e3,selector:void 0,callback:function(){},destination:void 0,newWindow:!1,close:!1,gravity:"toastify-top",positionLeft:!1,position:"",backgroundColor:"",avatar:"",className:"",stopOnFocus:!0,onClick:function(){},offset:{x:0,y:0},escapeMarkup:!0,ariaLive:"polite",style:{background:""}},n.lib=n.prototype={toastify:o,constructor:n,init:function(a){return a||(a={}),this.options={},this.toastElement=null,this.options.text=a.text||n.defaults.text,this.options.node=a.node||n.defaults.node,this.options.duration=a.duration===0?0:a.duration||n.defaults.duration,this.options.selector=a.selector||n.defaults.selector,this.options.callback=a.callback||n.defaults.callback,this.options.destination=a.destination||n.defaults.destination,this.options.newWindow=a.newWindow||n.defaults.newWindow,this.options.close=a.close||n.defaults.close,this.options.gravity=a.gravity==="bottom"?"toastify-bottom":n.defaults.gravity,this.options.positionLeft=a.positionLeft||n.defaults.positionLeft,this.options.position=a.position||n.defaults.position,this.options.backgroundColor=a.backgroundColor||n.defaults.backgroundColor,this.options.avatar=a.avatar||n.defaults.avatar,this.options.className=a.className||n.defaults.className,this.options.stopOnFocus=a.stopOnFocus===void 0?n.defaults.stopOnFocus:a.stopOnFocus,this.options.onClick=a.onClick||n.defaults.onClick,this.options.offset=a.offset||n.defaults.offset,this.options.escapeMarkup=a.escapeMarkup!==void 0?a.escapeMarkup:n.defaults.escapeMarkup,this.options.ariaLive=a.ariaLive||n.defaults.ariaLive,this.options.style=a.style||n.defaults.style,a.backgroundColor&&(this.options.style.background=a.backgroundColor),this},buildToast:function(){if(!this.options)throw"Toastify is not initialized";var a=document.createElement("div");a.className="toastify on "+this.options.className,this.options.position?a.className+=" toastify-"+this.options.position:this.options.positionLeft===!0?(a.className+=" toastify-left",console.warn("Property `positionLeft` will be depreciated in further versions. Please use `position` instead.")):a.className+=" toastify-right",a.className+=" "+this.options.gravity,this.options.backgroundColor&&console.warn('DEPRECATION NOTICE: "backgroundColor" is being deprecated. Please use the "style.background" property.');for(var c in this.options.style)a.style[c]=this.options.style[c];if(this.options.ariaLive&&a.setAttribute("aria-live",this.options.ariaLive),this.options.node&&this.options.node.nodeType===Node.ELEMENT_NODE)a.appendChild(this.options.node);else if(this.options.escapeMarkup?a.innerText=this.options.text:a.innerHTML=this.options.text,this.options.avatar!==""){var l=document.createElement("img");l.src=this.options.avatar,l.className="toastify-avatar",this.options.position=="left"||this.options.positionLeft===!0?a.appendChild(l):a.insertAdjacentElement("afterbegin",l)}if(this.options.close===!0){var u=document.createElement("button");u.type="button",u.setAttribute("aria-label","Close"),u.className="toast-close",u.innerHTML="✖",u.addEventListener("click",(function(v){v.stopPropagation(),this.removeElement(this.toastElement),window.clearTimeout(this.toastElement.timeOutValue)}).bind(this));var f=window.innerWidth>0?window.innerWidth:screen.width;(this.options.position=="left"||this.options.positionLeft===!0)&&f>360?a.insertAdjacentElement("afterbegin",u):a.appendChild(u)}if(this.options.stopOnFocus&&this.options.duration>0){var d=this;a.addEventListener("mouseover",function(v){window.clearTimeout(a.timeOutValue)}),a.addEventListener("mouseleave",function(){a.timeOutValue=window.setTimeout(function(){d.removeElement(a)},d.options.duration)})}if(typeof this.options.destination<"u"&&a.addEventListener("click",(function(v){v.stopPropagation(),this.options.newWindow===!0?window.open(this.options.destination,"_blank"):window.location=this.options.destination}).bind(this)),typeof this.options.onClick=="function"&&typeof this.options.destination>"u"&&a.addEventListener("click",(function(v){v.stopPropagation(),this.options.onClick()}).bind(this)),typeof this.options.offset=="object"){var m=i("x",this.options),h=i("y",this.options),p=this.options.position=="left"?m:"-"+m,g=this.options.gravity=="toastify-top"?h:"-"+h;a.style.transform="translate("+p+","+g+")"}return a},showToast:function(){this.toastElement=this.buildToast();var a;if(typeof this.options.selector=="string"?a=document.getElementById(this.options.selector):this.options.selector instanceof HTMLElement||typeof ShadowRoot<"u"&&this.options.selector instanceof ShadowRoot?a=this.options.selector:a=document.body,!a)throw"Root element is not defined";var c=n.defaults.oldestFirst?a.firstChild:a.lastChild;return a.insertBefore(this.toastElement,c),n.reposition(),this.options.duration>0&&(this.toastElement.timeOutValue=window.setTimeout((function(){this.removeElement(this.toastElement)}).bind(this),this.options.duration)),this},hideToast:function(){this.toastElement.timeOutValue&&clearTimeout(this.toastElement.timeOutValue),this.removeElement(this.toastElement)},removeElement:function(a){a.className=a.className.replace(" on",""),window.setTimeout((function(){this.options.node&&this.options.node.parentNode&&this.options.node.parentNode.removeChild(this.options.node),a.parentNode&&a.parentNode.removeChild(a),this.options.callback.call(a),n.reposition()}).bind(this),400)}},n.reposition=function(){for(var a={top:15,bottom:15},c={top:15,bottom:15},l={top:15,bottom:15},u=document.getElementsByClassName("toastify"),f,d=0;d0?window.innerWidth:screen.width;p<=360?(u[d].style[f]=l[f]+"px",l[f]+=m+h):s(u[d],"toastify-left")===!0?(u[d].style[f]=a[f]+"px",a[f]+=m+h):(u[d].style[f]=c[f]+"px",c[f]+=m+h)}return this};function i(a,c){return c.offset[a]?isNaN(c.offset[a])?c.offset[a]:c.offset[a]+"px":"0px"}function s(a,c){return!a||typeof c!="string"?!1:!!(a.className&&a.className.trim().split(/\s+/gi).indexOf(c)>-1)}return n.lib.init.prototype=n.lib,n})})(yr);var Xa=yr.exports;const Qa=gr(Xa);window._showToast=Le;function Le(e){typeof e=="string"&&(e={text:e});const{onClick:t,delay:n,...o}=e,i=Qa({className:`${t||e.destination?"shiny-pill":""}`,gravity:"bottom",position:"center",...o,onClick:()=>{t==null||t(i)}});return n?setTimeout(()=>{i.showToast()},n):i.showToast(),i}function $f(e,t,n,o){const i=$(e);J(()=>{i.current=e},[e,n]),J(()=>{!o||t===null||t===!1||i.current()},[o]),J(()=>{if(t===null||t===!1)return;const a=setInterval(()=>i.current(),t);return()=>clearInterval(a)},[t])}function Ja(e){const t=URL.parse("/compose/",window.location),{width:n,height:o}=window.screen,i=Math.max(0,(n-600)/2),s=Math.max(0,(o-450)/2),a=Math.min(n,600),c=Math.min(o,450),l=(e==null?void 0:e.uid)||Math.random(),u=window.open(t,"compose"+l,`width=${a},height=${c},left=${i},top=${s}`);return u?u.__COMPOSE__=e:alert(k._({id:"4S86wI"})),u}const ec=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);function tc(){if(ec){const e=document.createElement("input");e.style.position="absolute",e.style.top="0",e.style.left="0",e.style.opacity="0",document.body.appendChild(e),e.focus(),setTimeout(()=>{document.body.removeChild(e)},500)}}const ts={x:()=>A(()=>import("./icons/close-line-YTE7hIJE.js"),[],import.meta.url),heart:()=>A(()=>import("./icons/heart-line-VwvWYh8h.js"),[],import.meta.url),bookmark:()=>A(()=>import("./icons/bookmark-line-D6jQ7QFs.js"),[],import.meta.url),"check-circle":()=>A(()=>import("./icons/check-circle-line-sE41WGxF.js"),[],import.meta.url),"x-circle":()=>A(()=>import("./icons/close-circle-line-qd3g541O.js"),[],import.meta.url),transfer:()=>A(()=>import("./icons/transfer-4-line-Q9QJoxz3.js"),[],import.meta.url),rocket:()=>A(()=>import("./icons/rocket-line-rZbVYYCZ.js"),[],import.meta.url),"arrow-left":{module:()=>A(()=>import("./icons/arrow-left-line-_YC6-XGG.js"),[],import.meta.url),rtl:!0},"arrow-right":{module:()=>A(()=>import("./icons/arrow-right-line-PypiEqpu.js"),[],import.meta.url),rtl:!0},"arrow-up":()=>A(()=>import("./icons/arrow-up-line-fcuKqhVE.js"),[],import.meta.url),"arrow-down":()=>A(()=>import("./icons/arrow-down-line-0TRJUP_K.js"),[],import.meta.url),earth:()=>A(()=>import("./icons/earth-line-t1Um8wpQ.js"),[],import.meta.url),lock:()=>A(()=>import("./icons/lock-line-0jNHqZpm.js"),[],import.meta.url),unlock:()=>A(()=>import("./icons/unlock-line-w3piJMVb.js"),[],import.meta.url),"eye-close":()=>A(()=>import("./icons/eye-close-line-lBiePPv9.js"),[],import.meta.url),"eye-open":()=>A(()=>import("./icons/eye-2-line-vz_Kw-rK.js"),[],import.meta.url),message:()=>A(()=>import("./icons/mail-line-5XLS6FEo.js"),[],import.meta.url),comment:{module:()=>A(()=>import("./icons/chat-3-line-F0xcdpXY.js"),[],import.meta.url),rtl:!0},comment2:{module:()=>A(()=>import("./icons/comment-2-line-xEXuT-Ip.js"),[],import.meta.url),rtl:!0},home:()=>A(()=>import("./icons/home-3-line-qJiZhXUH.js"),[],import.meta.url),notification:()=>A(()=>import("./icons/notification-line-olNPLtgS.js"),[],import.meta.url),follow:()=>A(()=>import("./icons/user-follow-line-k_GCWTtp.js"),[],import.meta.url),"follow-add":()=>A(()=>import("./icons/user-add-line-zzW9OULB.js"),[],import.meta.url),poll:[()=>A(()=>import("./icons/chart-bar-line-5r_DfN2w.js"),[],import.meta.url),"90deg"],pencil:()=>A(()=>import("./icons/pencil-line-bKXqElLR.js"),[],import.meta.url),quill:()=>A(()=>import("./icons/quill-pen-line-h_5-FsGz.js"),[],import.meta.url),at:()=>A(()=>import("./icons/at-line-9vJS_Hnl.js"),[],import.meta.url),attachment:()=>A(()=>import("./icons/attachment-line-C2PUa1Ke.js"),[],import.meta.url),upload:()=>A(()=>import("./icons/upload-3-line-Qsjvubiw.js"),[],import.meta.url),gear:()=>A(()=>import("./icons/settings-3-line-kt4MSpRv.js"),[],import.meta.url),more:()=>A(()=>import("./icons/more-3-line-wUD-Yhmj.js"),[],import.meta.url),more2:()=>A(()=>import("./icons/more-1-fill-je1-slyh.js"),[],import.meta.url),external:{module:()=>A(()=>import("./icons/external-link-line-8nOOkmFu.js"),[],import.meta.url),rtl:!0},popout:{module:()=>A(()=>import("./icons/external-link-line-8nOOkmFu.js"),[],import.meta.url),rtl:!0},popin:{module:()=>A(()=>import("./icons/external-link-line-8nOOkmFu.js"),[],import.meta.url),rotate:"180deg",rtl:!0},plus:()=>A(()=>import("./icons/add-circle-line--O-MfyNy.js"),[],import.meta.url),"chevron-left":{module:()=>A(()=>import("./icons/left-line-Jck0yVmC.js"),[],import.meta.url),rtl:!0},"chevron-right":{module:()=>A(()=>import("./icons/right-line-7VBoqLdz.js"),[],import.meta.url),rtl:!0},"chevron-down":()=>A(()=>import("./icons/down-line-9PeS5YhF.js"),[],import.meta.url),reply:{module:()=>A(()=>import("./icons/share-forward-line-4jL-2Q4u.js"),[],import.meta.url),rotate:"180deg",flip:"horizontal",rtl:!0},thread:()=>A(()=>import("./icons/route-line-2YYy3958.js"),[],import.meta.url),group:{module:()=>A(()=>import("./icons/group-line-JvhJklhQ.js"),[],import.meta.url),rtl:!0},bot:()=>A(()=>import("./icons/android-2-line-uPwvVubH.js"),[],import.meta.url),menu:()=>A(()=>import("./icons/rows-4-line-SxGPYpTa.js"),[],import.meta.url),list:{module:()=>A(()=>import("./icons/list-check-line-qNqx9Mm4.js"),[],import.meta.url),rtl:!0},search:()=>A(()=>import("./icons/search-2-line-G39AynEw.js"),[],import.meta.url),hashtag:()=>A(()=>import("./icons/hashtag-line-SS3QMu1R.js"),[],import.meta.url),info:()=>A(()=>import("./icons/information-line-8SOch6cR.js"),[],import.meta.url),shortcut:()=>A(()=>import("./icons/lightning-line-JMYUlCZM.js"),[],import.meta.url),user:()=>A(()=>import("./icons/user-4-line-zT_bpOrS.js"),[],import.meta.url),following:()=>A(()=>import("./icons/walk-line-CF7a5s4t.js"),[],import.meta.url),pin:()=>A(()=>import("./icons/pin-line-ULyRQyWZ.js"),[],import.meta.url),unpin:[()=>A(()=>import("./icons/pin-line-ULyRQyWZ.js"),[],import.meta.url),"180deg"],bus:()=>A(()=>import("./icons/bus-2-line-XuQdDZ_w.js"),[],import.meta.url),link:()=>A(()=>import("./icons/link-2-line-BUqp1EwN.js"),[],import.meta.url),history:()=>A(()=>import("./icons/history-line-yoG7K8wL.js"),[],import.meta.url),share:()=>A(()=>import("./icons/share-2-line-PYo-zN94.js"),[],import.meta.url),sparkles:()=>A(()=>import("./icons/sparkles-line-wjZWGZ1a.js"),[],import.meta.url),sparkles2:()=>A(()=>import("./icons/sparkles-2-line-g2FqdZ0R.js"),[],import.meta.url),exit:{module:()=>A(()=>import("./icons/exit-line-l-1uUgI7.js"),[],import.meta.url),rtl:!0},translate:()=>A(()=>import("./icons/translate-line-HpDtlqS2.js"),[],import.meta.url),play:()=>A(()=>import("./icons/play-fill-Ey-zv2eL.js"),[],import.meta.url),trash:()=>A(()=>import("./icons/delete-2-line-pjUduCFs.js"),[],import.meta.url),mute:{module:()=>A(()=>import("./icons/volume-mute-line-WthBoXru.js"),[],import.meta.url),rtl:!0},unmute:{module:()=>A(()=>import("./icons/volume-line-PZujbN8h.js"),[],import.meta.url),rtl:!0},block:()=>A(()=>import("./icons/forbid-circle-line-3FxopGoP.js"),[],import.meta.url),unblock:[()=>A(()=>import("./icons/forbid-circle-line-3FxopGoP.js"),[],import.meta.url),"180deg"],flag:()=>A(()=>import("./icons/flag-1-line-xvcg7G7Q.js"),[],import.meta.url),time:()=>A(()=>import("./icons/time-line-ThP0kTRr.js"),[],import.meta.url),refresh:()=>A(()=>import("./icons/refresh-2-line-t42qqclb.js"),[],import.meta.url),emoji2:()=>A(()=>import("./icons/emoji-2-line--uNVc2IC.js"),[],import.meta.url),filter:()=>A(()=>import("./icons/filter-2-line-KyjbFYlO.js"),[],import.meta.url),filters:()=>A(()=>import("./icons/filter-line-1KEfnWDm.js"),[],import.meta.url),chart:()=>A(()=>import("./icons/chart-line-line-pHaLt6yC.js"),[],import.meta.url),react:()=>A(()=>import("./icons/react-line-YfZPqZem.js"),[],import.meta.url),layout4:{module:()=>A(()=>import("./icons/layout-4-line-FOdnyEcZ.js"),[],import.meta.url),rtl:!0},layout5:()=>A(()=>import("./icons/layout-5-line-9Kks7dle.js"),[],import.meta.url),announce:{module:()=>A(()=>import("./icons/announcement-line-MSlAmDH1.js"),[],import.meta.url),rtl:!0},alert:()=>A(()=>import("./icons/alert-line-zyc6hy8V.js"),[],import.meta.url),round:()=>A(()=>import("./icons/round-fill-a0rplSmV.js"),[],import.meta.url),"arrow-up-circle":()=>A(()=>import("./icons/arrow-up-circle-line-e3kZqEZN.js"),[],import.meta.url),"arrow-down-circle":()=>A(()=>import("./icons/arrow-down-circle-line-mpqFtRtO.js"),[],import.meta.url),clipboard:{module:()=>A(()=>import("./icons/clipboard-line-9F_Yeo71.js"),[],import.meta.url),rtl:!0},"account-edit":()=>A(()=>import("./icons/user-edit-line-9VnWCh0X.js"),[],import.meta.url),"account-warning":()=>A(()=>import("./icons/user-warning-line-gL3RGb1N.js"),[],import.meta.url),keyboard:()=>A(()=>import("./icons/keyboard-line-10AZQcVH.js"),[],import.meta.url),cloud:()=>A(()=>import("./icons/cloud-line-abe0HgFS.js"),[],import.meta.url),month:{module:()=>A(()=>import("./icons/calendar-month-line-VoXZVWAe.js"),[],import.meta.url),rtl:!0},media:()=>A(()=>import("./icons/photo-album-line--GdJqjfq.js"),[],import.meta.url),speak:()=>A(()=>import("./icons/radar-line-ndI8IhOG.js"),[],import.meta.url),building:()=>A(()=>import("./icons/building-5-line-ew7lu83B.js"),[],import.meta.url),history2:{module:()=>A(()=>import("./icons/history-2-line-3yIVzoWo.js"),[],import.meta.url),rtl:!0},document:()=>A(()=>import("./icons/document-line--D6ooZg1.js"),[],import.meta.url),"arrows-right":{module:()=>A(()=>import("./icons/arrows-right-line-HF4HILdT.js"),[],import.meta.url),rtl:!0},code:()=>A(()=>import("./icons/code-line-h4RWLaak.js"),[],import.meta.url),copy:()=>A(()=>import("./icons/copy-2-line-mPSDKieb.js"),[],import.meta.url),quote:{module:()=>A(()=>import("./icons/quote-left-line-NQzeELMO.js"),[],import.meta.url),rtl:!0},settings:()=>A(()=>import("./icons/settings-6-line-ZgCBilgF.js"),[],import.meta.url),"heart-break":()=>A(()=>import("./icons/heart-crack-line-P3DoKfTT.js"),[],import.meta.url),"user-x":()=>A(()=>import("./icons/user-x-line-zIdph-gu.js"),[],import.meta.url),minimize:()=>A(()=>import("./icons/arrows-down-line-ovOF9r0o.js"),[],import.meta.url)},nc={s:12,m:16,l:20,xl:24,xxl:32},ti={},oc=xa(function({width:e,height:t,body:n,rotate:o,flip:i}){return r("svg",{viewBox:`0 0 ${e} ${t}`,dangerouslySetInnerHTML:{__html:n},style:{transform:`${o?`rotate(${o})`:""} ${i?"scaleX(-1)":""}`}})},{isShallowEqual:!0,maxSize:Object.keys(ts).length,matchesArg:(e,t)=>e.icon===t.icon&&e.body===t.body});function M({icon:e,size:t="m",alt:n,title:o,class:i="",style:s={}}){if(!e)return null;const a=nc[t];let c=ts[e];if(!c)return null;let l,u,f=!1;Array.isArray(c)?[c,l,u]=c:typeof c=="object"&&({rotate:l,flip:u,rtl:f}=c,c=c.module);const[d,m]=W(ti[e]),h=$(e);return J(()=>{d&&h.current===e||((async()=>{const p=await c();m(p.default),ti[e]=p.default})(),h.current=e)},[e]),r("span",{class:`icon ${i} ${f?"rtl-flip":""}`,title:o||n,style:{width:`${a}px`,height:`${a}px`,...s},"data-icon":e,children:d&&r(oc,{icon:e,width:d.width,height:d.height,body:d.body,rotate:l,flip:u})})}function rc(e,t=[]){!e||typeof e!="function"||J(()=>{const n=new CloseWatcher;return n.addEventListener("close",e),()=>{n.destroy()}},t)}const ic=window.CloseWatcher?rc:()=>{},sc=document.getElementById("modal-container");function Qo({children:e,onClose:t,onClick:n,class:o,minimized:i}){if(!e)return null;const s=$();J(()=>{let u=setTimeout(()=>{var d;const f=(d=s.current)==null?void 0:d.querySelector('[tabindex="-1"]');f&&f.focus()},100);return()=>clearTimeout(u)},[]);const a=window.CloseWatcher,c=Ht("esc",()=>{setTimeout(()=>{t==null||t()},0)},{enabled:!a&&!!t,keydown:!1,keyup:!0},[t]);ic(t,[t]),J(()=>{const u=document.querySelectorAll(".deck-container");if(i){const f=u[u.length-1];f&&f.tabIndex===-1&&f.focus()}else e?u.forEach(f=>{f.setAttribute("inert","")}):u.forEach(f=>{f.removeAttribute("inert")});return()=>{u.forEach(f=>{f.removeAttribute("inert")})}},[e,i]);const l=r("div",{ref:u=>{var f;s.current=u,c(((f=u==null?void 0:u.querySelector)==null?void 0:f.call(u,'[tabindex="-1"]'))||u)},className:o,onClick:u=>{n==null||n(u),u.target===u.currentTarget&&(t==null||t(u))},tabIndex:i?0:"-1",inert:i,onFocus:u=>{var f,d;try{if(u.target===u.currentTarget){const m=(f=s.current)==null?void 0:f.querySelector('[tabindex="-1"]'),h=!!m&&((d=getComputedStyle(m))==null?void 0:d.pointerEvents)!=="none";m&&h&&m.focus()}}catch{}},children:e});return io(l,sc)}var br={exports:{}},ac="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED",cc=ac;var lc=cc;function ns(){}function os(){}os.resetWarningCache=ns;var uc=function(){function e(o,i,s,a,c,l){if(l!==lc){var u=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw u.name="Invariant Violation",u}}e.isRequired=e;function t(){return e}var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:os,resetWarningCache:ns};return n.PropTypes=n,n};var Nf=br.exports;if(0)var Ff,zf;else br.exports=uc();var U=br.exports;const Tr=e=>!!e&&e[0]==="o",Jo=ka||(e=>e());const bn=(e,t)=>e===!0||!!(e&&e[t]),He=(e,t)=>typeof e=="function"?e(t):e,dc="_szhsinMenu",fc=e=>e[dc];const Jt=(e,t)=>(t&&Object.keys(t).forEach(n=>{const o=e[n],i=t[n];typeof i=="function"&&o?e[n]=(...s)=>{i(...s),o(...s)}:e[n]=i}),e),hc=e=>{if(typeof e!="string")return{top:0,right:0,bottom:0,left:0};const t=e.trim().split(/\s+/,4).map(parseFloat),n=isNaN(t[0])?0:t[0],o=isNaN(t[1])?n:t[1];return{top:n,right:o,bottom:isNaN(t[2])?n:t[2],left:isNaN(t[3])?o:t[3]}},Po=e=>{for(;e;){if(e=e.parentNode,!e||e===document.body||!e.parentNode)return;const{overflow:t,overflowX:n,overflowY:o}=getComputedStyle(e);if(/auto|scroll|overlay|hidden/.test(t+o+n))return e}};function _o(e,t){return{"aria-disabled":e||void 0,tabIndex:t?0:-1}}function ni(e,t){for(let n=0;n({[e?`${e}ClassName`:"className"]:U.oneOfType([U.string,U.func])}),mc={className:U.string,...pc("menu"),arrowProps:U.object,focusProps:U.object,menuStyle:U.object,arrow:U.bool,setDownOverflow:U.bool,gap:U.number,shift:U.number,align:U.oneOf(["start","center","end"]),direction:U.oneOf(["left","right","top","bottom"]),position:U.oneOf(["auto","anchor","initial"]),overflow:U.oneOf(["auto","visible","hidden"])},Vf={...mc,containerProps:U.object,initialMounted:U.bool,unmountOnClose:U.bool,transition:U.oneOfType([U.bool,U.exact({open:U.bool,close:U.bool,item:U.bool})]),transitionTimeout:U.number,boundingBoxRef:U.object,boundingBoxPadding:U.string,reposition:U.oneOf(["auto","initial"]),repositionFlag:U.oneOfType([U.string,U.number]),viewScroll:U.oneOf(["auto","close","initial"]),submenuOpenDelay:U.number,submenuCloseDelay:U.number,portal:U.oneOfType([U.bool,U.exact({target:U.object,stablePosition:U.bool})]),theming:U.string,onItemClick:U.func},Hf={instanceRef:U.oneOfType([U.object,U.func]),onMenuChange:U.func},et=({block:e,element:t,modifiers:n,className:o})=>le(()=>{const i=t?`${e}__${t}`:e;let s=i;n&&Object.keys(n).forEach(c=>{const l=n[c];l&&(s+=` ${i}--${l===!0?c:`${c}-${l}`}`)});let a=typeof o=="function"?o(n):o;return typeof a=="string"&&(a=a.trim(),a&&(s+=` ${a}`)),s},[e,t,n,o]),gc="szh-menu-container",Je="szh-menu";const vc="arrow",Er="item",_c="divider",yc="header",bc="group",Tc="submenu";const rs=lt(),wr=lt({}),ao=lt({}),xr=lt({}),Ec=lt({}),yo=lt({}),Fe=Object.freeze({ENTER:"Enter",ESC:"Escape",SPACE:" ",HOME:"Home",END:"End",LEFT:"ArrowLeft",RIGHT:"ArrowRight",UP:"ArrowUp",DOWN:"ArrowDown"}),we=Object.freeze({RESET:0,SET:1,UNSET:2,INCREASE:3,DECREASE:4,FIRST:5,LAST:6,SET_INDEX:7}),Tn=Object.freeze({CLICK:"click",CANCEL:"cancel",BLUR:"blur",SCROLL:"scroll"}),Ut=Object.freeze({FIRST:"first",LAST:"last"}),wc=Object.freeze({entering:"opening",entered:"open",exiting:"closing",exited:"closed"}),Lo="absolute",En="none",kr="menuitem";const xc=({className:e,containerRef:t,containerProps:n,children:o,isOpen:i,theming:s,transition:a,onClose:c})=>{const l=bn(a,"item");return r("div",{...Jt({onKeyDown:({key:d})=>{switch(d){case Fe.ESC:He(c,{key:d,reason:Tn.CANCEL});break}},onBlur:d=>{i&&!d.currentTarget.contains(d.relatedTarget)&&He(c,{reason:Tn.BLUR})}},n),className:et({block:gc,modifiers:le(()=>({theme:s,itemTransition:l}),[s,l]),className:e}),style:{position:"absolute",...n==null?void 0:n.style},ref:t,children:o})},kc=()=>{let e,t=0;return{toggle:n=>{n?t++:t--,t=Math.max(t,0)},on:(n,o,i)=>{t?e||(e=setTimeout(()=>{e=0,o()},n)):i==null||i()},off:()=>{e&&(clearTimeout(e),e=0)}}},Sc=(e,t)=>{const[n,o]=W(),s=$({items:[],hoverIndex:-1,sorted:!1}).current,a=Pe((l,u)=>{const{items:f}=s;if(!l)s.items=[];else if(u)f.push(l);else{const d=f.indexOf(l);d>-1&&(f.splice(d,1),l.contains(document.activeElement)&&(t.current.focus(),o()))}s.hoverIndex=-1,s.sorted=!1},[s,t]),c=Pe((l,u,f)=>{const{items:d,hoverIndex:m}=s,h=()=>{if(s.sorted)return;const v=e.current.querySelectorAll(".szh-menu__item");d.sort((T,y)=>ni(v,T)-ni(v,y)),s.sorted=!0};let p=-1,g;switch(l){case we.RESET:break;case we.SET:g=u;break;case we.UNSET:g=v=>v===u?void 0:v;break;case we.FIRST:h(),p=0,g=d[p];break;case we.LAST:h(),p=d.length-1,g=d[p];break;case we.SET_INDEX:h(),p=f,g=d[p];break;case we.INCREASE:h(),p=m,p<0&&(p=d.indexOf(u)),p++,p>=d.length&&(p=0),g=d[p];break;case we.DECREASE:h(),p=m,p<0&&(p=d.indexOf(u)),p--,p<0&&(p=d.length-1),g=d[p];break;default:}g||(p=-1),o(g),s.hoverIndex=p},[e,s]);return{hoverItem:n,dispatch:c,updateItems:a}},oi=(e,t)=>Math.round(e)===t?e:t,is=e=>{const t=e.getBoundingClientRect();return t.width=oi(t.width,e.offsetWidth),t.height=oi(t.height,e.offsetHeight),t},Ic=(e,t,n,o)=>{const i=is(t.current),s=e.current.getBoundingClientRect(),a=n===window?{left:0,top:0,right:document.documentElement.clientWidth,bottom:window.innerHeight}:n.getBoundingClientRect(),c=hc(o),l=p=>p+s.left-a.left-c.left,u=p=>p+s.left+i.width-a.right+c.right,f=p=>p+s.top-a.top-c.top,d=p=>p+s.top+i.height-a.bottom+c.bottom;return{menuRect:i,containerRect:s,getLeftOverflow:l,getRightOverflow:u,getTopOverflow:f,getBottomOverflow:d,confineHorizontally:p=>{let g=l(p);if(g<0)p-=g;else{const v=u(p);v>0&&(p-=v,g=l(p),g<0&&(p-=g))}return p},confineVertically:p=>{let g=f(p);if(g<0)p-=g;else{const v=d(p);v>0&&(p-=v,g=f(p),g<0&&(p-=g))}return p}}},Ac=({arrowRef:e,menuY:t,anchorRect:n,containerRect:o,menuRect:i})=>{let s=n.top-o.top-t+n.height/2;const a=e.current.offsetHeight*1.25;return s=Math.max(a,s),s=Math.min(s,i.height-a),s},Cc=({anchorRect:e,containerRect:t,menuRect:n,placeLeftorRightY:o,placeLeftX:i,placeRightX:s,getLeftOverflow:a,getRightOverflow:c,confineHorizontally:l,confineVertically:u,arrowRef:f,arrow:d,direction:m,position:h})=>{let p=m,g=o;h!=="initial"&&(g=u(g),h==="anchor"&&(g=Math.min(g,e.bottom-t.top),g=Math.max(g,e.top-t.top-n.height)));let v,T,y;return p==="left"?(v=i,h!=="initial"&&(T=a(v),T<0&&(y=c(s),(y<=0||-T>y)&&(v=s,p="right")))):(v=s,h!=="initial"&&(y=c(v),y>0&&(T=a(i),(T>=0||-T{let s=n.left-o.left-t+n.width/2;const a=e.current.offsetWidth*1.25;return s=Math.max(a,s),s=Math.min(s,i.width-a),s},Lc=({anchorRect:e,containerRect:t,menuRect:n,placeToporBottomX:o,placeTopY:i,placeBottomY:s,getTopOverflow:a,getBottomOverflow:c,confineHorizontally:l,confineVertically:u,arrowRef:f,arrow:d,direction:m,position:h})=>{let p=m==="top"?"top":"bottom",g=o;h!=="initial"&&(g=l(g),h==="anchor"&&(g=Math.min(g,e.right-t.left),g=Math.max(g,e.left-t.left-n.width)));let v,T,y;return p==="top"?(v=i,h!=="initial"&&(T=a(v),T<0&&(y=c(s),(y<=0||-T>y)&&(v=s,p="bottom")))):(v=s,h!=="initial"&&(y=c(v),y>0&&(T=a(i),(T>=0||-T{const{menuRect:u,containerRect:f}=l,d=n==="left"||n==="right";let m=d?o:i,h=d?i:o;if(e){const E=c.current;d?m+=E.offsetWidth:h+=E.offsetHeight}const p=a.left-f.left-u.width-m,g=a.right-f.left+m,v=a.top-f.top-u.height-h,T=a.bottom-f.top+h;let y,x;t==="end"?(y=a.right-f.left-u.width,x=a.bottom-f.top-u.height):t==="center"?(y=a.left-f.left-(u.width-a.width)/2,x=a.top-f.top-(u.height-a.height)/2):(y=a.left-f.left,x=a.top-f.top),y+=m,x+=h;const w={...l,anchorRect:a,placeLeftX:p,placeRightX:g,placeLeftorRightY:x,placeTopY:v,placeBottomY:T,placeToporBottomX:y,arrowRef:c,arrow:e,direction:n,position:s};switch(n){case"left":case"right":return Cc(w);case"top":case"bottom":default:return Lc(w)}},jt=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u"?Wt:J;function ri(e,t){typeof e=="function"?e(t):e.current=t}const en=(e,t)=>le(()=>e?t?n=>{ri(e,n),ri(t,n)}:e:t,[e,t]),ii=-9999,ss=({ariaLabel:e,menuClassName:t,menuStyle:n,arrow:o,arrowProps:i={},anchorPoint:s,anchorRef:a,containerRef:c,containerProps:l,focusProps:u,externalRef:f,parentScrollingRef:d,align:m="start",direction:h="bottom",position:p="auto",overflow:g="visible",setDownOverflow:v,repositionFlag:T,captureFocus:y=!0,state:x,endTransition:w,isDisabled:E,menuItemFocus:b,gap:I=0,shift:D=0,children:R,onClose:S,...C})=>{const[L,Y]=W({x:ii,y:ii}),[z,ue]=W({}),[Q,se]=W(),[q,ae]=W(h),[ce]=W(kc),[de,V]=Ui(X=>X+1,1),{transition:he,boundingBoxRef:ee,boundingBoxPadding:Ce,rootMenuRef:Te,rootAnchorRef:xe,scrollNodesRef:Re,reposition:Ee,viewScroll:Oe,submenuCloseDelay:De}=ze(yo),{submenuCtx:te,reposSubmenu:F=T}=ze(ao),ke=$(null),Ze=$(),ie=$(),B=$(!1),{hoverItem:ne,dispatch:Z,updateItems:me}=Sc(ke,Ze),G=Tr(x),Ve=bn(he,"open"),oe=bn(he,"close"),ve=Re.current,An=X=>{switch(X.key){case Fe.HOME:Z(we.FIRST);break;case Fe.END:Z(we.LAST);break;case Fe.UP:Z(we.DECREASE,ne);break;case Fe.DOWN:Z(we.INCREASE,ne);break;case Fe.SPACE:X.target&&X.target.className.indexOf(Je)!==-1&&X.preventDefault();return;default:return}X.preventDefault(),X.stopPropagation()},pe=()=>{x==="closing"&&se(),He(w)},_e=X=>{X.stopPropagation(),ce.on(De,()=>{Z(we.RESET),Ze.current.focus()})},Ge=X=>{X.target===X.currentTarget&&ce.off()},ye=Pe(X=>{var be;const Ae=a?(be=a.current)==null?void 0:be.getBoundingClientRect():s?{left:s.x,right:s.x,top:s.y,bottom:s.y,width:0,height:0}:null;if(!Ae)return;ve.menu||(ve.menu=(ee?ee.current:Po(Te.current))||window);const Be=Ic(c,ke,ve.menu,Ce);let{arrowX:Se,arrowY:ot,x:Ln,y:bt,computedDirection:qe}=Mc({arrow:o,align:m,direction:h,gap:I,shift:D,position:p,anchorRect:Ae,arrowRef:ie,positionHelpers:Be});const{menuRect:Mn}=Be,Ke=Mn.height;if(!X&&g!=="visible"){const{getTopOverflow:Tt,getBottomOverflow:To}=Be;let Et,fe;const wt=To(bt);if(wt>0)Et=Ke-wt,fe=wt;else{const Rt=Tt(bt);Rt<0&&(Et=Ke+Rt,fe=0-Rt,Et>=0&&(bt-=Rt))}Et>=0&&se({height:Et,overflowAmt:fe})}o&&ue({x:Se,y:ot}),Y({x:Ln,y:bt}),ae(qe)},[o,m,Ce,h,I,D,p,g,s,a,c,ee,Te,ve]);jt(()=>{G&&(ye(),B.current&&V()),B.current=G},[G,ye,F]),jt(()=>{Q&&!v&&(ke.current.scrollTop=0)},[Q,v]),jt(()=>me,[me]),J(()=>{let{menu:X}=ve;if(!G||!X)return;if(X=X.addEventListener?X:window,!ve.anchors){ve.anchors=[];let Se=Po(xe&&xe.current);for(;Se&&Se!==X;)ve.anchors.push(Se),Se=Po(Se)}let be=Oe;if(ve.anchors.length&&be==="initial"&&(be="auto"),be==="initial")return;const Ae=()=>{be==="auto"?Jo(()=>ye(!0)):He(S,{reason:Tn.SCROLL})},Be=ve.anchors.concat(Oe!=="initial"?X:[]);return Be.forEach(Se=>Se.addEventListener("scroll",Ae)),()=>Be.forEach(Se=>Se.removeEventListener("scroll",Ae))},[xe,ve,G,S,Oe,ye]);const tt=!!Q&&Q.overflowAmt>0;J(()=>{if(tt||!G||!d)return;const X=()=>Jo(ye),be=d.current;return be.addEventListener("scroll",X),()=>be.removeEventListener("scroll",X)},[G,tt,d,ye]),J(()=>{if(!G||typeof ResizeObserver!="function"||Ee==="initial")return;const X=[],be=new ResizeObserver(Se=>Se.forEach(({target:ot})=>{X.indexOf(ot)<0?X.push(ot):Sa(()=>{ye(),V()})})),Ae={box:"border-box"};be.observe(ke.current,Ae);const Be=a==null?void 0:a.current;return Be&&be.observe(Be,Ae),()=>be.disconnect()},[G,Ee,a,ye]),J(()=>{if(!G){Z(we.RESET),oe||se();return}const{position:X,alwaysUpdate:be}=b||{},Ae=()=>{X===Ut.FIRST?Z(we.FIRST):X===Ut.LAST?Z(we.LAST):X>=-1&&Z(we.SET_INDEX,void 0,X)};if(be)Ae();else if(y){const Be=setTimeout(()=>{const Se=ke.current;Se&&!Se.contains(document.activeElement)&&(Ze.current.focus(),Ae())},Ve?170:100);return()=>clearTimeout(Be)}},[G,Ve,oe,y,b,Z]);const Cn=le(()=>({isParentOpen:G,submenuCtx:ce,dispatch:Z,updateItems:me}),[G,ce,Z,me]);let dt,Lt;Q&&(v?Lt=Q.overflowAmt:dt=Q.height);const bo=le(()=>({reposSubmenu:de,submenuCtx:ce,overflow:g,overflowAmt:Lt,parentMenuRef:ke,parentDir:q}),[de,ce,g,Lt,q]),ge=dt>=0?{maxHeight:dt,overflow:g}:void 0,Mt=le(()=>({state:x,align:m,dir:q}),[x,m,q]),yt=le(()=>({dir:q}),[q]),nt=et({block:Je,element:vc,modifiers:yt,className:i.className}),Pn=r("ul",{role:"menu","aria-label":e,..._o(E),...Jt({onPointerEnter:te==null?void 0:te.off,onPointerMove:_e,onPointerLeave:Ge,onKeyDown:An,onAnimationEnd:pe},C),ref:en(f,ke),className:et({block:Je,modifiers:Mt,className:t}),style:{...n,...ge,margin:0,display:x==="closed"?"none":void 0,position:Lo,left:L.x,top:L.y},children:[r("li",{tabIndex:-1,role:En,style:{position:Lo,left:0,top:0,display:"block",outline:"none"},ref:Ze,...u}),o&&r("li",{role:En,...i,className:nt,style:{display:"block",position:Lo,left:z.x,top:z.y,...i.style},ref:ie}),r(ao.Provider,{value:bo,children:r(wr.Provider,{value:Cn,children:r(rs.Provider,{value:ne,children:He(R,Mt)})})})]});return l?r(xc,{...l,isOpen:G,children:Pn}):Pn},as=Ct(function({"aria-label":t,className:n,containerProps:o,initialMounted:i,unmountOnClose:s,transition:a,transitionTimeout:c,boundingBoxRef:l,boundingBoxPadding:u,reposition:f="auto",submenuOpenDelay:d=300,submenuCloseDelay:m=150,viewScroll:h="initial",portal:p,theming:g,onItemClick:v,...T},y){const x=$(null),w=$({}),{anchorRef:E,state:b,onClose:I}=T,D=le(()=>({initialMounted:i,unmountOnClose:s,transition:a,transitionTimeout:c,boundingBoxRef:l,boundingBoxPadding:u,rootMenuRef:x,rootAnchorRef:E,scrollNodesRef:w,reposition:f,viewScroll:h,submenuOpenDelay:d,submenuCloseDelay:m}),[i,s,a,c,E,l,u,f,h,d,m]),R=le(()=>({handleClick(C,L){C.stopPropagation||He(v,C);let Y=C.keepOpen;Y===void 0&&(Y=L&&C.key===Fe.SPACE),Y||He(I,{value:C.value,key:C.key,reason:Tn.CLICK})},handleClose(C){He(I,{key:C,reason:Tn.CLICK})}}),[v,I]);if(!b)return null;const S=r(yo.Provider,{value:D,children:r(xr.Provider,{value:R,children:r(ss,{...T,ariaLabel:t||"Menu",externalRef:y,containerRef:x,containerProps:{className:n,containerRef:x,containerProps:o,theming:g,transition:a,onClose:I}})})});return p===!0&&typeof document<"u"?io(S,document.body):p?p.target?io(S,p.target):p.stablePosition?null:S:S}),er=0,tr=1,co=2,lo=3,uo=4,Rc=5,cs=6,Oc=["preEnter","entering","entered","preExit","exiting","exited","unmounted"],ls=e=>({_s:e,status:Oc[e],isEnter:euo}),nr=e=>e?cs:Rc,Dc=(e,t)=>{switch(e){case tr:case er:return co;case uo:case lo:return nr(t)}},$c=e=>typeof e=="object"?[e.enter,e.exit]:[e,e],si=(e,t,n,o,i)=>{clearTimeout(o.current);const s=ls(e);t(s),n.current=s,i&&i({current:s})},Nc=({enter:e=!0,exit:t=!0,preEnter:n,preExit:o,timeout:i,initialEntered:s,mountOnEnter:a,unmountOnExit:c,onStateChange:l}={})=>{const[u,f]=W(()=>ls(s?co:nr(a))),d=$(u),m=$(),[h,p]=$c(i),g=Pe(()=>{const T=Dc(d.current._s,c);T&&si(T,f,d,m,l)},[l,c]),v=Pe(T=>{const y=w=>{switch(si(w,f,d,m,l),w){case tr:h>=0&&(m.current=setTimeout(g,h));break;case uo:p>=0&&(m.current=setTimeout(g,p));break;case er:case lo:m.current=setTimeout(()=>y(w+1),0);break}},x=d.current.isEnter;typeof T!="boolean"&&(T=!x),T?!x&&y(e?n?er:tr:co):x&&y(t?o?lo:uo:nr(c))},[g,l,e,t,n,o,h,p,c]);return J(()=>()=>clearTimeout(m.current),[]),[u,v,g]};const Fc=({initialOpen:e,initialMounted:t,unmountOnClose:n,transition:o,transitionTimeout:i=500}={})=>{const[{status:s},a,c]=Nc({initialEntered:e,mountOnEnter:!t,unmountOnExit:n,timeout:i,enter:bn(o,"open"),exit:bn(o,"close")});return[{state:wc[s],endTransition:c},a]},us=e=>{const[t,n]=Fc(e),[o,i]=W(),s=(a,c)=>{i({position:a,alwaysUpdate:c}),n(!0)};return[{menuItemFocus:o,...t},n,s]},zc=(e,t)=>{const[n]=W({});return{onMouseDown:()=>{n.v=e&&e!=="closed"},onClick:o=>n.v?n.v=!1:t(!0,o)}},ds=(e,t)=>{const n=$(t);J(()=>{n.current!==t&&He(e,{open:t}),n.current=t},[e,t])},Vc=Ct(function({"aria-label":t,captureFocus:n,initialOpen:o,menuButton:i,instanceRef:s,onMenuChange:a,...c},l){const[u,f,d]=us(c),{state:m}=u,h=Tr(m),p=$(null),g=zc(m,(E,b)=>d(b.detail?void 0:Ut.FIRST)),v=Pe(E=>{f(!1),E.key&&p.current.focus()},[f]),T=E=>{switch(E.key){case Fe.UP:d(Ut.LAST);break;case Fe.DOWN:d(Ut.FIRST);break;default:return}E.preventDefault()},y=He(i,{open:h});if(!y||!y.type)throw new Error("Menu requires a menuButton prop.");const x={ref:en(y.ref,p),...Jt({onKeyDown:T,...g},y.props)};fc(y.type)==="MenuButton"&&(x.isOpen=h);const w=ji(y,x);return ds(a,h),Ki(s,()=>({openMenu:d,closeMenu:()=>f(!1)})),r(N,{children:[w,r(as,{...c,...u,"aria-label":t||(typeof y.props.children=="string"?y.props.children:"Menu"),anchorRef:p,ref:l,onClose:v})]})}),Sr=(e,t)=>{const n=Qt(t),o=Ct((i,s)=>{const a=$(null);return r(n,{...i,itemRef:a,externalRef:s,isHovering:ze(rs)===a.current})});return o.displayName=`WithHovering(${e})`,o},fs=(e,t,n)=>{jt(()=>{if(e)return;const o=t.current;return n(o,!0),()=>{n(o)}},[e,t,n])},Hc=Sr("SubMenu",function({"aria-label":t,className:n,disabled:o,direction:i,label:s,openTrigger:a,onMenuChange:c,isHovering:l,instanceRef:u,itemRef:f,captureFocus:d,repositionFlag:m,itemProps:h={},...p}){const g=ze(yo),{rootMenuRef:v,submenuOpenDelay:T,submenuCloseDelay:y}=g,{parentMenuRef:x,parentDir:w,overflow:E}=ze(ao),{isParentOpen:b,submenuCtx:I,dispatch:D,updateItems:R}=ze(wr),S=E!=="visible",[C,L,Y]=us(g),{state:z}=C,ue=!!o,Q=Tr(z),se=$(null),[q]=W({v:0}),ae=()=>{I.off(),q.v&&(clearTimeout(q.v),q.v=0)},ce=(...F)=>{ae(),de(),!ue&&Y(...F)},de=()=>!l&&!ue&&D(we.SET,f.current),V=F=>{de(),a||(q.v=setTimeout(()=>Jo(ce),Math.max(F,0)))},he=F=>{ue||(F.stopPropagation(),!(q.v||Q)&&I.on(y,()=>V(T-y),()=>V(T)))},ee=()=>{ae(),Q||D(we.UNSET,f.current)},Ce=F=>{if(l)switch(F.key){case Fe.ENTER:F.preventDefault();case Fe.SPACE:case Fe.RIGHT:a!=="none"&&ce(Ut.FIRST)}},Te=F=>{let ke=!1;switch(F.key){case Fe.LEFT:Q&&(f.current.focus(),L(!1),ke=!0);break;case Fe.RIGHT:Q||(ke=!0);break}ke&&(F.preventDefault(),F.stopPropagation())};fs(ue,f,R),ds(c,Q),J(()=>I.toggle(Q),[I,Q]),J(()=>()=>clearTimeout(q.v),[q]),J(()=>{l&&b?f.current.focus():L(!1)},[l,b,L,f]),Ki(u,()=>({openMenu:(...F)=>{b&&ce(...F)},closeMenu:()=>{Q&&(f.current.focus(),L(!1))}}));const xe=le(()=>({open:Q,hover:l,disabled:ue,submenu:!0}),[Q,l,ue]),{ref:Re,className:Ee,...Oe}=h,De=Jt({onPointerEnter:I.off,onPointerMove:he,onPointerLeave:ee,onKeyDown:Ce,onClick:()=>a!=="none"&&ce()},Oe),te=()=>{const F=r(ss,{...p,...C,ariaLabel:t||(typeof s=="string"?s:"Submenu"),anchorRef:f,containerRef:S?v:se,direction:i||(w==="right"||w==="left"?w:"right"),parentScrollingRef:S&&x,isDisabled:ue}),ke=v.current;return S&&ke?io(F,ke):F};return r("li",{className:et({block:Je,element:Tc,className:n}),style:{position:"relative"},role:En,ref:se,onKeyDown:Te,children:[r("div",{role:kr,"aria-haspopup":!0,"aria-expanded":Q,..._o(ue,l),...De,ref:en(Re,f),className:et({block:Je,element:Er,modifiers:xe,className:Ee}),children:le(()=>He(s,xe),[s,xe])}),z&&te()]})}),hs=(e,t,n,o)=>{const{submenuCloseDelay:i}=ze(yo),{isParentOpen:s,submenuCtx:a,dispatch:c,updateItems:l}=ze(wr),u=()=>{!n&&!o&&c(we.SET,e.current)},f=()=>{!o&&c(we.UNSET,e.current)},d=p=>{n&&!p.currentTarget.contains(p.relatedTarget)&&f()},m=p=>{o||(p.stopPropagation(),a.on(i,u,u))},h=(p,g)=>{a.off(),!g&&f()};return fs(o,e,l),J(()=>{n&&s&&t.current&&t.current.focus()},[t,n,s]),{setHover:u,onBlur:d,onPointerMove:m,onPointerLeave:h}},Ie=Sr("MenuItem",function({className:t,value:n,href:o,type:i,checked:s,disabled:a,children:c,onClick:l,isHovering:u,itemRef:f,externalRef:d,...m}){const h=!!a,{setHover:p,...g}=hs(f,f,u,h),v=ze(xr),T=ze(Ec),y=i==="radio",x=i==="checkbox",w=!!o&&!h&&!y&&!x,E=y?T.value===n:x?!!s:!1,b=C=>{if(h){C.stopPropagation(),C.preventDefault();return}const L={value:n,syntheticEvent:C};C.key!==void 0&&(L.key=C.key),x&&(L.checked=!E),y&&(L.name=T.name),He(l,L),y&&He(T.onRadioChange,L),v.handleClick(L,x||y)},I=C=>{if(u)switch(C.key){case Fe.ENTER:C.preventDefault();case Fe.SPACE:w?f.current.click():b(C)}},D=le(()=>({type:i,disabled:h,hover:u,checked:E,anchor:w}),[i,h,u,E,w]),R=Jt({...g,onPointerDown:p,onKeyDown:I,onClick:b},m),S={role:y?"menuitemradio":x?"menuitemcheckbox":kr,"aria-checked":y||x?E:void 0,..._o(h,u),...R,ref:en(d,f),className:et({block:Je,element:Er,modifiers:D,className:t}),children:le(()=>He(c,D),[c,D])};return w?r("li",{role:En,children:r("a",{href:o,...S})}):r("li",{...S})}),Bc=Sr("FocusableItem",function({className:t,disabled:n,children:o,isHovering:i,itemRef:s,externalRef:a,...c}){const l=!!n,u=$(null),{setHover:f,onPointerLeave:d,...m}=hs(s,u,i,l),{handleClose:h}=ze(xr),p=le(()=>({disabled:l,hover:i,focusable:!0}),[l,i]),g=le(()=>He(o,{...p,ref:u,closeMenu:h}),[o,p,h]),v=Jt({...m,onPointerLeave:T=>d(T,!0),onFocus:f},c);return r("li",{role:kr,..._o(l),...v,ref:en(a,s),className:et({block:Je,element:Er,modifiers:p,className:t}),children:g})}),sn=Qt(Ct(function({className:t,...n},o){return r("li",{role:"separator",...n,ref:o,className:et({block:Je,element:_c,className:t})})})),Bf=Qt(Ct(function({className:t,...n},o){return r("li",{role:En,...n,ref:o,className:et({block:Je,element:yc,className:t})})})),Uf=Ct(function({className:t,style:n,takeOverflow:o,...i},s){const a=$(null),[c,l]=W(),{overflow:u,overflowAmt:f}=ze(ao);return jt(()=>{let d;o&&f>=0&&(d=is(a.current).height-f,d<0&&(d=0)),l(d>=0?{maxHeight:d,overflow:u}:void 0)},[o,u,f]),jt(()=>{c&&(a.current.scrollTop=0)},[c]),r("div",{...i,ref:en(s,a),className:et({block:Je,element:bc,className:t}),style:{...n,...c}})});const ai={s:16,m:20,l:24,xl:32,xxl:50,xxxl:64},an={},dn=window.OffscreenCanvas?new OffscreenCanvas(1,1):document.createElement("canvas"),to=dn.getContext("2d",{willReadFrequently:!0});to.imageSmoothingEnabled=!1;const Uc=/missing\.png$/;function jc({url:e,size:t,alt:n="",squircle:o,...i}){t=ai[t]||t||ai.m;const s=$(),a=Uc.test(e);return r("span",{ref:s,class:`avatar ${o?"squircle":""} ${an[e]?"has-alpha":""}`,style:{width:t,height:t},title:n,...i,children:!!e&&r("img",{src:e,width:t,height:t,alt:n,loading:"lazy",decoding:"async",crossOrigin:an[e]===void 0&&!a?"anonymous":void 0,onError:c=>{c.target.crossOrigin&&(c.target.crossOrigin=null,c.target.src=e)},onLoad:c=>{s.current&&(s.current.dataset.loaded=!0),an[e]===void 0&&(a||setTimeout(()=>{try{const{width:l,height:u}=c.target;dn.width!==l&&(dn.width=l),dn.height!==u&&(dn.height=u),to.drawImage(c.target,0,0);const f=to.getImageData(0,0,l,u),d=f.data.filter((m,h)=>h%4===3&&m<=128).length/(f.data.length/4)>.1;d&&s.current.classList.add("has-alpha"),an[e]=d,to.clearRect(0,0,l,u)}catch{an[e]=!1}},1))}})})}const at=Me(jc),Zt=Ct((e,t)=>{var c;let n;try{n=Ia()}catch{}let o=(location.hash||"").replace(/^#/,"").trim();o===""&&(o="/");const{to:i,...s}=e;if(o&&o!=="/"&&o.includes("?")){const l=URL.parse(o,location.origin);if((c=l==null?void 0:l.searchParams)!=null&&c.size){const u=Array.from(l.searchParams.entries()).map(([f,d])=>`${f}=${encodeURIComponent(d)}`).join("&");o=l.pathname+"?"+u}}const a=o===i||decodeURIComponent(o)===i;return r("a",{ref:t,href:`#${i}`,...s,class:`${e.class||""} ${a?"is-active":""}`,onClick:l=>{var u,f,d;(f=(u=l.currentTarget)==null?void 0:u.parentNode)!=null&&f.closest("a")&&l.stopPropagation(),n&&(H.prevLocation=n),(d=e.onClick)==null||d.call(e,l)}})});let or=!1;const Kc=new MutationObserver(e=>{e.forEach(t=>{if(t.type==="attributes"){const{dir:n}=t.target;n==="rtl"?or=!0:or=!1}})});Kc.observe(document.documentElement,{attributes:!0,attributeFilter:["dir"]});function rr(){return or}const Wc=document.documentElement,jn=getComputedStyle(Wc),Zc=8;let ps=[0,0,0,0];function ms(){const e=jn.getPropertyValue("--sai-top"),t=jn.getPropertyValue("--sai-right"),n=jn.getPropertyValue("--sai-bottom"),o=jn.getPropertyValue("--sai-left");ps=[Math.max(0,parseInt(e,10)),Math.max(0,parseInt(t,10)),Math.max(0,parseInt(n,10)),Math.max(0,parseInt(o,10))]}requestAnimationFrame(ms);function gs(e=[]){return ps.map((n,o)=>(n||Zc)+(e[o]||0)).join(" ")}CSS.supports("top: env(safe-area-inset-top)")&&window.addEventListener("resize",ms,{passive:!0});function Gc(){const[e,t]=W({width:null,height:null});return Wt(()=>{const n=()=>{t({width:window.innerWidth,height:window.innerHeight})};return n(),window.addEventListener("resize",n,{passive:!0}),()=>{window.removeEventListener("resize",n)}},[]),e}function vs(e){const{containerProps:t,instanceRef:n,align:o}=e,i=Gc(),s=n!=null&&n.current?n:$(),a=rr()?o==="end"?"start":o==="start"?"end":o:o;return r(Vc,{boundingBoxPadding:gs(),repositionFlag:`${i.width}x${i.height}`,unmountOnClose:!0,...e,align:a,instanceRef:s,containerProps:{onClick:c=>{var l,u,f;c.target===c.currentTarget&&((u=(l=s.current)==null?void 0:l.closeMenu)==null||u.call(l)),(f=t==null?void 0:t.onClick)==null||f.call(t,c)},...t}})}function qc(e){const t=$();return r(Hc,{...e,instanceRef:t,itemProps:{onPointerMove:n=>{var o,i;n.pointerType==="touch"&&((i=(o=t.current)==null?void 0:o.openMenu)==null||i.call(o))},onPointerLeave:n=>{var o,i;n.pointerType==="touch"&&((i=(o=t.current)==null?void 0:o.openMenu)==null||i.call(o))},...e.itemProps}})}function Mo({subMenu:e=!1,confirm:t=!0,confirmLabel:n,menuItemClassName:o,menuFooter:i,menuExtras:s,...a}){const{children:c,onClick:l,...u}=a;return t?r(e?qc:vs,{openTrigger:"clickOnly",direction:"bottom",overflow:"auto",gap:-8,shift:8,menuClassName:"menu-emphasized",...u,menuButton:e?void 0:c,label:e?c:void 0,children:[r(Ie,{className:o,onClick:l,children:n}),s,i]}):e?r(Ie,{...a}):l?Aa(c,{onClick:l}):c}function ci(e){const{className:t,disabled:n,...o}=e;return r(Bc,{className:t,disabled:n,children:({ref:i,closeMenu:s})=>r(Zt,{...o,ref:i,onClick:({detail:a})=>s(a===0?"Enter":void 0)})})}function ir({staticUrl:e,alt:t,url:n}){return r("picture",{children:[e&&r("source",{srcset:e,media:"(prefers-reduced-motion: reduce)"}),r("img",{src:n,alt:t,class:"shortcode-emoji emoji",width:"16",height:"16",loading:"lazy",decoding:"async"},t||n)]})}const Yc=Me(e=>new RegExp(`:(${e.join("|")}):`,"g"));function Xc({text:e,emojis:t}){if(!e)return"";if(!(t!=null&&t.length)||e.indexOf(":")===-1)return e;const n=Yc(t.map(i=>i.shortcode));return e.split(n).map(i=>{const s=t.find(a=>a.shortcode===i);if(s){const{url:a,staticUrl:c}=s;return r(ir,{staticUrl:c,alt:i,url:a},i)}return i})}const Gt=Me(Xc),Qc=Me(e=>{const t={sensitivity:"base"};try{return new Intl.Collator(e||void 0,t)}catch{return new Intl.Collator(void 0,t)}}),Jc=/([^@]+)(@.+)/i,el=/(\:(\w|\+|\-)+\:)(?=|[\!\.\?]|$)/g,tl=/\s+/g,nl=/[^a-z0-9@\.]/gi;function ol({account:e,instance:t,showAvatar:n,showAcct:o,short:i,external:s,onClick:a}){const{i18n:c}=go(),{acct:l,avatar:u,avatarStatic:f,id:d,url:m,displayName:h,emojis:p,bot:g,username:v}=e,[T,y,x]=l.match(Jc)||[,l];t||(t=so().instance);const w=v.toLowerCase().trim(),E=(h||"").toLowerCase().trim(),b=E.replace(el,"").replace(tl,""),I=b.replace(nl,""),D=!i&&(w===E||w===b||w===I||Qc(c.locale).compare(w,b)===0)||I===l.toLowerCase();return r("a",{class:`name-text ${o?"show-acct":""} ${i?"short":""}`,href:m,target:s?"_blank":null,title:h?`${h} (${x?"":"@"}${l})`:`${x?"":"@"}${l}`,onClick:R=>{if(!s&&!R.shiftKey){if(R.preventDefault(),R.stopPropagation(),a)return a(R);if(R.metaKey||R.ctrlKey||R.shiftKey||R.which===2){const S=`#/${t}/a/${d}`;window.open(S,"_blank");return}H.showAccount={account:e,instance:t}}},children:[n&&r(N,{children:[r(at,{url:f||u,squircle:g})," "]}),h&&!i?r(N,{children:[r("b",{dir:"auto",children:r(Gt,{text:h,emojis:p})}),!o&&!D&&r(N,{children:[" ",r("i",{class:"bidi-isolate",children:["@",v]})]})]}):i?r("i",{children:v}):r("b",{children:v}),o&&r(N,{children:[r("br",{}),r("i",{class:"bidi-isolate",children:[x?"":"@",y,!!x&&r("span",{class:"ib",children:x})]})]})]})}const gt=Me(ol),Kn={"zh-YUE":"YUE",zh_HANT:"zh-Hant"},Ro=Me(e=>new Intl.DisplayNames(e||void 0,{type:"language"}));function rl(e){let t,n;typeof e=="object"&&({code:e,locale:t,fallback:n}=e);try{const o=Ro(t||k.locale).of(e);if(o!==e)return o;if(!n){const i=Ro(e).of(e);if(i!==e)return i}return n||""}catch{if(Kn[e])try{const i=Ro(Kn[t]||t||k.locale).of(Kn[e]);return i!==Kn[e]?i:n||""}catch{}return n||""}}const cn=Me(rl);function li(e){if(e instanceof Date)return!isNaN(e.getTime());{const t=new Date(e);return!isNaN(t.getTime())}}const il=Me(()=>new Intl.DateTimeFormat().resolvedOptions().locale),ui=Me((e,t={})=>{const n=e.replace(/-[a-z]+$/i,""),o=yn([n],[il()],e);try{return new Intl.DateTimeFormat(o,t)}catch{}try{return new Intl.DateTimeFormat(e,t)}catch{}return new Intl.DateTimeFormat(void 0,t)}),sl=Me(e=>new Intl.RelativeTimeFormat(e||void 0)),qt=60,Yt=60*qt,sr=24*Yt,al=e=>{const t=sl(k.locale),n=(e.getTime()-Date.now())/1e3,o=Math.abs(n);return o{const t=(Date.now()-e.getTime())/1e3;return tl+1,0),i=le(()=>new Date(e),[e]),[s,a,c]=le(()=>{if(!li(i))return[""+e,"",""];let l;if(t==="micro"){const u=new Date;(u.getTime()-i.getTime())/1e3/sr<=1?l=cl(i):u.getFullYear()===i.getFullYear()?l=ui(k.locale,{year:void 0,month:"short",day:"numeric"}).format(i):l=ui(k.locale,{dateStyle:"short"}).format(i)}return l||(l=al(i)),[l,i.toISOString(),i.toLocaleString()]},[i,t,n]);return J(()=>{if(!li(i))return;let l,u;function f(){u=requestAnimationFrame(()=>{o(),d()})}function d(){const m=(Date.now()-i.getTime())/1e3;m{clearTimeout(l),cancelAnimationFrame(u)}},[]),r("time",{datetime:a,title:c,children:s})}const ll=[{code:"af",name:"Afrikaans"},{code:"sq",name:"Albanian"},{code:"am",name:"Amharic"},{code:"ar",name:"Arabic"},{code:"hy",name:"Armenian"},{code:"as",name:"Assamese"},{code:"ay",name:"Aymara"},{code:"az",name:"Azerbaijani"},{code:"bm",name:"Bambara"},{code:"eu",name:"Basque"},{code:"be",name:"Belarusian"},{code:"bn",name:"Bengali"},{code:"bho",name:"Bhojpuri"},{code:"bs",name:"Bosnian"},{code:"bg",name:"Bulgarian"},{code:"ca",name:"Catalan"},{code:"ceb",name:"Cebuano"},{code:"ny",name:"Chichewa"},{code:"zh",name:"Chinese"},{code:"zh_HANT",name:"Chinese (Traditional)"},{code:"co",name:"Corsican"},{code:"hr",name:"Croatian"},{code:"cs",name:"Czech"},{code:"da",name:"Danish"},{code:"dv",name:"Dhivehi"},{code:"doi",name:"Dogri"},{code:"nl",name:"Dutch"},{code:"en",name:"English"},{code:"eo",name:"Esperanto"},{code:"et",name:"Estonian"},{code:"ee",name:"Ewe"},{code:"tl",name:"Filipino"},{code:"fi",name:"Finnish"},{code:"fr",name:"French"},{code:"fy",name:"Frisian"},{code:"gl",name:"Galician"},{code:"ka",name:"Georgian"},{code:"de",name:"German"},{code:"el",name:"Greek"},{code:"gn",name:"Guarani"},{code:"gu",name:"Gujarati"},{code:"ht",name:"Haitian Creole"},{code:"ha",name:"Hausa"},{code:"haw",name:"Hawaiian"},{code:"iw",name:"Hebrew"},{code:"hi",name:"Hindi"},{code:"hmn",name:"Hmong"},{code:"hu",name:"Hungarian"},{code:"is",name:"Icelandic"},{code:"ig",name:"Igbo"},{code:"ilo",name:"Ilocano"},{code:"id",name:"Indonesian"},{code:"ga",name:"Irish"},{code:"it",name:"Italian"},{code:"ja",name:"Japanese"},{code:"jw",name:"Javanese"},{code:"kn",name:"Kannada"},{code:"kk",name:"Kazakh"},{code:"km",name:"Khmer"},{code:"rw",name:"Kinyarwanda"},{code:"gom",name:"Konkani"},{code:"ko",name:"Korean"},{code:"kri",name:"Krio"},{code:"ku",name:"Kurdish (Kurmanji)"},{code:"ckb",name:"Kurdish (Sorani)"},{code:"ky",name:"Kyrgyz"},{code:"lo",name:"Lao"},{code:"la",name:"Latin"},{code:"lv",name:"Latvian"},{code:"ln",name:"Lingala"},{code:"lt",name:"Lithuanian"},{code:"lg",name:"Luganda"},{code:"lb",name:"Luxembourgish"},{code:"mk",name:"Macedonian"},{code:"mai",name:"Maithili"},{code:"mg",name:"Malagasy"},{code:"ms",name:"Malay"},{code:"ml",name:"Malayalam"},{code:"mt",name:"Maltese"},{code:"mi",name:"Maori"},{code:"mr",name:"Marathi"},{code:"mni-Mtei",name:"Meiteilon (Manipuri)"},{code:"lus",name:"Mizo"},{code:"mn",name:"Mongolian"},{code:"my",name:"Myanmar (Burmese)"},{code:"ne",name:"Nepali"},{code:"no",name:"Norwegian"},{code:"or",name:"Odia (Oriya)"},{code:"om",name:"Oromo"},{code:"ps",name:"Pashto"},{code:"fa",name:"Persian"},{code:"pl",name:"Polish"},{code:"pt",name:"Portuguese"},{code:"pa",name:"Punjabi"},{code:"qu",name:"Quechua"},{code:"ro",name:"Romanian"},{code:"ru",name:"Russian"},{code:"sm",name:"Samoan"},{code:"sa",name:"Sanskrit"},{code:"gd",name:"Scots Gaelic"},{code:"nso",name:"Sepedi"},{code:"sr",name:"Serbian"},{code:"st",name:"Sesotho"},{code:"sn",name:"Shona"},{code:"sd",name:"Sindhi"},{code:"si",name:"Sinhala"},{code:"sk",name:"Slovak"},{code:"sl",name:"Slovenian"},{code:"so",name:"Somali"},{code:"es",name:"Spanish"},{code:"su",name:"Sundanese"},{code:"sw",name:"Swahili"},{code:"sv",name:"Swedish"},{code:"tg",name:"Tajik"},{code:"ta",name:"Tamil"},{code:"tt",name:"Tatar"},{code:"te",name:"Telugu"},{code:"th",name:"Thai"},{code:"ti",name:"Tigrinya"},{code:"ts",name:"Tsonga"},{code:"tr",name:"Turkish"},{code:"tk",name:"Turkmen"},{code:"ak",name:"Twi"},{code:"uk",name:"Ukrainian"},{code:"ur",name:"Urdu"},{code:"ug",name:"Uyghur"},{code:"uz",name:"Uzbek"},{code:"vi",name:"Vietnamese"},{code:"cy",name:"Welsh"},{code:"xh",name:"Xhosa"},{code:"yi",name:"Yiddish"},{code:"yo",name:"Yoruba"},{code:"zu",name:"Zulu"}],ul=Me(()=>[new Intl.DateTimeFormat().resolvedOptions().locale,...navigator.languages]),dl=()=>yn(ul(),ll.map(e=>e.code.replace("_","-")),"en");function _s(e=!1){if(e){const{contentTranslationTargetLanguage:t}=H.settings;if(t)return t}return dl()}const fl=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,fo=e=>{if(typeof e!="string")throw new TypeError("Invalid argument expected string");const t=e.match(fl);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},di=e=>e==="*"||e==="x"||e==="X",fi=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},hl=(e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t],pl=(e,t)=>{if(di(e)||di(t))return 0;const[n,o]=hl(fi(e),fi(t));return n>o?1:n{for(let n=0;n{const n=fo(e),o=fo(t),i=n.pop(),s=o.pop(),a=Bt(n,o);return a!==0?a:i&&s?Bt(i.split("."),s.split(".")):i||s?i?-1:1:0},gl=(e,t,n)=>{vl(n);const o=ml(e,t);return ys[n].includes(o)},ys={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1],"!=":[-1,1]},hi=Object.keys(ys),vl=e=>{if(typeof e!="string")throw new TypeError(`Invalid operator type, expected string but got ${typeof e}`);if(hi.indexOf(e)===-1)throw new Error(`Invalid operator, expected one of ${hi.join("|")}`)},no=(e,t)=>{if(t=t.replace(/([><=]+)\s+/g,"$1"),t.includes("||"))return t.split("||").some(v=>no(e,v));if(t.includes(" - ")){const[v,T]=t.split(" - ",2);return no(e,`>=${v} <=${T}`)}else if(t.includes(" "))return t.trim().replace(/\s{2,}/g," ").split(" ").every(v=>no(e,v));const n=t.match(/^([<>=~^]+)/),o=n?n[1]:"=";if(o!=="^"&&o!=="~")return gl(e,t,o);const[i,s,a,,c]=fo(e),[l,u,f,,d]=fo(t),m=[i,s,a],h=[l,u??"x",f??"x"];if(d&&(!c||Bt(m,h)!==0||Bt(c.split("."),d.split("."))===-1))return!1;const p=h.findIndex(v=>v!=="0")+1,g=o==="~"?2:p>1?p:1;return!(Bt(m.slice(0,g),h.slice(0,g))!==0||Bt(m.slice(g),h.slice(g))===-1)};const _l={"@mastodon/edit-media-attributes":">=4.1","@mastodon/list-exclusive":">=4.2","@mastodon/filtered-notifications":"~4.3 || >=4.3","@mastodon/fetch-multiple-statuses":"~4.3 || >=4.3","@mastodon/trending-link-posts":"~4.3 || >=4.3","@mastodon/grouped-notifications":"~4.3 || >=4.3"},Oo=/pixelfed/i,rt=/^(?!.*pixelfed).*$/i,yl=/pleroma/i,bl=/akkoma/i,pi={"@mastodon/lists":rt,"@mastodon/filters":rt,"@mastodon/mentions":rt,"@mastodon/trending-hashtags":rt,"@mastodon/trending-links":rt,"@mastodon/post-bookmark":rt,"@mastodon/post-edit":rt,"@mastodon/profile-edit":rt,"@mastodon/profile-private-note":rt,"@pixelfed/trending":Oo,"@pixelfed/home-include-reblogs":Oo,"@pixelfed/global-feed":Oo,"@pleroma/local-visibility-post":yl,"@akkoma/local-visibility-post":bl},Wn={};function Zn(e){try{const{version:t,domain:n}=Ca(),o=`${n}-${e}`;if(Wn[o])return Wn[o];if(pi[e])return Wn[o]=pi[e].test(t);const i=_l[e];return i?Wn[o]=no(t,i,{includePrerelease:!0,loose:!0}):!1}catch{return!1}}const Kt=2147483647,Ye=36,Ir=1,wn=26,Tl=38,El=700,bs=72,Ts=128,Es="-",wl=/^xn--/,xl=/[^\0-\x7F]/,kl=/[\x2E\u3002\uFF0E\uFF61]/g,Sl={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Do=Ye-Ir,Xe=Math.floor,$o=String.fromCharCode;function ht(e){throw new RangeError(Sl[e])}function Il(e,t){const n=[];let o=e.length;for(;o--;)n[o]=t(e[o]);return n}function ws(e,t){const n=e.split("@");let o="";n.length>1&&(o=n[0]+"@",e=n[1]),e=e.replace(kl,".");const i=e.split("."),s=Il(i,t).join(".");return o+s}function xs(e){const t=[];let n=0;const o=e.length;for(;n=55296&&i<=56319&&nString.fromCodePoint(...e),Cl=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:Ye},mi=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},ks=function(e,t,n){let o=0;for(e=n?Xe(e/El):e>>1,e+=Xe(e/t);e>Do*wn>>1;o+=Ye)e=Xe(e/Do);return Xe(o+(Do+1)*e/(e+Tl))},Ss=function(e){const t=[],n=e.length;let o=0,i=Ts,s=bs,a=e.lastIndexOf(Es);a<0&&(a=0);for(let c=0;c=128&&ht("not-basic"),t.push(e.charCodeAt(c));for(let c=a>0?a+1:0;c=n&&ht("invalid-input");const m=Cl(e.charCodeAt(c++));m>=Ye&&ht("invalid-input"),m>Xe((Kt-o)/f)&&ht("overflow"),o+=m*f;const h=d<=s?Ir:d>=s+wn?wn:d-s;if(mXe(Kt/p)&&ht("overflow"),f*=p}const u=t.length+1;s=ks(o-l,u,l==0),Xe(o/u)>Kt-i&&ht("overflow"),i+=Xe(o/u),o%=u,t.splice(o++,0,i)}return String.fromCodePoint(...t)},Is=function(e){const t=[];e=xs(e);const n=e.length;let o=Ts,i=0,s=bs;for(const l of e)l<128&&t.push($o(l));const a=t.length;let c=a;for(a&&t.push(Es);c=o&&fXe((Kt-i)/u)&&ht("overflow"),i+=(l-o)*u,o=l;for(const f of e)if(fKt&&ht("overflow"),f===o){let d=i;for(let m=Ye;;m+=Ye){const h=m<=s?Ir:m>=s+wn?wn:m-s;if(d{const{shortcode:o,staticUrl:i,url:s}=n;e=e.replace(new RegExp(`:${o}:`,"g"),`:${o}:`)}),e):""}const Nt=document.createElement("div"),Ml=["u-url","mention","hashtag"],Rl=/[&<>]/g;function No(e){return e.replace(Rl,t=>({"&":"&","<":"<",">":">"})[t])}const Ol=/{}}=t;let s=e;const a=Kl(s,o),c=Ol.test(s),l=s.includes("```");if(c){const f=a.querySelectorAll('a:not([target="_blank"])');for(const m of f)m.setAttribute("target","_blank");const d=a.querySelectorAll("a[class]");for(const m of d)for(const h of m.classList)Ml.includes(h)||m.classList.remove(h)}if(c){const f=a.querySelectorAll("a[href]");for(const d of f)Dl.test(d.textContent.trim())&&(d.classList.add("has-url-text"),Yl(d))}if(c){const f=a.querySelectorAll("a[href]"),d=[];for(const m of f){const h=m.innerText.trim(),p=m.querySelector("*");if($l.test(h)){const[g,v,T]=h.split("@");p||(!d.some(([y])=>y===v)||d.some(([y,x])=>y===v&&x===T)?(m.innerHTML=`@${v}`,d.push([v,T])):m.innerHTML=`@${v}@${T}`),m.classList.add("mention")}Nl.test(h)&&(p||(m.innerHTML=`#${h.slice(1)}`),m.classList.add("mention","hashtag"))}}let u;if(s.includes(":")){u=zo(a);for(const f of u){let d=No(f.nodeValue);n&&(d=ho(d,n)),Nt.innerHTML=d,f.replaceWith(...Nt.childNodes)}}if(l){const f=[...a.querySelectorAll("p")].filter(d=>Fl.test(d.innerText.trim()));for(const d of f){const m=document.createElement("pre");for(const h of d.querySelectorAll("br"))h.replaceWith(` + */var $f=yr.exports;(function(e){(function(t,n){e.exports?e.exports=n():t.Toastify=n()})(wa,function(t){var n=function(a){return new n.lib.init(a)},o="1.12.0";n.defaults={oldestFirst:!0,text:"Toastify is awesome!",node:void 0,duration:3e3,selector:void 0,callback:function(){},destination:void 0,newWindow:!1,close:!1,gravity:"toastify-top",positionLeft:!1,position:"",backgroundColor:"",avatar:"",className:"",stopOnFocus:!0,onClick:function(){},offset:{x:0,y:0},escapeMarkup:!0,ariaLive:"polite",style:{background:""}},n.lib=n.prototype={toastify:o,constructor:n,init:function(a){return a||(a={}),this.options={},this.toastElement=null,this.options.text=a.text||n.defaults.text,this.options.node=a.node||n.defaults.node,this.options.duration=a.duration===0?0:a.duration||n.defaults.duration,this.options.selector=a.selector||n.defaults.selector,this.options.callback=a.callback||n.defaults.callback,this.options.destination=a.destination||n.defaults.destination,this.options.newWindow=a.newWindow||n.defaults.newWindow,this.options.close=a.close||n.defaults.close,this.options.gravity=a.gravity==="bottom"?"toastify-bottom":n.defaults.gravity,this.options.positionLeft=a.positionLeft||n.defaults.positionLeft,this.options.position=a.position||n.defaults.position,this.options.backgroundColor=a.backgroundColor||n.defaults.backgroundColor,this.options.avatar=a.avatar||n.defaults.avatar,this.options.className=a.className||n.defaults.className,this.options.stopOnFocus=a.stopOnFocus===void 0?n.defaults.stopOnFocus:a.stopOnFocus,this.options.onClick=a.onClick||n.defaults.onClick,this.options.offset=a.offset||n.defaults.offset,this.options.escapeMarkup=a.escapeMarkup!==void 0?a.escapeMarkup:n.defaults.escapeMarkup,this.options.ariaLive=a.ariaLive||n.defaults.ariaLive,this.options.style=a.style||n.defaults.style,a.backgroundColor&&(this.options.style.background=a.backgroundColor),this},buildToast:function(){if(!this.options)throw"Toastify is not initialized";var a=document.createElement("div");a.className="toastify on "+this.options.className,this.options.position?a.className+=" toastify-"+this.options.position:this.options.positionLeft===!0?(a.className+=" toastify-left",console.warn("Property `positionLeft` will be depreciated in further versions. Please use `position` instead.")):a.className+=" toastify-right",a.className+=" "+this.options.gravity,this.options.backgroundColor&&console.warn('DEPRECATION NOTICE: "backgroundColor" is being deprecated. Please use the "style.background" property.');for(var c in this.options.style)a.style[c]=this.options.style[c];if(this.options.ariaLive&&a.setAttribute("aria-live",this.options.ariaLive),this.options.node&&this.options.node.nodeType===Node.ELEMENT_NODE)a.appendChild(this.options.node);else if(this.options.escapeMarkup?a.innerText=this.options.text:a.innerHTML=this.options.text,this.options.avatar!==""){var l=document.createElement("img");l.src=this.options.avatar,l.className="toastify-avatar",this.options.position=="left"||this.options.positionLeft===!0?a.appendChild(l):a.insertAdjacentElement("afterbegin",l)}if(this.options.close===!0){var u=document.createElement("button");u.type="button",u.setAttribute("aria-label","Close"),u.className="toast-close",u.innerHTML="✖",u.addEventListener("click",(function(v){v.stopPropagation(),this.removeElement(this.toastElement),window.clearTimeout(this.toastElement.timeOutValue)}).bind(this));var f=window.innerWidth>0?window.innerWidth:screen.width;(this.options.position=="left"||this.options.positionLeft===!0)&&f>360?a.insertAdjacentElement("afterbegin",u):a.appendChild(u)}if(this.options.stopOnFocus&&this.options.duration>0){var d=this;a.addEventListener("mouseover",function(v){window.clearTimeout(a.timeOutValue)}),a.addEventListener("mouseleave",function(){a.timeOutValue=window.setTimeout(function(){d.removeElement(a)},d.options.duration)})}if(typeof this.options.destination<"u"&&a.addEventListener("click",(function(v){v.stopPropagation(),this.options.newWindow===!0?window.open(this.options.destination,"_blank"):window.location=this.options.destination}).bind(this)),typeof this.options.onClick=="function"&&typeof this.options.destination>"u"&&a.addEventListener("click",(function(v){v.stopPropagation(),this.options.onClick()}).bind(this)),typeof this.options.offset=="object"){var m=i("x",this.options),h=i("y",this.options),p=this.options.position=="left"?m:"-"+m,g=this.options.gravity=="toastify-top"?h:"-"+h;a.style.transform="translate("+p+","+g+")"}return a},showToast:function(){this.toastElement=this.buildToast();var a;if(typeof this.options.selector=="string"?a=document.getElementById(this.options.selector):this.options.selector instanceof HTMLElement||typeof ShadowRoot<"u"&&this.options.selector instanceof ShadowRoot?a=this.options.selector:a=document.body,!a)throw"Root element is not defined";var c=n.defaults.oldestFirst?a.firstChild:a.lastChild;return a.insertBefore(this.toastElement,c),n.reposition(),this.options.duration>0&&(this.toastElement.timeOutValue=window.setTimeout((function(){this.removeElement(this.toastElement)}).bind(this),this.options.duration)),this},hideToast:function(){this.toastElement.timeOutValue&&clearTimeout(this.toastElement.timeOutValue),this.removeElement(this.toastElement)},removeElement:function(a){a.className=a.className.replace(" on",""),window.setTimeout((function(){this.options.node&&this.options.node.parentNode&&this.options.node.parentNode.removeChild(this.options.node),a.parentNode&&a.parentNode.removeChild(a),this.options.callback.call(a),n.reposition()}).bind(this),400)}},n.reposition=function(){for(var a={top:15,bottom:15},c={top:15,bottom:15},l={top:15,bottom:15},u=document.getElementsByClassName("toastify"),f,d=0;d0?window.innerWidth:screen.width;p<=360?(u[d].style[f]=l[f]+"px",l[f]+=m+h):s(u[d],"toastify-left")===!0?(u[d].style[f]=a[f]+"px",a[f]+=m+h):(u[d].style[f]=c[f]+"px",c[f]+=m+h)}return this};function i(a,c){return c.offset[a]?isNaN(c.offset[a])?c.offset[a]:c.offset[a]+"px":"0px"}function s(a,c){return!a||typeof c!="string"?!1:!!(a.className&&a.className.trim().split(/\s+/gi).indexOf(c)>-1)}return n.lib.init.prototype=n.lib,n})})(yr);var Xa=yr.exports;const Qa=gr(Xa);window._showToast=Le;function Le(e){typeof e=="string"&&(e={text:e});const{onClick:t,delay:n,...o}=e,i=Qa({className:`${t||e.destination?"shiny-pill":""}`,gravity:"bottom",position:"center",...o,onClick:()=>{t==null||t(i)}});return n?setTimeout(()=>{i.showToast()},n):i.showToast(),i}function Nf(e,t,n,o){const i=$(e);J(()=>{i.current=e},[e,n]),J(()=>{!o||t===null||t===!1||i.current()},[o]),J(()=>{if(t===null||t===!1)return;const a=setInterval(()=>i.current(),t);return()=>clearInterval(a)},[t])}function Ja(e){const t=URL.parse("/compose/",window.location),{width:n,height:o}=window.screen,i=Math.max(0,(n-600)/2),s=Math.max(0,(o-450)/2),a=Math.min(n,600),c=Math.min(o,450),l=(e==null?void 0:e.uid)||Math.random(),u=window.open(t,"compose"+l,`width=${a},height=${c},left=${i},top=${s}`);return u?u.__COMPOSE__=e:alert(k._({id:"4S86wI"})),u}const ec=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);function tc(){if(ec){const e=document.createElement("input");e.style.position="absolute",e.style.top="0",e.style.left="0",e.style.opacity="0",document.body.appendChild(e),e.focus(),setTimeout(()=>{document.body.removeChild(e)},500)}}const ts={x:()=>A(()=>import("./icons/close-line-YTE7hIJE.js"),[],import.meta.url),heart:()=>A(()=>import("./icons/heart-line-VwvWYh8h.js"),[],import.meta.url),bookmark:()=>A(()=>import("./icons/bookmark-line-D6jQ7QFs.js"),[],import.meta.url),"check-circle":()=>A(()=>import("./icons/check-circle-line-sE41WGxF.js"),[],import.meta.url),"x-circle":()=>A(()=>import("./icons/close-circle-line-qd3g541O.js"),[],import.meta.url),transfer:()=>A(()=>import("./icons/transfer-4-line-Q9QJoxz3.js"),[],import.meta.url),rocket:()=>A(()=>import("./icons/rocket-line-rZbVYYCZ.js"),[],import.meta.url),"arrow-left":{module:()=>A(()=>import("./icons/arrow-left-line-_YC6-XGG.js"),[],import.meta.url),rtl:!0},"arrow-right":{module:()=>A(()=>import("./icons/arrow-right-line-PypiEqpu.js"),[],import.meta.url),rtl:!0},"arrow-up":()=>A(()=>import("./icons/arrow-up-line-fcuKqhVE.js"),[],import.meta.url),"arrow-down":()=>A(()=>import("./icons/arrow-down-line-0TRJUP_K.js"),[],import.meta.url),earth:()=>A(()=>import("./icons/earth-line-t1Um8wpQ.js"),[],import.meta.url),lock:()=>A(()=>import("./icons/lock-line-0jNHqZpm.js"),[],import.meta.url),unlock:()=>A(()=>import("./icons/unlock-line-w3piJMVb.js"),[],import.meta.url),"eye-close":()=>A(()=>import("./icons/eye-close-line-lBiePPv9.js"),[],import.meta.url),"eye-open":()=>A(()=>import("./icons/eye-2-line-vz_Kw-rK.js"),[],import.meta.url),message:()=>A(()=>import("./icons/mail-line-5XLS6FEo.js"),[],import.meta.url),comment:{module:()=>A(()=>import("./icons/chat-3-line-F0xcdpXY.js"),[],import.meta.url),rtl:!0},comment2:{module:()=>A(()=>import("./icons/comment-2-line-xEXuT-Ip.js"),[],import.meta.url),rtl:!0},home:()=>A(()=>import("./icons/home-3-line-qJiZhXUH.js"),[],import.meta.url),notification:()=>A(()=>import("./icons/notification-line-olNPLtgS.js"),[],import.meta.url),follow:()=>A(()=>import("./icons/user-follow-line-k_GCWTtp.js"),[],import.meta.url),"follow-add":()=>A(()=>import("./icons/user-add-line-zzW9OULB.js"),[],import.meta.url),poll:[()=>A(()=>import("./icons/chart-bar-line-5r_DfN2w.js"),[],import.meta.url),"90deg"],pencil:()=>A(()=>import("./icons/pencil-line-bKXqElLR.js"),[],import.meta.url),quill:()=>A(()=>import("./icons/quill-pen-line-h_5-FsGz.js"),[],import.meta.url),at:()=>A(()=>import("./icons/at-line-9vJS_Hnl.js"),[],import.meta.url),attachment:()=>A(()=>import("./icons/attachment-line-C2PUa1Ke.js"),[],import.meta.url),upload:()=>A(()=>import("./icons/upload-3-line-Qsjvubiw.js"),[],import.meta.url),gear:()=>A(()=>import("./icons/settings-3-line-kt4MSpRv.js"),[],import.meta.url),more:()=>A(()=>import("./icons/more-3-line-wUD-Yhmj.js"),[],import.meta.url),more2:()=>A(()=>import("./icons/more-1-fill-je1-slyh.js"),[],import.meta.url),external:{module:()=>A(()=>import("./icons/external-link-line-8nOOkmFu.js"),[],import.meta.url),rtl:!0},popout:{module:()=>A(()=>import("./icons/external-link-line-8nOOkmFu.js"),[],import.meta.url),rtl:!0},popin:{module:()=>A(()=>import("./icons/external-link-line-8nOOkmFu.js"),[],import.meta.url),rotate:"180deg",rtl:!0},plus:()=>A(()=>import("./icons/add-circle-line--O-MfyNy.js"),[],import.meta.url),"chevron-left":{module:()=>A(()=>import("./icons/left-line-Jck0yVmC.js"),[],import.meta.url),rtl:!0},"chevron-right":{module:()=>A(()=>import("./icons/right-line-7VBoqLdz.js"),[],import.meta.url),rtl:!0},"chevron-down":()=>A(()=>import("./icons/down-line-9PeS5YhF.js"),[],import.meta.url),reply:{module:()=>A(()=>import("./icons/share-forward-line-4jL-2Q4u.js"),[],import.meta.url),rotate:"180deg",flip:"horizontal",rtl:!0},thread:()=>A(()=>import("./icons/route-line-2YYy3958.js"),[],import.meta.url),group:{module:()=>A(()=>import("./icons/group-line-JvhJklhQ.js"),[],import.meta.url),rtl:!0},bot:()=>A(()=>import("./icons/android-2-line-uPwvVubH.js"),[],import.meta.url),menu:()=>A(()=>import("./icons/rows-4-line-SxGPYpTa.js"),[],import.meta.url),list:{module:()=>A(()=>import("./icons/list-check-line-qNqx9Mm4.js"),[],import.meta.url),rtl:!0},search:()=>A(()=>import("./icons/search-2-line-G39AynEw.js"),[],import.meta.url),hashtag:()=>A(()=>import("./icons/hashtag-line-SS3QMu1R.js"),[],import.meta.url),info:()=>A(()=>import("./icons/information-line-8SOch6cR.js"),[],import.meta.url),shortcut:()=>A(()=>import("./icons/lightning-line-JMYUlCZM.js"),[],import.meta.url),user:()=>A(()=>import("./icons/user-4-line-zT_bpOrS.js"),[],import.meta.url),following:()=>A(()=>import("./icons/walk-line-CF7a5s4t.js"),[],import.meta.url),pin:()=>A(()=>import("./icons/pin-line-ULyRQyWZ.js"),[],import.meta.url),unpin:[()=>A(()=>import("./icons/pin-line-ULyRQyWZ.js"),[],import.meta.url),"180deg"],bus:()=>A(()=>import("./icons/bus-2-line-XuQdDZ_w.js"),[],import.meta.url),link:()=>A(()=>import("./icons/link-2-line-BUqp1EwN.js"),[],import.meta.url),history:()=>A(()=>import("./icons/history-line-yoG7K8wL.js"),[],import.meta.url),share:()=>A(()=>import("./icons/share-2-line-PYo-zN94.js"),[],import.meta.url),sparkles:()=>A(()=>import("./icons/sparkles-line-wjZWGZ1a.js"),[],import.meta.url),sparkles2:()=>A(()=>import("./icons/sparkles-2-line-g2FqdZ0R.js"),[],import.meta.url),exit:{module:()=>A(()=>import("./icons/exit-line-l-1uUgI7.js"),[],import.meta.url),rtl:!0},translate:()=>A(()=>import("./icons/translate-line-HpDtlqS2.js"),[],import.meta.url),play:()=>A(()=>import("./icons/play-fill-Ey-zv2eL.js"),[],import.meta.url),trash:()=>A(()=>import("./icons/delete-2-line-pjUduCFs.js"),[],import.meta.url),mute:{module:()=>A(()=>import("./icons/volume-mute-line-WthBoXru.js"),[],import.meta.url),rtl:!0},unmute:{module:()=>A(()=>import("./icons/volume-line-PZujbN8h.js"),[],import.meta.url),rtl:!0},block:()=>A(()=>import("./icons/forbid-circle-line-3FxopGoP.js"),[],import.meta.url),unblock:[()=>A(()=>import("./icons/forbid-circle-line-3FxopGoP.js"),[],import.meta.url),"180deg"],flag:()=>A(()=>import("./icons/flag-1-line-xvcg7G7Q.js"),[],import.meta.url),time:()=>A(()=>import("./icons/time-line-ThP0kTRr.js"),[],import.meta.url),refresh:()=>A(()=>import("./icons/refresh-2-line-t42qqclb.js"),[],import.meta.url),emoji2:()=>A(()=>import("./icons/emoji-2-line--uNVc2IC.js"),[],import.meta.url),filter:()=>A(()=>import("./icons/filter-2-line-KyjbFYlO.js"),[],import.meta.url),filters:()=>A(()=>import("./icons/filter-line-1KEfnWDm.js"),[],import.meta.url),chart:()=>A(()=>import("./icons/chart-line-line-pHaLt6yC.js"),[],import.meta.url),react:()=>A(()=>import("./icons/react-line-YfZPqZem.js"),[],import.meta.url),layout4:{module:()=>A(()=>import("./icons/layout-4-line-FOdnyEcZ.js"),[],import.meta.url),rtl:!0},layout5:()=>A(()=>import("./icons/layout-5-line-9Kks7dle.js"),[],import.meta.url),announce:{module:()=>A(()=>import("./icons/announcement-line-MSlAmDH1.js"),[],import.meta.url),rtl:!0},alert:()=>A(()=>import("./icons/alert-line-zyc6hy8V.js"),[],import.meta.url),round:()=>A(()=>import("./icons/round-fill-a0rplSmV.js"),[],import.meta.url),"arrow-up-circle":()=>A(()=>import("./icons/arrow-up-circle-line-e3kZqEZN.js"),[],import.meta.url),"arrow-down-circle":()=>A(()=>import("./icons/arrow-down-circle-line-mpqFtRtO.js"),[],import.meta.url),clipboard:{module:()=>A(()=>import("./icons/clipboard-line-9F_Yeo71.js"),[],import.meta.url),rtl:!0},"account-edit":()=>A(()=>import("./icons/user-edit-line-9VnWCh0X.js"),[],import.meta.url),"account-warning":()=>A(()=>import("./icons/user-warning-line-gL3RGb1N.js"),[],import.meta.url),keyboard:()=>A(()=>import("./icons/keyboard-line-10AZQcVH.js"),[],import.meta.url),cloud:()=>A(()=>import("./icons/cloud-line-abe0HgFS.js"),[],import.meta.url),month:{module:()=>A(()=>import("./icons/calendar-month-line-VoXZVWAe.js"),[],import.meta.url),rtl:!0},media:()=>A(()=>import("./icons/photo-album-line--GdJqjfq.js"),[],import.meta.url),speak:()=>A(()=>import("./icons/radar-line-ndI8IhOG.js"),[],import.meta.url),building:()=>A(()=>import("./icons/building-5-line-ew7lu83B.js"),[],import.meta.url),history2:{module:()=>A(()=>import("./icons/history-2-line-3yIVzoWo.js"),[],import.meta.url),rtl:!0},document:()=>A(()=>import("./icons/document-line--D6ooZg1.js"),[],import.meta.url),"arrows-right":{module:()=>A(()=>import("./icons/arrows-right-line-HF4HILdT.js"),[],import.meta.url),rtl:!0},code:()=>A(()=>import("./icons/code-line-h4RWLaak.js"),[],import.meta.url),copy:()=>A(()=>import("./icons/copy-2-line-mPSDKieb.js"),[],import.meta.url),quote:{module:()=>A(()=>import("./icons/quote-left-line-NQzeELMO.js"),[],import.meta.url),rtl:!0},settings:()=>A(()=>import("./icons/settings-6-line-ZgCBilgF.js"),[],import.meta.url),"heart-break":()=>A(()=>import("./icons/heart-crack-line-P3DoKfTT.js"),[],import.meta.url),"user-x":()=>A(()=>import("./icons/user-x-line-zIdph-gu.js"),[],import.meta.url),minimize:()=>A(()=>import("./icons/arrows-down-line-ovOF9r0o.js"),[],import.meta.url)},nc={s:12,m:16,l:20,xl:24,xxl:32},ti={},oc=xa(function({width:e,height:t,body:n,rotate:o,flip:i}){return r("svg",{viewBox:`0 0 ${e} ${t}`,dangerouslySetInnerHTML:{__html:n},style:{transform:`${o?`rotate(${o})`:""} ${i?"scaleX(-1)":""}`}})},{isShallowEqual:!0,maxSize:Object.keys(ts).length,matchesArg:(e,t)=>e.icon===t.icon&&e.body===t.body});function M({icon:e,size:t="m",alt:n,title:o,class:i="",style:s={}}){if(!e)return null;const a=nc[t];let c=ts[e];if(!c)return null;let l,u,f=!1;Array.isArray(c)?[c,l,u]=c:typeof c=="object"&&({rotate:l,flip:u,rtl:f}=c,c=c.module);const[d,m]=W(ti[e]),h=$(e);return J(()=>{d&&h.current===e||((async()=>{const p=await c();m(p.default),ti[e]=p.default})(),h.current=e)},[e]),r("span",{class:`icon ${i} ${f?"rtl-flip":""}`,title:o||n,style:{width:`${a}px`,height:`${a}px`,...s},"data-icon":e,children:d&&r(oc,{icon:e,width:d.width,height:d.height,body:d.body,rotate:l,flip:u})})}function rc(e,t=[]){!e||typeof e!="function"||J(()=>{const n=new CloseWatcher;return n.addEventListener("close",e),()=>{n.destroy()}},t)}const ic=window.CloseWatcher?rc:()=>{},sc=document.getElementById("modal-container");function Qo({children:e,onClose:t,onClick:n,class:o,minimized:i}){if(!e)return null;const s=$();J(()=>{let u=setTimeout(()=>{var d;const f=(d=s.current)==null?void 0:d.querySelector('[tabindex="-1"]');f&&f.focus()},100);return()=>clearTimeout(u)},[]);const a=window.CloseWatcher,c=Ht("esc",()=>{setTimeout(()=>{t==null||t()},0)},{enabled:!a&&!!t,keydown:!1,keyup:!0},[t]);ic(t,[t]),J(()=>{const u=document.querySelectorAll(".deck-container");if(i){const f=u[u.length-1];f&&f.tabIndex===-1&&f.focus()}else e?u.forEach(f=>{f.setAttribute("inert","")}):u.forEach(f=>{f.removeAttribute("inert")});return()=>{u.forEach(f=>{f.removeAttribute("inert")})}},[e,i]);const l=r("div",{ref:u=>{var f;s.current=u,c(((f=u==null?void 0:u.querySelector)==null?void 0:f.call(u,'[tabindex="-1"]'))||u)},className:o,onClick:u=>{n==null||n(u),u.target===u.currentTarget&&(t==null||t(u))},tabIndex:i?0:"-1",inert:i,onFocus:u=>{var f,d;try{if(u.target===u.currentTarget){const m=(f=s.current)==null?void 0:f.querySelector('[tabindex="-1"]'),h=!!m&&((d=getComputedStyle(m))==null?void 0:d.pointerEvents)!=="none";m&&h&&m.focus()}}catch{}},children:e});return io(l,sc)}var br={exports:{}},ac="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED",cc=ac;var lc=cc;function ns(){}function os(){}os.resetWarningCache=ns;var uc=function(){function e(o,i,s,a,c,l){if(l!==lc){var u=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw u.name="Invariant Violation",u}}e.isRequired=e;function t(){return e}var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:os,resetWarningCache:ns};return n.PropTypes=n,n};var Ff=br.exports;if(0)var zf,Vf;else br.exports=uc();var U=br.exports;const Tr=e=>!!e&&e[0]==="o",Jo=ka||(e=>e());const bn=(e,t)=>e===!0||!!(e&&e[t]),He=(e,t)=>typeof e=="function"?e(t):e,dc="_szhsinMenu",fc=e=>e[dc];const Jt=(e,t)=>(t&&Object.keys(t).forEach(n=>{const o=e[n],i=t[n];typeof i=="function"&&o?e[n]=(...s)=>{i(...s),o(...s)}:e[n]=i}),e),hc=e=>{if(typeof e!="string")return{top:0,right:0,bottom:0,left:0};const t=e.trim().split(/\s+/,4).map(parseFloat),n=isNaN(t[0])?0:t[0],o=isNaN(t[1])?n:t[1];return{top:n,right:o,bottom:isNaN(t[2])?n:t[2],left:isNaN(t[3])?o:t[3]}},Po=e=>{for(;e;){if(e=e.parentNode,!e||e===document.body||!e.parentNode)return;const{overflow:t,overflowX:n,overflowY:o}=getComputedStyle(e);if(/auto|scroll|overlay|hidden/.test(t+o+n))return e}};function _o(e,t){return{"aria-disabled":e||void 0,tabIndex:t?0:-1}}function ni(e,t){for(let n=0;n({[e?`${e}ClassName`:"className"]:U.oneOfType([U.string,U.func])}),mc={className:U.string,...pc("menu"),arrowProps:U.object,focusProps:U.object,menuStyle:U.object,arrow:U.bool,setDownOverflow:U.bool,gap:U.number,shift:U.number,align:U.oneOf(["start","center","end"]),direction:U.oneOf(["left","right","top","bottom"]),position:U.oneOf(["auto","anchor","initial"]),overflow:U.oneOf(["auto","visible","hidden"])},Hf={...mc,containerProps:U.object,initialMounted:U.bool,unmountOnClose:U.bool,transition:U.oneOfType([U.bool,U.exact({open:U.bool,close:U.bool,item:U.bool})]),transitionTimeout:U.number,boundingBoxRef:U.object,boundingBoxPadding:U.string,reposition:U.oneOf(["auto","initial"]),repositionFlag:U.oneOfType([U.string,U.number]),viewScroll:U.oneOf(["auto","close","initial"]),submenuOpenDelay:U.number,submenuCloseDelay:U.number,portal:U.oneOfType([U.bool,U.exact({target:U.object,stablePosition:U.bool})]),theming:U.string,onItemClick:U.func},Bf={instanceRef:U.oneOfType([U.object,U.func]),onMenuChange:U.func},et=({block:e,element:t,modifiers:n,className:o})=>le(()=>{const i=t?`${e}__${t}`:e;let s=i;n&&Object.keys(n).forEach(c=>{const l=n[c];l&&(s+=` ${i}--${l===!0?c:`${c}-${l}`}`)});let a=typeof o=="function"?o(n):o;return typeof a=="string"&&(a=a.trim(),a&&(s+=` ${a}`)),s},[e,t,n,o]),gc="szh-menu-container",Je="szh-menu";const vc="arrow",Er="item",_c="divider",yc="header",bc="group",Tc="submenu";const rs=lt(),wr=lt({}),ao=lt({}),xr=lt({}),Ec=lt({}),yo=lt({}),Fe=Object.freeze({ENTER:"Enter",ESC:"Escape",SPACE:" ",HOME:"Home",END:"End",LEFT:"ArrowLeft",RIGHT:"ArrowRight",UP:"ArrowUp",DOWN:"ArrowDown"}),we=Object.freeze({RESET:0,SET:1,UNSET:2,INCREASE:3,DECREASE:4,FIRST:5,LAST:6,SET_INDEX:7}),Tn=Object.freeze({CLICK:"click",CANCEL:"cancel",BLUR:"blur",SCROLL:"scroll"}),Ut=Object.freeze({FIRST:"first",LAST:"last"}),wc=Object.freeze({entering:"opening",entered:"open",exiting:"closing",exited:"closed"}),Lo="absolute",En="none",kr="menuitem";const xc=({className:e,containerRef:t,containerProps:n,children:o,isOpen:i,theming:s,transition:a,onClose:c})=>{const l=bn(a,"item");return r("div",{...Jt({onKeyDown:({key:d})=>{switch(d){case Fe.ESC:He(c,{key:d,reason:Tn.CANCEL});break}},onBlur:d=>{i&&!d.currentTarget.contains(d.relatedTarget)&&He(c,{reason:Tn.BLUR})}},n),className:et({block:gc,modifiers:le(()=>({theme:s,itemTransition:l}),[s,l]),className:e}),style:{position:"absolute",...n==null?void 0:n.style},ref:t,children:o})},kc=()=>{let e,t=0;return{toggle:n=>{n?t++:t--,t=Math.max(t,0)},on:(n,o,i)=>{t?e||(e=setTimeout(()=>{e=0,o()},n)):i==null||i()},off:()=>{e&&(clearTimeout(e),e=0)}}},Sc=(e,t)=>{const[n,o]=W(),s=$({items:[],hoverIndex:-1,sorted:!1}).current,a=Pe((l,u)=>{const{items:f}=s;if(!l)s.items=[];else if(u)f.push(l);else{const d=f.indexOf(l);d>-1&&(f.splice(d,1),l.contains(document.activeElement)&&(t.current.focus(),o()))}s.hoverIndex=-1,s.sorted=!1},[s,t]),c=Pe((l,u,f)=>{const{items:d,hoverIndex:m}=s,h=()=>{if(s.sorted)return;const v=e.current.querySelectorAll(".szh-menu__item");d.sort((T,y)=>ni(v,T)-ni(v,y)),s.sorted=!0};let p=-1,g;switch(l){case we.RESET:break;case we.SET:g=u;break;case we.UNSET:g=v=>v===u?void 0:v;break;case we.FIRST:h(),p=0,g=d[p];break;case we.LAST:h(),p=d.length-1,g=d[p];break;case we.SET_INDEX:h(),p=f,g=d[p];break;case we.INCREASE:h(),p=m,p<0&&(p=d.indexOf(u)),p++,p>=d.length&&(p=0),g=d[p];break;case we.DECREASE:h(),p=m,p<0&&(p=d.indexOf(u)),p--,p<0&&(p=d.length-1),g=d[p];break;default:}g||(p=-1),o(g),s.hoverIndex=p},[e,s]);return{hoverItem:n,dispatch:c,updateItems:a}},oi=(e,t)=>Math.round(e)===t?e:t,is=e=>{const t=e.getBoundingClientRect();return t.width=oi(t.width,e.offsetWidth),t.height=oi(t.height,e.offsetHeight),t},Ic=(e,t,n,o)=>{const i=is(t.current),s=e.current.getBoundingClientRect(),a=n===window?{left:0,top:0,right:document.documentElement.clientWidth,bottom:window.innerHeight}:n.getBoundingClientRect(),c=hc(o),l=p=>p+s.left-a.left-c.left,u=p=>p+s.left+i.width-a.right+c.right,f=p=>p+s.top-a.top-c.top,d=p=>p+s.top+i.height-a.bottom+c.bottom;return{menuRect:i,containerRect:s,getLeftOverflow:l,getRightOverflow:u,getTopOverflow:f,getBottomOverflow:d,confineHorizontally:p=>{let g=l(p);if(g<0)p-=g;else{const v=u(p);v>0&&(p-=v,g=l(p),g<0&&(p-=g))}return p},confineVertically:p=>{let g=f(p);if(g<0)p-=g;else{const v=d(p);v>0&&(p-=v,g=f(p),g<0&&(p-=g))}return p}}},Ac=({arrowRef:e,menuY:t,anchorRect:n,containerRect:o,menuRect:i})=>{let s=n.top-o.top-t+n.height/2;const a=e.current.offsetHeight*1.25;return s=Math.max(a,s),s=Math.min(s,i.height-a),s},Cc=({anchorRect:e,containerRect:t,menuRect:n,placeLeftorRightY:o,placeLeftX:i,placeRightX:s,getLeftOverflow:a,getRightOverflow:c,confineHorizontally:l,confineVertically:u,arrowRef:f,arrow:d,direction:m,position:h})=>{let p=m,g=o;h!=="initial"&&(g=u(g),h==="anchor"&&(g=Math.min(g,e.bottom-t.top),g=Math.max(g,e.top-t.top-n.height)));let v,T,y;return p==="left"?(v=i,h!=="initial"&&(T=a(v),T<0&&(y=c(s),(y<=0||-T>y)&&(v=s,p="right")))):(v=s,h!=="initial"&&(y=c(v),y>0&&(T=a(i),(T>=0||-T{let s=n.left-o.left-t+n.width/2;const a=e.current.offsetWidth*1.25;return s=Math.max(a,s),s=Math.min(s,i.width-a),s},Lc=({anchorRect:e,containerRect:t,menuRect:n,placeToporBottomX:o,placeTopY:i,placeBottomY:s,getTopOverflow:a,getBottomOverflow:c,confineHorizontally:l,confineVertically:u,arrowRef:f,arrow:d,direction:m,position:h})=>{let p=m==="top"?"top":"bottom",g=o;h!=="initial"&&(g=l(g),h==="anchor"&&(g=Math.min(g,e.right-t.left),g=Math.max(g,e.left-t.left-n.width)));let v,T,y;return p==="top"?(v=i,h!=="initial"&&(T=a(v),T<0&&(y=c(s),(y<=0||-T>y)&&(v=s,p="bottom")))):(v=s,h!=="initial"&&(y=c(v),y>0&&(T=a(i),(T>=0||-T{const{menuRect:u,containerRect:f}=l,d=n==="left"||n==="right";let m=d?o:i,h=d?i:o;if(e){const E=c.current;d?m+=E.offsetWidth:h+=E.offsetHeight}const p=a.left-f.left-u.width-m,g=a.right-f.left+m,v=a.top-f.top-u.height-h,T=a.bottom-f.top+h;let y,x;t==="end"?(y=a.right-f.left-u.width,x=a.bottom-f.top-u.height):t==="center"?(y=a.left-f.left-(u.width-a.width)/2,x=a.top-f.top-(u.height-a.height)/2):(y=a.left-f.left,x=a.top-f.top),y+=m,x+=h;const w={...l,anchorRect:a,placeLeftX:p,placeRightX:g,placeLeftorRightY:x,placeTopY:v,placeBottomY:T,placeToporBottomX:y,arrowRef:c,arrow:e,direction:n,position:s};switch(n){case"left":case"right":return Cc(w);case"top":case"bottom":default:return Lc(w)}},jt=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u"?Wt:J;function ri(e,t){typeof e=="function"?e(t):e.current=t}const en=(e,t)=>le(()=>e?t?n=>{ri(e,n),ri(t,n)}:e:t,[e,t]),ii=-9999,ss=({ariaLabel:e,menuClassName:t,menuStyle:n,arrow:o,arrowProps:i={},anchorPoint:s,anchorRef:a,containerRef:c,containerProps:l,focusProps:u,externalRef:f,parentScrollingRef:d,align:m="start",direction:h="bottom",position:p="auto",overflow:g="visible",setDownOverflow:v,repositionFlag:T,captureFocus:y=!0,state:x,endTransition:w,isDisabled:E,menuItemFocus:b,gap:I=0,shift:D=0,children:R,onClose:S,...C})=>{const[L,Y]=W({x:ii,y:ii}),[z,ue]=W({}),[Q,se]=W(),[q,ae]=W(h),[ce]=W(kc),[de,V]=Ui(X=>X+1,1),{transition:he,boundingBoxRef:ee,boundingBoxPadding:Ce,rootMenuRef:Te,rootAnchorRef:xe,scrollNodesRef:Re,reposition:Ee,viewScroll:Oe,submenuCloseDelay:De}=ze(yo),{submenuCtx:te,reposSubmenu:F=T}=ze(ao),ke=$(null),Ze=$(),ie=$(),B=$(!1),{hoverItem:ne,dispatch:Z,updateItems:me}=Sc(ke,Ze),G=Tr(x),Ve=bn(he,"open"),oe=bn(he,"close"),ve=Re.current,An=X=>{switch(X.key){case Fe.HOME:Z(we.FIRST);break;case Fe.END:Z(we.LAST);break;case Fe.UP:Z(we.DECREASE,ne);break;case Fe.DOWN:Z(we.INCREASE,ne);break;case Fe.SPACE:X.target&&X.target.className.indexOf(Je)!==-1&&X.preventDefault();return;default:return}X.preventDefault(),X.stopPropagation()},pe=()=>{x==="closing"&&se(),He(w)},_e=X=>{X.stopPropagation(),ce.on(De,()=>{Z(we.RESET),Ze.current.focus()})},Ge=X=>{X.target===X.currentTarget&&ce.off()},ye=Pe(X=>{var be;const Ae=a?(be=a.current)==null?void 0:be.getBoundingClientRect():s?{left:s.x,right:s.x,top:s.y,bottom:s.y,width:0,height:0}:null;if(!Ae)return;ve.menu||(ve.menu=(ee?ee.current:Po(Te.current))||window);const Be=Ic(c,ke,ve.menu,Ce);let{arrowX:Se,arrowY:ot,x:Ln,y:bt,computedDirection:qe}=Mc({arrow:o,align:m,direction:h,gap:I,shift:D,position:p,anchorRect:Ae,arrowRef:ie,positionHelpers:Be});const{menuRect:Mn}=Be,Ke=Mn.height;if(!X&&g!=="visible"){const{getTopOverflow:Tt,getBottomOverflow:To}=Be;let Et,fe;const wt=To(bt);if(wt>0)Et=Ke-wt,fe=wt;else{const Rt=Tt(bt);Rt<0&&(Et=Ke+Rt,fe=0-Rt,Et>=0&&(bt-=Rt))}Et>=0&&se({height:Et,overflowAmt:fe})}o&&ue({x:Se,y:ot}),Y({x:Ln,y:bt}),ae(qe)},[o,m,Ce,h,I,D,p,g,s,a,c,ee,Te,ve]);jt(()=>{G&&(ye(),B.current&&V()),B.current=G},[G,ye,F]),jt(()=>{Q&&!v&&(ke.current.scrollTop=0)},[Q,v]),jt(()=>me,[me]),J(()=>{let{menu:X}=ve;if(!G||!X)return;if(X=X.addEventListener?X:window,!ve.anchors){ve.anchors=[];let Se=Po(xe&&xe.current);for(;Se&&Se!==X;)ve.anchors.push(Se),Se=Po(Se)}let be=Oe;if(ve.anchors.length&&be==="initial"&&(be="auto"),be==="initial")return;const Ae=()=>{be==="auto"?Jo(()=>ye(!0)):He(S,{reason:Tn.SCROLL})},Be=ve.anchors.concat(Oe!=="initial"?X:[]);return Be.forEach(Se=>Se.addEventListener("scroll",Ae)),()=>Be.forEach(Se=>Se.removeEventListener("scroll",Ae))},[xe,ve,G,S,Oe,ye]);const tt=!!Q&&Q.overflowAmt>0;J(()=>{if(tt||!G||!d)return;const X=()=>Jo(ye),be=d.current;return be.addEventListener("scroll",X),()=>be.removeEventListener("scroll",X)},[G,tt,d,ye]),J(()=>{if(!G||typeof ResizeObserver!="function"||Ee==="initial")return;const X=[],be=new ResizeObserver(Se=>Se.forEach(({target:ot})=>{X.indexOf(ot)<0?X.push(ot):Sa(()=>{ye(),V()})})),Ae={box:"border-box"};be.observe(ke.current,Ae);const Be=a==null?void 0:a.current;return Be&&be.observe(Be,Ae),()=>be.disconnect()},[G,Ee,a,ye]),J(()=>{if(!G){Z(we.RESET),oe||se();return}const{position:X,alwaysUpdate:be}=b||{},Ae=()=>{X===Ut.FIRST?Z(we.FIRST):X===Ut.LAST?Z(we.LAST):X>=-1&&Z(we.SET_INDEX,void 0,X)};if(be)Ae();else if(y){const Be=setTimeout(()=>{const Se=ke.current;Se&&!Se.contains(document.activeElement)&&(Ze.current.focus(),Ae())},Ve?170:100);return()=>clearTimeout(Be)}},[G,Ve,oe,y,b,Z]);const Cn=le(()=>({isParentOpen:G,submenuCtx:ce,dispatch:Z,updateItems:me}),[G,ce,Z,me]);let dt,Lt;Q&&(v?Lt=Q.overflowAmt:dt=Q.height);const bo=le(()=>({reposSubmenu:de,submenuCtx:ce,overflow:g,overflowAmt:Lt,parentMenuRef:ke,parentDir:q}),[de,ce,g,Lt,q]),ge=dt>=0?{maxHeight:dt,overflow:g}:void 0,Mt=le(()=>({state:x,align:m,dir:q}),[x,m,q]),yt=le(()=>({dir:q}),[q]),nt=et({block:Je,element:vc,modifiers:yt,className:i.className}),Pn=r("ul",{role:"menu","aria-label":e,..._o(E),...Jt({onPointerEnter:te==null?void 0:te.off,onPointerMove:_e,onPointerLeave:Ge,onKeyDown:An,onAnimationEnd:pe},C),ref:en(f,ke),className:et({block:Je,modifiers:Mt,className:t}),style:{...n,...ge,margin:0,display:x==="closed"?"none":void 0,position:Lo,left:L.x,top:L.y},children:[r("li",{tabIndex:-1,role:En,style:{position:Lo,left:0,top:0,display:"block",outline:"none"},ref:Ze,...u}),o&&r("li",{role:En,...i,className:nt,style:{display:"block",position:Lo,left:z.x,top:z.y,...i.style},ref:ie}),r(ao.Provider,{value:bo,children:r(wr.Provider,{value:Cn,children:r(rs.Provider,{value:ne,children:He(R,Mt)})})})]});return l?r(xc,{...l,isOpen:G,children:Pn}):Pn},as=Ct(function({"aria-label":t,className:n,containerProps:o,initialMounted:i,unmountOnClose:s,transition:a,transitionTimeout:c,boundingBoxRef:l,boundingBoxPadding:u,reposition:f="auto",submenuOpenDelay:d=300,submenuCloseDelay:m=150,viewScroll:h="initial",portal:p,theming:g,onItemClick:v,...T},y){const x=$(null),w=$({}),{anchorRef:E,state:b,onClose:I}=T,D=le(()=>({initialMounted:i,unmountOnClose:s,transition:a,transitionTimeout:c,boundingBoxRef:l,boundingBoxPadding:u,rootMenuRef:x,rootAnchorRef:E,scrollNodesRef:w,reposition:f,viewScroll:h,submenuOpenDelay:d,submenuCloseDelay:m}),[i,s,a,c,E,l,u,f,h,d,m]),R=le(()=>({handleClick(C,L){C.stopPropagation||He(v,C);let Y=C.keepOpen;Y===void 0&&(Y=L&&C.key===Fe.SPACE),Y||He(I,{value:C.value,key:C.key,reason:Tn.CLICK})},handleClose(C){He(I,{key:C,reason:Tn.CLICK})}}),[v,I]);if(!b)return null;const S=r(yo.Provider,{value:D,children:r(xr.Provider,{value:R,children:r(ss,{...T,ariaLabel:t||"Menu",externalRef:y,containerRef:x,containerProps:{className:n,containerRef:x,containerProps:o,theming:g,transition:a,onClose:I}})})});return p===!0&&typeof document<"u"?io(S,document.body):p?p.target?io(S,p.target):p.stablePosition?null:S:S}),er=0,tr=1,co=2,lo=3,uo=4,Rc=5,cs=6,Oc=["preEnter","entering","entered","preExit","exiting","exited","unmounted"],ls=e=>({_s:e,status:Oc[e],isEnter:euo}),nr=e=>e?cs:Rc,Dc=(e,t)=>{switch(e){case tr:case er:return co;case uo:case lo:return nr(t)}},$c=e=>typeof e=="object"?[e.enter,e.exit]:[e,e],si=(e,t,n,o,i)=>{clearTimeout(o.current);const s=ls(e);t(s),n.current=s,i&&i({current:s})},Nc=({enter:e=!0,exit:t=!0,preEnter:n,preExit:o,timeout:i,initialEntered:s,mountOnEnter:a,unmountOnExit:c,onStateChange:l}={})=>{const[u,f]=W(()=>ls(s?co:nr(a))),d=$(u),m=$(),[h,p]=$c(i),g=Pe(()=>{const T=Dc(d.current._s,c);T&&si(T,f,d,m,l)},[l,c]),v=Pe(T=>{const y=w=>{switch(si(w,f,d,m,l),w){case tr:h>=0&&(m.current=setTimeout(g,h));break;case uo:p>=0&&(m.current=setTimeout(g,p));break;case er:case lo:m.current=setTimeout(()=>y(w+1),0);break}},x=d.current.isEnter;typeof T!="boolean"&&(T=!x),T?!x&&y(e?n?er:tr:co):x&&y(t?o?lo:uo:nr(c))},[g,l,e,t,n,o,h,p,c]);return J(()=>()=>clearTimeout(m.current),[]),[u,v,g]};const Fc=({initialOpen:e,initialMounted:t,unmountOnClose:n,transition:o,transitionTimeout:i=500}={})=>{const[{status:s},a,c]=Nc({initialEntered:e,mountOnEnter:!t,unmountOnExit:n,timeout:i,enter:bn(o,"open"),exit:bn(o,"close")});return[{state:wc[s],endTransition:c},a]},us=e=>{const[t,n]=Fc(e),[o,i]=W(),s=(a,c)=>{i({position:a,alwaysUpdate:c}),n(!0)};return[{menuItemFocus:o,...t},n,s]},zc=(e,t)=>{const[n]=W({});return{onMouseDown:()=>{n.v=e&&e!=="closed"},onClick:o=>n.v?n.v=!1:t(!0,o)}},ds=(e,t)=>{const n=$(t);J(()=>{n.current!==t&&He(e,{open:t}),n.current=t},[e,t])},Vc=Ct(function({"aria-label":t,captureFocus:n,initialOpen:o,menuButton:i,instanceRef:s,onMenuChange:a,...c},l){const[u,f,d]=us(c),{state:m}=u,h=Tr(m),p=$(null),g=zc(m,(E,b)=>d(b.detail?void 0:Ut.FIRST)),v=Pe(E=>{f(!1),E.key&&p.current.focus()},[f]),T=E=>{switch(E.key){case Fe.UP:d(Ut.LAST);break;case Fe.DOWN:d(Ut.FIRST);break;default:return}E.preventDefault()},y=He(i,{open:h});if(!y||!y.type)throw new Error("Menu requires a menuButton prop.");const x={ref:en(y.ref,p),...Jt({onKeyDown:T,...g},y.props)};fc(y.type)==="MenuButton"&&(x.isOpen=h);const w=ji(y,x);return ds(a,h),Ki(s,()=>({openMenu:d,closeMenu:()=>f(!1)})),r(N,{children:[w,r(as,{...c,...u,"aria-label":t||(typeof y.props.children=="string"?y.props.children:"Menu"),anchorRef:p,ref:l,onClose:v})]})}),Sr=(e,t)=>{const n=Qt(t),o=Ct((i,s)=>{const a=$(null);return r(n,{...i,itemRef:a,externalRef:s,isHovering:ze(rs)===a.current})});return o.displayName=`WithHovering(${e})`,o},fs=(e,t,n)=>{jt(()=>{if(e)return;const o=t.current;return n(o,!0),()=>{n(o)}},[e,t,n])},Hc=Sr("SubMenu",function({"aria-label":t,className:n,disabled:o,direction:i,label:s,openTrigger:a,onMenuChange:c,isHovering:l,instanceRef:u,itemRef:f,captureFocus:d,repositionFlag:m,itemProps:h={},...p}){const g=ze(yo),{rootMenuRef:v,submenuOpenDelay:T,submenuCloseDelay:y}=g,{parentMenuRef:x,parentDir:w,overflow:E}=ze(ao),{isParentOpen:b,submenuCtx:I,dispatch:D,updateItems:R}=ze(wr),S=E!=="visible",[C,L,Y]=us(g),{state:z}=C,ue=!!o,Q=Tr(z),se=$(null),[q]=W({v:0}),ae=()=>{I.off(),q.v&&(clearTimeout(q.v),q.v=0)},ce=(...F)=>{ae(),de(),!ue&&Y(...F)},de=()=>!l&&!ue&&D(we.SET,f.current),V=F=>{de(),a||(q.v=setTimeout(()=>Jo(ce),Math.max(F,0)))},he=F=>{ue||(F.stopPropagation(),!(q.v||Q)&&I.on(y,()=>V(T-y),()=>V(T)))},ee=()=>{ae(),Q||D(we.UNSET,f.current)},Ce=F=>{if(l)switch(F.key){case Fe.ENTER:F.preventDefault();case Fe.SPACE:case Fe.RIGHT:a!=="none"&&ce(Ut.FIRST)}},Te=F=>{let ke=!1;switch(F.key){case Fe.LEFT:Q&&(f.current.focus(),L(!1),ke=!0);break;case Fe.RIGHT:Q||(ke=!0);break}ke&&(F.preventDefault(),F.stopPropagation())};fs(ue,f,R),ds(c,Q),J(()=>I.toggle(Q),[I,Q]),J(()=>()=>clearTimeout(q.v),[q]),J(()=>{l&&b?f.current.focus():L(!1)},[l,b,L,f]),Ki(u,()=>({openMenu:(...F)=>{b&&ce(...F)},closeMenu:()=>{Q&&(f.current.focus(),L(!1))}}));const xe=le(()=>({open:Q,hover:l,disabled:ue,submenu:!0}),[Q,l,ue]),{ref:Re,className:Ee,...Oe}=h,De=Jt({onPointerEnter:I.off,onPointerMove:he,onPointerLeave:ee,onKeyDown:Ce,onClick:()=>a!=="none"&&ce()},Oe),te=()=>{const F=r(ss,{...p,...C,ariaLabel:t||(typeof s=="string"?s:"Submenu"),anchorRef:f,containerRef:S?v:se,direction:i||(w==="right"||w==="left"?w:"right"),parentScrollingRef:S&&x,isDisabled:ue}),ke=v.current;return S&&ke?io(F,ke):F};return r("li",{className:et({block:Je,element:Tc,className:n}),style:{position:"relative"},role:En,ref:se,onKeyDown:Te,children:[r("div",{role:kr,"aria-haspopup":!0,"aria-expanded":Q,..._o(ue,l),...De,ref:en(Re,f),className:et({block:Je,element:Er,modifiers:xe,className:Ee}),children:le(()=>He(s,xe),[s,xe])}),z&&te()]})}),hs=(e,t,n,o)=>{const{submenuCloseDelay:i}=ze(yo),{isParentOpen:s,submenuCtx:a,dispatch:c,updateItems:l}=ze(wr),u=()=>{!n&&!o&&c(we.SET,e.current)},f=()=>{!o&&c(we.UNSET,e.current)},d=p=>{n&&!p.currentTarget.contains(p.relatedTarget)&&f()},m=p=>{o||(p.stopPropagation(),a.on(i,u,u))},h=(p,g)=>{a.off(),!g&&f()};return fs(o,e,l),J(()=>{n&&s&&t.current&&t.current.focus()},[t,n,s]),{setHover:u,onBlur:d,onPointerMove:m,onPointerLeave:h}},Ie=Sr("MenuItem",function({className:t,value:n,href:o,type:i,checked:s,disabled:a,children:c,onClick:l,isHovering:u,itemRef:f,externalRef:d,...m}){const h=!!a,{setHover:p,...g}=hs(f,f,u,h),v=ze(xr),T=ze(Ec),y=i==="radio",x=i==="checkbox",w=!!o&&!h&&!y&&!x,E=y?T.value===n:x?!!s:!1,b=C=>{if(h){C.stopPropagation(),C.preventDefault();return}const L={value:n,syntheticEvent:C};C.key!==void 0&&(L.key=C.key),x&&(L.checked=!E),y&&(L.name=T.name),He(l,L),y&&He(T.onRadioChange,L),v.handleClick(L,x||y)},I=C=>{if(u)switch(C.key){case Fe.ENTER:C.preventDefault();case Fe.SPACE:w?f.current.click():b(C)}},D=le(()=>({type:i,disabled:h,hover:u,checked:E,anchor:w}),[i,h,u,E,w]),R=Jt({...g,onPointerDown:p,onKeyDown:I,onClick:b},m),S={role:y?"menuitemradio":x?"menuitemcheckbox":kr,"aria-checked":y||x?E:void 0,..._o(h,u),...R,ref:en(d,f),className:et({block:Je,element:Er,modifiers:D,className:t}),children:le(()=>He(c,D),[c,D])};return w?r("li",{role:En,children:r("a",{href:o,...S})}):r("li",{...S})}),Bc=Sr("FocusableItem",function({className:t,disabled:n,children:o,isHovering:i,itemRef:s,externalRef:a,...c}){const l=!!n,u=$(null),{setHover:f,onPointerLeave:d,...m}=hs(s,u,i,l),{handleClose:h}=ze(xr),p=le(()=>({disabled:l,hover:i,focusable:!0}),[l,i]),g=le(()=>He(o,{...p,ref:u,closeMenu:h}),[o,p,h]),v=Jt({...m,onPointerLeave:T=>d(T,!0),onFocus:f},c);return r("li",{role:kr,..._o(l),...v,ref:en(a,s),className:et({block:Je,element:Er,modifiers:p,className:t}),children:g})}),sn=Qt(Ct(function({className:t,...n},o){return r("li",{role:"separator",...n,ref:o,className:et({block:Je,element:_c,className:t})})})),Uf=Qt(Ct(function({className:t,...n},o){return r("li",{role:En,...n,ref:o,className:et({block:Je,element:yc,className:t})})})),jf=Ct(function({className:t,style:n,takeOverflow:o,...i},s){const a=$(null),[c,l]=W(),{overflow:u,overflowAmt:f}=ze(ao);return jt(()=>{let d;o&&f>=0&&(d=is(a.current).height-f,d<0&&(d=0)),l(d>=0?{maxHeight:d,overflow:u}:void 0)},[o,u,f]),jt(()=>{c&&(a.current.scrollTop=0)},[c]),r("div",{...i,ref:en(s,a),className:et({block:Je,element:bc,className:t}),style:{...n,...c}})});const ai={s:16,m:20,l:24,xl:32,xxl:50,xxxl:64},an={},dn=window.OffscreenCanvas?new OffscreenCanvas(1,1):document.createElement("canvas"),to=dn.getContext("2d",{willReadFrequently:!0});to.imageSmoothingEnabled=!1;const Uc=/missing\.png$/;function jc({url:e,size:t,alt:n="",squircle:o,...i}){t=ai[t]||t||ai.m;const s=$(),a=Uc.test(e);return r("span",{ref:s,class:`avatar ${o?"squircle":""} ${an[e]?"has-alpha":""}`,style:{width:t,height:t},title:n,...i,children:!!e&&r("img",{src:e,width:t,height:t,alt:n,loading:"lazy",decoding:"async",fetchPriority:"low",crossOrigin:an[e]===void 0&&!a?"anonymous":void 0,onError:c=>{c.target.crossOrigin&&(c.target.crossOrigin=null,c.target.src=e)},onLoad:c=>{s.current&&(s.current.dataset.loaded=!0),an[e]===void 0&&(a||setTimeout(()=>{try{const{width:l,height:u}=c.target;dn.width!==l&&(dn.width=l),dn.height!==u&&(dn.height=u),to.drawImage(c.target,0,0);const f=to.getImageData(0,0,l,u),d=f.data.filter((m,h)=>h%4===3&&m<=128).length/(f.data.length/4)>.1;d&&s.current.classList.add("has-alpha"),an[e]=d,to.clearRect(0,0,l,u)}catch{an[e]=!1}},1))}})})}const at=Me(jc),Zt=Ct((e,t)=>{var c;let n;try{n=Ia()}catch{}let o=(location.hash||"").replace(/^#/,"").trim();o===""&&(o="/");const{to:i,...s}=e;if(o&&o!=="/"&&o.includes("?")){const l=URL.parse(o,location.origin);if((c=l==null?void 0:l.searchParams)!=null&&c.size){const u=Array.from(l.searchParams.entries()).map(([f,d])=>`${f}=${encodeURIComponent(d)}`).join("&");o=l.pathname+"?"+u}}const a=o===i||decodeURIComponent(o)===i;return r("a",{ref:t,href:`#${i}`,...s,class:`${e.class||""} ${a?"is-active":""}`,onClick:l=>{var u,f,d;(f=(u=l.currentTarget)==null?void 0:u.parentNode)!=null&&f.closest("a")&&l.stopPropagation(),n&&(H.prevLocation=n),(d=e.onClick)==null||d.call(e,l)}})});let or=!1;const Kc=new MutationObserver(e=>{e.forEach(t=>{if(t.type==="attributes"){const{dir:n}=t.target;n==="rtl"?or=!0:or=!1}})});Kc.observe(document.documentElement,{attributes:!0,attributeFilter:["dir"]});function rr(){return or}const Wc=document.documentElement,jn=getComputedStyle(Wc),Zc=8;let ps=[0,0,0,0];function ms(){const e=jn.getPropertyValue("--sai-top"),t=jn.getPropertyValue("--sai-right"),n=jn.getPropertyValue("--sai-bottom"),o=jn.getPropertyValue("--sai-left");ps=[Math.max(0,parseInt(e,10)),Math.max(0,parseInt(t,10)),Math.max(0,parseInt(n,10)),Math.max(0,parseInt(o,10))]}requestAnimationFrame(ms);function gs(e=[]){return ps.map((n,o)=>(n||Zc)+(e[o]||0)).join(" ")}CSS.supports("top: env(safe-area-inset-top)")&&window.addEventListener("resize",ms,{passive:!0});function Gc(){const[e,t]=W({width:null,height:null});return Wt(()=>{const n=()=>{t({width:window.innerWidth,height:window.innerHeight})};return n(),window.addEventListener("resize",n,{passive:!0}),()=>{window.removeEventListener("resize",n)}},[]),e}function vs(e){const{containerProps:t,instanceRef:n,align:o}=e,i=Gc(),s=n!=null&&n.current?n:$(),a=rr()?o==="end"?"start":o==="start"?"end":o:o;return r(Vc,{boundingBoxPadding:gs(),repositionFlag:`${i.width}x${i.height}`,unmountOnClose:!0,...e,align:a,instanceRef:s,containerProps:{onClick:c=>{var l,u,f;c.target===c.currentTarget&&((u=(l=s.current)==null?void 0:l.closeMenu)==null||u.call(l)),(f=t==null?void 0:t.onClick)==null||f.call(t,c)},...t}})}function qc(e){const t=$();return r(Hc,{...e,instanceRef:t,itemProps:{onPointerMove:n=>{var o,i;n.pointerType==="touch"&&((i=(o=t.current)==null?void 0:o.openMenu)==null||i.call(o))},onPointerLeave:n=>{var o,i;n.pointerType==="touch"&&((i=(o=t.current)==null?void 0:o.openMenu)==null||i.call(o))},...e.itemProps}})}function Mo({subMenu:e=!1,confirm:t=!0,confirmLabel:n,menuItemClassName:o,menuFooter:i,menuExtras:s,...a}){const{children:c,onClick:l,...u}=a;return t?r(e?qc:vs,{openTrigger:"clickOnly",direction:"bottom",overflow:"auto",gap:-8,shift:8,menuClassName:"menu-emphasized",...u,menuButton:e?void 0:c,label:e?c:void 0,children:[r(Ie,{className:o,onClick:l,children:n}),s,i]}):e?r(Ie,{...a}):l?Aa(c,{onClick:l}):c}function ci(e){const{className:t,disabled:n,...o}=e;return r(Bc,{className:t,disabled:n,children:({ref:i,closeMenu:s})=>r(Zt,{...o,ref:i,onClick:({detail:a})=>s(a===0?"Enter":void 0)})})}function ir({staticUrl:e,alt:t,url:n}){return r("picture",{children:[e&&r("source",{srcset:e,media:"(prefers-reduced-motion: reduce)"}),r("img",{src:n,alt:t,class:"shortcode-emoji emoji",width:"16",height:"16",loading:"lazy",decoding:"async",fetchPriority:"low"},t||n)]})}const Yc=Me(e=>new RegExp(`:(${e.join("|")}):`,"g"));function Xc({text:e,emojis:t}){if(!e)return"";if(!(t!=null&&t.length)||e.indexOf(":")===-1)return e;const n=Yc(t.map(i=>i.shortcode));return e.split(n).map((i,s)=>{const a=t.find(c=>c.shortcode===i);if(a){const{url:c,staticUrl:l}=a;return r(ir,{staticUrl:l,alt:i,url:c},i+"-"+s)}return i})}const Gt=Me(Xc),Qc=Me(e=>{const t={sensitivity:"base"};try{return new Intl.Collator(e||void 0,t)}catch{return new Intl.Collator(void 0,t)}}),Jc=/([^@]+)(@.+)/i,el=/(\:(\w|\+|\-)+\:)(?=|[\!\.\?]|$)/g,tl=/\s+/g,nl=/[^a-z0-9@\.]/gi;function ol({account:e,instance:t,showAvatar:n,showAcct:o,short:i,external:s,onClick:a}){const{i18n:c}=go(),{acct:l,avatar:u,avatarStatic:f,id:d,url:m,displayName:h,emojis:p,bot:g,username:v}=e,[T,y,x]=l.match(Jc)||[,l];t||(t=so().instance);const w=v.toLowerCase().trim(),E=(h||"").toLowerCase().trim(),b=E.replace(el,"").replace(tl,""),I=b.replace(nl,""),D=!i&&(w===E||w===b||w===I||Qc(c.locale).compare(w,b)===0)||I===l.toLowerCase();return r("a",{class:`name-text ${o?"show-acct":""} ${i?"short":""}`,href:m,target:s?"_blank":null,title:h?`${h} (${x?"":"@"}${l})`:`${x?"":"@"}${l}`,onClick:R=>{if(!s&&!R.shiftKey){if(R.preventDefault(),R.stopPropagation(),a)return a(R);if(R.metaKey||R.ctrlKey||R.shiftKey||R.which===2){const S=`#/${t}/a/${d}`;window.open(S,"_blank");return}H.showAccount={account:e,instance:t}}},children:[n&&r(N,{children:[r(at,{url:f||u,squircle:g})," "]}),h&&!i?r(N,{children:[r("b",{dir:"auto",children:r(Gt,{text:h,emojis:p})}),!o&&!D&&r(N,{children:[" ",r("i",{class:"bidi-isolate",children:["@",v]})]})]}):i?r("i",{children:v}):r("b",{children:v}),o&&r(N,{children:[r("br",{}),r("i",{class:"bidi-isolate",children:[x?"":"@",y,!!x&&r("span",{class:"ib",children:x})]})]})]})}const gt=Me(ol),Kn={"zh-YUE":"YUE",zh_HANT:"zh-Hant"},Ro=Me(e=>new Intl.DisplayNames(e||void 0,{type:"language"}));function rl(e){let t,n;typeof e=="object"&&({code:e,locale:t,fallback:n}=e);try{const o=Ro(t||k.locale).of(e);if(o!==e)return o;if(!n){const i=Ro(e).of(e);if(i!==e)return i}return n||""}catch{if(Kn[e])try{const i=Ro(Kn[t]||t||k.locale).of(Kn[e]);return i!==Kn[e]?i:n||""}catch{}return n||""}}const cn=Me(rl);function li(e){if(e instanceof Date)return!isNaN(e.getTime());{const t=new Date(e);return!isNaN(t.getTime())}}const il=Me(()=>new Intl.DateTimeFormat().resolvedOptions().locale),ui=Me((e,t={})=>{const n=e.replace(/-[a-z]+$/i,""),o=yn([n],[il()],e);try{return new Intl.DateTimeFormat(o,t)}catch{}try{return new Intl.DateTimeFormat(e,t)}catch{}return new Intl.DateTimeFormat(void 0,t)}),sl=Me(e=>new Intl.RelativeTimeFormat(e||void 0)),qt=60,Yt=60*qt,sr=24*Yt,al=e=>{const t=sl(k.locale),n=(e.getTime()-Date.now())/1e3,o=Math.abs(n);return o{const t=(Date.now()-e.getTime())/1e3;return tl+1,0),i=le(()=>new Date(e),[e]),[s,a,c]=le(()=>{if(!li(i))return[""+e,"",""];let l;if(t==="micro"){const u=new Date;(u.getTime()-i.getTime())/1e3/sr<=1?l=cl(i):u.getFullYear()===i.getFullYear()?l=ui(k.locale,{year:void 0,month:"short",day:"numeric"}).format(i):l=ui(k.locale,{dateStyle:"short"}).format(i)}return l||(l=al(i)),[l,i.toISOString(),i.toLocaleString()]},[i,t,n]);return J(()=>{if(!li(i))return;let l,u;function f(){u=requestAnimationFrame(()=>{o(),d()})}function d(){const m=(Date.now()-i.getTime())/1e3;m{clearTimeout(l),cancelAnimationFrame(u)}},[]),r("time",{datetime:a,title:c,children:s})}const ll=[{code:"af",name:"Afrikaans"},{code:"sq",name:"Albanian"},{code:"am",name:"Amharic"},{code:"ar",name:"Arabic"},{code:"hy",name:"Armenian"},{code:"as",name:"Assamese"},{code:"ay",name:"Aymara"},{code:"az",name:"Azerbaijani"},{code:"bm",name:"Bambara"},{code:"eu",name:"Basque"},{code:"be",name:"Belarusian"},{code:"bn",name:"Bengali"},{code:"bho",name:"Bhojpuri"},{code:"bs",name:"Bosnian"},{code:"bg",name:"Bulgarian"},{code:"ca",name:"Catalan"},{code:"ceb",name:"Cebuano"},{code:"ny",name:"Chichewa"},{code:"zh",name:"Chinese"},{code:"zh_HANT",name:"Chinese (Traditional)"},{code:"co",name:"Corsican"},{code:"hr",name:"Croatian"},{code:"cs",name:"Czech"},{code:"da",name:"Danish"},{code:"dv",name:"Dhivehi"},{code:"doi",name:"Dogri"},{code:"nl",name:"Dutch"},{code:"en",name:"English"},{code:"eo",name:"Esperanto"},{code:"et",name:"Estonian"},{code:"ee",name:"Ewe"},{code:"tl",name:"Filipino"},{code:"fi",name:"Finnish"},{code:"fr",name:"French"},{code:"fy",name:"Frisian"},{code:"gl",name:"Galician"},{code:"ka",name:"Georgian"},{code:"de",name:"German"},{code:"el",name:"Greek"},{code:"gn",name:"Guarani"},{code:"gu",name:"Gujarati"},{code:"ht",name:"Haitian Creole"},{code:"ha",name:"Hausa"},{code:"haw",name:"Hawaiian"},{code:"iw",name:"Hebrew"},{code:"hi",name:"Hindi"},{code:"hmn",name:"Hmong"},{code:"hu",name:"Hungarian"},{code:"is",name:"Icelandic"},{code:"ig",name:"Igbo"},{code:"ilo",name:"Ilocano"},{code:"id",name:"Indonesian"},{code:"ga",name:"Irish"},{code:"it",name:"Italian"},{code:"ja",name:"Japanese"},{code:"jw",name:"Javanese"},{code:"kn",name:"Kannada"},{code:"kk",name:"Kazakh"},{code:"km",name:"Khmer"},{code:"rw",name:"Kinyarwanda"},{code:"gom",name:"Konkani"},{code:"ko",name:"Korean"},{code:"kri",name:"Krio"},{code:"ku",name:"Kurdish (Kurmanji)"},{code:"ckb",name:"Kurdish (Sorani)"},{code:"ky",name:"Kyrgyz"},{code:"lo",name:"Lao"},{code:"la",name:"Latin"},{code:"lv",name:"Latvian"},{code:"ln",name:"Lingala"},{code:"lt",name:"Lithuanian"},{code:"lg",name:"Luganda"},{code:"lb",name:"Luxembourgish"},{code:"mk",name:"Macedonian"},{code:"mai",name:"Maithili"},{code:"mg",name:"Malagasy"},{code:"ms",name:"Malay"},{code:"ml",name:"Malayalam"},{code:"mt",name:"Maltese"},{code:"mi",name:"Maori"},{code:"mr",name:"Marathi"},{code:"mni-Mtei",name:"Meiteilon (Manipuri)"},{code:"lus",name:"Mizo"},{code:"mn",name:"Mongolian"},{code:"my",name:"Myanmar (Burmese)"},{code:"ne",name:"Nepali"},{code:"no",name:"Norwegian"},{code:"or",name:"Odia (Oriya)"},{code:"om",name:"Oromo"},{code:"ps",name:"Pashto"},{code:"fa",name:"Persian"},{code:"pl",name:"Polish"},{code:"pt",name:"Portuguese"},{code:"pa",name:"Punjabi"},{code:"qu",name:"Quechua"},{code:"ro",name:"Romanian"},{code:"ru",name:"Russian"},{code:"sm",name:"Samoan"},{code:"sa",name:"Sanskrit"},{code:"gd",name:"Scots Gaelic"},{code:"nso",name:"Sepedi"},{code:"sr",name:"Serbian"},{code:"st",name:"Sesotho"},{code:"sn",name:"Shona"},{code:"sd",name:"Sindhi"},{code:"si",name:"Sinhala"},{code:"sk",name:"Slovak"},{code:"sl",name:"Slovenian"},{code:"so",name:"Somali"},{code:"es",name:"Spanish"},{code:"su",name:"Sundanese"},{code:"sw",name:"Swahili"},{code:"sv",name:"Swedish"},{code:"tg",name:"Tajik"},{code:"ta",name:"Tamil"},{code:"tt",name:"Tatar"},{code:"te",name:"Telugu"},{code:"th",name:"Thai"},{code:"ti",name:"Tigrinya"},{code:"ts",name:"Tsonga"},{code:"tr",name:"Turkish"},{code:"tk",name:"Turkmen"},{code:"ak",name:"Twi"},{code:"uk",name:"Ukrainian"},{code:"ur",name:"Urdu"},{code:"ug",name:"Uyghur"},{code:"uz",name:"Uzbek"},{code:"vi",name:"Vietnamese"},{code:"cy",name:"Welsh"},{code:"xh",name:"Xhosa"},{code:"yi",name:"Yiddish"},{code:"yo",name:"Yoruba"},{code:"zu",name:"Zulu"}],ul=Me(()=>[new Intl.DateTimeFormat().resolvedOptions().locale,...navigator.languages]),dl=()=>yn(ul(),ll.map(e=>e.code.replace("_","-")),"en");function _s(e=!1){if(e){const{contentTranslationTargetLanguage:t}=H.settings;if(t)return t}return dl()}const fl=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,fo=e=>{if(typeof e!="string")throw new TypeError("Invalid argument expected string");const t=e.match(fl);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},di=e=>e==="*"||e==="x"||e==="X",fi=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},hl=(e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t],pl=(e,t)=>{if(di(e)||di(t))return 0;const[n,o]=hl(fi(e),fi(t));return n>o?1:n{for(let n=0;n{const n=fo(e),o=fo(t),i=n.pop(),s=o.pop(),a=Bt(n,o);return a!==0?a:i&&s?Bt(i.split("."),s.split(".")):i||s?i?-1:1:0},gl=(e,t,n)=>{vl(n);const o=ml(e,t);return ys[n].includes(o)},ys={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1],"!=":[-1,1]},hi=Object.keys(ys),vl=e=>{if(typeof e!="string")throw new TypeError(`Invalid operator type, expected string but got ${typeof e}`);if(hi.indexOf(e)===-1)throw new Error(`Invalid operator, expected one of ${hi.join("|")}`)},no=(e,t)=>{if(t=t.replace(/([><=]+)\s+/g,"$1"),t.includes("||"))return t.split("||").some(v=>no(e,v));if(t.includes(" - ")){const[v,T]=t.split(" - ",2);return no(e,`>=${v} <=${T}`)}else if(t.includes(" "))return t.trim().replace(/\s{2,}/g," ").split(" ").every(v=>no(e,v));const n=t.match(/^([<>=~^]+)/),o=n?n[1]:"=";if(o!=="^"&&o!=="~")return gl(e,t,o);const[i,s,a,,c]=fo(e),[l,u,f,,d]=fo(t),m=[i,s,a],h=[l,u??"x",f??"x"];if(d&&(!c||Bt(m,h)!==0||Bt(c.split("."),d.split("."))===-1))return!1;const p=h.findIndex(v=>v!=="0")+1,g=o==="~"?2:p>1?p:1;return!(Bt(m.slice(0,g),h.slice(0,g))!==0||Bt(m.slice(g),h.slice(g))===-1)};const _l={"@mastodon/edit-media-attributes":">=4.1","@mastodon/list-exclusive":">=4.2","@mastodon/filtered-notifications":"~4.3 || >=4.3","@mastodon/fetch-multiple-statuses":"~4.3 || >=4.3","@mastodon/trending-link-posts":"~4.3 || >=4.3","@mastodon/grouped-notifications":"~4.3 || >=4.3"},Oo=/pixelfed/i,rt=/^(?!.*pixelfed).*$/i,yl=/pleroma/i,bl=/akkoma/i,pi={"@mastodon/lists":rt,"@mastodon/filters":rt,"@mastodon/mentions":rt,"@mastodon/trending-hashtags":rt,"@mastodon/trending-links":rt,"@mastodon/post-bookmark":rt,"@mastodon/post-edit":rt,"@mastodon/profile-edit":rt,"@mastodon/profile-private-note":rt,"@pixelfed/trending":Oo,"@pixelfed/home-include-reblogs":Oo,"@pixelfed/global-feed":Oo,"@pleroma/local-visibility-post":yl,"@akkoma/local-visibility-post":bl},Wn={};function Zn(e){try{const{version:t,domain:n}=Ca(),o=`${n}-${e}`;if(Wn[o])return Wn[o];if(pi[e])return Wn[o]=pi[e].test(t);const i=_l[e];return i?Wn[o]=no(t,i,{includePrerelease:!0,loose:!0}):!1}catch{return!1}}const Kt=2147483647,Ye=36,Ir=1,wn=26,Tl=38,El=700,bs=72,Ts=128,Es="-",wl=/^xn--/,xl=/[^\0-\x7F]/,kl=/[\x2E\u3002\uFF0E\uFF61]/g,Sl={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Do=Ye-Ir,Xe=Math.floor,$o=String.fromCharCode;function ht(e){throw new RangeError(Sl[e])}function Il(e,t){const n=[];let o=e.length;for(;o--;)n[o]=t(e[o]);return n}function ws(e,t){const n=e.split("@");let o="";n.length>1&&(o=n[0]+"@",e=n[1]),e=e.replace(kl,".");const i=e.split("."),s=Il(i,t).join(".");return o+s}function xs(e){const t=[];let n=0;const o=e.length;for(;n=55296&&i<=56319&&nString.fromCodePoint(...e),Cl=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:Ye},mi=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},ks=function(e,t,n){let o=0;for(e=n?Xe(e/El):e>>1,e+=Xe(e/t);e>Do*wn>>1;o+=Ye)e=Xe(e/Do);return Xe(o+(Do+1)*e/(e+Tl))},Ss=function(e){const t=[],n=e.length;let o=0,i=Ts,s=bs,a=e.lastIndexOf(Es);a<0&&(a=0);for(let c=0;c=128&&ht("not-basic"),t.push(e.charCodeAt(c));for(let c=a>0?a+1:0;c=n&&ht("invalid-input");const m=Cl(e.charCodeAt(c++));m>=Ye&&ht("invalid-input"),m>Xe((Kt-o)/f)&&ht("overflow"),o+=m*f;const h=d<=s?Ir:d>=s+wn?wn:d-s;if(mXe(Kt/p)&&ht("overflow"),f*=p}const u=t.length+1;s=ks(o-l,u,l==0),Xe(o/u)>Kt-i&&ht("overflow"),i+=Xe(o/u),o%=u,t.splice(o++,0,i)}return String.fromCodePoint(...t)},Is=function(e){const t=[];e=xs(e);const n=e.length;let o=Ts,i=0,s=bs;for(const l of e)l<128&&t.push($o(l));const a=t.length;let c=a;for(a&&t.push(Es);c=o&&fXe((Kt-i)/u)&&ht("overflow"),i+=(l-o)*u,o=l;for(const f of e)if(fKt&&ht("overflow"),f===o){let d=i;for(let m=Ye;;m+=Ye){const h=m<=s?Ir:m>=s+wn?wn:m-s;if(d{const{shortcode:o,staticUrl:i,url:s}=n;e=e.replace(new RegExp(`:${o}:`,"g"),`:${o}:`)}),e):""}const Nt=document.createElement("div"),Ml=["u-url","mention","hashtag"],Rl=/[&<>]/g;function No(e){return e.replace(Rl,t=>({"&":"&","<":"<",">":">"})[t])}const Ol=/{}}=t;let s=e;const a=Wl(s,o),c=Ol.test(s),l=s.includes("```");if(c){const f=a.querySelectorAll('a:not([target="_blank"])');for(const m of f)m.setAttribute("target","_blank");const d=a.querySelectorAll("a[class]");for(const m of d)for(const h of m.classList)Ml.includes(h)||m.classList.remove(h)}if(c){const f=a.querySelectorAll("a[href]");for(const d of f)Dl.test(d.textContent.trim())&&(d.classList.add("has-url-text"),Xl(d))}if(c){const f=a.querySelectorAll("a[href]"),d=[];for(const m of f){const h=m.innerText.trim(),p=m.querySelector("*");if($l.test(h)){const[g,v,T]=h.split("@");p||(!d.some(([y])=>y===v)||d.some(([y,x])=>y===v&&x===T)?(m.innerHTML=`@${v}`,d.push([v,T])):m.innerHTML=`@${v}@${T}`),m.classList.add("mention")}Nl.test(h)&&(p||(m.innerHTML=`#${h.slice(1)}`),m.classList.add("mention","hashtag"))}}let u;if(s.includes(":")&&(n!=null&&n.length)){u=zo(a);for(const f of u){let d=No(f.nodeValue);d=ho(d,n),Nt.innerHTML=d,f.replaceWith(...Nt.childNodes)}}if(l){const f=[...a.querySelectorAll("p")].filter(d=>Fl.test(d.innerText.trim()));for(const d of f){const m=document.createElement("pre");for(const h of d.querySelectorAll("br"))h.replaceWith(` `);m.innerHTML=`${d.innerHTML.trim()}`,d.replaceWith(m)}}if(l){const d=[...a.querySelectorAll("p")].filter(m=>zl.test(m.innerText));for(const m of d){const h=[m];let p=!1,g=m;for(;g.nextElementSibling;){const v=g.nextElementSibling;if(v&&v.tagName==="P")if(Vl.test(v.innerText)){h.push(v),p=!0;break}else h.push(v);else break;g=v}if(p){const v=document.createElement("pre");for(const y of h)for(const x of y.querySelectorAll("br"))x.replaceWith(` `);const T=h.map(y=>y.innerHTML).join(` -`);v.innerHTML=`${T}`,m.replaceWith(v);for(const y of h)y.remove()}}}if(s.includes("`")){u=zo(a);for(const f of u){let d=No(f.nodeValue);Hl.test(d)&&(d=d.replaceAll(/(`[^]+?`)/g,"$1")),Nt.innerHTML=d,f.replaceWith(...Nt.childNodes)}}if(Bl.test(s)){u=zo(a,{rejectFilter:["A"]});for(const f of u){let d=No(f.nodeValue);Ul.test(d)&&(d=d.replaceAll(jl,'$1')),Nt.innerHTML=d,f.replaceWith(...Nt.childNodes)}}if(s.includes("#")){let f=null;const d=[...a.querySelectorAll("p")].filter((m,h)=>{let p=0;for(let g=0;g3||p>1&&f&&h===f+1)return f=h,!0});if(d!=null&&d.length)for(const m of d)m.classList.add("hashtag-stuffing"),m.title=m.innerText}if(s.includes("i(a)),o?a:a.innerHTML}const Cs=Me(Wl),Zl=["STYLE","IMG","VIDEO","AUDIO","AREA","MAP","TRACK","EMBED","IFRAME","OBJECT","PICTURE","PORTAL","SOURCE","SVG","MATH","CANVAS","NOSCRIPT","SCRIPT","INPUT","OPTION","TEXTAREA","SLOT","TEMPLATE"],Gl=Object.fromEntries(Zl.map(e=>[e,!0])),ql=/^(https?:\/\/(www\.)?|xmpp:)/,Fo=30;function Yl(e){var t;if(!(!e||(t=e.querySelector)!=null&&t.call(e,"*")))try{const n=e.innerText.trim(),o=(n.match(ql)||[])[0]||"";if(!o)return;const i=n.slice(o.length,o.length+Fo),s=n.slice(o.length+Fo),a=n.slice(o.length).length>Fo;e.innerHTML=`${i}`}catch{}}function zo(e,t={}){var a;const n=[],o=Object.assign({},Gl,(a=t.rejectFilter)==null?void 0:a.reduce((c,l)=>(c[l]=!0,c),{})),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode(c){return o[c.parentNode.nodeName]?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}},!1);let s;for(;s=i.nextNode();)n.push(s);return n}const Ft=document.createElement("div");function Xl(e,t){if(!e)return"";const{preProcess:n}=t||{};return Ft.innerHTML=e.replace(/<\/p>/g,`

    +`);v.innerHTML=`${T}`,m.replaceWith(v);for(const y of h)y.remove()}}}if(s.includes("`")){u=zo(a);for(const f of u){let d=No(f.nodeValue);Hl.test(d)&&(d=d.replaceAll(Kl,"$1")),Nt.innerHTML=d,f.replaceWith(...Nt.childNodes)}}if(Bl.test(s)){u=zo(a,{rejectFilter:["A"]});for(const f of u){let d=No(f.nodeValue);Ul.test(d)&&(d=d.replaceAll(jl,'$1')),Nt.innerHTML=d,f.replaceWith(...Nt.childNodes)}}if(s.includes("#")){let f=null;const d=[...a.querySelectorAll("p")].filter((m,h)=>{let p=0;for(let g=0;g3||p>1&&f&&h===f+1)return f=h,!0});if(d!=null&&d.length)for(const m of d)m.classList.add("hashtag-stuffing"),m.title=m.innerText}if(s.includes("i(a)),o?a:a.innerHTML}const Cs=Me(Zl),Gl=["STYLE","IMG","VIDEO","AUDIO","AREA","MAP","TRACK","EMBED","IFRAME","OBJECT","PICTURE","PORTAL","SOURCE","SVG","MATH","CANVAS","NOSCRIPT","SCRIPT","INPUT","OPTION","TEXTAREA","SLOT","TEMPLATE"],ql=Object.fromEntries(Gl.map(e=>[e,!0])),Yl=/^(https?:\/\/(www\.)?|xmpp:)/,Fo=30;function Xl(e){var t;if(!(!e||(t=e.querySelector)!=null&&t.call(e,"*")))try{const n=e.innerText.trim(),o=(n.match(Yl)||[])[0]||"";if(!o)return;const i=n.slice(o.length,o.length+Fo),s=n.slice(o.length+Fo),a=n.slice(o.length).length>Fo;e.innerHTML=`${i}`}catch{}}function zo(e,t={}){var a;const n=[],o=Object.assign({},ql,(a=t.rejectFilter)==null?void 0:a.reduce((c,l)=>(c[l]=!0,c),{})),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode(c){return o[c.parentNode.nodeName]?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}},!1);let s;for(;s=i.nextNode();)n.push(s);return n}const Ft=document.createElement("div");function Ql(e,t){if(!e)return"";const{preProcess:n}=t||{};return Ft.innerHTML=e.replace(/<\/p>/g,`

    `).replace(/<\/li>/g,` `),Ft.querySelectorAll("br").forEach(o=>{o.replaceWith(` `)}),n==null||n(Ft),Ft.querySelectorAll(".invisible").forEach(o=>{o.remove()}),Ft.querySelectorAll(".ellipsis").forEach(o=>{o.append("...")}),Ft.innerText.replace(/[\r\n]{3,}/g,` -`).trim()}const po=Me(Xl);function Ql(e){const{mentions:t=[],instance:n,previewMode:o,statusURL:i}=e||{};return s=>{var f,d;let{target:a}=s;if(a=a.closest("a"),!a||s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||s.which===2)return;const c=(f=a.previousSibling)==null?void 0:f.textContent,l=c==null?void 0:c.endsWith("@"),u=a.innerText.startsWith("@");if((a.classList.contains("u-url")||a.classList.contains("mention"))&&u||l&&!u){const m=(a.querySelector("span")||a).innerText.trim(),h=m.replace(/^@/,""),p=a.getAttribute("href"),g=t.find(v=>v.url===p)||t.find(v=>v.acct===h||v.username===h);if(g)s.preventDefault(),s.stopPropagation(),H.showAccount={account:g.acct,instance:n};else if(!/^http/i.test(m)){s.preventDefault(),s.stopPropagation();const v=a.getAttribute("href");H.showAccount={account:v,instance:n}}}else if(!o){const m=c==null?void 0:c.endsWith("#");if(a.classList.contains("hashtag")||m){s.preventDefault(),s.stopPropagation();const h=a.innerText.replace(/^#/,"").trim(),p=n?`#/${n}/t/${h}`:`#/t/${h}`;location.hash=p}else(d=H.unfurledLinks[a.href])!=null&&d.url&&i!==a.href&&(s.preventDefault(),s.stopPropagation(),H.prevLocation={pathname:location.hash.replace(/^#/,"")},location.hash=`#${H.unfurledLinks[a.href].url}`)}}}function jf(e,t){return()=>k.number(e,{style:"unit",unit:t,unitDisplay:"long"})}const Jl=Me(()=>new Intl.DateTimeFormat().resolvedOptions().locale),eu=e=>{const{locale:t,dateYear:n,hideTime:o,formatOpts:i,forceOpts:s}=e||{},a=t.replace(/-[a-z]+$/i,""),c=yn([a],[Jl],t),l=new Date().getFullYear(),u=s||{year:n===l?void 0:"numeric",month:"short",day:"numeric",hour:o?void 0:"numeric",minute:o?void 0:"numeric",...i};try{return Intl.DateTimeFormat(c,u)}catch{}try{return Intl.DateTimeFormat(t,u)}catch{}return Intl.DateTimeFormat(void 0,u)},tu=Me(eu);function xn(e,t){return e instanceof Date||(e=new Date(e)),tu({dateYear:e.getFullYear(),locale:k.locale,...t}).format(e)}function it(e){try{return k.number(e,{notation:"compact",roundingMode:"floor"})}catch{return e}}const gi=5e3;function Gn(e){if(e||(e=!0),H.showCompose){H.composerState.minimized?Le({duration:gi,text:k._({id:"/4fHR1"})}):Le({duration:gi,text:k._({id:"vvl08N"})});return}tc(),H.showCompose=e}function Kf({skeleton:e,account:t,avatarSize:n="xl",useAvatarStatic:o=!1,instance:i,external:s,internal:a,onClick:c,showActivity:l=!1,showStats:u=!1,accountInstance:f,hideDisplayName:d=!1,relationship:m={},excludeRelationshipAttrs:h=[]}){if(e)return r("div",{class:"account-block skeleton",children:[r(at,{size:n}),r("span",{children:[r("b",{children:"████████"}),r("br",{}),r("span",{class:"account-block-acct",children:"██████"})]})]});if(!t)return null;const{id:p,acct:g,avatar:v,avatarStatic:T,displayName:y,username:x,emojis:w,url:E,statusesCount:b,lastStatusAt:I,bot:D,fields:R,note:S,group:C,followersCount:L,createdAt:Y,locked:z}=t;let[ue,Q,se]=g.match(/([^@]+)(@.+)/i)||[,g];f&&(se=`@${f}`);const q=R==null?void 0:R.find(de=>!!de.verifiedAt&&!!de.value),ae={};for(const de in m)h.includes(de)||(ae[de]=m[de]);const ce=ae.following||ae.followedBy||ae.requested;return r("a",{class:"account-block",href:E,target:s?"_blank":null,title:se?g:`@${g}`,onClick:de=>{if(!s){if(de.preventDefault(),c)return c(de);a?location.hash=`/${i}/a/${p}`:H.showAccount={account:t,instance:i}}},children:[r("div",{class:"avatar-container",children:r(at,{url:o?T:v||T,size:n,squircle:D})}),r("span",{class:"account-block-content",children:[!d&&r(N,{children:y?r("b",{children:r(Gt,{text:y,emojis:w})}):r("b",{children:x})})," ",r("span",{class:"account-block-acct bidi-isolate",children:[se?"":"@",Q,r("wbr",{}),se,z&&r(N,{children:[" ",r(M,{icon:"lock",size:"s",alt:k._({id:"G2fuEb"})})]})]}),l&&r("div",{class:"account-block-stats",children:[r(O,{id:"ajzDof",values:{0:it(b)}}),!!I&&r(N,{children:[" ","·"," ",r(O,{id:"f8bJ3C",values:{0:xn(I,{hideTime:!0})}})]})]}),u&&r("div",{class:"account-block-stats",children:[D&&r(N,{children:r("span",{class:"tag collapsed",children:[r(M,{icon:"bot"})," ",r(O,{id:"9Vdq+j"})]})}),!!C&&r(N,{children:r("span",{class:"tag collapsed",children:[r(M,{icon:"group"})," ",r(O,{id:"L8fEEm"})]})}),ce&&r("div",{class:"shazam-container-horizontal",children:r("div",{class:"shazam-container-inner",children:ae.following&&ae.followedBy?r("span",{class:"tag minimal",children:r(O,{id:"7oRLbi"})}):ae.requested?r("span",{class:"tag minimal",children:r(O,{id:"Yx0Ud8"})}):ae.following?r("span",{class:"tag minimal",children:r(O,{id:"y6sq5j"})}):ae.followedBy?r("span",{class:"tag minimal",children:r(O,{id:"p3UO/y"})}):null})},m.id),!!L&&r("span",{class:"ib",children:r(O,{id:"Mn1E9C",values:{followersCount:L}})}),!!q&&r("span",{class:"verified-field",children:[r(M,{icon:"check-circle",size:"s",alt:k._({id:"QDEWii"})})," ",r("span",{dangerouslySetInnerHTML:{__html:Cs(q.value,{emojis:w})}})]}),!D&&!C&&!ce&&!L&&!q&&!!Y&&r("span",{class:"created-at",children:r(O,{id:"PCcEFZ",values:{0:xn(Y,{hideTime:!0})},components:{0:r("time",{datetime:Y})}})})]})]})]})}var Ps={};function We(e,t){typeof t=="boolean"&&(t={forever:t}),this._originalTimeouts=JSON.parse(JSON.stringify(e)),this._timeouts=e,this._options=t||{},this._maxRetryTime=t&&t.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._timer=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}var nu=We;We.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts.slice(0)};We.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timer&&clearTimeout(this._timer),this._timeouts=[],this._cachedTimeouts=null};We.prototype.retry=function(e){if(this._timeout&&clearTimeout(this._timeout),!e)return!1;var t=new Date().getTime();if(e&&t-this._operationStart>=this._maxRetryTime)return this._errors.push(e),this._errors.unshift(new Error("RetryOperation timeout occurred")),!1;this._errors.push(e);var n=this._timeouts.shift();if(n===void 0)if(this._cachedTimeouts)this._errors.splice(0,this._errors.length-1),n=this._cachedTimeouts.slice(-1);else return!1;var o=this;return this._timer=setTimeout(function(){o._attempts++,o._operationTimeoutCb&&(o._timeout=setTimeout(function(){o._operationTimeoutCb(o._attempts)},o._operationTimeout),o._options.unref&&o._timeout.unref()),o._fn(o._attempts)},n),this._options.unref&&this._timer.unref(),!0};We.prototype.attempt=function(e,t){this._fn=e,t&&(t.timeout&&(this._operationTimeout=t.timeout),t.cb&&(this._operationTimeoutCb=t.cb));var n=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){n._operationTimeoutCb()},n._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)};We.prototype.try=function(e){console.log("Using RetryOperation.try() is deprecated"),this.attempt(e)};We.prototype.start=function(e){console.log("Using RetryOperation.start() is deprecated"),this.attempt(e)};We.prototype.start=We.prototype.try;We.prototype.errors=function(){return this._errors};We.prototype.attempts=function(){return this._attempts};We.prototype.mainError=function(){if(this._errors.length===0)return null;for(var e={},t=null,n=0,o=0;o=n&&(t=i,n=a)}return t};(function(e){var t=nu;e.operation=function(n){var o=e.timeouts(n);return new t(o,{forever:n&&(n.forever||n.retries===1/0),unref:n&&n.unref,maxRetryTime:n&&n.maxRetryTime})},e.timeouts=function(n){if(n instanceof Array)return[].concat(n);var o={retries:10,factor:2,minTimeout:1*1e3,maxTimeout:1/0,randomize:!1};for(var i in n)o[i]=n[i];if(o.minTimeout>o.maxTimeout)throw new Error("minTimeout is greater than maxTimeout");for(var s=[],a=0;aiu.call(e)==="[object Error]",au=new Set(["Failed to fetch","NetworkError when attempting to fetch resource.","The Internet connection appears to be offline.","Load failed","Network request failed","fetch failed"]);function cu(e){return e&&su(e)&&e.name==="TypeError"&&typeof e.message=="string"?e.message==="Load failed"?e.stack===void 0:au.has(e.message):!1}class lu extends Error{constructor(t){super(),t instanceof Error?(this.originalError=t,{message:t}=t):(this.originalError=new Error(t),this.originalError.stack=this.stack),this.name="AbortError",this.message=t}}const vi=(e,t,n)=>{const o=n.retries-(t-1);return e.attemptNumber=t,e.retriesLeft=o,e};async function uu(e,t){return new Promise((n,o)=>{t={onFailedAttempt(){},retries:10,shouldRetry:()=>!0,...t};const i=ru.operation(t),s=()=>{var c;i.stop(),o((c=t.signal)==null?void 0:c.reason)};t.signal&&!t.signal.aborted&&t.signal.addEventListener("abort",s,{once:!0});const a=()=>{var c;(c=t.signal)==null||c.removeEventListener("abort",s),i.stop()};i.attempt(async c=>{try{const l=await e(c);a(),n(l)}catch(l){try{if(!(l instanceof Error))throw new TypeError(`Non-error was thrown: "${l}". You should only throw errors.`);if(l instanceof lu)throw l.originalError;if(l instanceof TypeError&&!cu(l))throw l;if(vi(l,c,t),await t.shouldRetry(l)||(i.stop(),o(l)),await t.onFailedAttempt(l),!i.retry(l))throw i.mainError()}catch(u){vi(u,c,t),a(),o(u)}}})})}const du=[{code:"auto",name:"Detect"},{code:"af",name:"Afrikaans"},{code:"sq",name:"Albanian"},{code:"am",name:"Amharic"},{code:"ar",name:"Arabic"},{code:"hy",name:"Armenian"},{code:"as",name:"Assamese"},{code:"ay",name:"Aymara"},{code:"az",name:"Azerbaijani"},{code:"bm",name:"Bambara"},{code:"eu",name:"Basque"},{code:"be",name:"Belarusian"},{code:"bn",name:"Bengali"},{code:"bho",name:"Bhojpuri"},{code:"bs",name:"Bosnian"},{code:"bg",name:"Bulgarian"},{code:"ca",name:"Catalan"},{code:"ceb",name:"Cebuano"},{code:"ny",name:"Chichewa"},{code:"zh",name:"Chinese"},{code:"co",name:"Corsican"},{code:"hr",name:"Croatian"},{code:"cs",name:"Czech"},{code:"da",name:"Danish"},{code:"dv",name:"Dhivehi"},{code:"doi",name:"Dogri"},{code:"nl",name:"Dutch"},{code:"en",name:"English"},{code:"eo",name:"Esperanto"},{code:"et",name:"Estonian"},{code:"ee",name:"Ewe"},{code:"tl",name:"Filipino"},{code:"fi",name:"Finnish"},{code:"fr",name:"French"},{code:"fy",name:"Frisian"},{code:"gl",name:"Galician"},{code:"ka",name:"Georgian"},{code:"de",name:"German"},{code:"el",name:"Greek"},{code:"gn",name:"Guarani"},{code:"gu",name:"Gujarati"},{code:"ht",name:"Haitian Creole"},{code:"ha",name:"Hausa"},{code:"haw",name:"Hawaiian"},{code:"iw",name:"Hebrew"},{code:"hi",name:"Hindi"},{code:"hmn",name:"Hmong"},{code:"hu",name:"Hungarian"},{code:"is",name:"Icelandic"},{code:"ig",name:"Igbo"},{code:"ilo",name:"Ilocano"},{code:"id",name:"Indonesian"},{code:"ga",name:"Irish"},{code:"it",name:"Italian"},{code:"ja",name:"Japanese"},{code:"jw",name:"Javanese"},{code:"kn",name:"Kannada"},{code:"kk",name:"Kazakh"},{code:"km",name:"Khmer"},{code:"rw",name:"Kinyarwanda"},{code:"gom",name:"Konkani"},{code:"ko",name:"Korean"},{code:"kri",name:"Krio"},{code:"ku",name:"Kurdish (Kurmanji)"},{code:"ckb",name:"Kurdish (Sorani)"},{code:"ky",name:"Kyrgyz"},{code:"lo",name:"Lao"},{code:"la",name:"Latin"},{code:"lv",name:"Latvian"},{code:"ln",name:"Lingala"},{code:"lt",name:"Lithuanian"},{code:"lg",name:"Luganda"},{code:"lb",name:"Luxembourgish"},{code:"mk",name:"Macedonian"},{code:"mai",name:"Maithili"},{code:"mg",name:"Malagasy"},{code:"ms",name:"Malay"},{code:"ml",name:"Malayalam"},{code:"mt",name:"Maltese"},{code:"mi",name:"Maori"},{code:"mr",name:"Marathi"},{code:"mni-Mtei",name:"Meiteilon (Manipuri)"},{code:"lus",name:"Mizo"},{code:"mn",name:"Mongolian"},{code:"my",name:"Myanmar (Burmese)"},{code:"ne",name:"Nepali"},{code:"no",name:"Norwegian"},{code:"or",name:"Odia (Oriya)"},{code:"om",name:"Oromo"},{code:"ps",name:"Pashto"},{code:"fa",name:"Persian"},{code:"pl",name:"Polish"},{code:"pt",name:"Portuguese"},{code:"pa",name:"Punjabi"},{code:"qu",name:"Quechua"},{code:"ro",name:"Romanian"},{code:"ru",name:"Russian"},{code:"sm",name:"Samoan"},{code:"sa",name:"Sanskrit"},{code:"gd",name:"Scots Gaelic"},{code:"nso",name:"Sepedi"},{code:"sr",name:"Serbian"},{code:"st",name:"Sesotho"},{code:"sn",name:"Shona"},{code:"sd",name:"Sindhi"},{code:"si",name:"Sinhala"},{code:"sk",name:"Slovak"},{code:"sl",name:"Slovenian"},{code:"so",name:"Somali"},{code:"es",name:"Spanish"},{code:"su",name:"Sundanese"},{code:"sw",name:"Swahili"},{code:"sv",name:"Swedish"},{code:"tg",name:"Tajik"},{code:"ta",name:"Tamil"},{code:"tt",name:"Tatar"},{code:"te",name:"Telugu"},{code:"th",name:"Thai"},{code:"ti",name:"Tigrinya"},{code:"ts",name:"Tsonga"},{code:"tr",name:"Turkish"},{code:"tk",name:"Turkmen"},{code:"ak",name:"Twi"},{code:"uk",name:"Ukrainian"},{code:"ur",name:"Urdu"},{code:"ug",name:"Uyghur"},{code:"uz",name:"Uzbek"},{code:"vi",name:"Vietnamese"},{code:"cy",name:"Welsh"},{code:"xh",name:"Xhosa"},{code:"yi",name:"Yiddish"},{code:"yo",name:"Yoruba"},{code:"zu",name:"Zulu"}];var fu=Object.defineProperty,hu=(e,t,n)=>t in e?fu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,qn=(e,t,n)=>hu(e,typeof t!="symbol"?t+"":t,n),ar=new Map,Yn=new WeakMap,_i=0,pu=void 0;function mu(e){return e?(Yn.has(e)||(_i+=1,Yn.set(e,_i.toString())),Yn.get(e)):"0"}function gu(e){return Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${t}_${t==="root"?mu(e.root):e[t]}`).toString()}function vu(e){const t=gu(e);let n=ar.get(t);if(!n){const o=new Map;let i;const s=new IntersectionObserver(a=>{a.forEach(c=>{var l;const u=c.isIntersecting&&i.some(f=>c.intersectionRatio>=f);e.trackVisibility&&typeof c.isVisible>"u"&&(c.isVisible=u),(l=o.get(c.target))==null||l.forEach(f=>{f(u,c)})})},e);i=s.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),n={id:t,observer:s,elements:o},ar.set(t,n)}return n}function Ls(e,t,n={},o=pu){if(typeof window.IntersectionObserver>"u"&&o!==void 0){const l=e.getBoundingClientRect();return t(o,{isIntersecting:o,target:e,intersectionRatio:typeof n.threshold=="number"?n.threshold:0,time:0,boundingClientRect:l,intersectionRect:l,rootBounds:l}),()=>{}}const{id:i,observer:s,elements:a}=vu(n),c=a.get(e)||[];return a.has(e)||a.set(e,c),c.push(t),s.observe(e),function(){c.splice(c.indexOf(t),1),c.length===0&&(a.delete(e),s.unobserve(e)),a.size===0&&(s.disconnect(),ar.delete(i))}}function _u(e){return typeof e.children!="function"}var Wf=class extends Wi{constructor(e){super(e),qn(this,"node",null),qn(this,"_unobserveCb",null),qn(this,"handleNode",t=>{this.node&&(this.unobserve(),!t&&!this.props.triggerOnce&&!this.props.skip&&this.setState({inView:!!this.props.initialInView,entry:void 0})),this.node=t||null,this.observeNode()}),qn(this,"handleChange",(t,n)=>{t&&this.props.triggerOnce&&this.unobserve(),_u(this.props)||this.setState({inView:t,entry:n}),this.props.onChange&&this.props.onChange(t,n)}),this.state={inView:!!e.initialInView,entry:void 0}}componentDidMount(){this.unobserve(),this.observeNode()}componentDidUpdate(e){(e.rootMargin!==this.props.rootMargin||e.root!==this.props.root||e.threshold!==this.props.threshold||e.skip!==this.props.skip||e.trackVisibility!==this.props.trackVisibility||e.delay!==this.props.delay)&&(this.unobserve(),this.observeNode())}componentWillUnmount(){this.unobserve()}observeNode(){if(!this.node||this.props.skip)return;const{threshold:e,root:t,rootMargin:n,trackVisibility:o,delay:i,fallbackInView:s}=this.props;this._unobserveCb=Ls(this.node,this.handleChange,{threshold:e,root:t,rootMargin:n,trackVisibility:o,delay:i},s)}unobserve(){this._unobserveCb&&(this._unobserveCb(),this._unobserveCb=null)}render(){const{children:e}=this.props;if(typeof e=="function"){const{inView:h,entry:p}=this.state;return e({inView:h,entry:p,ref:this.handleNode})}const{as:t,triggerOnce:n,threshold:o,root:i,rootMargin:s,onChange:a,skip:c,trackVisibility:l,delay:u,initialInView:f,fallbackInView:d,...m}=this.props;return Pa(t||"div",{ref:this.handleNode,...m},e)}};function yu({threshold:e,delay:t,trackVisibility:n,rootMargin:o,root:i,triggerOnce:s,skip:a,initialInView:c,fallbackInView:l,onChange:u}={}){var f;const[d,m]=W(null),h=$(),[p,g]=W({inView:!!c,entry:void 0});h.current=u,J(()=>{if(a||!d)return;let x;return x=Ls(d,(w,E)=>{g({inView:w,entry:E}),h.current&&h.current(w,E),E.isIntersecting&&s&&x&&(x(),x=void 0)},{root:i,rootMargin:o,threshold:e,trackVisibility:n,delay:t},l),()=>{x&&x()}},[Array.isArray(e)?e.toString():e,d,i,o,s,a,n,l,t]);const v=(f=p.entry)==null?void 0:f.target,T=$();!d&&v&&!s&&!a&&T.current!==v&&(T.current=v,g({inView:!!c,entry:void 0}));const y=[m,p.inView,p.entry];return y.ref=y[0],y.inView=y[1],y.entry=y[2],y}const yi=48,Vo={};function Ms({id:e,children:t}){const n=$(),o=!!Vo[e],[i,s]=W(!1),[a,c]=W(o||!1),{ref:l}=yu({root:null,rootMargin:`-${yi}px 0px 0px 0px`,trackVisibility:!0,delay:1e3,onChange:u=>{u&&(s(!0),e&&(Vo[e]=!0))},triggerOnce:!0,skip:a||i});return J(()=>{if(!n.current)return;const u=n.current.getBoundingClientRect();u.bottom>yi&&(u.top{let i=mn[Ho];return fetch(`https://${i}/api/v1/${t}/${n}/${encodeURIComponent(e)}`).then(s=>{if(!s.ok)throw new Error(s.statusText);return s.json()}).then(s=>{var a;return{provider:"lingva",content:s.translation,detectedSourceLanguage:(a=s.info)==null?void 0:a.detectedSource,info:s.info}})},{retries:3,onFailedAttempt:i=>{Ho=(Ho+1)%mn.length}})}const Rs=1e3*60*60,Os=vo(Eu,{maxAge:Rs}),wu=vo(Tu(Os),{maxAge:Rs});function xu({forceTranslate:e,sourceLanguage:t,onTranslate:n,text:o="",mini:i,autoDetected:s}){const a=_s(!0),[c,l]=W("default"),[u,f]=W(null),[d,m]=W(null),[h,p]=W(null),g=$(),v=t?cn(t):null,T=cn(a),y=$("auto");n||(n=i?wu:Os);const x=async()=>{var w,E;l("loading");try{const{content:b,detectedSourceLanguage:I,provider:D,error:R,...S}=await n(o,y.current,a);if(b){if(I){const C=cn(I);p(C)}if(D==="lingva"){const C=(E=(w=S==null?void 0:S.info)==null?void 0:w.pronunciation)==null?void 0:E.query;C&&f(C)}m(b),l("default"),!i&&b.trim()!==o.trim()&&(g.current.open=!0,g.current.scrollIntoView({behavior:"smooth",block:"nearest"}))}else l("error")}catch{l("error")}};return J(()=>{e&&x()},[e]),i?d&&d.trim()!==o.trim()&&h!==T?r(Ms,{children:r("div",{class:"status-translation-block-mini",children:[r(M,{icon:"translate",alt:k._({id:"zVJKbG",values:{sourceLangText:v}})}),r("output",{lang:a,dir:"auto",title:u||"",children:d})]})}):null:r("div",{class:"status-translation-block",onClick:w=>{w.preventDefault()},children:r("details",{ref:g,children:[r("summary",{children:r("button",{type:"button",onClick:async w=>{w.preventDefault(),w.stopPropagation(),g.current.open=!g.current.open,c!=="loading"&&(d||x())},children:[r(M,{icon:"translate"})," ",r("span",{children:c==="loading"?k._({id:"Zxkt/v"}):t&&v&&!h?s?k._({id:"R20Yf9",values:{sourceLangText:v}}):k._({id:"h8zDAI",values:{sourceLangText:v}}):k._({id:"pi8x/S"})})]})}),r("div",{class:"translated-block",children:[r("div",{class:"translation-info insignificant",children:[r("select",{class:"translated-source-select",disabled:c==="loading",onChange:w=>{y.current=w.target.value,x()},children:du.map(w=>{const E=cn({code:w.code,fallback:w.name}),b=cn({code:w.code,locale:w.code}),I=E!==b;return r("option",{value:w.code,children:w.code==="auto"?k._({id:"Bze3gr",values:{0:h??"…"}}):I?`${b} - ${E}`:b})})})," ",r("span",{children:["→ ",T]}),r(Gi,{abrupt:!0,hidden:c!=="loading"})]}),c==="error"?r("p",{class:"ui-state",children:r(O,{id:"m5LihO"})}):!!d&&r(N,{children:[r("output",{class:"translated-content",lang:a,dir:"auto",children:d}),!!u&&r("output",{class:"translated-pronunciation-content",tabIndex:-1,onClick:w=>{w.target.classList.toggle("expand")},children:u})]})]})]})})}const ku=mn!=null&&mn.length?xu:()=>null;function ut(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}function Ds(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const o=ut(n);return(i,s)=>o.then(a=>s(a.transaction(t,i).objectStore(t)))}let Bo;function Pt(){return Bo||(Bo=Ds("keyval-store","keyval")),Bo}function Su(e,t=Pt()){return t("readonly",n=>ut(n.get(e)))}function Iu(e,t,n=Pt()){return n("readwrite",o=>(o.put(t,e),ut(o.transaction)))}function Au(e,t=Pt()){return t("readonly",n=>Promise.all(e.map(o=>ut(n.get(o)))))}function Cu(e,t=Pt()){return t("readwrite",n=>(n.delete(e),ut(n.transaction)))}function Pu(e,t=Pt()){return t("readwrite",n=>(e.forEach(o=>n.delete(o)),ut(n.transaction)))}function Lu(e=Pt()){return e("readwrite",t=>(t.clear(),ut(t.transaction)))}function Mu(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},ut(e.transaction)}function Ru(e=Pt()){return e("readonly",t=>{if(t.getAllKeys)return ut(t.getAllKeys());const n=[];return Mu(t,o=>n.push(o.key)).then(()=>n)})}function Ti(e,t){const n=Ds(e,t);return{set:(o,i)=>Iu(o,i,n),get:o=>Su(o,n),getMany:o=>Au(o,n),del:o=>Cu(o,n),delMany:o=>Pu(o,n),clear:()=>Lu(n),keys:()=>Ru(n)}}const Zf={drafts:Ti("drafts-db","drafts-store"),catchup:Ti("catchup-db","catchup-store")};async function Gf(e,t={}){if(!(e!=null&&e.length))return;const{masto:n}=so(),o=vr(),i=e.reduce((s,a)=>(!s.includes(a.id)&&!t[a.id]&&a.id!==o&&s.push(a.id),s),[]);if(!i.length)return null;try{return(await n.v1.accounts.relationships.fetch({id:i})).reduce((c,l)=>(c[l.id]=l,c),{})}catch{return null}}class Ue extends HTMLElement{constructor(){super(),this.isIframeLoaded=!1,this.setupDom()}static get observedAttributes(){return["videoid","playlistid"]}connectedCallback(){this.addEventListener("pointerover",Ue.warmConnections,{once:!0}),this.addEventListener("click",()=>this.addIframe())}get videoId(){return encodeURIComponent(this.getAttribute("videoid")||"")}set videoId(t){this.setAttribute("videoid",t)}get playlistId(){return encodeURIComponent(this.getAttribute("playlistid")||"")}set playlistId(t){this.setAttribute("playlistid",t)}get videoTitle(){return this.getAttribute("videotitle")||"Video"}set videoTitle(t){this.setAttribute("videotitle",t)}get videoPlay(){return this.getAttribute("videoPlay")||"Play"}set videoPlay(t){this.setAttribute("videoPlay",t)}get videoStartAt(){return this.getAttribute("videoStartAt")||"0"}get autoLoad(){return this.hasAttribute("autoload")}get noCookie(){return this.hasAttribute("nocookie")}get posterQuality(){return this.getAttribute("posterquality")||"hqdefault"}get posterLoading(){return this.getAttribute("posterloading")||"lazy"}get params(){return`start=${this.videoStartAt}&${this.getAttribute("params")}`}set params(t){this.setAttribute("params",t)}setupDom(){const t=this.attachShadow({mode:"open"});let n="";window.liteYouTubeNonce&&(n=`nonce="${window.liteYouTubeNonce}"`),t.innerHTML=` +`).trim()}const po=Me(Ql);function Jl(e){const{mentions:t=[],instance:n,previewMode:o,statusURL:i}=e||{};return s=>{var f,d;let{target:a}=s;if(a=a.closest("a"),!a||s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||s.which===2)return;const c=(f=a.previousSibling)==null?void 0:f.textContent,l=c==null?void 0:c.endsWith("@"),u=a.innerText.startsWith("@");if((a.classList.contains("u-url")||a.classList.contains("mention"))&&u||l&&!u){const m=(a.querySelector("span")||a).innerText.trim(),h=m.replace(/^@/,""),p=a.getAttribute("href"),g=t.find(v=>v.url===p)||t.find(v=>v.acct===h||v.username===h);if(g)s.preventDefault(),s.stopPropagation(),H.showAccount={account:g.acct,instance:n};else if(!/^http/i.test(m)){s.preventDefault(),s.stopPropagation();const v=a.getAttribute("href");H.showAccount={account:v,instance:n}}}else if(!o){const m=c==null?void 0:c.endsWith("#");if(a.classList.contains("hashtag")||m){s.preventDefault(),s.stopPropagation();const h=a.innerText.replace(/^#/,"").trim(),p=n?`#/${n}/t/${h}`:`#/t/${h}`;location.hash=p}else(d=H.unfurledLinks[a.href])!=null&&d.url&&i!==a.href&&(s.preventDefault(),s.stopPropagation(),H.prevLocation={pathname:location.hash.replace(/^#/,"")},location.hash=`#${H.unfurledLinks[a.href].url}`)}}}function Kf(e,t){return()=>k.number(e,{style:"unit",unit:t,unitDisplay:"long"})}const eu=Me(()=>new Intl.DateTimeFormat().resolvedOptions().locale),tu=e=>{const{locale:t,dateYear:n,hideTime:o,formatOpts:i,forceOpts:s}=e||{},a=t.replace(/-[a-z]+$/i,""),c=yn([a],[eu],t),l=new Date().getFullYear(),u=s||{year:n===l?void 0:"numeric",month:"short",day:"numeric",hour:o?void 0:"numeric",minute:o?void 0:"numeric",...i};try{return Intl.DateTimeFormat(c,u)}catch{}try{return Intl.DateTimeFormat(t,u)}catch{}return Intl.DateTimeFormat(void 0,u)},nu=Me(tu);function xn(e,t){return e instanceof Date||(e=new Date(e)),nu({dateYear:e.getFullYear(),locale:k.locale,...t}).format(e)}function it(e){try{return k.number(e,{notation:"compact",roundingMode:"floor"})}catch{return e}}const gi=5e3;function Gn(e){if(e||(e=!0),H.showCompose){H.composerState.minimized?Le({duration:gi,text:k._({id:"/4fHR1"})}):Le({duration:gi,text:k._({id:"vvl08N"})});return}tc(),H.showCompose=e}function Wf({skeleton:e,account:t,avatarSize:n="xl",useAvatarStatic:o=!1,instance:i,external:s,internal:a,onClick:c,showActivity:l=!1,showStats:u=!1,accountInstance:f,hideDisplayName:d=!1,relationship:m={},excludeRelationshipAttrs:h=[]}){if(e)return r("div",{class:"account-block skeleton",children:[r(at,{size:n}),r("span",{children:[r("b",{children:"████████"}),r("br",{}),r("span",{class:"account-block-acct",children:"██████"})]})]});if(!t)return null;const{id:p,acct:g,avatar:v,avatarStatic:T,displayName:y,username:x,emojis:w,url:E,statusesCount:b,lastStatusAt:I,bot:D,fields:R,note:S,group:C,followersCount:L,createdAt:Y,locked:z}=t;let[ue,Q,se]=g.match(/([^@]+)(@.+)/i)||[,g];f&&(se=`@${f}`);const q=R==null?void 0:R.find(de=>!!de.verifiedAt&&!!de.value),ae={};for(const de in m)h.includes(de)||(ae[de]=m[de]);const ce=ae.following||ae.followedBy||ae.requested;return r("a",{class:"account-block",href:E,target:s?"_blank":null,title:se?g:`@${g}`,onClick:de=>{if(!s){if(de.preventDefault(),c)return c(de);a?location.hash=`/${i}/a/${p}`:H.showAccount={account:t,instance:i}}},children:[r("div",{class:"avatar-container",children:r(at,{url:o?T:v||T,size:n,squircle:D})}),r("span",{class:"account-block-content",children:[!d&&r(N,{children:y?r("b",{children:r(Gt,{text:y,emojis:w})}):r("b",{children:x})})," ",r("span",{class:"account-block-acct bidi-isolate",children:[se?"":"@",Q,r("wbr",{}),se,z&&r(N,{children:[" ",r(M,{icon:"lock",size:"s",alt:k._({id:"G2fuEb"})})]})]}),l&&r("div",{class:"account-block-stats",children:[r(O,{id:"ajzDof",values:{0:it(b)}}),!!I&&r(N,{children:[" ","·"," ",r(O,{id:"f8bJ3C",values:{0:xn(I,{hideTime:!0})}})]})]}),u&&r("div",{class:"account-block-stats",children:[D&&r(N,{children:r("span",{class:"tag collapsed",children:[r(M,{icon:"bot"})," ",r(O,{id:"9Vdq+j"})]})}),!!C&&r(N,{children:r("span",{class:"tag collapsed",children:[r(M,{icon:"group"})," ",r(O,{id:"L8fEEm"})]})}),ce&&r("div",{class:"shazam-container-horizontal",children:r("div",{class:"shazam-container-inner",children:ae.following&&ae.followedBy?r("span",{class:"tag minimal",children:r(O,{id:"7oRLbi"})}):ae.requested?r("span",{class:"tag minimal",children:r(O,{id:"Yx0Ud8"})}):ae.following?r("span",{class:"tag minimal",children:r(O,{id:"y6sq5j"})}):ae.followedBy?r("span",{class:"tag minimal",children:r(O,{id:"p3UO/y"})}):null})},m.id),!!L&&r("span",{class:"ib",children:r(O,{id:"Mn1E9C",values:{followersCount:L}})}),!!q&&r("span",{class:"verified-field",children:[r(M,{icon:"check-circle",size:"s",alt:k._({id:"QDEWii"})})," ",r("span",{dangerouslySetInnerHTML:{__html:Cs(q.value,{emojis:w})}})]}),!D&&!C&&!ce&&!L&&!q&&!!Y&&r("span",{class:"created-at",children:r(O,{id:"PCcEFZ",values:{0:xn(Y,{hideTime:!0})},components:{0:r("time",{datetime:Y})}})})]})]})]})}var Ps={};function We(e,t){typeof t=="boolean"&&(t={forever:t}),this._originalTimeouts=JSON.parse(JSON.stringify(e)),this._timeouts=e,this._options=t||{},this._maxRetryTime=t&&t.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._timer=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}var ou=We;We.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts.slice(0)};We.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timer&&clearTimeout(this._timer),this._timeouts=[],this._cachedTimeouts=null};We.prototype.retry=function(e){if(this._timeout&&clearTimeout(this._timeout),!e)return!1;var t=new Date().getTime();if(e&&t-this._operationStart>=this._maxRetryTime)return this._errors.push(e),this._errors.unshift(new Error("RetryOperation timeout occurred")),!1;this._errors.push(e);var n=this._timeouts.shift();if(n===void 0)if(this._cachedTimeouts)this._errors.splice(0,this._errors.length-1),n=this._cachedTimeouts.slice(-1);else return!1;var o=this;return this._timer=setTimeout(function(){o._attempts++,o._operationTimeoutCb&&(o._timeout=setTimeout(function(){o._operationTimeoutCb(o._attempts)},o._operationTimeout),o._options.unref&&o._timeout.unref()),o._fn(o._attempts)},n),this._options.unref&&this._timer.unref(),!0};We.prototype.attempt=function(e,t){this._fn=e,t&&(t.timeout&&(this._operationTimeout=t.timeout),t.cb&&(this._operationTimeoutCb=t.cb));var n=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){n._operationTimeoutCb()},n._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)};We.prototype.try=function(e){console.log("Using RetryOperation.try() is deprecated"),this.attempt(e)};We.prototype.start=function(e){console.log("Using RetryOperation.start() is deprecated"),this.attempt(e)};We.prototype.start=We.prototype.try;We.prototype.errors=function(){return this._errors};We.prototype.attempts=function(){return this._attempts};We.prototype.mainError=function(){if(this._errors.length===0)return null;for(var e={},t=null,n=0,o=0;o=n&&(t=i,n=a)}return t};(function(e){var t=ou;e.operation=function(n){var o=e.timeouts(n);return new t(o,{forever:n&&(n.forever||n.retries===1/0),unref:n&&n.unref,maxRetryTime:n&&n.maxRetryTime})},e.timeouts=function(n){if(n instanceof Array)return[].concat(n);var o={retries:10,factor:2,minTimeout:1*1e3,maxTimeout:1/0,randomize:!1};for(var i in n)o[i]=n[i];if(o.minTimeout>o.maxTimeout)throw new Error("minTimeout is greater than maxTimeout");for(var s=[],a=0;asu.call(e)==="[object Error]",cu=new Set(["Failed to fetch","NetworkError when attempting to fetch resource.","The Internet connection appears to be offline.","Load failed","Network request failed","fetch failed"]);function lu(e){return e&&au(e)&&e.name==="TypeError"&&typeof e.message=="string"?e.message==="Load failed"?e.stack===void 0:cu.has(e.message):!1}class uu extends Error{constructor(t){super(),t instanceof Error?(this.originalError=t,{message:t}=t):(this.originalError=new Error(t),this.originalError.stack=this.stack),this.name="AbortError",this.message=t}}const vi=(e,t,n)=>{const o=n.retries-(t-1);return e.attemptNumber=t,e.retriesLeft=o,e};async function du(e,t){return new Promise((n,o)=>{t={onFailedAttempt(){},retries:10,shouldRetry:()=>!0,...t};const i=iu.operation(t),s=()=>{var c;i.stop(),o((c=t.signal)==null?void 0:c.reason)};t.signal&&!t.signal.aborted&&t.signal.addEventListener("abort",s,{once:!0});const a=()=>{var c;(c=t.signal)==null||c.removeEventListener("abort",s),i.stop()};i.attempt(async c=>{try{const l=await e(c);a(),n(l)}catch(l){try{if(!(l instanceof Error))throw new TypeError(`Non-error was thrown: "${l}". You should only throw errors.`);if(l instanceof uu)throw l.originalError;if(l instanceof TypeError&&!lu(l))throw l;if(vi(l,c,t),await t.shouldRetry(l)||(i.stop(),o(l)),await t.onFailedAttempt(l),!i.retry(l))throw i.mainError()}catch(u){vi(u,c,t),a(),o(u)}}})})}const fu=[{code:"auto",name:"Detect"},{code:"af",name:"Afrikaans"},{code:"sq",name:"Albanian"},{code:"am",name:"Amharic"},{code:"ar",name:"Arabic"},{code:"hy",name:"Armenian"},{code:"as",name:"Assamese"},{code:"ay",name:"Aymara"},{code:"az",name:"Azerbaijani"},{code:"bm",name:"Bambara"},{code:"eu",name:"Basque"},{code:"be",name:"Belarusian"},{code:"bn",name:"Bengali"},{code:"bho",name:"Bhojpuri"},{code:"bs",name:"Bosnian"},{code:"bg",name:"Bulgarian"},{code:"ca",name:"Catalan"},{code:"ceb",name:"Cebuano"},{code:"ny",name:"Chichewa"},{code:"zh",name:"Chinese"},{code:"co",name:"Corsican"},{code:"hr",name:"Croatian"},{code:"cs",name:"Czech"},{code:"da",name:"Danish"},{code:"dv",name:"Dhivehi"},{code:"doi",name:"Dogri"},{code:"nl",name:"Dutch"},{code:"en",name:"English"},{code:"eo",name:"Esperanto"},{code:"et",name:"Estonian"},{code:"ee",name:"Ewe"},{code:"tl",name:"Filipino"},{code:"fi",name:"Finnish"},{code:"fr",name:"French"},{code:"fy",name:"Frisian"},{code:"gl",name:"Galician"},{code:"ka",name:"Georgian"},{code:"de",name:"German"},{code:"el",name:"Greek"},{code:"gn",name:"Guarani"},{code:"gu",name:"Gujarati"},{code:"ht",name:"Haitian Creole"},{code:"ha",name:"Hausa"},{code:"haw",name:"Hawaiian"},{code:"iw",name:"Hebrew"},{code:"hi",name:"Hindi"},{code:"hmn",name:"Hmong"},{code:"hu",name:"Hungarian"},{code:"is",name:"Icelandic"},{code:"ig",name:"Igbo"},{code:"ilo",name:"Ilocano"},{code:"id",name:"Indonesian"},{code:"ga",name:"Irish"},{code:"it",name:"Italian"},{code:"ja",name:"Japanese"},{code:"jw",name:"Javanese"},{code:"kn",name:"Kannada"},{code:"kk",name:"Kazakh"},{code:"km",name:"Khmer"},{code:"rw",name:"Kinyarwanda"},{code:"gom",name:"Konkani"},{code:"ko",name:"Korean"},{code:"kri",name:"Krio"},{code:"ku",name:"Kurdish (Kurmanji)"},{code:"ckb",name:"Kurdish (Sorani)"},{code:"ky",name:"Kyrgyz"},{code:"lo",name:"Lao"},{code:"la",name:"Latin"},{code:"lv",name:"Latvian"},{code:"ln",name:"Lingala"},{code:"lt",name:"Lithuanian"},{code:"lg",name:"Luganda"},{code:"lb",name:"Luxembourgish"},{code:"mk",name:"Macedonian"},{code:"mai",name:"Maithili"},{code:"mg",name:"Malagasy"},{code:"ms",name:"Malay"},{code:"ml",name:"Malayalam"},{code:"mt",name:"Maltese"},{code:"mi",name:"Maori"},{code:"mr",name:"Marathi"},{code:"mni-Mtei",name:"Meiteilon (Manipuri)"},{code:"lus",name:"Mizo"},{code:"mn",name:"Mongolian"},{code:"my",name:"Myanmar (Burmese)"},{code:"ne",name:"Nepali"},{code:"no",name:"Norwegian"},{code:"or",name:"Odia (Oriya)"},{code:"om",name:"Oromo"},{code:"ps",name:"Pashto"},{code:"fa",name:"Persian"},{code:"pl",name:"Polish"},{code:"pt",name:"Portuguese"},{code:"pa",name:"Punjabi"},{code:"qu",name:"Quechua"},{code:"ro",name:"Romanian"},{code:"ru",name:"Russian"},{code:"sm",name:"Samoan"},{code:"sa",name:"Sanskrit"},{code:"gd",name:"Scots Gaelic"},{code:"nso",name:"Sepedi"},{code:"sr",name:"Serbian"},{code:"st",name:"Sesotho"},{code:"sn",name:"Shona"},{code:"sd",name:"Sindhi"},{code:"si",name:"Sinhala"},{code:"sk",name:"Slovak"},{code:"sl",name:"Slovenian"},{code:"so",name:"Somali"},{code:"es",name:"Spanish"},{code:"su",name:"Sundanese"},{code:"sw",name:"Swahili"},{code:"sv",name:"Swedish"},{code:"tg",name:"Tajik"},{code:"ta",name:"Tamil"},{code:"tt",name:"Tatar"},{code:"te",name:"Telugu"},{code:"th",name:"Thai"},{code:"ti",name:"Tigrinya"},{code:"ts",name:"Tsonga"},{code:"tr",name:"Turkish"},{code:"tk",name:"Turkmen"},{code:"ak",name:"Twi"},{code:"uk",name:"Ukrainian"},{code:"ur",name:"Urdu"},{code:"ug",name:"Uyghur"},{code:"uz",name:"Uzbek"},{code:"vi",name:"Vietnamese"},{code:"cy",name:"Welsh"},{code:"xh",name:"Xhosa"},{code:"yi",name:"Yiddish"},{code:"yo",name:"Yoruba"},{code:"zu",name:"Zulu"}];var hu=Object.defineProperty,pu=(e,t,n)=>t in e?hu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,qn=(e,t,n)=>pu(e,typeof t!="symbol"?t+"":t,n),ar=new Map,Yn=new WeakMap,_i=0,mu=void 0;function gu(e){return e?(Yn.has(e)||(_i+=1,Yn.set(e,_i.toString())),Yn.get(e)):"0"}function vu(e){return Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${t}_${t==="root"?gu(e.root):e[t]}`).toString()}function _u(e){const t=vu(e);let n=ar.get(t);if(!n){const o=new Map;let i;const s=new IntersectionObserver(a=>{a.forEach(c=>{var l;const u=c.isIntersecting&&i.some(f=>c.intersectionRatio>=f);e.trackVisibility&&typeof c.isVisible>"u"&&(c.isVisible=u),(l=o.get(c.target))==null||l.forEach(f=>{f(u,c)})})},e);i=s.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),n={id:t,observer:s,elements:o},ar.set(t,n)}return n}function Ls(e,t,n={},o=mu){if(typeof window.IntersectionObserver>"u"&&o!==void 0){const l=e.getBoundingClientRect();return t(o,{isIntersecting:o,target:e,intersectionRatio:typeof n.threshold=="number"?n.threshold:0,time:0,boundingClientRect:l,intersectionRect:l,rootBounds:l}),()=>{}}const{id:i,observer:s,elements:a}=_u(n),c=a.get(e)||[];return a.has(e)||a.set(e,c),c.push(t),s.observe(e),function(){c.splice(c.indexOf(t),1),c.length===0&&(a.delete(e),s.unobserve(e)),a.size===0&&(s.disconnect(),ar.delete(i))}}function yu(e){return typeof e.children!="function"}var Zf=class extends Wi{constructor(e){super(e),qn(this,"node",null),qn(this,"_unobserveCb",null),qn(this,"handleNode",t=>{this.node&&(this.unobserve(),!t&&!this.props.triggerOnce&&!this.props.skip&&this.setState({inView:!!this.props.initialInView,entry:void 0})),this.node=t||null,this.observeNode()}),qn(this,"handleChange",(t,n)=>{t&&this.props.triggerOnce&&this.unobserve(),yu(this.props)||this.setState({inView:t,entry:n}),this.props.onChange&&this.props.onChange(t,n)}),this.state={inView:!!e.initialInView,entry:void 0}}componentDidMount(){this.unobserve(),this.observeNode()}componentDidUpdate(e){(e.rootMargin!==this.props.rootMargin||e.root!==this.props.root||e.threshold!==this.props.threshold||e.skip!==this.props.skip||e.trackVisibility!==this.props.trackVisibility||e.delay!==this.props.delay)&&(this.unobserve(),this.observeNode())}componentWillUnmount(){this.unobserve()}observeNode(){if(!this.node||this.props.skip)return;const{threshold:e,root:t,rootMargin:n,trackVisibility:o,delay:i,fallbackInView:s}=this.props;this._unobserveCb=Ls(this.node,this.handleChange,{threshold:e,root:t,rootMargin:n,trackVisibility:o,delay:i},s)}unobserve(){this._unobserveCb&&(this._unobserveCb(),this._unobserveCb=null)}render(){const{children:e}=this.props;if(typeof e=="function"){const{inView:h,entry:p}=this.state;return e({inView:h,entry:p,ref:this.handleNode})}const{as:t,triggerOnce:n,threshold:o,root:i,rootMargin:s,onChange:a,skip:c,trackVisibility:l,delay:u,initialInView:f,fallbackInView:d,...m}=this.props;return Pa(t||"div",{ref:this.handleNode,...m},e)}};function bu({threshold:e,delay:t,trackVisibility:n,rootMargin:o,root:i,triggerOnce:s,skip:a,initialInView:c,fallbackInView:l,onChange:u}={}){var f;const[d,m]=W(null),h=$(),[p,g]=W({inView:!!c,entry:void 0});h.current=u,J(()=>{if(a||!d)return;let x;return x=Ls(d,(w,E)=>{g({inView:w,entry:E}),h.current&&h.current(w,E),E.isIntersecting&&s&&x&&(x(),x=void 0)},{root:i,rootMargin:o,threshold:e,trackVisibility:n,delay:t},l),()=>{x&&x()}},[Array.isArray(e)?e.toString():e,d,i,o,s,a,n,l,t]);const v=(f=p.entry)==null?void 0:f.target,T=$();!d&&v&&!s&&!a&&T.current!==v&&(T.current=v,g({inView:!!c,entry:void 0}));const y=[m,p.inView,p.entry];return y.ref=y[0],y.inView=y[1],y.entry=y[2],y}const yi=48,Vo={};function Ms({id:e,children:t}){const n=$(),o=!!Vo[e],[i,s]=W(!1),[a,c]=W(o||!1),{ref:l}=bu({root:null,rootMargin:`-${yi}px 0px 0px 0px`,trackVisibility:!0,delay:1e3,onChange:u=>{u&&(s(!0),e&&(Vo[e]=!0))},triggerOnce:!0,skip:a||i});return J(()=>{if(!n.current)return;const u=n.current.getBoundingClientRect();u.bottom>yi&&(u.top{let i=mn[Ho];return fetch(`https://${i}/api/v1/${t}/${n}/${encodeURIComponent(e)}`).then(s=>{if(!s.ok)throw new Error(s.statusText);return s.json()}).then(s=>{var a;return{provider:"lingva",content:s.translation,detectedSourceLanguage:(a=s.info)==null?void 0:a.detectedSource,info:s.info}})},{retries:3,onFailedAttempt:i=>{Ho=(Ho+1)%mn.length}})}const Rs=1e3*60*60,Os=vo(wu,{maxAge:Rs}),xu=vo(Eu(Os),{maxAge:Rs});function ku({forceTranslate:e,sourceLanguage:t,onTranslate:n,text:o="",mini:i,autoDetected:s}){const a=_s(!0),[c,l]=W("default"),[u,f]=W(null),[d,m]=W(null),[h,p]=W(null),g=$(),v=t?cn(t):null,T=cn(a),y=$("auto");n||(n=i?xu:Os);const x=async()=>{var w,E;l("loading");try{const{content:b,detectedSourceLanguage:I,provider:D,error:R,...S}=await n(o,y.current,a);if(b){if(I){const C=cn(I);p(C)}if(D==="lingva"){const C=(E=(w=S==null?void 0:S.info)==null?void 0:w.pronunciation)==null?void 0:E.query;C&&f(C)}m(b),l("default"),!i&&b.trim()!==o.trim()&&(g.current.open=!0,g.current.scrollIntoView({behavior:"smooth",block:"nearest"}))}else l("error")}catch{l("error")}};return J(()=>{e&&x()},[e]),i?d&&d.trim()!==o.trim()&&h!==T?r(Ms,{children:r("div",{class:"status-translation-block-mini",children:[r(M,{icon:"translate",alt:k._({id:"zVJKbG",values:{sourceLangText:v}})}),r("output",{lang:a,dir:"auto",title:u||"",children:d})]})}):null:r("div",{class:"status-translation-block",onClick:w=>{w.preventDefault()},children:r("details",{ref:g,children:[r("summary",{children:r("button",{type:"button",onClick:async w=>{w.preventDefault(),w.stopPropagation(),g.current.open=!g.current.open,c!=="loading"&&(d||x())},children:[r(M,{icon:"translate"})," ",r("span",{children:c==="loading"?k._({id:"Zxkt/v"}):t&&v&&!h?s?k._({id:"R20Yf9",values:{sourceLangText:v}}):k._({id:"h8zDAI",values:{sourceLangText:v}}):k._({id:"pi8x/S"})})]})}),r("div",{class:"translated-block",children:[r("div",{class:"translation-info insignificant",children:[r("select",{class:"translated-source-select",disabled:c==="loading",onChange:w=>{y.current=w.target.value,x()},children:fu.map(w=>{const E=cn({code:w.code,fallback:w.name}),b=cn({code:w.code,locale:w.code}),I=E!==b;return r("option",{value:w.code,children:w.code==="auto"?k._({id:"Bze3gr",values:{0:h??"…"}}):I?`${b} - ${E}`:b})})})," ",r("span",{children:["→ ",T]}),r(Gi,{abrupt:!0,hidden:c!=="loading"})]}),c==="error"?r("p",{class:"ui-state",children:r(O,{id:"m5LihO"})}):!!d&&r(N,{children:[r("output",{class:"translated-content",lang:a,dir:"auto",children:d}),!!u&&r("output",{class:"translated-pronunciation-content",tabIndex:-1,onClick:w=>{w.target.classList.toggle("expand")},children:u})]})]})]})})}const Su=mn!=null&&mn.length?ku:()=>null;function ut(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}function Ds(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const o=ut(n);return(i,s)=>o.then(a=>s(a.transaction(t,i).objectStore(t)))}let Bo;function Pt(){return Bo||(Bo=Ds("keyval-store","keyval")),Bo}function Iu(e,t=Pt()){return t("readonly",n=>ut(n.get(e)))}function Au(e,t,n=Pt()){return n("readwrite",o=>(o.put(t,e),ut(o.transaction)))}function Cu(e,t=Pt()){return t("readonly",n=>Promise.all(e.map(o=>ut(n.get(o)))))}function Pu(e,t=Pt()){return t("readwrite",n=>(n.delete(e),ut(n.transaction)))}function Lu(e,t=Pt()){return t("readwrite",n=>(e.forEach(o=>n.delete(o)),ut(n.transaction)))}function Mu(e=Pt()){return e("readwrite",t=>(t.clear(),ut(t.transaction)))}function Ru(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},ut(e.transaction)}function Ou(e=Pt()){return e("readonly",t=>{if(t.getAllKeys)return ut(t.getAllKeys());const n=[];return Ru(t,o=>n.push(o.key)).then(()=>n)})}function Ti(e,t){const n=Ds(e,t);return{set:(o,i)=>Au(o,i,n),get:o=>Iu(o,n),getMany:o=>Cu(o,n),del:o=>Pu(o,n),delMany:o=>Lu(o,n),clear:()=>Mu(n),keys:()=>Ou(n)}}const Gf={drafts:Ti("drafts-db","drafts-store"),catchup:Ti("catchup-db","catchup-store")};async function qf(e,t={}){if(!(e!=null&&e.length))return;const{masto:n}=so(),o=vr(),i=e.reduce((s,a)=>(!s.includes(a.id)&&!t[a.id]&&a.id!==o&&s.push(a.id),s),[]);if(!i.length)return null;try{return(await n.v1.accounts.relationships.fetch({id:i})).reduce((c,l)=>(c[l.id]=l,c),{})}catch{return null}}class Ue extends HTMLElement{constructor(){super(),this.isIframeLoaded=!1,this.setupDom()}static get observedAttributes(){return["videoid","playlistid"]}connectedCallback(){this.addEventListener("pointerover",Ue.warmConnections,{once:!0}),this.addEventListener("click",()=>this.addIframe())}get videoId(){return encodeURIComponent(this.getAttribute("videoid")||"")}set videoId(t){this.setAttribute("videoid",t)}get playlistId(){return encodeURIComponent(this.getAttribute("playlistid")||"")}set playlistId(t){this.setAttribute("playlistid",t)}get videoTitle(){return this.getAttribute("videotitle")||"Video"}set videoTitle(t){this.setAttribute("videotitle",t)}get videoPlay(){return this.getAttribute("videoPlay")||"Play"}set videoPlay(t){this.setAttribute("videoPlay",t)}get videoStartAt(){return this.getAttribute("videoStartAt")||"0"}get autoLoad(){return this.hasAttribute("autoload")}get noCookie(){return this.hasAttribute("nocookie")}get posterQuality(){return this.getAttribute("posterquality")||"hqdefault"}get posterLoading(){return this.getAttribute("posterloading")||"lazy"}get params(){return`start=${this.videoStartAt}&${this.getAttribute("params")}`}set params(t){this.setAttribute("params",t)}setupDom(){const t=this.attachShadow({mode:"open"});let n="";window.liteYouTubeNonce&&(n=`nonce="${window.liteYouTubeNonce}"`),t.innerHTML=` \n
    \n \n \n \n \n \n \n
    \n `;\n this.domRefFrame = shadowDom.querySelector('#frame');\n this.domRefImg = {\n fallback: shadowDom.querySelector('#fallbackPlaceholder'),\n webp: shadowDom.querySelector('#webpPlaceholder'),\n jpeg: shadowDom.querySelector('#jpegPlaceholder'),\n };\n this.domRefPlayButton = shadowDom.querySelector('#playButton');\n }\n setupComponent() {\n this.initImagePlaceholder();\n this.domRefPlayButton.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.setAttribute('title', `${this.videoPlay}: ${this.videoTitle}`);\n if (this.autoLoad || this.isYouTubeShort()) {\n this.initIntersectionObserver();\n }\n }\n attributeChangedCallback(name, oldVal, newVal) {\n switch (name) {\n case 'videoid':\n case 'playlistid':\n case 'videoTitle':\n case 'videoPlay': {\n if (oldVal !== newVal) {\n this.setupComponent();\n if (this.domRefFrame.classList.contains('activated')) {\n this.domRefFrame.classList.remove('activated');\n this.shadowRoot.querySelector('iframe').remove();\n this.isIframeLoaded = false;\n }\n }\n break;\n }\n default:\n break;\n }\n }\n addIframe(isIntersectionObserver = false) {\n if (!this.isIframeLoaded) {\n let autoplay = isIntersectionObserver ? 0 : 1;\n const wantsNoCookie = this.noCookie ? '-nocookie' : '';\n let embedTarget;\n if (this.playlistId) {\n embedTarget = `?listType=playlist&list=${this.playlistId}&`;\n }\n else {\n embedTarget = `${this.videoId}?`;\n }\n if (this.isYouTubeShort()) {\n this.params = `loop=1&mute=1&modestbranding=1&playsinline=1&rel=0&enablejsapi=1&playlist=${this.videoId}`;\n autoplay = 1;\n }\n const iframeHTML = `\n`;\n this.domRefFrame.insertAdjacentHTML('beforeend', iframeHTML);\n this.domRefFrame.classList.add('activated');\n this.isIframeLoaded = true;\n this.attemptShortAutoPlay();\n this.dispatchEvent(new CustomEvent('liteYoutubeIframeLoaded', {\n detail: {\n videoId: this.videoId,\n },\n bubbles: true,\n cancelable: true,\n }));\n }\n }\n initImagePlaceholder() {\n const posterUrlWebp = `https://i.ytimg.com/vi_webp/${this.videoId}/${this.posterQuality}.webp`;\n const posterUrlJpeg = `https://i.ytimg.com/vi/${this.videoId}/${this.posterQuality}.jpg`;\n this.domRefImg.fallback.loading = this.posterLoading;\n this.domRefImg.webp.srcset = posterUrlWebp;\n this.domRefImg.jpeg.srcset = posterUrlJpeg;\n this.domRefImg.fallback.src = posterUrlJpeg;\n this.domRefImg.fallback.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.domRefImg?.fallback?.setAttribute('alt', `${this.videoPlay}: ${this.videoTitle}`);\n }\n initIntersectionObserver() {\n const options = {\n root: null,\n rootMargin: '0px',\n threshold: 0,\n };\n const observer = new IntersectionObserver((entries, observer) => {\n entries.forEach(entry => {\n if (entry.isIntersecting && !this.isIframeLoaded) {\n LiteYTEmbed.warmConnections();\n this.addIframe(true);\n observer.unobserve(this);\n }\n });\n }, options);\n observer.observe(this);\n }\n attemptShortAutoPlay() {\n if (this.isYouTubeShort()) {\n setTimeout(() => {\n this.shadowRoot\n .querySelector('iframe')\n ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"' + 'playVideo' + '\",\"args\":\"\"}', '*');\n }, 2000);\n }\n }\n isYouTubeShort() {\n return (this.getAttribute('short') === '' &&\n window.matchMedia('(max-width: 40em)').matches);\n }\n static addPrefetch(kind, url) {\n const linkElem = document.createElement('link');\n linkElem.rel = kind;\n linkElem.href = url;\n linkElem.crossOrigin = 'true';\n document.head.append(linkElem);\n }\n static warmConnections() {\n if (LiteYTEmbed.isPreconnected || window.liteYouTubeIsPreconnected)\n return;\n LiteYTEmbed.addPrefetch('preconnect', 'https://i.ytimg.com/');\n LiteYTEmbed.addPrefetch('preconnect', 'https://s.ytimg.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.google.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\n LiteYTEmbed.addPrefetch('preconnect', 'https://static.doubleclick.net');\n LiteYTEmbed.isPreconnected = true;\n window.liteYouTubeIsPreconnected = true;\n }\n}\nLiteYTEmbed.isPreconnected = false;\ncustomElements.define('lite-youtube', LiteYTEmbed);\n//# sourceMappingURL=lite-youtube.js.map","const digitLookup = new Uint8Array(128);\nfor (let i = 0; i < 83; i++) {\n digitLookup[\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~'.charCodeAt(\n i,\n )\n ] = i;\n}\nconst decode83 = (str, start, end) => {\n let value = 0;\n while (start < end) {\n value *= 83;\n value += digitLookup[str.charCodeAt(start++)];\n }\n return value;\n};\n\nconst pow = Math.pow;\nconst PI = Math.PI;\nconst PI2 = PI * 2;\n\nconst d = 3294.6;\nconst e = 269.025;\nconst sRGBToLinear = (value) =>\n value > 10.31475 ? pow(value / e + 0.052132, 2.4) : value / d;\n\nconst linearTosRGB = (v) =>\n ~~(v > 0.00001227 ? e * pow(v, 0.416666) - 13.025 : v * d + 1);\n\nconst signSqr = (x) => (x < 0 ? -1 : 1) * x * x;\n\n/**\n * Fast approximate cosine implementation\n * Based on FTrig https://github.com/netcell/FTrig\n */\nconst fastCos = (x) => {\n x += PI / 2;\n while (x > PI) {\n x -= PI2;\n }\n const cos = 1.27323954 * x - 0.405284735 * signSqr(x);\n return 0.225 * (signSqr(cos) - cos) + cos;\n};\n\n/**\n * Extracts average color from BlurHash image\n * @param {string} blurHash BlurHash image string\n * @returns {[number, number, number]}\n */\nexport function getBlurHashAverageColor(blurHash) {\n const val = decode83(blurHash, 2, 6);\n return [val >> 16, (val >> 8) & 255, val & 255];\n}\n\n/**\n * Decodes BlurHash image\n * @param {string} blurHash BlurHash image string\n * @param {number} width Output image width\n * @param {number} height Output image height\n * @param {?number} punch\n * @returns {Uint8ClampedArray}\n */\nexport function decodeBlurHash(blurHash, width, height, punch) {\n const sizeFlag = decode83(blurHash, 0, 1);\n const numX = (sizeFlag % 9) + 1;\n const numY = ~~(sizeFlag / 9) + 1;\n const size = numX * numY;\n\n let i = 0,\n j = 0,\n x = 0,\n y = 0,\n r = 0,\n g = 0,\n b = 0,\n basis = 0,\n basisY = 0,\n colorIndex = 0,\n pixelIndex = 0,\n value = 0;\n\n const maximumValue = ((decode83(blurHash, 1, 2) + 1) / 13446) * (punch | 1);\n\n const colors = new Float64Array(size * 3);\n\n const averageColor = getBlurHashAverageColor(blurHash);\n for (i = 0; i < 3; i++) {\n colors[i] = sRGBToLinear(averageColor[i]);\n }\n\n for (i = 1; i < size; i++) {\n value = decode83(blurHash, 4 + i * 2, 6 + i * 2);\n colors[i * 3] = signSqr(~~(value / 361) - 9) * maximumValue;\n colors[i * 3 + 1] = signSqr((~~(value / 19) % 19) - 9) * maximumValue;\n colors[i * 3 + 2] = signSqr((value % 19) - 9) * maximumValue;\n }\n\n const cosinesY = new Float64Array(numY * height);\n const cosinesX = new Float64Array(numX * width);\n for (j = 0; j < numY; j++) {\n for (y = 0; y < height; y++) {\n cosinesY[j * height + y] = fastCos((PI * y * j) / height);\n }\n }\n for (i = 0; i < numX; i++) {\n for (x = 0; x < width; x++) {\n cosinesX[i * width + x] = fastCos((PI * x * i) / width);\n }\n }\n\n const bytesPerRow = width * 4;\n const pixels = new Uint8ClampedArray(bytesPerRow * height);\n\n for (y = 0; y < height; y++) {\n for (x = 0; x < width; x++) {\n r = g = b = 0;\n for (j = 0; j < numY; j++) {\n basisY = cosinesY[j * height + y];\n for (i = 0; i < numX; i++) {\n basis = cosinesX[i * width + x] * basisY;\n colorIndex = (i + j * numX) * 3;\n r += colors[colorIndex] * basis;\n g += colors[colorIndex + 1] * basis;\n b += colors[colorIndex + 2] * basis;\n }\n }\n\n pixelIndex = 4 * x + y * bytesPerRow;\n pixels[pixelIndex] = linearTosRGB(r);\n pixels[pixelIndex + 1] = linearTosRGB(g);\n pixels[pixelIndex + 2] = linearTosRGB(b);\n pixels[pixelIndex + 3] = 255; // alpha\n }\n }\n return pixels;\n}\n","/**\n * @param {string[]} splittedHtml\n * @param {{ char?: string; count?: number}} options\n * @returns {string}\n */\nconst addIndentation = (splittedHtml, options = {}) => {\n const char = options.char || ' '\n const count = options.count || 2\n\n let level = 0\n const opened = []\n\n return splittedHtml.reverse().reduce((indented, elTag) => {\n if (opened.length\n && level\n && opened[level]\n /* if current element tag is the same as previously opened one */\n && opened[level] === elTag.substring(1, opened[level].length + 1)\n ) {\n opened.splice(level, 1)\n level--\n }\n\n const indentation = char.repeat(level ? level * count : 0)\n\n const newIndented = [\n `${indentation}${elTag}`,\n ...indented,\n ]\n\n // if current element tag is closing tag\n // add it to opened elements\n if (elTag.substring(0, 2) === ' (\n // Replace\n // - 1 or more spaces or tabs at the start of line\n // - 1 or more spaces or tabs at the end of line\n // - empty lines\n // with empty string\n nonFormattedString.trim().replace(/(^(\\s|\\t)+|(( |\\t)+)$)/gm, '')\n)\n\n/**\n * @param {string} markup\n * @returns {string[]} Array of strings splitted on new lines without empty lines\n */\nconst mergeAttributesWithElements = (markup) => {\n const splittedMarkup = removeEmptyLines(markup).split('\\n')\n\n const mergedLines = []\n let currentElement = ''\n for (let i = 0; i < splittedMarkup.length; i += 1) {\n const line = splittedMarkup[i]\n\n // If line is closing element/tag separate closing tag from rest of the line with space\n if (line.endsWith('/>')) {\n mergedLines.push(`${currentElement}${line.slice(0, -2)} />`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n if (line.endsWith('>')) {\n mergedLines.push(`${currentElement}${\n line.startsWith('>') || line.startsWith('<') ? '' : ' '\n }${line}`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n currentElement += currentElement.length ? ` ${line}` : line\n }\n\n return mergedLines\n}\n\nmodule.exports = {\n mergeAttributesWithElements,\n removeEmptyLines,\n}\n","const addIndentation = require('./utils/addIndentation')\nconst { mergeAttributesWithElements } = require('./utils/toLines')\n\n/**\n * @param {string} markup\n * @param {{ char?: string; count?: number }} options\n * @returns {string}\n */\nconst prettify = (markup, options = {}) => {\n const splitted = mergeAttributesWithElements(markup)\n\n return addIndentation(splitted, options)\n}\n\nmodule.exports = prettify\n","import { useRef as s, useCallback as h, useEffect as g } from \"react\";\nvar l = /* @__PURE__ */ ((e) => (e.Mouse = \"mouse\", e.Touch = \"touch\", e.Pointer = \"pointer\", e))(l || {}), d = /* @__PURE__ */ ((e) => (e.CancelledByMovement = \"cancelled-by-movement\", e.CancelledByRelease = \"cancelled-by-release\", e.CancelledOutsideElement = \"cancelled-outside-element\", e))(d || {});\nconst A = () => typeof window == \"object\" ? window?.PointerEvent ?? null : null, z = () => typeof window == \"object\" ? window?.TouchEvent ?? null : null;\nfunction U(e) {\n const { nativeEvent: t } = e, u = z();\n return u && t instanceof u || \"touches\" in e;\n}\nfunction X(e) {\n const t = A();\n return e.nativeEvent instanceof MouseEvent && !(t && e.nativeEvent instanceof t);\n}\nfunction Y(e) {\n const { nativeEvent: t } = e;\n if (!t)\n return !1;\n const u = A();\n return u && t instanceof u || \"pointerId\" in t;\n}\nfunction R(e) {\n return X(e) || U(e) || Y(e);\n}\nfunction j(e) {\n return U(e) ? {\n x: e.touches[0].pageX,\n y: e.touches[0].pageY\n } : X(e) || Y(e) ? {\n x: e.pageX,\n y: e.pageY\n } : null;\n}\nfunction G(e) {\n return {\n target: e.target,\n currentTarget: e.currentTarget,\n nativeEvent: e,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n persist: () => {\n }\n };\n}\nfunction J(e, {\n threshold: t = 400,\n captureEvent: u = !1,\n detect: y = l.Pointer,\n cancelOnMovement: w = !1,\n cancelOutsideElement: v = !0,\n filterEvents: p,\n onStart: M,\n onMove: C,\n onFinish: L,\n onCancel: b\n} = {}) {\n const P = s(!1), c = s(!1), I = s(), a = s(), T = s(e), f = s(null), E = h(\n (n) => (r) => {\n c.current || R(r) && (p !== void 0 && !p(r) || (u && r.persist(), M?.(r, { context: n }), f.current = j(r), c.current = !0, I.current = r.currentTarget, a.current = setTimeout(() => {\n T.current && (T.current(r, { context: n }), P.current = !0);\n }, t)));\n },\n [u, p, M, t]\n ), i = h(\n (n) => (r, o) => {\n R(r) && c.current && (f.current = null, u && r.persist(), P.current ? L?.(r, { context: n }) : c.current && b?.(r, { context: n, reason: o ?? d.CancelledByRelease }), P.current = !1, c.current = !1, a.current !== void 0 && clearTimeout(a.current));\n },\n [u, L, b]\n ), m = h(\n (n) => (r) => {\n if (C?.(r, { context: n }), w !== !1 && f.current) {\n const o = j(r);\n if (o) {\n const B = w === !0 ? 25 : w, D = {\n x: Math.abs(o.x - f.current.x),\n y: Math.abs(o.y - f.current.y)\n };\n (D.x > B || D.y > B) && i(n)(r, d.CancelledByMovement);\n }\n }\n },\n [i, w, C]\n ), q = h(\n (n) => {\n if (e === null)\n return {};\n switch (y) {\n case l.Mouse: {\n const r = {\n onMouseDown: E(n),\n onMouseMove: m(n),\n onMouseUp: i(n)\n };\n return v && (r.onMouseLeave = (o) => {\n i(n)(o, d.CancelledOutsideElement);\n }), r;\n }\n case l.Touch:\n return {\n onTouchStart: E(n),\n onTouchMove: m(n),\n onTouchEnd: i(n)\n };\n case l.Pointer: {\n const r = {\n onPointerDown: E(n),\n onPointerMove: m(n),\n onPointerUp: i(n)\n };\n return v && (r.onPointerLeave = (o) => i(n)(o, d.CancelledOutsideElement)), r;\n }\n }\n },\n [e, i, v, y, m, E]\n );\n return g(() => {\n if (!window)\n return;\n function n(r) {\n const o = G(r);\n i()(o);\n }\n return window.addEventListener(\"mouseup\", n), window.addEventListener(\"touchend\", n), window.addEventListener(\"pointerup\", n), () => {\n window.removeEventListener(\"mouseup\", n), window.removeEventListener(\"touchend\", n), window.removeEventListener(\"pointerup\", n);\n };\n }, [i]), g(\n () => () => {\n a.current !== void 0 && clearTimeout(a.current);\n },\n []\n ), g(() => {\n T.current = e;\n }, [e]), q;\n}\nexport {\n d as LongPressCallbackReason,\n l as LongPressEventType,\n J as useLongPress\n};\n","import { Plural, plural, t, Trans } from '@lingui/macro';\nimport { useState } from 'preact/hooks';\n\nimport shortenNumber from '../utils/shorten-number';\n\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nexport default function Poll({\n poll,\n lang,\n readOnly,\n refresh = () => {},\n votePoll = () => {},\n}) {\n const [uiState, setUIState] = useState('default');\n const {\n expired,\n expiresAt,\n id,\n multiple,\n options,\n ownVotes,\n voted,\n votersCount,\n votesCount,\n emojis,\n } = poll;\n const expiresAtDate = !!expiresAt && new Date(expiresAt); // Update poll at point of expiry\n // NOTE: Disable this because setTimeout runs immediately if delay is too large\n // https://stackoverflow.com/a/56718027/20838\n // useEffect(() => {\n // let timeout;\n // if (!expired && expiresAtDate) {\n // const ms = expiresAtDate.getTime() - Date.now() + 1; // +1 to give it a little buffer\n // if (ms > 0) {\n // timeout = setTimeout(() => {\n // setUIState('loading');\n // (async () => {\n // // await refresh();\n // setUIState('default');\n // })();\n // }, ms);\n // }\n // }\n // return () => {\n // clearTimeout(timeout);\n // };\n // }, [expired, expiresAtDate]);\n\n const pollVotesCount = multiple ? votersCount : votesCount;\n let roundPrecision = 0;\n\n if (pollVotesCount <= 1000) {\n roundPrecision = 0;\n } else if (pollVotesCount <= 10000) {\n roundPrecision = 1;\n } else if (pollVotesCount <= 100000) {\n roundPrecision = 2;\n }\n\n const [showResults, setShowResults] = useState(false);\n const optionsHaveVoteCounts = options.every((o) => o.votesCount !== null);\n\n return (\n \n {(showResults && optionsHaveVoteCounts) || voted || expired ? (\n <>\n
    \n {options.map((option, i) => {\n const { title, votesCount: optionVotesCount } = option;\n const ratio = pollVotesCount\n ? optionVotesCount / pollVotesCount\n : 0;\n const percentage = ratio\n ? ratio.toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n maximumFractionDigits: roundPrecision,\n })\n : '0%';\n\n const isLeading =\n optionVotesCount > 0 &&\n optionVotesCount ===\n Math.max(...options.map((o) => o.votesCount));\n return (\n \n
    \n \n \n \n {voted && ownVotes.includes(i) && (\n <>\n {' '}\n \n \n )}\n
    \n \n {percentage}\n
    \n \n );\n })}\n \n {!expired && !voted && (\n {\n e.preventDefault();\n setShowResults(false);\n }}\n >\n Hide results\n \n )}\n \n ) : (\n {\n e.preventDefault();\n const form = e.target;\n const formData = new FormData(form);\n const choices = [];\n formData.forEach((value, key) => {\n if (key === 'poll') {\n choices.push(value);\n }\n });\n if (!choices.length) return;\n setUIState('loading');\n await votePoll(choices);\n setUIState('default');\n }}\n >\n
    \n {options.map((option, i) => {\n const { title } = option;\n return (\n
    \n \n
    \n );\n })}\n
    \n {!readOnly && (\n \n Vote\n \n )}\n \n )}\n

    \n {!expired && !readOnly && (\n {\n e.preventDefault();\n setUIState('loading');\n\n (async () => {\n await refresh();\n setUIState('default');\n })();\n }}\n title={t`Refresh`}\n >\n \n \n )}\n {!voted && !expired && !readOnly && optionsHaveVoteCounts && (\n {\n e.preventDefault();\n setShowResults(!showResults);\n }}\n title={showResults ? t`Hide results` : t`Show results`}\n >\n {' '}\n \n )}\n {!expired && !readOnly && ' '}\n \n {shortenNumber(votesCount)} vote\n \n }\n other={\n \n {shortenNumber(votesCount)} votes\n \n }\n />\n {!!votersCount && votersCount !== votesCount && (\n <>\n {' '}\n •{' '}\n \n {shortenNumber(votersCount)}{' '}\n voter\n \n }\n other={\n \n {shortenNumber(votersCount)}{' '}\n voters\n \n }\n />\n \n )}{' '}\n •{' '}\n {expired ? (\n !!expiresAtDate ? (\n \n Ended \n \n ) : (\n t`Ended`\n )\n ) : !!expiresAtDate ? (\n \n Ending \n \n ) : (\n t`Ending`\n )}\n

    \n \n );\n}\n","import { createContext } from 'preact';\n\nconst FilterContext = createContext();\nexport default FilterContext;\n","import mem from './mem';\nimport { getCurrentAccountID } from './store-utils';\n\nfunction _isFiltered(filtered, filterContext) {\n if (!filtered?.length) return false;\n const appliedFilters = filtered.filter((f) => {\n const { filter } = f;\n const hasContext = filter.context.includes(filterContext);\n if (!hasContext) return false;\n if (!filter.expiresAt) return hasContext;\n return new Date(filter.expiresAt) > new Date();\n });\n if (!appliedFilters.length) return false;\n const isHidden = appliedFilters.some((f) => f.filter.filterAction === 'hide');\n if (isHidden)\n return {\n action: 'hide',\n };\n const isWarn = appliedFilters.some((f) => f.filter.filterAction === 'warn');\n if (isWarn) {\n const filterTitles = appliedFilters.map((f) => f.filter.title);\n return {\n action: 'warn',\n titles: filterTitles,\n titlesStr: filterTitles.join(' • '),\n };\n }\n return false;\n}\nexport const isFiltered = mem(_isFiltered);\n\nexport function filteredItem(item, filterContext, currentAccountID) {\n const { filtered } = item;\n if (!filtered?.length) return true;\n const isSelf = currentAccountID && item.account?.id === currentAccountID;\n if (isSelf) return true;\n const filterState = isFiltered(filtered, filterContext);\n if (!filterState) return true;\n if (filterState.action === 'hide') return false;\n // item._filtered = filterState;\n return true;\n}\nexport function filteredItems(items, filterContext) {\n if (!items?.length) return [];\n if (!filterContext) return items;\n const currentAccountID = getCurrentAccountID();\n return items.filter((item) =>\n filteredItem(item, filterContext, currentAccountID),\n );\n}\n","const div = document.createElement('div');\nexport default function htmlContentLength(html) {\n if (!html) return 0;\n div.innerHTML = html;\n // .invisible spans for links\n // e.g. https://mastodon.social\n div.querySelectorAll('.invisible').forEach((el) => {\n el.remove();\n });\n return div.innerText.length;\n}\n","export const supportsTTS = 'speechSynthesis' in window;\n\nexport function speak(text, lang) {\n if (!supportsTTS) return;\n try {\n if (speechSynthesis.speaking) {\n speechSynthesis.cancel();\n }\n const utterance = new SpeechSynthesisUtterance(text);\n if (lang) utterance.lang = lang;\n speechSynthesis.speak(utterance);\n } catch (e) {\n alert(e);\n }\n}\n","import getHTMLText from './getHTMLText';\n\nfunction statusPeek(status) {\n const { spoilerText, content, poll, mediaAttachments } = status;\n let text = '';\n if (spoilerText?.trim()) {\n text += spoilerText;\n } else {\n text += getHTMLText(content);\n }\n text = text.trim();\n if (poll?.options?.length) {\n text += `\\n\\n📊:\\n${poll.options\n .map((o) => `${poll.multiple ? '▪️' : '•'} ${o.title}`)\n .join('\\n')}`;\n }\n if (mediaAttachments?.length) {\n text +=\n ' ' +\n mediaAttachments\n .map(\n (m) =>\n ({\n image: '🖼️',\n gifv: '🎞️',\n video: '📹',\n audio: '🎵',\n unknown: '',\n }[m.type] || ''),\n )\n .join('');\n }\n return text;\n}\n\nexport default statusPeek;\n","import{useRef as r,useEffect as n,useMemo as t,useState as e,useCallback as u}from\"react\";function c(e,u,c){var i=this,a=r(null),o=r(0),f=r(null),l=r([]),v=r(),m=r(),d=r(e),g=r(!0);d.current=e;var p=\"undefined\"!=typeof window,w=!u&&0!==u&&p;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var s=!!(c=c||{}).leading,x=!(\"trailing\"in c)||!!c.trailing,h=\"maxWait\"in c,y=\"debounceOnServer\"in c&&!!c.debounceOnServer,F=h?Math.max(+c.maxWait||0,u):null;n(function(){return g.current=!0,function(){g.current=!1}},[]);var A=t(function(){var r=function(r){var n=l.current,t=v.current;return l.current=v.current=null,o.current=r,m.current=d.current.apply(t,n)},n=function(r,n){w&&cancelAnimationFrame(f.current),f.current=w?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!g.current)return!1;var n=r-a.current;return!a.current||n>=u||n<0||h&&r-o.current>=F},e=function(n){return f.current=null,x&&l.current?r(n):(l.current=v.current=null,m.current)},c=function r(){var c=Date.now();if(t(c))return e(c);if(g.current){var i=u-(c-a.current),f=h?Math.min(i,F-(c-o.current)):i;n(r,f)}},A=function(){if(p||y){var e=Date.now(),d=t(e);if(l.current=[].slice.call(arguments),v.current=i,a.current=e,d){if(!f.current&&g.current)return o.current=a.current,n(c,u),s?r(a.current):m.current;if(h)return n(c,u),r(a.current)}return f.current||n(c,u),m.current}};return A.cancel=function(){f.current&&(w?cancelAnimationFrame(f.current):clearTimeout(f.current)),o.current=0,l.current=a.current=v.current=f.current=null},A.isPending=function(){return!!f.current},A.flush=function(){return f.current?e(Date.now()):m.current},A},[s,h,u,F,x,w,p,y]);return A}function i(r,n){return r===n}function a(n,t,a){var o=a&&a.equalityFn||i,f=r(n),l=e({})[1],v=c(u(function(r){f.current=r,l({})},[l]),t,a),m=r(n);return o(m.current,n)||(v(n),m.current=n),[f.current,v]}function o(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i})}export{a as useDebounce,c as useDebouncedCallback,o as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import { useRef, useEffect, useCallback, useState, useMemo } from 'react';\n\n// This could've been more streamlined with internal state instead of abusing\n// refs to such extent, but then composing hooks and components could not opt out of unnecessary renders.\nfunction useResolvedElement(subscriber, refOrElement) {\n var lastReportRef = useRef(null);\n var refOrElementRef = useRef(null);\n refOrElementRef.current = refOrElement;\n var cbElementRef = useRef(null); // Calling re-evaluation after each render without using a dep array,\n // as the ref object's current value could've changed since the last render.\n\n useEffect(function () {\n evaluateSubscription();\n });\n var evaluateSubscription = useCallback(function () {\n var cbElement = cbElementRef.current;\n var refOrElement = refOrElementRef.current; // Ugly ternary. But smaller than an if-else block.\n\n var element = cbElement ? cbElement : refOrElement ? refOrElement instanceof Element ? refOrElement : refOrElement.current : null;\n\n if (lastReportRef.current && lastReportRef.current.element === element && lastReportRef.current.subscriber === subscriber) {\n return;\n }\n\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n }\n\n lastReportRef.current = {\n element: element,\n subscriber: subscriber,\n // Only calling the subscriber, if there's an actual element to report.\n // Setting cleanup to undefined unless a subscriber returns one, as an existing cleanup function would've been just called.\n cleanup: element ? subscriber(element) : undefined\n };\n }, [subscriber]); // making sure we call the cleanup function on unmount\n\n useEffect(function () {\n return function () {\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n lastReportRef.current = null;\n }\n };\n }, []);\n return useCallback(function (element) {\n cbElementRef.current = element;\n evaluateSubscription();\n }, [evaluateSubscription]);\n}\n\n// We're only using the first element of the size sequences, until future versions of the spec solidify on how\n// exactly it'll be used for fragments in multi-column scenarios:\n// From the spec:\n// > The box size properties are exposed as FrozenArray in order to support elements that have multiple fragments,\n// > which occur in multi-column scenarios. However the current definitions of content rect and border box do not\n// > mention how those boxes are affected by multi-column layout. In this spec, there will only be a single\n// > ResizeObserverSize returned in the FrozenArray, which will correspond to the dimensions of the first column.\n// > A future version of this spec will extend the returned FrozenArray to contain the per-fragment size information.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface)\n//\n// Also, testing these new box options revealed that in both Chrome and FF everything is returned in the callback,\n// regardless of the \"box\" option.\n// The spec states the following on this:\n// > This does not have any impact on which box dimensions are returned to the defined callback when the event\n// > is fired, it solely defines which box the author wishes to observe layout changes on.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// I'm not exactly clear on what this means, especially when you consider a later section stating the following:\n// > This section is non-normative. An author may desire to observe more than one CSS box.\n// > In this case, author will need to use multiple ResizeObservers.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// Which is clearly not how current browser implementations behave, and seems to contradict the previous quote.\n// For this reason I decided to only return the requested size,\n// even though it seems we have access to results for all box types.\n// This also means that we get to keep the current api, being able to return a simple { width, height } pair,\n// regardless of box option.\nfunction extractSize(entry, boxProp, sizeType) {\n if (!entry[boxProp]) {\n if (boxProp === \"contentBoxSize\") {\n // The dimensions in `contentBoxSize` and `contentRect` are equivalent according to the spec.\n // See the 6th step in the description for the RO algorithm:\n // https://drafts.csswg.org/resize-observer/#create-and-populate-resizeobserverentry-h\n // > Set this.contentRect to logical this.contentBoxSize given target and observedBox of \"content-box\".\n // In real browser implementations of course these objects differ, but the width/height values should be equivalent.\n return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n }\n\n return undefined;\n } // A couple bytes smaller than calling Array.isArray() and just as effective here.\n\n\n return entry[boxProp][0] ? entry[boxProp][0][sizeType] : // TS complains about this, because the RO entry type follows the spec and does not reflect Firefox's current\n // behaviour of returning objects instead of arrays for `borderBoxSize` and `contentBoxSize`.\n // @ts-ignore\n entry[boxProp][sizeType];\n}\n\nfunction useResizeObserver(opts) {\n if (opts === void 0) {\n opts = {};\n }\n\n // Saving the callback as a ref. With this, I don't need to put onResize in the\n // effect dep array, and just passing in an anonymous function without memoising\n // will not reinstantiate the hook's ResizeObserver.\n var onResize = opts.onResize;\n var onResizeRef = useRef(undefined);\n onResizeRef.current = onResize;\n var round = opts.round || Math.round; // Using a single instance throughout the hook's lifetime\n\n var resizeObserverRef = useRef();\n\n var _useState = useState({\n width: undefined,\n height: undefined\n }),\n size = _useState[0],\n setSize = _useState[1]; // In certain edge cases the RO might want to report a size change just after\n // the component unmounted.\n\n\n var didUnmount = useRef(false);\n useEffect(function () {\n didUnmount.current = false;\n return function () {\n didUnmount.current = true;\n };\n }, []); // Using a ref to track the previous width / height to avoid unnecessary renders.\n\n var previous = useRef({\n width: undefined,\n height: undefined\n }); // This block is kinda like a useEffect, only it's called whenever a new\n // element could be resolved based on the ref option. It also has a cleanup\n // function.\n\n var refCallback = useResolvedElement(useCallback(function (element) {\n // We only use a single Resize Observer instance, and we're instantiating it on demand, only once there's something to observe.\n // This instance is also recreated when the `box` option changes, so that a new observation is fired if there was a previously observed element with a different box option.\n if (!resizeObserverRef.current || resizeObserverRef.current.box !== opts.box || resizeObserverRef.current.round !== round) {\n resizeObserverRef.current = {\n box: opts.box,\n round: round,\n instance: new ResizeObserver(function (entries) {\n var entry = entries[0];\n var boxProp = opts.box === \"border-box\" ? \"borderBoxSize\" : opts.box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n var reportedWidth = extractSize(entry, boxProp, \"inlineSize\");\n var reportedHeight = extractSize(entry, boxProp, \"blockSize\");\n var newWidth = reportedWidth ? round(reportedWidth) : undefined;\n var newHeight = reportedHeight ? round(reportedHeight) : undefined;\n\n if (previous.current.width !== newWidth || previous.current.height !== newHeight) {\n var newSize = {\n width: newWidth,\n height: newHeight\n };\n previous.current.width = newWidth;\n previous.current.height = newHeight;\n\n if (onResizeRef.current) {\n onResizeRef.current(newSize);\n } else {\n if (!didUnmount.current) {\n setSize(newSize);\n }\n }\n }\n })\n };\n }\n\n resizeObserverRef.current.instance.observe(element, {\n box: opts.box\n });\n return function () {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.instance.unobserve(element);\n }\n };\n }, [opts.box, round]), opts.ref);\n return useMemo(function () {\n return {\n ref: refCallback,\n width: size.width,\n height: size.height\n };\n }, [refCallback, size.width, size.height]);\n}\n\nexport { useResizeObserver as default };\n","import { useRef } from 'preact/hooks';\nimport { useThrottledCallback } from 'use-debounce';\nimport useResizeObserver from 'use-resize-observer';\n\nexport default function useTruncated({ className = 'truncated' } = {}) {\n const ref = useRef();\n const onResize = useThrottledCallback(({ height }) => {\n if (ref.current) {\n const { scrollHeight } = ref.current;\n let truncated = scrollHeight > height;\n if (truncated) {\n const { height: _height, maxHeight } = getComputedStyle(ref.current);\n const computedHeight = parseInt(maxHeight || _height, 10);\n truncated = scrollHeight > computedHeight;\n }\n ref.current.classList.toggle(className, truncated);\n }\n }, 300);\n useResizeObserver({\n ref,\n box: 'border-box',\n onResize,\n });\n return ref;\n}\n","export default {\n public: 'earth',\n unlisted: 'group',\n private: 'lock',\n direct: 'message',\n local: 'building',\n};\n","export var styleRoot = 'kvfysmfp';\nexport var styleChild = 'ufhsfnkm';\nexport var styles = \".\".concat(styleRoot, \"{overflow:hidden;touch-action:none}.\").concat(styleChild, \"{transform-origin: 0 0}\");\n","var isSsr = typeof window === 'undefined';\nexport var isTouch = function () {\n return !isSsr && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};\nexport var make2dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale(\".concat(scale, \") translate(\").concat(x, \"px, \").concat(y, \"px)\");\n};\nexport var make3dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale3d(\".concat(scale, \",\").concat(scale, \", 1) translate3d(\").concat(x, \"px, \").concat(y, \"px, 0)\");\n};\nexport var hasTranslate3DSupport = function () {\n var css = !isSsr && window.CSS;\n return css && css.supports && css.supports('transform', 'translate3d(0,0,0)');\n};\n","var min = Math.min, max = Math.max;\nexport function getOffsetBounds(_a) {\n var containerDimension = _a.containerDimension, childDimension = _a.childDimension, padding = _a.padding, centerContained = _a.centerContained;\n var diff = childDimension - containerDimension;\n if (diff + 2 * padding <= 0 && centerContained) {\n return [diff / 2, diff / 2];\n }\n else {\n return [min(diff + padding, 0) - padding, max(0, diff + padding)];\n }\n}\n","import { __assign, __extends } from \"tslib\";\nimport React, { Component, createRef, Children, cloneElement } from 'react';\nimport { styleRoot, styleChild, styles } from './styles.css';\nimport { isTouch } from '../utils';\nimport { getOffsetBounds } from './getOffsetBounds';\nvar classnames = function (base, other) {\n return other ? \"\".concat(base, \" \").concat(other) : base;\n};\nvar abs = Math.abs, min = Math.min, sqrt = Math.sqrt;\nvar isSsr = typeof window === 'undefined';\nvar isMac = isSsr ? false : /(Mac)/i.test(navigator.platform);\nvar isDragInteraction = function (i) { return i === 'drag'; };\nvar isZoomInteraction = function (i) { return i === 'zoom'; };\nvar isZoomGesture = function (wheelEvent) { return isMac && wheelEvent.ctrlKey; };\nvar cancelEvent = function (event) {\n event.stopPropagation();\n event.preventDefault();\n};\nvar getDistance = function (a, b) {\n var x = a.x - b.x;\n var y = a.y - b.y;\n return sqrt(x * x + y * y);\n};\nvar calculateScale = function (startTouches, endTouches) {\n var startDistance = getDistance(startTouches[0], startTouches[1]);\n var endDistance = getDistance(endTouches[0], endTouches[1]);\n return endDistance / startDistance;\n};\nvar isCloseTo = function (value, expected) {\n return value > expected - 0.01 && value < expected + 0.01;\n};\nvar swing = function (p) { return -Math.cos(p * Math.PI) / 2 + 0.5; };\nvar getPointByPageCoordinates = function (touch) { return ({\n x: touch.pageX,\n y: touch.pageY,\n}); };\nvar getPageCoordinatesByTouches = function (touches) {\n return Array.from(touches).map(getPointByPageCoordinates);\n};\nvar sum = function (a, b) { return a + b; };\nvar getVectorAvg = function (vectors) { return ({\n x: vectors.map(function (_a) {\n var x = _a.x;\n return x;\n }).reduce(sum, 0) / vectors.length,\n y: vectors.map(function (_a) {\n var y = _a.y;\n return y;\n }).reduce(sum, 0) / vectors.length,\n}); };\nvar clamp = function (min, max, value) {\n return value < min ? min : value > max ? max : value;\n};\nvar shouldInterceptWheel = function (event) {\n return !(event.ctrlKey || event.metaKey);\n};\nvar getElementSize = function (element) {\n if (element) {\n var offsetWidth = element.offsetWidth, offsetHeight = element.offsetHeight;\n // Any DOMElement\n if (offsetWidth && offsetHeight) {\n return { width: offsetWidth, height: offsetHeight };\n }\n // Svg support\n var style = getComputedStyle(element);\n var width = parseFloat(style.width);\n var height = parseFloat(style.height);\n if (height && width) {\n return { width: width, height: height };\n }\n }\n return { width: 0, height: 0 };\n};\nvar calculateVelocity = function (startPoint, endPoint) { return ({\n x: endPoint.x - startPoint.x,\n y: endPoint.y - startPoint.y,\n}); };\nvar comparePoints = function (p1, p2) { return p1.x === p2.x && p1.y === p2.y; };\nvar noup = function () { };\nvar zeroPoint = { x: 0, y: 0 };\nvar PinchZoom = /** @class */ (function (_super) {\n __extends(PinchZoom, _super);\n function PinchZoom() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this._prevDragMovePoint = null;\n _this._containerObserver = null;\n _this._fingers = 0;\n _this._firstMove = true;\n _this._initialOffset = __assign({}, zeroPoint);\n _this._interaction = null;\n _this._isDoubleTap = false;\n _this._isOffsetsSet = false;\n _this._lastDragPosition = null;\n _this._lastScale = 1;\n _this._lastTouchStart = 0;\n _this._lastZoomCenter = null;\n _this._listenMouseMove = false;\n _this._nthZoom = 0;\n _this._offset = __assign({}, zeroPoint);\n _this._startOffset = __assign({}, zeroPoint);\n _this._startTouches = null;\n _this._updatePlaned = false;\n _this._wheelTimeOut = null;\n _this._zoomFactor = 1;\n _this._initialZoomFactor = 1;\n _this._draggingPoint = __assign({}, zeroPoint);\n // It help reduce behavior difference between touch and mouse events\n _this._ignoreNextClick = false;\n // @ts-ignore\n _this._containerRef = createRef();\n _this._handleClick = function (clickEvent) {\n if (_this._ignoreNextClick) {\n _this._ignoreNextClick = false;\n clickEvent.stopPropagation();\n }\n };\n _this._onResize = function () {\n var _a;\n if ((_a = _this._containerRef) === null || _a === void 0 ? void 0 : _a.current) {\n _this._updateInitialZoomFactor();\n _this._setupOffsets();\n _this._update();\n }\n };\n _this._handlerOnTouchEnd = _this._handlerIfEnable(function (touchEndEvent) {\n _this._fingers = touchEndEvent.touches.length;\n if (_this.props.shouldCancelHandledTouchEndEvents &&\n (isZoomInteraction(_this._interaction) ||\n (isDragInteraction(_this._interaction) &&\n (_this._startOffset.x !== _this._offset.x ||\n _this._startOffset.y !== _this._offset.y)))) {\n cancelEvent(touchEndEvent);\n }\n if (isDragInteraction(_this._interaction) && !_this._enoughToDrag()) {\n _this._handleClick(touchEndEvent);\n }\n _this._updateInteraction(touchEndEvent);\n });\n _this._handlerOnTouchStart = _this._handlerIfEnable(function (touchStartEvent) {\n _this._firstMove = true;\n _this._fingers = touchStartEvent.touches.length;\n _this._detectDoubleTap(touchStartEvent);\n });\n _this._handlerOnTouchMove = _this._handlerIfEnable(function (touchMoveEvent) {\n if (_this._isDoubleTap) {\n return;\n }\n _this._collectInertia(touchMoveEvent);\n if (_this._firstMove) {\n _this._updateInteraction(touchMoveEvent);\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n }\n _this._startOffset = __assign({}, _this._offset);\n _this._startTouches = getPageCoordinatesByTouches(touchMoveEvent.touches);\n }\n else {\n if (isZoomInteraction(_this._interaction)) {\n if (_this._startTouches &&\n _this._startTouches.length === 2 &&\n touchMoveEvent.touches.length === 2) {\n _this._handleZoom(touchMoveEvent, calculateScale(_this._startTouches, getPageCoordinatesByTouches(touchMoveEvent.touches)));\n }\n }\n else if (isDragInteraction(_this._interaction)) {\n _this._handleDrag(touchMoveEvent);\n }\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n _this._update();\n }\n }\n _this._firstMove = false;\n });\n _this._handlerWheel = function (wheelEvent) {\n if (_this.props.shouldInterceptWheel(wheelEvent)) {\n return;\n }\n cancelEvent(wheelEvent);\n var pageX = wheelEvent.pageX, pageY = wheelEvent.pageY, deltaY = wheelEvent.deltaY, deltaMode = wheelEvent.deltaMode;\n var scaleDelta = 1;\n if (isZoomGesture(wheelEvent) || deltaMode === 1) {\n scaleDelta = 15;\n }\n var likeTouchEvent = {\n touches: [\n // @ts-ignore\n { pageX: pageX, pageY: pageY },\n ],\n };\n var center = _this._getOffsetByFirstTouch(likeTouchEvent);\n var dScale = deltaY * scaleDelta;\n _this._stopAnimation();\n _this._scaleTo(_this._zoomFactor - dScale / _this.props.wheelScaleFactor, center);\n _this._update();\n clearTimeout(\n // @ts-ignore\n _this._wheelTimeOut);\n _this._wheelTimeOut = setTimeout(function () { return _this._sanitize(); }, 100);\n };\n // @ts-ignore\n _this._handlers = _this.props.isTouch()\n ? [\n ['touchstart', _this._handlerOnTouchStart],\n ['touchend', _this._handlerOnTouchEnd],\n ['touchmove', _this._handlerOnTouchMove],\n ]\n : [\n [\n 'mousemove',\n _this.simulate(_this._handlerOnTouchMove),\n _this.props._document,\n ],\n [\n 'mouseup',\n _this.simulate(_this._handlerOnTouchEnd),\n _this.props._document,\n ],\n ['mousedown', _this.simulate(_this._handlerOnTouchStart)],\n ['click', _this._handleClick],\n ['wheel', _this._handlerWheel],\n ];\n return _this;\n }\n PinchZoom.prototype._handleDragStart = function (event) {\n this._ignoreNextClick = true;\n this.props.onDragStart();\n this._stopAnimation();\n this._resetInertia();\n this._lastDragPosition = null;\n this._hasInteraction = true;\n this._draggingPoint = this._offset;\n this._handleDrag(event);\n };\n PinchZoom.prototype._handleDrag = function (event) {\n var touch = this._getOffsetByFirstTouch(event);\n if (this._enoughToDrag()) {\n this._drag(touch, this._lastDragPosition);\n }\n else {\n this._virtualDrag(touch, this._lastDragPosition);\n }\n this._offset = this._sanitizeOffset(this._offset);\n this._lastDragPosition = touch;\n };\n PinchZoom.prototype._resetInertia = function () {\n this._velocity = null;\n this._prevDragMovePoint = null;\n };\n PinchZoom.prototype._realizeInertia = function () {\n var _this = this;\n var _a = this.props, inertiaFriction = _a.inertiaFriction, inertia = _a.inertia;\n if (!inertia || !this._velocity) {\n return;\n }\n var _b = this._velocity, x = _b.x, y = _b.y;\n if (x || y) {\n this._stopAnimation();\n this._resetInertia();\n var renderFrame = function () {\n x *= inertiaFriction;\n y *= inertiaFriction;\n if (!x && !y) {\n return _this._stopAnimation();\n }\n var prevOffset = __assign({}, _this._offset);\n _this._addOffset({ x: x, y: y });\n _this._offset = _this._sanitizeOffset(_this._offset);\n if (comparePoints(prevOffset, _this._offset)) {\n return _this._stopAnimation();\n }\n _this._update({ isAnimation: true });\n };\n this._animate(renderFrame, { duration: 9999 });\n }\n };\n PinchZoom.prototype._collectInertia = function (_a) {\n var touches = _a.touches;\n if (!this.props.inertia) {\n return;\n }\n var currentCoordinates = getPageCoordinatesByTouches(touches)[0];\n var prevPoint = this._prevDragMovePoint;\n if (prevPoint) {\n this._velocity = calculateVelocity(currentCoordinates, prevPoint);\n }\n this._prevDragMovePoint = currentCoordinates;\n };\n PinchZoom.prototype._handleDragEnd = function () {\n this.props.onDragEnd();\n this._end();\n this._realizeInertia();\n };\n PinchZoom.prototype._handleZoomStart = function () {\n this.props.onZoomStart();\n this._stopAnimation();\n this._lastScale = 1;\n this._nthZoom = 0;\n this._lastZoomCenter = null;\n this._hasInteraction = true;\n };\n PinchZoom.prototype._handleZoom = function (event, newScale) {\n var touchCenter = getVectorAvg(this._getOffsetTouches(event));\n var scale = newScale / this._lastScale;\n this._lastScale = newScale;\n // The first touch events are thrown away since they are not precise\n this._nthZoom += 1;\n if (this._nthZoom > 3) {\n this._scale(scale, touchCenter);\n this._drag(touchCenter, this._lastZoomCenter);\n if (this.props.enforceBoundsDuringZoom) {\n this._offset = this._sanitizeOffset(this._offset);\n }\n }\n this._lastZoomCenter = touchCenter;\n };\n PinchZoom.prototype._handleZoomEnd = function () {\n this.props.onZoomEnd();\n this._end();\n };\n PinchZoom.prototype._handleDoubleTap = function (event) {\n var _this = this;\n if (this._hasInteraction || this.props.tapZoomFactor === 0) {\n return;\n }\n var needZoomOut = (this.props.doubleTapZoomOutOnMaxScale &&\n this._zoomFactor === this.props.maxZoom) ||\n (this.props.doubleTapToggleZoom && this._zoomFactor > 1);\n this.props.onDoubleTap();\n this._ignoreNextClick = true;\n var zoomFactor = this._zoomFactor + this.props.tapZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var updateProgress = function (progress) {\n _this._scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center);\n };\n var center = this._getOffsetByFirstTouch(event);\n this._isDoubleTap = true;\n if (startZoomFactor > zoomFactor) {\n center = this._getCurrentZoomCenter();\n }\n needZoomOut ? this._zoomOutAnimation() : this._animate(updateProgress);\n };\n PinchZoom.prototype._computeInitialOffset = function () {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var x = -abs(width * this._getInitialZoomFactor() - rect.width) / 2;\n var y = -abs(height * this._getInitialZoomFactor() - rect.height) / 2;\n this._initialOffset = { x: x, y: y };\n };\n PinchZoom.prototype._resetOffset = function () {\n this._offset = __assign({}, this._initialOffset);\n };\n PinchZoom.prototype._setupOffsets = function () {\n if (this.props.setOffsetsOnce && this._isOffsetsSet) {\n return;\n }\n this._isOffsetsSet = true;\n this._computeInitialOffset();\n this._resetOffset();\n };\n PinchZoom.prototype._sanitizeOffset = function (offset) {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var elWidth = width * this._getInitialZoomFactor() * this._zoomFactor;\n var elHeight = height * this._getInitialZoomFactor() * this._zoomFactor;\n var _b = getOffsetBounds({\n containerDimension: rect.width,\n childDimension: elWidth,\n padding: this.props.horizontalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetX = _b[0], maxOffsetX = _b[1];\n var _c = getOffsetBounds({\n containerDimension: rect.height,\n childDimension: elHeight,\n padding: this.props.verticalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetY = _c[0], maxOffsetY = _c[1];\n return {\n x: clamp(minOffsetX, maxOffsetX, offset.x),\n y: clamp(minOffsetY, maxOffsetY, offset.y),\n };\n };\n PinchZoom.prototype.alignCenter = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), __x = _a.x, __y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n // Bug-Fix: https://github.com/retyui/react-quick-pinch-zoom/issues/58\n var x = __x * this._initialZoomFactor;\n var y = __y * this._initialZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n var rect = this._getContainerRect();\n var containerCenter = { x: rect.width / 2, y: rect.height / 2 };\n this._zoomFactor = 1;\n this._offset = { x: -(containerCenter.x - x), y: -(containerCenter.y - y) };\n this._scaleTo(scale, containerCenter);\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = _this._sanitizeOffset({ x: x, y: y });\n _this._update();\n };\n this._animate(updateFrame, {\n callback: function () { return _this._sanitize(); },\n duration: duration,\n });\n };\n PinchZoom.prototype.scaleTo = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), x = _a.x, y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n this._zoomFactor = 1;\n this._offset = { x: 0, y: 0 };\n this._scaleTo(scale, { x: x, y: y });\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateFrame, { callback: function () { return _this._sanitize(); }, duration: duration });\n };\n PinchZoom.prototype._scaleTo = function (zoomFactor, center) {\n this._scale(zoomFactor / this._zoomFactor, center);\n this._offset = this._sanitizeOffset(this._offset);\n };\n PinchZoom.prototype._scale = function (scale, center) {\n scale = this._scaleZoomFactor(scale);\n this._addOffset({\n x: (scale - 1) * (center.x + this._offset.x),\n y: (scale - 1) * (center.y + this._offset.y),\n });\n this.props.onZoomUpdate();\n };\n PinchZoom.prototype._scaleZoomFactor = function (scale) {\n var originalZoomFactor = this._zoomFactor;\n this._zoomFactor *= scale;\n this._zoomFactor = clamp(this.props.minZoom, this.props.maxZoom, this._zoomFactor);\n return this._zoomFactor / originalZoomFactor;\n };\n PinchZoom.prototype._canDrag = function () {\n return this.props.draggableUnZoomed || !isCloseTo(this._zoomFactor, 1);\n };\n PinchZoom.prototype._drag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n if (!this.props.lockDragAxis) {\n this._addOffset({\n x: x,\n y: y,\n });\n }\n else {\n // lock scroll to position that was changed the most\n if (abs(x) > abs(y)) {\n this._addOffset({\n x: x,\n y: 0,\n });\n }\n else {\n this._addOffset({\n y: y,\n x: 0,\n });\n }\n }\n this.props.onDragUpdate();\n }\n };\n PinchZoom.prototype._virtualDrag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n this._draggingPoint = {\n x: x + this._draggingPoint.x,\n y: y + this._draggingPoint.y,\n };\n }\n };\n PinchZoom.prototype._addOffset = function (offset) {\n var _a = this._offset, x = _a.x, y = _a.y;\n this._offset = {\n x: x + offset.x,\n y: y + offset.y,\n };\n };\n PinchZoom.prototype._sanitize = function () {\n if (this._zoomFactor < this.props.zoomOutFactor) {\n this._resetInertia();\n this._zoomOutAnimation();\n }\n else if (this._isInsaneOffset()) {\n this._sanitizeOffsetAnimation();\n }\n };\n PinchZoom.prototype._isInsaneOffset = function () {\n var offset = this._offset;\n var sanitizedOffset = this._sanitizeOffset(offset);\n return sanitizedOffset.x !== offset.x || sanitizedOffset.y !== offset.y;\n };\n PinchZoom.prototype._sanitizeOffsetAnimation = function () {\n var _this = this;\n var targetOffset = this._sanitizeOffset(this._offset);\n var startOffset = __assign({}, this._offset);\n var updateProgress = function (progress) {\n var x = startOffset.x + progress * (targetOffset.x - startOffset.x);\n var y = startOffset.y + progress * (targetOffset.y - startOffset.y);\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._zoomOutAnimation = function () {\n var _this = this;\n if (this._zoomFactor === 1) {\n return;\n }\n var startZoomFactor = this._zoomFactor;\n var zoomFactor = 1;\n var center = this._getCurrentZoomCenter();\n var updateProgress = function (progress) {\n var scaleFactor = startZoomFactor + progress * (zoomFactor - startZoomFactor);\n _this._scaleTo(scaleFactor, center);\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._getInitialZoomFactor = function () {\n return this._initialZoomFactor;\n };\n PinchZoom.prototype._getCurrentZoomCenter = function () {\n var _a = this._offset, x = _a.x, y = _a.y;\n var offsetLeft = x - this._initialOffset.x;\n var offsetTop = y - this._initialOffset.y;\n return {\n x: -1 * x - offsetLeft / (1 / this._zoomFactor - 1),\n y: -1 * y - offsetTop / (1 / this._zoomFactor - 1),\n };\n };\n PinchZoom.prototype._getOffsetByFirstTouch = function (event) {\n return this._getOffsetTouches(event)[0];\n };\n PinchZoom.prototype._getOffsetTouches = function (event) {\n var _document = this.props._document;\n var _html = _document.documentElement;\n var _body = _document.body;\n var _a = this._getContainerRect(), top = _a.top, left = _a.left;\n var scrollTop = _html.scrollTop || _body.scrollTop;\n var scrollLeft = _html.scrollLeft || _body.scrollLeft;\n var posTop = top + scrollTop;\n var posLeft = left + scrollLeft;\n return getPageCoordinatesByTouches(event.touches).map(function (_a) {\n var x = _a.x, y = _a.y;\n return ({\n x: x - posLeft,\n y: y - posTop,\n });\n });\n };\n PinchZoom.prototype._animate = function (frameFn, options) {\n var _this = this;\n var startTime = new Date().getTime();\n var _a = __assign({ timeFn: swing, callback: function () { }, duration: this.props.animationDuration }, options), timeFn = _a.timeFn, callback = _a.callback, duration = _a.duration;\n var renderFrame = function () {\n if (!_this._inAnimation) {\n return;\n }\n var frameTime = new Date().getTime() - startTime;\n var progress = frameTime / duration;\n if (frameTime >= duration) {\n frameFn(1);\n _this._stopAnimation();\n callback();\n _this._update();\n }\n else {\n progress = timeFn(progress);\n frameFn(progress);\n _this._update({ isAnimation: true });\n requestAnimationFrame(renderFrame);\n }\n };\n this._inAnimation = true;\n requestAnimationFrame(renderFrame);\n };\n PinchZoom.prototype._stopAnimation = function () {\n this._inAnimation = false;\n };\n PinchZoom.prototype._end = function () {\n this._hasInteraction = false;\n this._sanitize();\n this._update();\n };\n PinchZoom.prototype._getContainerRect = function () {\n var div = this._containerRef.current;\n return div.getBoundingClientRect();\n };\n PinchZoom.prototype._getChildSize = function () {\n var div = this._containerRef.current;\n return getElementSize(div === null || div === void 0 ? void 0 : div.firstElementChild);\n };\n PinchZoom.prototype._updateInitialZoomFactor = function () {\n var rect = this._getContainerRect();\n var size = this._getChildSize();\n var xZoomFactor = rect.width / size.width;\n var yZoomFactor = rect.height / size.height;\n this._initialZoomFactor = min(xZoomFactor, yZoomFactor);\n };\n PinchZoom.prototype._bindEvents = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (window.ResizeObserver) {\n this._containerObserver = new ResizeObserver(this._onResize);\n this._containerObserver.observe(div);\n }\n else {\n window.addEventListener('resize', this._onResize);\n }\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).addEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.addEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._unSubscribe = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (this._containerObserver) {\n this._containerObserver.disconnect();\n this._containerObserver = null;\n }\n window.removeEventListener('resize', this._onResize);\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).removeEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.removeEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._update = function (options) {\n var _this = this;\n if (this._updatePlaned) {\n return;\n }\n var updateFrame = function () {\n var scale = _this._getInitialZoomFactor() * _this._zoomFactor;\n var x = -_this._offset.x / scale;\n var y = -_this._offset.y / scale;\n _this.props.onUpdate({ scale: scale, x: x, y: y });\n };\n if (options === null || options === void 0 ? void 0 : options.isAnimation) {\n return updateFrame();\n }\n this._updatePlaned = true;\n requestAnimationFrame(function () {\n _this._updatePlaned = false;\n updateFrame();\n });\n };\n PinchZoom.prototype._handlerIfEnable = function (fn) {\n var _this = this;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (_this.props.enabled) {\n fn.apply(void 0, args);\n }\n };\n };\n PinchZoom.prototype._setInteraction = function (newInteraction, event) {\n var interaction = this._interaction;\n if (interaction !== newInteraction) {\n if (interaction && !newInteraction) {\n if (isZoomInteraction(interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(interaction)) {\n this._handleDragEnd();\n }\n }\n if (isZoomInteraction(newInteraction)) {\n this._handleZoomStart();\n }\n else if (isDragInteraction(newInteraction)) {\n this._handleDragStart(event);\n }\n }\n this._interaction = newInteraction;\n };\n PinchZoom.prototype._distanceBetweenNumbers = function (a, b) {\n return a > b ? a - b : b - a;\n };\n PinchZoom.prototype._enoughToDrag = function () {\n if (this._distanceBetweenNumbers(this._startOffset.x, this._draggingPoint.x) >\n 5 ||\n this._distanceBetweenNumbers(this._startOffset.y, this._draggingPoint.y) >\n 5)\n return true;\n return false;\n };\n PinchZoom.prototype._updateInteraction = function (event) {\n var fingers = this._fingers;\n if (fingers === 2) {\n return this._setInteraction('zoom', event);\n }\n if (fingers === 1 && this._canDrag()) {\n return this._setInteraction('drag', event);\n }\n this._setInteraction(null, event);\n };\n PinchZoom.prototype._detectDoubleTap = function (event) {\n var time = new Date().getTime();\n if (this._fingers > 1) {\n this._lastTouchStart = 0;\n }\n if (time - this._lastTouchStart < 300) {\n cancelEvent(event);\n this._handleDoubleTap(event);\n if (isZoomInteraction(this._interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(this._interaction)) {\n this._handleDragEnd();\n }\n }\n else {\n this._isDoubleTap = false;\n }\n if (this._fingers === 1) {\n this._lastTouchStart = time;\n }\n };\n PinchZoom.prototype.simulate = function (fn) {\n var _this = this;\n return function (mouseEvent) {\n var pageX = mouseEvent.pageX, pageY = mouseEvent.pageY, type = mouseEvent.type;\n var isEnd = type === 'mouseup';\n var isStart = type === 'mousedown';\n if (isStart) {\n mouseEvent.preventDefault();\n _this._listenMouseMove = true;\n }\n if (_this._listenMouseMove) {\n // @ts-ignore\n mouseEvent.touches = isEnd ? [] : [{ pageX: pageX, pageY: pageY }];\n fn(\n // @ts-ignore\n mouseEvent);\n }\n if (isEnd) {\n _this._listenMouseMove = false;\n }\n };\n };\n PinchZoom.prototype.componentDidMount = function () {\n this._bindEvents();\n this._update();\n };\n PinchZoom.prototype.componentWillUnmount = function () {\n this._stopAnimation();\n this._unSubscribe();\n };\n PinchZoom.prototype.render = function () {\n var _a = this.props, children = _a.children, containerProps = _a.containerProps;\n var child = Children.only(children);\n var props = containerProps || {};\n return (React.createElement(React.Fragment, null,\n React.createElement(\"style\", null, styles),\n React.createElement(\"div\", __assign({}, props, { ref: this._containerRef, className: classnames(styleRoot, props.className) }), cloneElement(child, {\n className: classnames(styleChild, child.props.className),\n }))));\n };\n PinchZoom.defaultProps = {\n animationDuration: 250,\n draggableUnZoomed: true,\n enforceBoundsDuringZoom: false,\n centerContained: false,\n enabled: true,\n inertia: true,\n inertiaFriction: 0.96,\n horizontalPadding: 0,\n isTouch: isTouch,\n lockDragAxis: false,\n maxZoom: 5,\n minZoom: 0.5,\n onDoubleTap: noup,\n onDragEnd: noup,\n onDragStart: noup,\n onDragUpdate: noup,\n onZoomEnd: noup,\n onZoomStart: noup,\n onZoomUpdate: noup,\n setOffsetsOnce: false,\n shouldInterceptWheel: shouldInterceptWheel,\n shouldCancelHandledTouchEndEvents: false,\n tapZoomFactor: 1,\n verticalPadding: 0,\n wheelScaleFactor: 1500,\n zoomOutFactor: 1.3,\n doubleTapZoomOutOnMaxScale: false,\n doubleTapToggleZoom: false,\n // @ts-expect-error\n _document: isSsr ? null : window.document,\n };\n return PinchZoom;\n}(Component));\nif (process.env.NODE_ENV !== 'production') {\n var _a = require('prop-types'), any = _a.any, element = _a.element, object = _a.object, number = _a.number, func = _a.func, bool = _a.bool;\n // @ts-ignore\n PinchZoom.propTypes = {\n children: element,\n containerProps: object,\n wheelScaleFactor: number,\n animationDuration: number,\n draggableUnZoomed: bool,\n enforceBoundsDuringZoom: bool,\n centerContained: bool,\n enabled: bool,\n horizontalPadding: number,\n lockDragAxis: bool,\n onUpdate: func.isRequired,\n maxZoom: number,\n minZoom: number,\n onDoubleTap: func,\n onDragEnd: func,\n onDragStart: func,\n onDragUpdate: func,\n onZoomEnd: func,\n onZoomStart: func,\n onZoomUpdate: func,\n setOffsetsOnce: bool,\n tapZoomFactor: number,\n verticalPadding: number,\n zoomOutFactor: number,\n doubleTapZoomOutOnMaxScale: bool,\n doubleTapToggleZoom: bool,\n isTouch: func,\n _document: any,\n };\n}\nexport default PinchZoom;\n","export default function formatDuration(time) {\n if (!time) return;\n let hours = Math.floor(time / 3600);\n let minutes = Math.floor((time % 3600) / 60);\n let seconds = Math.round(time % 60);\n\n if (hours === 0) {\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n } else {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n }\n}\n","import { t, Trans } from '@lingui/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport QuickPinchZoom, { make3dTransformValue } from 'react-quick-pinch-zoom';\n\nimport formatDuration from '../utils/format-duration';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\n/*\nMedia type\n===\nunknown = unsupported or unrecognized file type\nimage = Static image\ngifv = Looping, soundless animation\nvideo = Video clip\naudio = Audio track\n*/\n\nconst dataAltLabel = 'ALT';\nconst AltBadge = (props) => {\n const { alt, lang, index, ...rest } = props;\n if (!alt || !alt.trim()) return null;\n return (\n {\n e.stopPropagation();\n e.preventDefault();\n states.showMediaAlt = {\n alt,\n lang,\n };\n }}\n title={t`Media description`}\n >\n {dataAltLabel}\n {!!index && {index}}\n \n );\n};\n\nconst MEDIA_CAPTION_LIMIT = 140;\nconst MEDIA_CAPTION_LIMIT_LONGER = 280;\nexport const isMediaCaptionLong = mem((caption) =>\n caption?.length\n ? caption.length > MEDIA_CAPTION_LIMIT ||\n /[\\n\\r].*[\\n\\r]/.test(caption.trim())\n : false,\n);\n\nfunction Media({\n class: className = '',\n media,\n to,\n lang,\n showOriginal,\n autoAnimate,\n showCaption,\n allowLongerCaption,\n altIndex,\n onClick = () => {},\n}) {\n let {\n blurhash,\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n if (/no\\-preview\\./i.test(previewUrl)) {\n previewUrl = null;\n }\n const { original = {}, small, focus } = meta || {};\n\n const width = showOriginal\n ? original?.width\n : small?.width || original?.width;\n const height = showOriginal\n ? original?.height\n : small?.height || original?.height;\n const mediaURL = showOriginal ? url : previewUrl || url;\n const remoteMediaURL = showOriginal\n ? remoteUrl\n : previewRemoteUrl || remoteUrl;\n const hasDimensions = width && height;\n const orientation = hasDimensions\n ? width > height\n ? 'landscape'\n : 'portrait'\n : null;\n\n const rgbAverageColor = blurhash ? getBlurHashAverageColor(blurhash) : null;\n\n const videoRef = useRef();\n\n let focalPosition;\n if (focus) {\n // Convert focal point to CSS background position\n // Formula from jquery-focuspoint\n // x = -1, y = 1 => 0% 0%\n // x = 0, y = 0 => 50% 50%\n // x = 1, y = -1 => 100% 100%\n const x = ((focus.x + 1) / 2) * 100;\n const y = ((1 - focus.y) / 2) * 100;\n focalPosition = `${x.toFixed(0)}% ${y.toFixed(0)}%`;\n }\n\n const mediaRef = useRef();\n const onUpdate = useCallback(({ x, y, scale }) => {\n const { current: media } = mediaRef;\n\n if (media) {\n const value = make3dTransformValue({ x, y, scale });\n\n if (scale === 1) {\n media.style.removeProperty('transform');\n } else {\n media.style.setProperty('transform', value);\n }\n\n media.closest('.media-zoom').style.touchAction =\n scale <= 1.01 ? 'pan-x' : '';\n }\n }, []);\n\n const [pinchZoomEnabled, setPinchZoomEnabled] = useState(false);\n const quickPinchZoomProps = {\n enabled: pinchZoomEnabled,\n draggableUnZoomed: false,\n inertiaFriction: 0.9,\n tapZoomFactor: 2,\n doubleTapToggleZoom: true,\n containerProps: {\n className: 'media-zoom',\n style: {\n overflow: 'visible',\n // width: 'inherit',\n // height: 'inherit',\n // justifyContent: 'inherit',\n // alignItems: 'inherit',\n // display: 'inherit',\n },\n },\n onUpdate,\n };\n\n const Parent = useMemo(\n () => (to ? (props) => : 'div'),\n [to],\n );\n\n const remoteMediaURLObj = remoteMediaURL ? getURLObj(remoteMediaURL) : null;\n const isVideoMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(remoteMediaURLObj.pathname);\n const isAudioMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(remoteMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' && previewUrl && !isVideoMaybe && !isAudioMaybe);\n\n const parentRef = useRef();\n const [imageSmallerThanParent, setImageSmallerThanParent] = useState(false);\n useLayoutEffect(() => {\n if (!isImage) return;\n if (!showOriginal) return;\n if (!parentRef.current) return;\n const { offsetWidth, offsetHeight } = parentRef.current;\n const smaller = width < offsetWidth && height < offsetHeight;\n if (smaller) setImageSmallerThanParent(smaller);\n }, [width, height]);\n\n const maxAspectHeight =\n window.innerHeight * (orientation === 'portrait' ? 0.45 : 0.33);\n const maxHeight = orientation === 'portrait' ? 0 : 160;\n const averageColorStyle = {\n '--average-color': rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n };\n const mediaStyles =\n width && height\n ? {\n '--width': `${width}px`,\n '--height': `${height}px`,\n // Calculate '--aspectWidth' based on aspect ratio calculated from '--width' and '--height', max height has to be 160px\n '--aspectWidth': `${\n (width / height) * Math.max(maxHeight, maxAspectHeight)\n }px`,\n aspectRatio: `${width} / ${height}`,\n ...averageColorStyle,\n }\n : {\n ...averageColorStyle,\n };\n\n const longDesc = isMediaCaptionLong(description);\n let showInlineDesc =\n !!showCaption && !showOriginal && !!description && !longDesc;\n if (\n allowLongerCaption &&\n !showInlineDesc &&\n description?.length <= MEDIA_CAPTION_LIMIT_LONGER\n ) {\n showInlineDesc = true;\n }\n const Figure = !showInlineDesc\n ? Fragment\n : (props) => {\n const { children, ...restProps } = props;\n return (\n
    \n {children}\n {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: description,\n lang,\n };\n }}\n >\n {description}\n \n
    \n );\n };\n\n const [hasNaturalAspectRatio, setHasNaturalAspectRatio] = useState(undefined);\n\n if (isImage) {\n // Note: type: unknown might not have width/height\n quickPinchZoomProps.containerProps.style.display = 'inherit';\n\n useLayoutEffect(() => {\n if (!isSafari) return;\n if (!showOriginal) return;\n (async () => {\n try {\n await fetch(mediaURL, { mode: 'no-cors' });\n mediaRef.current.src = mediaURL;\n } catch (e) {\n // Ignore\n }\n })();\n }, [mediaURL]);\n\n return (\n
    \n \n {showOriginal ? (\n \n {\n e.target.closest('.media-image').style.backgroundImage = '';\n e.target.closest('.media-zoom').style.display = '';\n setPinchZoomEnabled(true);\n }}\n onError={(e) => {\n const { src } = e.target;\n if (\n src === mediaURL &&\n remoteMediaURL &&\n mediaURL !== remoteMediaURL\n ) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n \n ) : (\n <>\n {\n // e.target.closest('.media-image').style.backgroundImage = '';\n e.target.dataset.loaded = true;\n const $media = e.target.closest('.media');\n if (!hasDimensions && $media) {\n const { naturalWidth, naturalHeight } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight ? 'landscape' : 'portrait';\n $media.style.setProperty('--width', `${naturalWidth}px`);\n $media.style.setProperty('--height', `${naturalHeight}px`);\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n\n // Check natural aspect ratio vs display aspect ratio\n if ($media) {\n const {\n clientWidth,\n clientHeight,\n naturalWidth,\n naturalHeight,\n } = e.target;\n if (\n clientWidth &&\n clientHeight &&\n naturalWidth &&\n naturalHeight\n ) {\n const minDimension = 88;\n if (\n naturalWidth < minDimension ||\n naturalHeight < minDimension\n ) {\n $media.dataset.hasSmallDimension = true;\n } else {\n const displayNaturalHeight =\n (naturalHeight * clientWidth) / naturalWidth;\n const almostSimilarHeight =\n Math.abs(displayNaturalHeight - clientHeight) < 5;\n\n if (almostSimilarHeight) {\n setHasNaturalAspectRatio(true);\n }\n }\n }\n }\n }}\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL && mediaURL !== remoteMediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n {!showInlineDesc && (\n \n )}\n \n )}\n \n
    \n );\n } else if (type === 'gifv' || type === 'video' || isVideoMaybe) {\n const hasDuration = original.duration > 0;\n const shortDuration = original.duration < 31;\n const isGIF = type === 'gifv' && shortDuration;\n // If GIF is too long, treat it as a video\n const loopable = original.duration < 61;\n const formattedDuration = formatDuration(original.duration);\n const hoverAnimate = !showOriginal && !autoAnimate && isGIF;\n const autoGIFAnimate = !showOriginal && autoAnimate && isGIF;\n const showProgress = original.duration > 5;\n\n // This string is only for autoplay + muted to work on Mobile Safari\n const gifHTML = `\n \n `;\n\n const videoHTML = `\n \n `;\n\n return (\n
    \n {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n onClick(e);\n }}\n onMouseEnter={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onMouseLeave={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n onFocus={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onBlur={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n >\n {showOriginal || autoGIFAnimate ? (\n isGIF && showOriginal ? (\n \n \n \n ) : isGIF ? (\n \n ) : (\n \n )\n ) : isGIF ? (\n {\n const { target } = e;\n const container = target?.closest('.media-gif');\n if (container) {\n const percentage =\n (target.currentTime / target.duration) * 100;\n container.style.setProperty(\n '--progress',\n `${percentage}%`,\n );\n }\n }\n : undefined\n }\n />\n ) : (\n <>\n {previewUrl ? (\n {\n if (!hasDimensions) {\n const $media = e.target.closest('.media');\n if ($media) {\n const { naturalHeight, naturalWidth } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight\n ? 'landscape'\n : 'portrait';\n $media.style.setProperty(\n '--width',\n `${naturalWidth}px`,\n );\n $media.style.setProperty(\n '--height',\n `${naturalHeight}px`,\n );\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n }\n }}\n />\n ) : (\n {\n if (!hasDuration) {\n const { duration } = e.target;\n if (duration) {\n const formattedDuration = formatDuration(duration);\n const container = e.target.closest('.media-video');\n if (container) {\n container.dataset.formattedDuration =\n formattedDuration;\n }\n }\n }\n }}\n />\n )}\n
    \n \n
    \n \n )}\n {!showOriginal && !showInlineDesc && (\n \n )}\n \n
    \n );\n } else if (type === 'audio' || isAudioMaybe) {\n const formattedDuration = formatDuration(original.duration);\n return (\n
    \n \n {showOriginal ? (\n
    \n );\n }\n}\n\nfunction getURLObj(url) {\n // Fake base URL if url doesn't have https:// prefix\n return URL.parse(url, location.origin);\n}\n\nexport default memo(Media, (oldProps, newProps) => {\n const oldMedia = oldProps.media || {};\n const newMedia = newProps.media || {};\n\n return (\n oldMedia?.id === newMedia?.id &&\n oldMedia.url === newMedia.url &&\n oldProps.to === newProps.to &&\n oldProps.class === newProps.class\n );\n});\n","import './status.css';\nimport '@justinribeiro/lite-youtube';\n\nimport { msg, plural, Plural, t, Trans } from '@lingui/macro';\nimport { useLingui } from '@lingui/react';\nimport {\n ControlledMenu,\n Menu,\n MenuDivider,\n MenuHeader,\n MenuItem,\n} from '@szhsin/react-menu';\nimport { decodeBlurHash, getBlurHashAverageColor } from 'fast-blurhash';\nimport { shallowEqual } from 'fast-equals';\nimport prettify from 'html-prettify';\nimport pThrottle from 'p-throttle';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\n// import { detectAll } from 'tinyld/light';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport CustomEmoji from '../components/custom-emoji';\nimport EmojiText from '../components/emoji-text';\nimport LazyShazam from '../components/lazy-shazam';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport NameText from '../components/name-text';\nimport Poll from '../components/poll';\nimport { api } from '../utils/api';\nimport emojifyText from '../utils/emojify-text';\nimport enhanceContent from '../utils/enhance-content';\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport getHTMLText from '../utils/getHTMLText';\nimport handleContentLinks from '../utils/handle-content-links';\nimport htmlContentLength from '../utils/html-content-length';\nimport isRTL from '../utils/is-rtl';\nimport isMastodonLinkMaybe from '../utils/isMastodonLinkMaybe';\nimport localeMatch from '../utils/locale-match';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states, { getStatus, saveStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport unfurlMastodonLink from '../utils/unfurl-link';\nimport useTruncated from '../utils/useTruncated';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport Link from './link';\nimport Media, { isMediaCaptionLong } from './media';\nimport MenuLink from './menu-link';\nimport RelativeTime from './relative-time';\nimport TranslationBlock from './translation-block';\n\nconst SHOW_COMMENT_COUNT_LIMIT = 280;\nconst INLINE_TRANSLATE_LIMIT = 140;\n\nconst throttle = pThrottle({\n limit: 1,\n interval: 1000,\n});\nfunction fetchAccount(id, masto) {\n return masto.v1.accounts.$select(id).fetch();\n}\nconst memFetchAccount = pmem(throttle(fetchAccount));\n\nconst visibilityText = {\n public: msg`Public`,\n local: msg`Local`,\n unlisted: msg`Unlisted`,\n private: msg`Followers only`,\n direct: msg`Private mention`,\n};\n\nconst isIOS =\n window.ontouchstart !== undefined &&\n /iPad|iPhone|iPod/.test(navigator.userAgent);\n\nconst rtf = new Intl.RelativeTimeFormat();\n\nconst REACTIONS_LIMIT = 80;\n\nfunction getPollText(poll) {\n if (!poll?.options?.length) return '';\n return `📊:\\n${poll.options\n .map(\n (option) =>\n `- ${option.title}${\n option.votesCount >= 0 ? ` (${option.votesCount})` : ''\n }`,\n )\n .join('\\n')}`;\n}\nfunction getPostText(status) {\n const { spoilerText, content, poll } = status;\n return (\n (spoilerText ? `${spoilerText}\\n\\n` : '') +\n getHTMLText(content) +\n getPollText(poll)\n );\n}\n\nconst HTTP_REGEX = /^http/i;\nconst PostContent =\n /*memo(*/\n ({ post, instance, previewMode }) => {\n const { content, emojis, language, mentions, url } = post;\n\n const divRef = useRef();\n useLayoutEffect(() => {\n if (!divRef.current) return;\n const dom = enhanceContent(content, {\n emojis,\n returnDOM: true,\n });\n // Remove target=\"_blank\" from links\n for (const a of dom.querySelectorAll('a.u-url[target=\"_blank\"]')) {\n if (!HTTP_REGEX.test(a.innerText.trim())) {\n a.removeAttribute('target');\n }\n }\n divRef.current.replaceChildren(dom.cloneNode(true));\n }, [content, emojis.length]);\n\n return (\n {\n // // Remove target=\"_blank\" from links\n // dom.querySelectorAll('a.u-url[target=\"_blank\"]').forEach((a) => {\n // if (!/http/i.test(a.innerText.trim())) {\n // a.removeAttribute('target');\n // }\n // });\n // },\n // }),\n // }}\n />\n );\n }; /*,\n (oldProps, newProps) => {\n const { post: oldPost } = oldProps;\n const { post: newPost } = newProps;\n return oldPost.content === newPost.content;\n },\n);*/\n\nconst SIZE_CLASS = {\n s: 'small',\n m: 'medium',\n l: 'large',\n};\n\nconst detectLang = pmem(async (text) => {\n const { detectAll } = await import('tinyld/light');\n text = text?.trim();\n\n // Ref: https://github.com/komodojp/tinyld/blob/develop/docs/benchmark.md\n // 500 should be enough for now, also the default max chars for Mastodon\n if (text?.length > 500) {\n return null;\n }\n const langs = detectAll(text);\n const lang = langs[0];\n if (lang?.lang && lang?.accuracy > 0.5) {\n // If > 50% accurate, use it\n // It can be accurate if < 50% but better be safe\n // Though > 50% also can be inaccurate 🤷‍♂️\n return lang.lang;\n }\n return null;\n});\n\nconst readMoreText = msg`Read more →`;\n\n// All this work just to make sure this only lazy-run once\n// Because first run is slow due to intl-localematcher\nconst DIFFERENT_LANG_CHECK = {};\nconst checkDifferentLanguage = (\n language,\n contentTranslationHideLanguages = [],\n) => {\n if (!language) return false;\n const targetLanguage = getTranslateTargetLanguage(true);\n const different =\n language !== targetLanguage &&\n !localeMatch([language], [targetLanguage]) &&\n !contentTranslationHideLanguages.find(\n (l) => language === l || localeMatch([language], [l]),\n );\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages] = true;\n return different;\n};\n\nfunction Status({\n statusID,\n status,\n instance: propInstance,\n size = 'm',\n contentTextWeight,\n readOnly,\n enableCommentHint,\n withinContext,\n skeleton,\n enableTranslate,\n forceTranslate: _forceTranslate,\n previewMode,\n // allowFilters,\n onMediaClick,\n quoted,\n onStatusLinkClick = () => {},\n showFollowedTags,\n allowContextMenu,\n showActionsBar,\n showReplyParent,\n mediaFirst,\n}) {\n const { _ } = useLingui();\n\n if (skeleton) {\n return (\n \n {!mediaFirst && }\n
    \n
    \n {(size === 's' || mediaFirst) && } ███ ████████\n
    \n
    \n {mediaFirst &&
    }\n
    \n

    ████ ████████

    \n
    \n
    \n
    \n
    \n );\n }\n const { masto, instance, authenticated } = api({ instance: propInstance });\n const { instance: currentInstance } = api();\n const sameInstance = instance === currentInstance;\n\n let sKey = statusKey(statusID || status?.id, instance);\n const snapStates = useSnapshot(states);\n if (!status) {\n status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n sKey = statusKey(status?.id, instance);\n }\n if (!status) {\n return null;\n }\n\n const {\n account: {\n acct,\n avatar,\n avatarStatic,\n id: accountId,\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n repliesCount,\n reblogged,\n reblogsCount,\n favourited,\n favouritesCount,\n bookmarked,\n poll,\n muted,\n sensitive,\n spoilerText,\n visibility, // public, unlisted, private, direct\n language: _language,\n editedAt,\n filtered,\n card,\n createdAt,\n inReplyToId,\n inReplyToAccountId,\n content,\n mentions,\n mediaAttachments,\n reblog,\n uri,\n url,\n emojis,\n tags,\n pinned,\n // Non-API props\n _deleted,\n _pinned,\n // _filtered,\n // Non-Mastodon\n emojiReactions,\n } = status;\n\n const [languageAutoDetected, setLanguageAutoDetected] = useState(null);\n useEffect(() => {\n if (!content) return;\n if (_language) return;\n let timer;\n timer = setTimeout(async () => {\n let detected = await detectLang(\n getHTMLText(content, {\n preProcess: (dom) => {\n // Remove anything that can skew the language detection\n\n // Remove .mention, .hashtag, pre, code, a:has(.invisible)\n dom\n .querySelectorAll(\n '.mention, .hashtag, pre, code, a:has(.invisible)',\n )\n .forEach((a) => {\n a.remove();\n });\n\n // Remove links that contains text that starts with https?://\n dom.querySelectorAll('a').forEach((a) => {\n const text = a.innerText.trim();\n if (text.startsWith('https://') || text.startsWith('http://')) {\n a.remove();\n }\n });\n },\n }),\n );\n setLanguageAutoDetected(detected);\n }, 1000);\n return () => clearTimeout(timer);\n }, [content, _language]);\n const language = _language || languageAutoDetected;\n\n // if (!mediaAttachments?.length) mediaFirst = false;\n const hasMediaAttachments = !!mediaAttachments?.length;\n if (mediaFirst && hasMediaAttachments) size = 's';\n\n const currentAccount = useMemo(() => {\n return getCurrentAccountID();\n }, []);\n const isSelf = useMemo(() => {\n return currentAccount && currentAccount === accountId;\n }, [accountId, currentAccount]);\n\n const filterContext = useContext(FilterContext);\n const filterInfo =\n !isSelf && !readOnly && !previewMode && isFiltered(filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n return null;\n }\n\n console.debug('RENDER Status', id, status?.account.displayName, quoted);\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...status,\n });\n }\n };\n\n if (/*allowFilters && */ size !== 'l' && filterInfo) {\n return (\n \n );\n }\n\n const createdAtDate = new Date(createdAt);\n const editedAtDate = new Date(editedAt);\n\n let inReplyToAccountRef = mentions?.find(\n (mention) => mention.id === inReplyToAccountId,\n );\n if (!inReplyToAccountRef && inReplyToAccountId === id) {\n inReplyToAccountRef = { url: accountURL, username, displayName };\n }\n const [inReplyToAccount, setInReplyToAccount] = useState(inReplyToAccountRef);\n if (!withinContext && !inReplyToAccount && inReplyToAccountId) {\n const account = states.accounts[inReplyToAccountId];\n if (account) {\n setInReplyToAccount(account);\n } else {\n memFetchAccount(inReplyToAccountId, masto)\n .then((account) => {\n setInReplyToAccount(account);\n states.accounts[account.id] = account;\n })\n .catch((e) => {});\n }\n }\n const mentionSelf =\n inReplyToAccountId === currentAccount ||\n mentions?.find((mention) => mention.id === currentAccount);\n\n const readingExpandSpoilers = useMemo(() => {\n const prefs = store.account.get('preferences') || {};\n return !!prefs['reading:expand:spoilers'];\n }, []);\n const readingExpandMedia = useMemo(() => {\n // default | show_all | hide_all\n // Ignore hide_all because it means hide *ALL* media including non-sensitive ones\n const prefs = store.account.get('preferences') || {};\n return prefs['reading:expand:media']?.toLowerCase() || 'default';\n }, []);\n // FOR TESTING:\n // const readingExpandSpoilers = true;\n // const readingExpandMedia = 'show_all';\n const showSpoiler =\n previewMode || readingExpandSpoilers || !!snapStates.spoilers[id];\n const showSpoilerMedia =\n previewMode ||\n readingExpandMedia === 'show_all' ||\n !!snapStates.spoilersMedia[id];\n\n if (reblog) {\n // If has statusID, means useItemID (cached in states)\n\n if (group) {\n return (\n \n
    \n {' '}\n \n
    \n \n \n );\n }\n\n return (\n \n
    \n {' '}\n \n {' '}\n boosted\n \n
    \n \n \n );\n }\n\n // Check followedTags\n const FollowedTagsParent = useCallback(\n ({ children }) => (\n \n
    \n {' '}\n {snapStates.statusFollowedTags[sKey].slice(0, 3).map((tag) => (\n \n {tag}\n \n ))}\n
    \n {children}\n \n ),\n [sKey, instance, snapStates.statusFollowedTags[sKey]],\n );\n const StatusParent =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length\n ? FollowedTagsParent\n : Fragment;\n\n const isSizeLarge = size === 'l';\n\n const [forceTranslate, setForceTranslate] = useState(_forceTranslate);\n // const targetLanguage = getTranslateTargetLanguage(true);\n // const contentTranslationHideLanguages =\n // snapStates.settings.contentTranslationHideLanguages || [];\n const { contentTranslation, contentTranslationAutoInline } =\n snapStates.settings;\n if (!contentTranslation) enableTranslate = false;\n const inlineTranslate = useMemo(() => {\n if (\n !contentTranslation ||\n !contentTranslationAutoInline ||\n readOnly ||\n (withinContext && !isSizeLarge) ||\n previewMode ||\n spoilerText ||\n sensitive ||\n poll ||\n card ||\n mediaAttachments?.length\n ) {\n return false;\n }\n const contentLength = htmlContentLength(content);\n return contentLength > 0 && contentLength <= INLINE_TRANSLATE_LIMIT;\n }, [\n contentTranslation,\n contentTranslationAutoInline,\n readOnly,\n withinContext,\n isSizeLarge,\n previewMode,\n spoilerText,\n sensitive,\n poll,\n card,\n mediaAttachments,\n content,\n ]);\n\n const [showEdited, setShowEdited] = useState(false);\n const [showEmbed, setShowEmbed] = useState(false);\n\n const spoilerContentRef = useTruncated();\n const contentRef = useTruncated();\n const mediaContainerRef = useTruncated();\n\n const statusRef = useRef(null);\n\n const unauthInteractionErrorMessage = t`Sorry, your current logged-in instance can't interact with this post from another instance.`;\n\n const textWeight = useCallback(\n () =>\n Math.max(\n Math.round((spoilerText.length + htmlContentLength(content)) / 140) ||\n 1,\n 1,\n ),\n [spoilerText, content],\n );\n\n const createdDateText = niceDateTime(createdAtDate);\n const editedDateText = editedAt && niceDateTime(editedAtDate);\n\n // Can boost if:\n // - authenticated AND\n // - visibility != direct OR\n // - visibility = private AND isSelf\n let canBoost =\n authenticated && visibility !== 'direct' && visibility !== 'private';\n if (visibility === 'private' && isSelf) {\n canBoost = true;\n }\n\n const replyStatus = (e) => {\n if (!sameInstance || !authenticated) {\n return alert(unauthInteractionErrorMessage);\n }\n // syntheticEvent comes from MenuItem\n if (e?.shiftKey || e?.syntheticEvent?.shiftKey) {\n const newWin = openCompose({\n replyToStatus: status,\n });\n if (newWin) return;\n }\n showCompose({\n replyToStatus: status,\n });\n };\n\n // Check if media has no descriptions\n const mediaNoDesc = useMemo(() => {\n return mediaAttachments.some(\n (attachment) => !attachment.description?.trim?.(),\n );\n }, [mediaAttachments]);\n\n const statusMonthsAgo = useMemo(() => {\n return Math.floor(\n (new Date() - createdAtDate) / (1000 * 60 * 60 * 24 * 30),\n );\n }, [createdAtDate]);\n\n // const boostStatus = async () => {\n // if (!sameInstance || !authenticated) {\n // alert(unauthInteractionErrorMessage);\n // return false;\n // }\n // try {\n // if (!reblogged) {\n // let confirmText = 'Boost this post?';\n // if (mediaNoDesc) {\n // confirmText += '\\n\\n⚠️ Some media have no descriptions.';\n // }\n // const yes = confirm(confirmText);\n // if (!yes) {\n // return false;\n // }\n // }\n // // Optimistic\n // states.statuses[sKey] = {\n // ...status,\n // reblogged: !reblogged,\n // reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n // };\n // if (reblogged) {\n // const newStatus = await masto.v1.statuses.$select(id).unreblog();\n // saveStatus(newStatus, instance);\n // return true;\n // } else {\n // const newStatus = await masto.v1.statuses.$select(id).reblog();\n // saveStatus(newStatus, instance);\n // return true;\n // }\n // } catch (e) {\n // console.error(e);\n // // Revert optimistism\n // states.statuses[sKey] = status;\n // return false;\n // }\n // };\n const confirmBoostStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n reblogged: !reblogged,\n reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n };\n if (reblogged) {\n const newStatus = await masto.v1.statuses.$select(id).unreblog();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).reblog();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n\n const favouriteStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n favourited: !favourited,\n favouritesCount: favouritesCount + (favourited ? -1 : 1),\n };\n if (favourited) {\n const newStatus = await masto.v1.statuses.$select(id).unfavourite();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).favourite();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const favouriteStatusNotify = async () => {\n try {\n const done = await favouriteStatus();\n if (!isSizeLarge && done) {\n showToast(\n favourited\n ? t`Unliked @${username || acct}'s post`\n : t`Liked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n const bookmarkStatus = async () => {\n if (!supports('@mastodon/post-bookmark')) return;\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n bookmarked: !bookmarked,\n };\n if (bookmarked) {\n const newStatus = await masto.v1.statuses.$select(id).unbookmark();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).bookmark();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const bookmarkStatusNotify = async () => {\n try {\n const done = await bookmarkStatus();\n if (!isSizeLarge && done) {\n showToast(\n bookmarked\n ? t`Unbookmarked @${username || acct}'s post`\n : t`Bookmarked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n // const differentLanguage =\n // !!language &&\n // language !== targetLanguage &&\n // !localeMatch([language], [targetLanguage]) &&\n // !contentTranslationHideLanguages.find(\n // (l) => language === l || localeMatch([language], [l]),\n // );\n const contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages || [];\n const [differentLanguage, setDifferentLanguage] = useState(\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages]\n ? checkDifferentLanguage(language, contentTranslationHideLanguages)\n : false,\n );\n useEffect(() => {\n if (\n !language ||\n differentLanguage ||\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages]\n ) {\n return;\n }\n let timeout = setTimeout(() => {\n const different = checkDifferentLanguage(\n language,\n contentTranslationHideLanguages,\n );\n if (different) setDifferentLanguage(different);\n }, 1);\n return () => clearTimeout(timeout);\n }, [language, differentLanguage, contentTranslationHideLanguages]);\n\n const reblogIterator = useRef();\n const favouriteIterator = useRef();\n async function fetchBoostedLikedByAccounts(firstLoad) {\n if (firstLoad) {\n reblogIterator.current = masto.v1.statuses\n .$select(statusID)\n .rebloggedBy.list({\n limit: REACTIONS_LIMIT,\n });\n favouriteIterator.current = masto.v1.statuses\n .$select(statusID)\n .favouritedBy.list({\n limit: REACTIONS_LIMIT,\n });\n }\n const [{ value: reblogResults }, { value: favouriteResults }] =\n await Promise.allSettled([\n reblogIterator.current.next(),\n favouriteIterator.current.next(),\n ]);\n if (reblogResults.value?.length || favouriteResults.value?.length) {\n const accounts = [];\n if (reblogResults.value?.length) {\n accounts.push(\n ...reblogResults.value.map((a) => {\n a._types = ['reblog'];\n return a;\n }),\n );\n }\n if (favouriteResults.value?.length) {\n accounts.push(\n ...favouriteResults.value.map((a) => {\n a._types = ['favourite'];\n return a;\n }),\n );\n }\n return {\n value: accounts,\n done: reblogResults.done && favouriteResults.done,\n };\n }\n return {\n value: [],\n done: true,\n };\n }\n\n const actionsRef = useRef();\n const isPublic = ['public', 'unlisted'].includes(visibility);\n const isPinnable = ['public', 'unlisted', 'private'].includes(visibility);\n const StatusMenuItems = (\n <>\n {!isSizeLarge && sameInstance && (\n <>\n
    \n \n \n \n {repliesCount > 0 ? shortenNumber(repliesCount) : t`Reply`}\n \n \n \n \n {reblogged ? t`Unboost` : t`Boost`}\n \n }\n className={`menu-reblog ${reblogged ? 'checked' : ''}`}\n menuExtras={\n {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n \n \n Quote\n \n \n }\n menuFooter={\n mediaNoDesc && !reblogged ? (\n
    \n \n Some media have no descriptions.\n
    \n ) : (\n statusMonthsAgo >= 3 && (\n
    \n \n \n \n Old post (\n \n {rtf.format(-statusMonthsAgo, 'month')}\n \n )\n \n \n
    \n )\n )\n }\n disabled={!canBoost}\n onClick={async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n }}\n >\n \n \n {reblogsCount > 0\n ? shortenNumber(reblogsCount)\n : reblogged\n ? t`Unboost`\n : t`Boost…`}\n \n \n \n \n \n {favouritesCount > 0\n ? shortenNumber(favouritesCount)\n : favourited\n ? t`Unlike`\n : t`Like`}\n \n \n {supports('@mastodon/post-bookmark') && (\n \n \n {bookmarked ? t`Unbookmark` : t`Bookmark`}\n \n )}\n
    \n \n )}\n {!isSizeLarge && sameInstance && (isSizeLarge || showActionsBar) && (\n \n )}\n {(isSizeLarge || showActionsBar) && (\n <>\n {\n states.showGenericAccounts = {\n heading: t`Boosted/Liked by…`,\n fetchAccounts: fetchBoostedLikedByAccounts,\n instance,\n showReactions: true,\n postID: sKey,\n };\n }}\n >\n \n \n Boosted/Liked by…\n \n \n \n )}\n {!mediaFirst && (\n <>\n {(enableTranslate || !language || differentLanguage) && (\n \n )}\n {enableTranslate ? (\n
    \n {\n setForceTranslate(true);\n }}\n >\n \n \n Translate\n \n \n {supportsTTS && (\n {\n const postText = getPostText(status);\n if (postText) {\n speak(postText, language);\n }\n }}\n >\n \n \n Speak\n \n \n )}\n
    \n ) : (\n (!language || differentLanguage) && (\n
    \n \n \n \n Translate\n \n \n {supportsTTS && (\n {\n const postText = getPostText(status);\n if (postText) {\n speak(postText, language);\n }\n }}\n >\n \n \n Speak\n \n \n )}\n
    \n )\n )}\n \n )}\n {((!isSizeLarge && sameInstance) ||\n enableTranslate ||\n !language ||\n differentLanguage) && }\n {!isSizeLarge && (\n <>\n {\n onStatusLinkClick(e, status);\n }}\n >\n \n \n \n View post by{' '}\n @{username || acct}\n \n
    \n \n {_(visibilityText[visibility])} • {createdDateText}\n \n
    \n \n \n )}\n {!!editedAt && (\n <>\n {\n setShowEdited(id);\n }}\n >\n \n \n Show Edit History\n
    \n \n Edited: {editedDateText}\n \n
    \n \n \n )}\n \n \n \n {nicePostURL(url)}\n \n \n
    \n {\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(url);\n showToast(t`Link copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy link`);\n }\n }}\n >\n \n \n Copy\n \n \n {isPublic &&\n navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n {\n try {\n navigator.share({\n url,\n });\n } catch (e) {\n console.error(e);\n alert(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n \n \n Share…\n \n \n )}\n
    \n {isPublic && isSizeLarge && (\n {\n setShowEmbed(true);\n }}\n >\n \n \n Embed post\n \n \n )}\n {(isSelf || mentionSelf) && }\n {(isSelf || mentionSelf) && (\n {\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [muted ? 'unmute' : 'mute']();\n saveStatus(newStatus, instance);\n showToast(\n muted ? t`Conversation unmuted` : t`Conversation muted`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n muted\n ? t`Unable to unmute conversation`\n : t`Unable to mute conversation`,\n );\n }\n }}\n >\n {muted ? (\n <>\n \n \n Unmute conversation\n \n \n ) : (\n <>\n \n \n Mute conversation\n \n \n )}\n \n )}\n {isSelf && isPinnable && (\n {\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [pinned ? 'unpin' : 'pin']();\n saveStatus(newStatus, instance);\n showToast(\n pinned\n ? t`Post unpinned from profile`\n : t`Post pinned to profile`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n pinned ? t`Unable to unpin post` : t`Unable to pin post`,\n );\n }\n }}\n >\n {pinned ? (\n <>\n \n \n Unpin from profile\n \n \n ) : (\n <>\n \n \n Pin to profile\n \n \n )}\n \n )}\n {isSelf && (\n
    \n {supports('@mastodon/post-edit') && (\n {\n showCompose({\n editStatus: status,\n });\n }}\n >\n \n \n Edit\n \n \n )}\n {isSizeLarge && (\n \n \n \n Delete this post?\n \n \n }\n itemProps={{\n className: 'danger',\n }}\n menuItemClassName=\"danger\"\n onClick={() => {\n // const yes = confirm('Delete this post?');\n // if (yes) {\n (async () => {\n try {\n await masto.v1.statuses.$select(id).remove();\n const cachedStatus = getStatus(id, instance);\n cachedStatus._deleted = true;\n showToast(t`Post deleted`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to delete post`);\n }\n })();\n // }\n }}\n >\n \n \n Delete…\n \n \n )}\n
    \n )}\n {!isSelf && isSizeLarge && (\n <>\n \n {\n states.showReportModal = {\n account: status.account,\n post: status,\n };\n }}\n >\n \n \n Report post…\n \n \n \n )}\n \n );\n\n const contextMenuRef = useRef();\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuProps, setContextMenuProps] = useState({});\n\n const showContextMenu =\n allowContextMenu || (!isSizeLarge && !previewMode && !_deleted && !quoted);\n\n // Only iOS/iPadOS browsers don't support contextmenu\n // Some comments report iPadOS might support contextmenu if a mouse is connected\n const bindLongPressContext = useLongPress(\n isIOS && showContextMenu\n ? (e) => {\n if (e.pointerType === 'mouse') return;\n // There's 'pen' too, but not sure if contextmenu event would trigger from a pen\n\n const { clientX, clientY } = e.touches?.[0] || e;\n // link detection copied from onContextMenu because here it works\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: clientX,\n y: clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }\n : null,\n {\n threshold: 600,\n captureEvent: true,\n detect: 'touch',\n cancelOnMovement: 2, // true allows movement of up to 25 pixels\n },\n );\n\n const hotkeysEnabled = !readOnly && !previewMode && !quoted;\n const rRef = useHotkeys('r, shift+r', replyStatus, {\n enabled: hotkeysEnabled,\n });\n const fRef = useHotkeys('f, l', favouriteStatusNotify, {\n enabled: hotkeysEnabled,\n });\n const dRef = useHotkeys('d', bookmarkStatusNotify, {\n enabled: hotkeysEnabled,\n });\n const bRef = useHotkeys(\n 'shift+b',\n () => {\n (async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n })();\n },\n {\n enabled: hotkeysEnabled && canBoost,\n },\n );\n const xRef = useHotkeys('x', (e) => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n if (activeStatus) {\n const spoilerButton = activeStatus.querySelector(\n '.spoiler-button:not(.spoiling)',\n );\n if (spoilerButton) {\n e.stopPropagation();\n spoilerButton.click();\n } else {\n const spoilerMediaButton = activeStatus.querySelector(\n '.spoiler-media-button:not(.spoiling)',\n );\n if (spoilerMediaButton) {\n e.stopPropagation();\n spoilerMediaButton.click();\n }\n }\n }\n });\n\n const displayedMediaAttachments = mediaAttachments.slice(\n 0,\n isSizeLarge ? undefined : 4,\n );\n const showMultipleMediaCaptions =\n mediaAttachments.length > 1 &&\n displayedMediaAttachments.some(\n (media) => !!media.description && !isMediaCaptionLong(media.description),\n );\n const captionChildren = useMemo(() => {\n if (!showMultipleMediaCaptions) return null;\n const attachments = [];\n displayedMediaAttachments.forEach((media, i) => {\n if (!media.description) return;\n const index = attachments.findIndex(\n (attachment) => attachment.media.description === media.description,\n );\n if (index === -1) {\n attachments.push({\n media,\n indices: [i],\n });\n } else {\n attachments[index].indices.push(i);\n }\n });\n return attachments.map(({ media, indices }) => (\n i + 1).join(' ')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: media.description,\n lang: language,\n };\n }}\n title={media.description}\n >\n {indices.map((i) => i + 1).join(' ')} {media.description}\n \n ));\n\n // return displayedMediaAttachments.map(\n // (media, i) =>\n // !!media.description && (\n // {\n // e.preventDefault();\n // e.stopPropagation();\n // states.showMediaAlt = {\n // alt: media.description,\n // lang: language,\n // };\n // }}\n // title={media.description}\n // >\n // {i + 1} {media.description}\n // \n // ),\n // );\n }, [showMultipleMediaCaptions, displayedMediaAttachments, language]);\n\n const isThread = useMemo(() => {\n return (\n (!!inReplyToId && inReplyToAccountId === status.account?.id) ||\n !!snapStates.statusThreadNumber[sKey]\n );\n }, [\n inReplyToId,\n inReplyToAccountId,\n status.account?.id,\n snapStates.statusThreadNumber[sKey],\n ]);\n\n const showCommentHint = useMemo(() => {\n return (\n enableCommentHint &&\n !isThread &&\n !withinContext &&\n !inReplyToId &&\n visibility === 'public' &&\n repliesCount > 0\n );\n }, [\n enableCommentHint,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n visibility,\n ]);\n const showCommentCount = useMemo(() => {\n if (\n card ||\n poll ||\n sensitive ||\n spoilerText ||\n mediaAttachments?.length ||\n isThread ||\n withinContext ||\n inReplyToId ||\n repliesCount <= 0\n ) {\n return false;\n }\n const questionRegex = /[???︖❓❔⁇⁈⁉¿‽؟]/;\n const containsQuestion = questionRegex.test(content);\n if (!containsQuestion) return false;\n const contentLength = htmlContentLength(content);\n if (contentLength > 0 && contentLength <= SHOW_COMMENT_COUNT_LIMIT) {\n return true;\n }\n }, [\n card,\n poll,\n sensitive,\n spoilerText,\n mediaAttachments,\n reblog,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n content,\n ]);\n\n return (\n \n {showReplyParent && !!(inReplyToId && inReplyToAccountId) && (\n \n )}\n {\n statusRef.current = node;\n // Use parent node if it's in focus\n // Use case: \n // When navigating (j/k), the is focused instead of \n // Hotkey binding doesn't bubble up thus this hack\n const nodeRef =\n node?.closest?.(\n '.timeline-item, .timeline-item-alt, .status-link, .status-focus',\n ) || node;\n rRef(nodeRef);\n fRef(nodeRef);\n dRef(nodeRef);\n bRef(nodeRef);\n xRef(nodeRef);\n }}\n tabindex=\"-1\"\n class={`status ${\n !withinContext && inReplyToId && inReplyToAccount\n ? 'status-reply-to'\n : ''\n } visibility-${visibility} ${_pinned ? 'status-pinned' : ''} ${\n SIZE_CLASS[size]\n } ${_deleted ? 'status-deleted' : ''} ${quoted ? 'status-card' : ''} ${\n isContextMenuOpen ? 'status-menu-open' : ''\n } ${mediaFirst && hasMediaAttachments ? 'status-media-first' : ''}`}\n onMouseEnter={debugHover}\n onContextMenu={(e) => {\n if (!showContextMenu) return;\n if (e.metaKey) return;\n // console.log('context menu', e);\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n\n // If there's selected text, don't show custom context menu\n const selection = window.getSelection?.();\n if (selection.toString().length > 0) {\n const { anchorNode } = selection;\n if (statusRef.current?.contains(anchorNode)) {\n return;\n }\n }\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: e.clientX,\n y: e.clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }}\n {...(showContextMenu ? bindLongPressContext() : {})}\n >\n {showContextMenu && (\n {\n setIsContextMenuOpen(false);\n // statusRef.current?.focus?.();\n if (e?.reason === 'click') {\n statusRef.current?.closest('[tabindex]')?.focus?.();\n }\n }}\n portal={{\n target: document.body,\n }}\n containerProps={{\n style: {\n // Higher than the backdrop\n zIndex: 1001,\n },\n onClick: () => {\n contextMenuRef.current?.closeMenu?.();\n },\n }}\n overflow=\"auto\"\n boundingBoxPadding={safeBoundingBoxPadding()}\n unmountOnClose\n >\n {StatusMenuItems}\n \n )}\n {showActionsBar &&\n size !== 'l' &&\n !previewMode &&\n !readOnly &&\n !_deleted &&\n !quoted && (\n \n \n \n {\n e.preventDefault();\n e.stopPropagation();\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'start',\n direction: 'left',\n gap: 0,\n shift: -8,\n });\n setIsContextMenuOpen('actions-bar');\n }}\n >\n \n \n \n )}\n {size !== 'l' && (\n
    \n {reblogged && (\n \n )}\n {favourited && (\n \n )}\n {bookmarked && (\n \n )}\n {_pinned && (\n \n )}\n
    \n )}\n {size !== 's' && (\n {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: status.account,\n instance,\n };\n }}\n >\n \n
    \n )}\n
    \n
    \n \n \n \n {/* {inReplyToAccount && !withinContext && size !== 's' && (\n <>\n {' '}\n \n {' '}\n \n \n \n )} */}\n {/* */}{' '}\n {size !== 'l' &&\n (_deleted ? (\n \n Deleted\n \n ) : url && !previewMode && !readOnly && !quoted ? (\n {\n if (\n e.metaKey ||\n e.ctrlKey ||\n e.shiftKey ||\n e.altKey ||\n e.which === 2\n ) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n onStatusLinkClick?.(e, status);\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'end',\n direction: 'bottom',\n gap: 4,\n });\n setIsContextMenuOpen(true);\n }}\n class={`time ${\n isContextMenuOpen && contextMenuProps?.anchorRef\n ? 'is-open'\n : ''\n }`}\n >\n {showCommentHint && !showCommentCount ? (\n \n ) : (\n visibility !== 'public' &&\n visibility !== 'direct' && (\n \n )\n )}{' '}\n \n {!previewMode && !readOnly && (\n \n )}\n \n ) : (\n // {\n // if (e.target === e.currentTarget)\n // menuInstanceRef.current?.closeMenu?.();\n // },\n // }}\n // align=\"end\"\n // gap={4}\n // overflow=\"auto\"\n // viewScroll=\"close\"\n // boundingBoxPadding=\"8 8 8 8\"\n // unmountOnClose\n // menuButton={({ open }) => (\n // {\n // e.preventDefault();\n // e.stopPropagation();\n // onStatusLinkClick?.(e, status);\n // }}\n // class={`time ${open ? 'is-open' : ''}`}\n // >\n // {' '}\n // \n // \n // )}\n // >\n // {StatusMenuItems}\n // \n \n {visibility !== 'public' && visibility !== 'direct' && (\n <>\n {' '}\n \n )}\n \n \n ))}\n
    \n {visibility === 'direct' && (\n <>\n
    \n Private mention\n
    {' '}\n \n )}\n {!withinContext && (\n <>\n {isThread ? (\n
    \n \n \n Thread\n {snapStates.statusThreadNumber[sKey]\n ? ` ${snapStates.statusThreadNumber[sKey]}/X`\n : ''}\n \n
    \n ) : (\n !!inReplyToId &&\n !!inReplyToAccount &&\n (!!spoilerText ||\n !mentions.find((mention) => {\n return mention.id === inReplyToAccountId;\n })) && (\n
    \n {' '}\n \n
    \n )\n )}\n \n )}\n \n {mediaFirst && hasMediaAttachments ? (\n <>\n {(!!spoilerText || !!sensitive) && !readingExpandSpoilers && (\n <>\n {!!spoilerText && (\n \n {' '}\n \n )}\n {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n {' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n \n \n )}\n \n {!!content && (\n
    \n \n
    \n )}\n \n ) : (\n <>\n {!!spoilerText && (\n <>\n \n

    \n \n

    \n
    \n {readingExpandSpoilers || previewMode ? (\n
    \n Content warning\n
    \n ) : (\n {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n {' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n \n )}\n \n )}\n {!!content && (\n \n \n \n \n )}\n {!!poll && (\n {\n states.statuses[sKey].poll = newPoll;\n }}\n refresh={() => {\n return masto.v1.polls\n .$select(poll.id)\n .fetch()\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n })\n .catch((e) => {}); // Silently fail\n }}\n votePoll={(choices) => {\n return masto.v1.polls\n .$select(poll.id)\n .votes.create({\n choices,\n })\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n })\n .catch((e) => {}); // Silently fail\n }}\n />\n )}\n {(((enableTranslate || inlineTranslate) &&\n !!content.trim() &&\n !!getHTMLText(emojifyText(content, emojis)) &&\n differentLanguage) ||\n forceTranslate) && (\n \n )}\n {!previewMode &&\n sensitive &&\n !!mediaAttachments.length &&\n readingExpandMedia !== 'show_all' && (\n
    \n );\n}\n\nfunction MultipleMediaFigure(props) {\n const { enabled, children, lang, captionChildren } = props;\n if (!enabled || !captionChildren) return children;\n return (\n
    \n {children}\n
    \n {captionChildren}\n
    \n
    \n );\n}\n\nfunction MediaFirstContainer(props) {\n const { mediaAttachments, language, postID, instance } = props;\n const moreThanOne = mediaAttachments.length > 1;\n\n const carouselRef = useRef();\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(Math.abs(scrollLeft) / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n return (\n <>\n
    \n
    \n {mediaAttachments.map((media, i) => (\n
    \n \n
    \n ))}\n
    \n {moreThanOne && (\n \n )}\n
    \n {moreThanOne && (\n \n {mediaAttachments.map((media, i) => (\n \n ))}\n \n )}\n \n );\n}\n\nfunction getDomain(url) {\n return punycode.toUnicode(\n URL.parse(url)\n .hostname.replace(/^www\\./, '')\n .replace(/\\/$/, ''),\n );\n}\n\n// \"Post\": Quote post + card link preview combo\n// Assume all links from these domains are \"posts\"\n// Mastodon links are \"posts\" too but they are converted to real quote posts and there's too many domains to check\n// This is just \"Progressive Enhancement\"\nfunction isCardPost(domain) {\n return ['x.com', 'twitter.com', 'threads.net', 'bsky.app'].includes(domain);\n}\n\nfunction Byline({ authors, hidden, children }) {\n if (hidden) return children;\n if (!authors?.[0]?.account?.id) return children;\n const author = authors[0].account;\n\n return (\n \n );\n}\n\nfunction Card({ card, selfReferential, selfAuthor, instance }) {\n const snapStates = useSnapshot(states);\n const {\n blurhash,\n title,\n description,\n html,\n providerName,\n providerUrl,\n authorName,\n authorUrl,\n width,\n height,\n image,\n imageDescription,\n url,\n type,\n embedUrl,\n language,\n publishedAt,\n authors,\n } = card;\n\n /* type\n link = Link OEmbed\n photo = Photo OEmbed\n video = Video OEmbed\n rich = iframe OEmbed. Not currently accepted, so won’t show up in practice.\n */\n\n const hasText = title || providerName || authorName;\n const isLandscape = width / height >= 1.2;\n const size = isLandscape ? 'large' : '';\n\n const [cardStatusURL, setCardStatusURL] = useState(null);\n // const [cardStatusID, setCardStatusID] = useState(null);\n useEffect(() => {\n if (hasText && image && !selfReferential && isMastodonLinkMaybe(url)) {\n unfurlMastodonLink(instance, url).then((result) => {\n if (!result) return;\n const { id, url } = result;\n setCardStatusURL('#' + url);\n\n // NOTE: This is for quote post\n // (async () => {\n // const { masto } = api({ instance });\n // const status = await masto.v1.statuses.$select(id).fetch();\n // saveStatus(status, instance);\n // setCardStatusID(id);\n // })();\n });\n }\n }, [hasText, image, selfReferential]);\n\n // if (cardStatusID) {\n // return (\n // \n // );\n // }\n\n if (snapStates.unfurledLinks[url]) return null;\n\n const hasIframeHTML = /`;\n this.domRefFrame.insertAdjacentHTML('beforeend', iframeHTML);\n this.domRefFrame.classList.add('activated');\n this.isIframeLoaded = true;\n this.attemptShortAutoPlay();\n this.dispatchEvent(new CustomEvent('liteYoutubeIframeLoaded', {\n detail: {\n videoId: this.videoId,\n },\n bubbles: true,\n cancelable: true,\n }));\n }\n }\n initImagePlaceholder() {\n const posterUrlWebp = `https://i.ytimg.com/vi_webp/${this.videoId}/${this.posterQuality}.webp`;\n const posterUrlJpeg = `https://i.ytimg.com/vi/${this.videoId}/${this.posterQuality}.jpg`;\n this.domRefImg.fallback.loading = this.posterLoading;\n this.domRefImg.webp.srcset = posterUrlWebp;\n this.domRefImg.jpeg.srcset = posterUrlJpeg;\n this.domRefImg.fallback.src = posterUrlJpeg;\n this.domRefImg.fallback.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.domRefImg?.fallback?.setAttribute('alt', `${this.videoPlay}: ${this.videoTitle}`);\n }\n initIntersectionObserver() {\n const options = {\n root: null,\n rootMargin: '0px',\n threshold: 0,\n };\n const observer = new IntersectionObserver((entries, observer) => {\n entries.forEach(entry => {\n if (entry.isIntersecting && !this.isIframeLoaded) {\n LiteYTEmbed.warmConnections();\n this.addIframe(true);\n observer.unobserve(this);\n }\n });\n }, options);\n observer.observe(this);\n }\n attemptShortAutoPlay() {\n if (this.isYouTubeShort()) {\n setTimeout(() => {\n this.shadowRoot\n .querySelector('iframe')\n ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"' + 'playVideo' + '\",\"args\":\"\"}', '*');\n }, 2000);\n }\n }\n isYouTubeShort() {\n return (this.getAttribute('short') === '' &&\n window.matchMedia('(max-width: 40em)').matches);\n }\n static addPrefetch(kind, url) {\n const linkElem = document.createElement('link');\n linkElem.rel = kind;\n linkElem.href = url;\n linkElem.crossOrigin = 'true';\n document.head.append(linkElem);\n }\n static warmConnections() {\n if (LiteYTEmbed.isPreconnected || window.liteYouTubeIsPreconnected)\n return;\n LiteYTEmbed.addPrefetch('preconnect', 'https://i.ytimg.com/');\n LiteYTEmbed.addPrefetch('preconnect', 'https://s.ytimg.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.google.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\n LiteYTEmbed.addPrefetch('preconnect', 'https://static.doubleclick.net');\n LiteYTEmbed.isPreconnected = true;\n window.liteYouTubeIsPreconnected = true;\n }\n}\nLiteYTEmbed.isPreconnected = false;\ncustomElements.define('lite-youtube', LiteYTEmbed);\n//# sourceMappingURL=lite-youtube.js.map","const digitLookup = new Uint8Array(128);\nfor (let i = 0; i < 83; i++) {\n digitLookup[\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~'.charCodeAt(\n i,\n )\n ] = i;\n}\nconst decode83 = (str, start, end) => {\n let value = 0;\n while (start < end) {\n value *= 83;\n value += digitLookup[str.charCodeAt(start++)];\n }\n return value;\n};\n\nconst pow = Math.pow;\nconst PI = Math.PI;\nconst PI2 = PI * 2;\n\nconst d = 3294.6;\nconst e = 269.025;\nconst sRGBToLinear = (value) =>\n value > 10.31475 ? pow(value / e + 0.052132, 2.4) : value / d;\n\nconst linearTosRGB = (v) =>\n ~~(v > 0.00001227 ? e * pow(v, 0.416666) - 13.025 : v * d + 1);\n\nconst signSqr = (x) => (x < 0 ? -1 : 1) * x * x;\n\n/**\n * Fast approximate cosine implementation\n * Based on FTrig https://github.com/netcell/FTrig\n */\nconst fastCos = (x) => {\n x += PI / 2;\n while (x > PI) {\n x -= PI2;\n }\n const cos = 1.27323954 * x - 0.405284735 * signSqr(x);\n return 0.225 * (signSqr(cos) - cos) + cos;\n};\n\n/**\n * Extracts average color from BlurHash image\n * @param {string} blurHash BlurHash image string\n * @returns {[number, number, number]}\n */\nexport function getBlurHashAverageColor(blurHash) {\n const val = decode83(blurHash, 2, 6);\n return [val >> 16, (val >> 8) & 255, val & 255];\n}\n\n/**\n * Decodes BlurHash image\n * @param {string} blurHash BlurHash image string\n * @param {number} width Output image width\n * @param {number} height Output image height\n * @param {?number} punch\n * @returns {Uint8ClampedArray}\n */\nexport function decodeBlurHash(blurHash, width, height, punch) {\n const sizeFlag = decode83(blurHash, 0, 1);\n const numX = (sizeFlag % 9) + 1;\n const numY = ~~(sizeFlag / 9) + 1;\n const size = numX * numY;\n\n let i = 0,\n j = 0,\n x = 0,\n y = 0,\n r = 0,\n g = 0,\n b = 0,\n basis = 0,\n basisY = 0,\n colorIndex = 0,\n pixelIndex = 0,\n value = 0;\n\n const maximumValue = ((decode83(blurHash, 1, 2) + 1) / 13446) * (punch | 1);\n\n const colors = new Float64Array(size * 3);\n\n const averageColor = getBlurHashAverageColor(blurHash);\n for (i = 0; i < 3; i++) {\n colors[i] = sRGBToLinear(averageColor[i]);\n }\n\n for (i = 1; i < size; i++) {\n value = decode83(blurHash, 4 + i * 2, 6 + i * 2);\n colors[i * 3] = signSqr(~~(value / 361) - 9) * maximumValue;\n colors[i * 3 + 1] = signSqr((~~(value / 19) % 19) - 9) * maximumValue;\n colors[i * 3 + 2] = signSqr((value % 19) - 9) * maximumValue;\n }\n\n const cosinesY = new Float64Array(numY * height);\n const cosinesX = new Float64Array(numX * width);\n for (j = 0; j < numY; j++) {\n for (y = 0; y < height; y++) {\n cosinesY[j * height + y] = fastCos((PI * y * j) / height);\n }\n }\n for (i = 0; i < numX; i++) {\n for (x = 0; x < width; x++) {\n cosinesX[i * width + x] = fastCos((PI * x * i) / width);\n }\n }\n\n const bytesPerRow = width * 4;\n const pixels = new Uint8ClampedArray(bytesPerRow * height);\n\n for (y = 0; y < height; y++) {\n for (x = 0; x < width; x++) {\n r = g = b = 0;\n for (j = 0; j < numY; j++) {\n basisY = cosinesY[j * height + y];\n for (i = 0; i < numX; i++) {\n basis = cosinesX[i * width + x] * basisY;\n colorIndex = (i + j * numX) * 3;\n r += colors[colorIndex] * basis;\n g += colors[colorIndex + 1] * basis;\n b += colors[colorIndex + 2] * basis;\n }\n }\n\n pixelIndex = 4 * x + y * bytesPerRow;\n pixels[pixelIndex] = linearTosRGB(r);\n pixels[pixelIndex + 1] = linearTosRGB(g);\n pixels[pixelIndex + 2] = linearTosRGB(b);\n pixels[pixelIndex + 3] = 255; // alpha\n }\n }\n return pixels;\n}\n","/**\n * @param {string[]} splittedHtml\n * @param {{ char?: string; count?: number}} options\n * @returns {string}\n */\nconst addIndentation = (splittedHtml, options = {}) => {\n const char = options.char || ' '\n const count = options.count || 2\n\n let level = 0\n const opened = []\n\n return splittedHtml.reverse().reduce((indented, elTag) => {\n if (opened.length\n && level\n && opened[level]\n /* if current element tag is the same as previously opened one */\n && opened[level] === elTag.substring(1, opened[level].length + 1)\n ) {\n opened.splice(level, 1)\n level--\n }\n\n const indentation = char.repeat(level ? level * count : 0)\n\n const newIndented = [\n `${indentation}${elTag}`,\n ...indented,\n ]\n\n // if current element tag is closing tag\n // add it to opened elements\n if (elTag.substring(0, 2) === ' (\n // Replace\n // - 1 or more spaces or tabs at the start of line\n // - 1 or more spaces or tabs at the end of line\n // - empty lines\n // with empty string\n nonFormattedString.trim().replace(/(^(\\s|\\t)+|(( |\\t)+)$)/gm, '')\n)\n\n/**\n * @param {string} markup\n * @returns {string[]} Array of strings splitted on new lines without empty lines\n */\nconst mergeAttributesWithElements = (markup) => {\n const splittedMarkup = removeEmptyLines(markup).split('\\n')\n\n const mergedLines = []\n let currentElement = ''\n for (let i = 0; i < splittedMarkup.length; i += 1) {\n const line = splittedMarkup[i]\n\n // If line is closing element/tag separate closing tag from rest of the line with space\n if (line.endsWith('/>')) {\n mergedLines.push(`${currentElement}${line.slice(0, -2)} />`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n if (line.endsWith('>')) {\n mergedLines.push(`${currentElement}${\n line.startsWith('>') || line.startsWith('<') ? '' : ' '\n }${line}`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n currentElement += currentElement.length ? ` ${line}` : line\n }\n\n return mergedLines\n}\n\nmodule.exports = {\n mergeAttributesWithElements,\n removeEmptyLines,\n}\n","const addIndentation = require('./utils/addIndentation')\nconst { mergeAttributesWithElements } = require('./utils/toLines')\n\n/**\n * @param {string} markup\n * @param {{ char?: string; count?: number }} options\n * @returns {string}\n */\nconst prettify = (markup, options = {}) => {\n const splitted = mergeAttributesWithElements(markup)\n\n return addIndentation(splitted, options)\n}\n\nmodule.exports = prettify\n","import { useRef as s, useCallback as h, useEffect as g } from \"react\";\nvar l = /* @__PURE__ */ ((e) => (e.Mouse = \"mouse\", e.Touch = \"touch\", e.Pointer = \"pointer\", e))(l || {}), d = /* @__PURE__ */ ((e) => (e.CancelledByMovement = \"cancelled-by-movement\", e.CancelledByRelease = \"cancelled-by-release\", e.CancelledOutsideElement = \"cancelled-outside-element\", e))(d || {});\nconst A = () => typeof window == \"object\" ? window?.PointerEvent ?? null : null, z = () => typeof window == \"object\" ? window?.TouchEvent ?? null : null;\nfunction U(e) {\n const { nativeEvent: t } = e, u = z();\n return u && t instanceof u || \"touches\" in e;\n}\nfunction X(e) {\n const t = A();\n return e.nativeEvent instanceof MouseEvent && !(t && e.nativeEvent instanceof t);\n}\nfunction Y(e) {\n const { nativeEvent: t } = e;\n if (!t)\n return !1;\n const u = A();\n return u && t instanceof u || \"pointerId\" in t;\n}\nfunction R(e) {\n return X(e) || U(e) || Y(e);\n}\nfunction j(e) {\n return U(e) ? {\n x: e.touches[0].pageX,\n y: e.touches[0].pageY\n } : X(e) || Y(e) ? {\n x: e.pageX,\n y: e.pageY\n } : null;\n}\nfunction G(e) {\n return {\n target: e.target,\n currentTarget: e.currentTarget,\n nativeEvent: e,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n persist: () => {\n }\n };\n}\nfunction J(e, {\n threshold: t = 400,\n captureEvent: u = !1,\n detect: y = l.Pointer,\n cancelOnMovement: w = !1,\n cancelOutsideElement: v = !0,\n filterEvents: p,\n onStart: M,\n onMove: C,\n onFinish: L,\n onCancel: b\n} = {}) {\n const P = s(!1), c = s(!1), I = s(), a = s(), T = s(e), f = s(null), E = h(\n (n) => (r) => {\n c.current || R(r) && (p !== void 0 && !p(r) || (u && r.persist(), M?.(r, { context: n }), f.current = j(r), c.current = !0, I.current = r.currentTarget, a.current = setTimeout(() => {\n T.current && (T.current(r, { context: n }), P.current = !0);\n }, t)));\n },\n [u, p, M, t]\n ), i = h(\n (n) => (r, o) => {\n R(r) && c.current && (f.current = null, u && r.persist(), P.current ? L?.(r, { context: n }) : c.current && b?.(r, { context: n, reason: o ?? d.CancelledByRelease }), P.current = !1, c.current = !1, a.current !== void 0 && clearTimeout(a.current));\n },\n [u, L, b]\n ), m = h(\n (n) => (r) => {\n if (C?.(r, { context: n }), w !== !1 && f.current) {\n const o = j(r);\n if (o) {\n const B = w === !0 ? 25 : w, D = {\n x: Math.abs(o.x - f.current.x),\n y: Math.abs(o.y - f.current.y)\n };\n (D.x > B || D.y > B) && i(n)(r, d.CancelledByMovement);\n }\n }\n },\n [i, w, C]\n ), q = h(\n (n) => {\n if (e === null)\n return {};\n switch (y) {\n case l.Mouse: {\n const r = {\n onMouseDown: E(n),\n onMouseMove: m(n),\n onMouseUp: i(n)\n };\n return v && (r.onMouseLeave = (o) => {\n i(n)(o, d.CancelledOutsideElement);\n }), r;\n }\n case l.Touch:\n return {\n onTouchStart: E(n),\n onTouchMove: m(n),\n onTouchEnd: i(n)\n };\n case l.Pointer: {\n const r = {\n onPointerDown: E(n),\n onPointerMove: m(n),\n onPointerUp: i(n)\n };\n return v && (r.onPointerLeave = (o) => i(n)(o, d.CancelledOutsideElement)), r;\n }\n }\n },\n [e, i, v, y, m, E]\n );\n return g(() => {\n if (!window)\n return;\n function n(r) {\n const o = G(r);\n i()(o);\n }\n return window.addEventListener(\"mouseup\", n), window.addEventListener(\"touchend\", n), window.addEventListener(\"pointerup\", n), () => {\n window.removeEventListener(\"mouseup\", n), window.removeEventListener(\"touchend\", n), window.removeEventListener(\"pointerup\", n);\n };\n }, [i]), g(\n () => () => {\n a.current !== void 0 && clearTimeout(a.current);\n },\n []\n ), g(() => {\n T.current = e;\n }, [e]), q;\n}\nexport {\n d as LongPressCallbackReason,\n l as LongPressEventType,\n J as useLongPress\n};\n","import { Plural, plural, t, Trans } from '@lingui/macro';\nimport { useState } from 'preact/hooks';\n\nimport shortenNumber from '../utils/shorten-number';\n\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nexport default function Poll({\n poll,\n lang,\n readOnly,\n refresh = () => {},\n votePoll = () => {},\n}) {\n const [uiState, setUIState] = useState('default');\n const {\n expired,\n expiresAt,\n id,\n multiple,\n options,\n ownVotes,\n voted,\n votersCount,\n votesCount,\n emojis,\n } = poll;\n const expiresAtDate = !!expiresAt && new Date(expiresAt); // Update poll at point of expiry\n // NOTE: Disable this because setTimeout runs immediately if delay is too large\n // https://stackoverflow.com/a/56718027/20838\n // useEffect(() => {\n // let timeout;\n // if (!expired && expiresAtDate) {\n // const ms = expiresAtDate.getTime() - Date.now() + 1; // +1 to give it a little buffer\n // if (ms > 0) {\n // timeout = setTimeout(() => {\n // setUIState('loading');\n // (async () => {\n // // await refresh();\n // setUIState('default');\n // })();\n // }, ms);\n // }\n // }\n // return () => {\n // clearTimeout(timeout);\n // };\n // }, [expired, expiresAtDate]);\n\n const pollVotesCount = multiple ? votersCount : votesCount;\n let roundPrecision = 0;\n\n if (pollVotesCount <= 1000) {\n roundPrecision = 0;\n } else if (pollVotesCount <= 10000) {\n roundPrecision = 1;\n } else if (pollVotesCount <= 100000) {\n roundPrecision = 2;\n }\n\n const [showResults, setShowResults] = useState(false);\n const optionsHaveVoteCounts = options.every((o) => o.votesCount !== null);\n\n return (\n \n {(showResults && optionsHaveVoteCounts) || voted || expired ? (\n <>\n
    \n {options.map((option, i) => {\n const { title, votesCount: optionVotesCount } = option;\n const ratio = pollVotesCount\n ? optionVotesCount / pollVotesCount\n : 0;\n const percentage = ratio\n ? ratio.toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n maximumFractionDigits: roundPrecision,\n })\n : '0%';\n\n const isLeading =\n optionVotesCount > 0 &&\n optionVotesCount ===\n Math.max(...options.map((o) => o.votesCount));\n return (\n \n
    \n \n \n \n {voted && ownVotes.includes(i) && (\n <>\n {' '}\n \n \n )}\n
    \n \n {percentage}\n
    \n \n );\n })}\n \n {!expired && !voted && (\n {\n e.preventDefault();\n setShowResults(false);\n }}\n >\n Hide results\n \n )}\n \n ) : (\n {\n e.preventDefault();\n const form = e.target;\n const formData = new FormData(form);\n const choices = [];\n formData.forEach((value, key) => {\n if (key === 'poll') {\n choices.push(value);\n }\n });\n if (!choices.length) return;\n setUIState('loading');\n await votePoll(choices);\n setUIState('default');\n }}\n >\n
    \n {options.map((option, i) => {\n const { title } = option;\n return (\n
    \n \n
    \n );\n })}\n
    \n {!readOnly && (\n \n Vote\n \n )}\n \n )}\n

    \n {!expired && !readOnly && (\n {\n e.preventDefault();\n setUIState('loading');\n\n (async () => {\n await refresh();\n setUIState('default');\n })();\n }}\n title={t`Refresh`}\n >\n \n \n )}\n {!voted && !expired && !readOnly && optionsHaveVoteCounts && (\n {\n e.preventDefault();\n setShowResults(!showResults);\n }}\n title={showResults ? t`Hide results` : t`Show results`}\n >\n {' '}\n \n )}\n {!expired && !readOnly && ' '}\n \n {shortenNumber(votesCount)} vote\n \n }\n other={\n \n {shortenNumber(votesCount)} votes\n \n }\n />\n {!!votersCount && votersCount !== votesCount && (\n <>\n {' '}\n •{' '}\n \n {shortenNumber(votersCount)}{' '}\n voter\n \n }\n other={\n \n {shortenNumber(votersCount)}{' '}\n voters\n \n }\n />\n \n )}{' '}\n •{' '}\n {expired ? (\n !!expiresAtDate ? (\n \n Ended \n \n ) : (\n t`Ended`\n )\n ) : !!expiresAtDate ? (\n \n Ending \n \n ) : (\n t`Ending`\n )}\n

    \n \n );\n}\n","import { createContext } from 'preact';\n\nconst FilterContext = createContext();\nexport default FilterContext;\n","import mem from './mem';\nimport { getCurrentAccountID } from './store-utils';\n\nfunction _isFiltered(filtered, filterContext) {\n if (!filtered?.length) return false;\n const appliedFilters = filtered.filter((f) => {\n const { filter } = f;\n const hasContext = filter.context.includes(filterContext);\n if (!hasContext) return false;\n if (!filter.expiresAt) return hasContext;\n return new Date(filter.expiresAt) > new Date();\n });\n if (!appliedFilters.length) return false;\n const isHidden = appliedFilters.some((f) => f.filter.filterAction === 'hide');\n if (isHidden)\n return {\n action: 'hide',\n };\n const isWarn = appliedFilters.some((f) => f.filter.filterAction === 'warn');\n if (isWarn) {\n const filterTitles = appliedFilters.map((f) => f.filter.title);\n return {\n action: 'warn',\n titles: filterTitles,\n titlesStr: filterTitles.join(' • '),\n };\n }\n return false;\n}\nexport const isFiltered = mem(_isFiltered);\n\nexport function filteredItem(item, filterContext, currentAccountID) {\n const { filtered } = item;\n if (!filtered?.length) return true;\n const isSelf = currentAccountID && item.account?.id === currentAccountID;\n if (isSelf) return true;\n const filterState = isFiltered(filtered, filterContext);\n if (!filterState) return true;\n if (filterState.action === 'hide') return false;\n // item._filtered = filterState;\n return true;\n}\nexport function filteredItems(items, filterContext) {\n if (!items?.length) return [];\n if (!filterContext) return items;\n const currentAccountID = getCurrentAccountID();\n return items.filter((item) =>\n filteredItem(item, filterContext, currentAccountID),\n );\n}\n","const div = document.createElement('div');\nexport default function htmlContentLength(html) {\n if (!html) return 0;\n div.innerHTML = html;\n // .invisible spans for links\n // e.g. https://mastodon.social\n div.querySelectorAll('.invisible').forEach((el) => {\n el.remove();\n });\n return div.innerText.length;\n}\n","export const supportsTTS = 'speechSynthesis' in window;\n\nexport function speak(text, lang) {\n if (!supportsTTS) return;\n try {\n if (speechSynthesis.speaking) {\n speechSynthesis.cancel();\n }\n const utterance = new SpeechSynthesisUtterance(text);\n if (lang) utterance.lang = lang;\n speechSynthesis.speak(utterance);\n } catch (e) {\n alert(e);\n }\n}\n","import getHTMLText from './getHTMLText';\n\nfunction statusPeek(status) {\n const { spoilerText, content, poll, mediaAttachments } = status;\n let text = '';\n if (spoilerText?.trim()) {\n text += spoilerText;\n } else {\n text += getHTMLText(content);\n }\n text = text.trim();\n if (poll?.options?.length) {\n text += `\\n\\n📊:\\n${poll.options\n .map((o) => `${poll.multiple ? '▪️' : '•'} ${o.title}`)\n .join('\\n')}`;\n }\n if (mediaAttachments?.length) {\n text +=\n ' ' +\n mediaAttachments\n .map(\n (m) =>\n ({\n image: '🖼️',\n gifv: '🎞️',\n video: '📹',\n audio: '🎵',\n unknown: '',\n }[m.type] || ''),\n )\n .join('');\n }\n return text;\n}\n\nexport default statusPeek;\n","import{useRef as r,useEffect as n,useMemo as t,useReducer as e,useCallback as u}from\"react\";function c(e,u,c){var i=this,a=r(null),o=r(0),f=r(null),l=r([]),v=r(),m=r(),d=r(e),g=r(!0);d.current=e;var p=\"undefined\"!=typeof window,w=!u&&0!==u&&p;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var s=!!(c=c||{}).leading,x=!(\"trailing\"in c)||!!c.trailing,h=\"maxWait\"in c,y=\"debounceOnServer\"in c&&!!c.debounceOnServer,F=h?Math.max(+c.maxWait||0,u):null;n(function(){return g.current=!0,function(){g.current=!1}},[]);var A=t(function(){var r=function(r){var n=l.current,t=v.current;return l.current=v.current=null,o.current=r,m.current=d.current.apply(t,n)},n=function(r,n){w&&cancelAnimationFrame(f.current),f.current=w?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!g.current)return!1;var n=r-a.current;return!a.current||n>=u||n<0||h&&r-o.current>=F},e=function(n){return f.current=null,x&&l.current?r(n):(l.current=v.current=null,m.current)},c=function r(){var c=Date.now();if(t(c))return e(c);if(g.current){var i=u-(c-a.current),f=h?Math.min(i,F-(c-o.current)):i;n(r,f)}},A=function(){if(p||y){var e=Date.now(),d=t(e);if(l.current=[].slice.call(arguments),v.current=i,a.current=e,d){if(!f.current&&g.current)return o.current=a.current,n(c,u),s?r(a.current):m.current;if(h)return n(c,u),r(a.current)}return f.current||n(c,u),m.current}};return A.cancel=function(){f.current&&(w?cancelAnimationFrame(f.current):clearTimeout(f.current)),o.current=0,l.current=a.current=v.current=f.current=null},A.isPending=function(){return!!f.current},A.flush=function(){return f.current?e(Date.now()):m.current},A},[s,h,u,F,x,w,p,y]);return A}function i(r,n){return r===n}function a(r,n){return n}function o(n,t,o){var f=o&&o.equalityFn||i,l=e(a,n),v=l[0],m=l[1],d=c(u(function(r){return m(r)},[m]),t,o),g=r(n);return f(g.current,n)||(d(n),g.current=n),f(v,n)&&d.cancel(),[v,d]}function f(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i})}export{o as useDebounce,c as useDebouncedCallback,f as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import { useRef, useEffect, useCallback, useState, useMemo } from 'react';\n\n// This could've been more streamlined with internal state instead of abusing\n// refs to such extent, but then composing hooks and components could not opt out of unnecessary renders.\nfunction useResolvedElement(subscriber, refOrElement) {\n var lastReportRef = useRef(null);\n var refOrElementRef = useRef(null);\n refOrElementRef.current = refOrElement;\n var cbElementRef = useRef(null); // Calling re-evaluation after each render without using a dep array,\n // as the ref object's current value could've changed since the last render.\n\n useEffect(function () {\n evaluateSubscription();\n });\n var evaluateSubscription = useCallback(function () {\n var cbElement = cbElementRef.current;\n var refOrElement = refOrElementRef.current; // Ugly ternary. But smaller than an if-else block.\n\n var element = cbElement ? cbElement : refOrElement ? refOrElement instanceof Element ? refOrElement : refOrElement.current : null;\n\n if (lastReportRef.current && lastReportRef.current.element === element && lastReportRef.current.subscriber === subscriber) {\n return;\n }\n\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n }\n\n lastReportRef.current = {\n element: element,\n subscriber: subscriber,\n // Only calling the subscriber, if there's an actual element to report.\n // Setting cleanup to undefined unless a subscriber returns one, as an existing cleanup function would've been just called.\n cleanup: element ? subscriber(element) : undefined\n };\n }, [subscriber]); // making sure we call the cleanup function on unmount\n\n useEffect(function () {\n return function () {\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n lastReportRef.current = null;\n }\n };\n }, []);\n return useCallback(function (element) {\n cbElementRef.current = element;\n evaluateSubscription();\n }, [evaluateSubscription]);\n}\n\n// We're only using the first element of the size sequences, until future versions of the spec solidify on how\n// exactly it'll be used for fragments in multi-column scenarios:\n// From the spec:\n// > The box size properties are exposed as FrozenArray in order to support elements that have multiple fragments,\n// > which occur in multi-column scenarios. However the current definitions of content rect and border box do not\n// > mention how those boxes are affected by multi-column layout. In this spec, there will only be a single\n// > ResizeObserverSize returned in the FrozenArray, which will correspond to the dimensions of the first column.\n// > A future version of this spec will extend the returned FrozenArray to contain the per-fragment size information.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface)\n//\n// Also, testing these new box options revealed that in both Chrome and FF everything is returned in the callback,\n// regardless of the \"box\" option.\n// The spec states the following on this:\n// > This does not have any impact on which box dimensions are returned to the defined callback when the event\n// > is fired, it solely defines which box the author wishes to observe layout changes on.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// I'm not exactly clear on what this means, especially when you consider a later section stating the following:\n// > This section is non-normative. An author may desire to observe more than one CSS box.\n// > In this case, author will need to use multiple ResizeObservers.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// Which is clearly not how current browser implementations behave, and seems to contradict the previous quote.\n// For this reason I decided to only return the requested size,\n// even though it seems we have access to results for all box types.\n// This also means that we get to keep the current api, being able to return a simple { width, height } pair,\n// regardless of box option.\nfunction extractSize(entry, boxProp, sizeType) {\n if (!entry[boxProp]) {\n if (boxProp === \"contentBoxSize\") {\n // The dimensions in `contentBoxSize` and `contentRect` are equivalent according to the spec.\n // See the 6th step in the description for the RO algorithm:\n // https://drafts.csswg.org/resize-observer/#create-and-populate-resizeobserverentry-h\n // > Set this.contentRect to logical this.contentBoxSize given target and observedBox of \"content-box\".\n // In real browser implementations of course these objects differ, but the width/height values should be equivalent.\n return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n }\n\n return undefined;\n } // A couple bytes smaller than calling Array.isArray() and just as effective here.\n\n\n return entry[boxProp][0] ? entry[boxProp][0][sizeType] : // TS complains about this, because the RO entry type follows the spec and does not reflect Firefox's current\n // behaviour of returning objects instead of arrays for `borderBoxSize` and `contentBoxSize`.\n // @ts-ignore\n entry[boxProp][sizeType];\n}\n\nfunction useResizeObserver(opts) {\n if (opts === void 0) {\n opts = {};\n }\n\n // Saving the callback as a ref. With this, I don't need to put onResize in the\n // effect dep array, and just passing in an anonymous function without memoising\n // will not reinstantiate the hook's ResizeObserver.\n var onResize = opts.onResize;\n var onResizeRef = useRef(undefined);\n onResizeRef.current = onResize;\n var round = opts.round || Math.round; // Using a single instance throughout the hook's lifetime\n\n var resizeObserverRef = useRef();\n\n var _useState = useState({\n width: undefined,\n height: undefined\n }),\n size = _useState[0],\n setSize = _useState[1]; // In certain edge cases the RO might want to report a size change just after\n // the component unmounted.\n\n\n var didUnmount = useRef(false);\n useEffect(function () {\n didUnmount.current = false;\n return function () {\n didUnmount.current = true;\n };\n }, []); // Using a ref to track the previous width / height to avoid unnecessary renders.\n\n var previous = useRef({\n width: undefined,\n height: undefined\n }); // This block is kinda like a useEffect, only it's called whenever a new\n // element could be resolved based on the ref option. It also has a cleanup\n // function.\n\n var refCallback = useResolvedElement(useCallback(function (element) {\n // We only use a single Resize Observer instance, and we're instantiating it on demand, only once there's something to observe.\n // This instance is also recreated when the `box` option changes, so that a new observation is fired if there was a previously observed element with a different box option.\n if (!resizeObserverRef.current || resizeObserverRef.current.box !== opts.box || resizeObserverRef.current.round !== round) {\n resizeObserverRef.current = {\n box: opts.box,\n round: round,\n instance: new ResizeObserver(function (entries) {\n var entry = entries[0];\n var boxProp = opts.box === \"border-box\" ? \"borderBoxSize\" : opts.box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n var reportedWidth = extractSize(entry, boxProp, \"inlineSize\");\n var reportedHeight = extractSize(entry, boxProp, \"blockSize\");\n var newWidth = reportedWidth ? round(reportedWidth) : undefined;\n var newHeight = reportedHeight ? round(reportedHeight) : undefined;\n\n if (previous.current.width !== newWidth || previous.current.height !== newHeight) {\n var newSize = {\n width: newWidth,\n height: newHeight\n };\n previous.current.width = newWidth;\n previous.current.height = newHeight;\n\n if (onResizeRef.current) {\n onResizeRef.current(newSize);\n } else {\n if (!didUnmount.current) {\n setSize(newSize);\n }\n }\n }\n })\n };\n }\n\n resizeObserverRef.current.instance.observe(element, {\n box: opts.box\n });\n return function () {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.instance.unobserve(element);\n }\n };\n }, [opts.box, round]), opts.ref);\n return useMemo(function () {\n return {\n ref: refCallback,\n width: size.width,\n height: size.height\n };\n }, [refCallback, size.width, size.height]);\n}\n\nexport { useResizeObserver as default };\n","import { useRef } from 'preact/hooks';\nimport { useThrottledCallback } from 'use-debounce';\nimport useResizeObserver from 'use-resize-observer';\n\nexport default function useTruncated({ className = 'truncated' } = {}) {\n const ref = useRef();\n const onResize = useThrottledCallback(({ height }) => {\n if (ref.current) {\n const { scrollHeight } = ref.current;\n let truncated = scrollHeight > height;\n if (truncated) {\n const { height: _height, maxHeight } = getComputedStyle(ref.current);\n const computedHeight = parseInt(maxHeight || _height, 10);\n truncated = scrollHeight > computedHeight;\n }\n ref.current.classList.toggle(className, truncated);\n }\n }, 300);\n useResizeObserver({\n ref,\n box: 'border-box',\n onResize,\n });\n return ref;\n}\n","export default {\n public: 'earth',\n unlisted: 'group',\n private: 'lock',\n direct: 'message',\n local: 'building',\n};\n","export var styleRoot = 'kvfysmfp';\nexport var styleChild = 'ufhsfnkm';\nexport var styles = \".\".concat(styleRoot, \"{overflow:hidden;touch-action:none}.\").concat(styleChild, \"{transform-origin: 0 0}\");\n","var isSsr = typeof window === 'undefined';\nexport var isTouch = function () {\n return !isSsr && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};\nexport var make2dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale(\".concat(scale, \") translate(\").concat(x, \"px, \").concat(y, \"px)\");\n};\nexport var make3dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale3d(\".concat(scale, \",\").concat(scale, \", 1) translate3d(\").concat(x, \"px, \").concat(y, \"px, 0)\");\n};\nexport var hasTranslate3DSupport = function () {\n var css = !isSsr && window.CSS;\n return css && css.supports && css.supports('transform', 'translate3d(0,0,0)');\n};\n","var min = Math.min, max = Math.max;\nexport function getOffsetBounds(_a) {\n var containerDimension = _a.containerDimension, childDimension = _a.childDimension, padding = _a.padding, centerContained = _a.centerContained;\n var diff = childDimension - containerDimension;\n if (diff + 2 * padding <= 0 && centerContained) {\n return [diff / 2, diff / 2];\n }\n else {\n return [min(diff + padding, 0) - padding, max(0, diff + padding)];\n }\n}\n","import { __assign, __extends } from \"tslib\";\nimport React, { Component, createRef, Children, cloneElement } from 'react';\nimport { styleRoot, styleChild, styles } from './styles.css';\nimport { isTouch } from '../utils';\nimport { getOffsetBounds } from './getOffsetBounds';\nvar classnames = function (base, other) {\n return other ? \"\".concat(base, \" \").concat(other) : base;\n};\nvar abs = Math.abs, min = Math.min, sqrt = Math.sqrt;\nvar isSsr = typeof window === 'undefined';\nvar isMac = isSsr ? false : /(Mac)/i.test(navigator.platform);\nvar isDragInteraction = function (i) { return i === 'drag'; };\nvar isZoomInteraction = function (i) { return i === 'zoom'; };\nvar isZoomGesture = function (wheelEvent) { return isMac && wheelEvent.ctrlKey; };\nvar cancelEvent = function (event) {\n event.stopPropagation();\n event.preventDefault();\n};\nvar getDistance = function (a, b) {\n var x = a.x - b.x;\n var y = a.y - b.y;\n return sqrt(x * x + y * y);\n};\nvar calculateScale = function (startTouches, endTouches) {\n var startDistance = getDistance(startTouches[0], startTouches[1]);\n var endDistance = getDistance(endTouches[0], endTouches[1]);\n return endDistance / startDistance;\n};\nvar isCloseTo = function (value, expected) {\n return value > expected - 0.01 && value < expected + 0.01;\n};\nvar swing = function (p) { return -Math.cos(p * Math.PI) / 2 + 0.5; };\nvar getPointByPageCoordinates = function (touch) { return ({\n x: touch.pageX,\n y: touch.pageY,\n}); };\nvar getPageCoordinatesByTouches = function (touches) {\n return Array.from(touches).map(getPointByPageCoordinates);\n};\nvar sum = function (a, b) { return a + b; };\nvar getVectorAvg = function (vectors) { return ({\n x: vectors.map(function (_a) {\n var x = _a.x;\n return x;\n }).reduce(sum, 0) / vectors.length,\n y: vectors.map(function (_a) {\n var y = _a.y;\n return y;\n }).reduce(sum, 0) / vectors.length,\n}); };\nvar clamp = function (min, max, value) {\n return value < min ? min : value > max ? max : value;\n};\nvar shouldInterceptWheel = function (event) {\n return !(event.ctrlKey || event.metaKey);\n};\nvar getElementSize = function (element) {\n if (element) {\n var offsetWidth = element.offsetWidth, offsetHeight = element.offsetHeight;\n // Any DOMElement\n if (offsetWidth && offsetHeight) {\n return { width: offsetWidth, height: offsetHeight };\n }\n // Svg support\n var style = getComputedStyle(element);\n var width = parseFloat(style.width);\n var height = parseFloat(style.height);\n if (height && width) {\n return { width: width, height: height };\n }\n }\n return { width: 0, height: 0 };\n};\nvar calculateVelocity = function (startPoint, endPoint) { return ({\n x: endPoint.x - startPoint.x,\n y: endPoint.y - startPoint.y,\n}); };\nvar comparePoints = function (p1, p2) { return p1.x === p2.x && p1.y === p2.y; };\nvar noup = function () { };\nvar zeroPoint = { x: 0, y: 0 };\nvar PinchZoom = /** @class */ (function (_super) {\n __extends(PinchZoom, _super);\n function PinchZoom() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this._prevDragMovePoint = null;\n _this._containerObserver = null;\n _this._fingers = 0;\n _this._firstMove = true;\n _this._initialOffset = __assign({}, zeroPoint);\n _this._interaction = null;\n _this._isDoubleTap = false;\n _this._isOffsetsSet = false;\n _this._lastDragPosition = null;\n _this._lastScale = 1;\n _this._lastTouchStart = 0;\n _this._lastZoomCenter = null;\n _this._listenMouseMove = false;\n _this._nthZoom = 0;\n _this._offset = __assign({}, zeroPoint);\n _this._startOffset = __assign({}, zeroPoint);\n _this._startTouches = null;\n _this._updatePlaned = false;\n _this._wheelTimeOut = null;\n _this._zoomFactor = 1;\n _this._initialZoomFactor = 1;\n _this._draggingPoint = __assign({}, zeroPoint);\n // It help reduce behavior difference between touch and mouse events\n _this._ignoreNextClick = false;\n // @ts-ignore\n _this._containerRef = createRef();\n _this._handleClick = function (clickEvent) {\n if (_this._ignoreNextClick) {\n _this._ignoreNextClick = false;\n clickEvent.stopPropagation();\n }\n };\n _this._onResize = function () {\n var _a;\n if ((_a = _this._containerRef) === null || _a === void 0 ? void 0 : _a.current) {\n _this._updateInitialZoomFactor();\n _this._setupOffsets();\n _this._update();\n }\n };\n _this._handlerOnTouchEnd = _this._handlerIfEnable(function (touchEndEvent) {\n _this._fingers = touchEndEvent.touches.length;\n if (_this.props.shouldCancelHandledTouchEndEvents &&\n (isZoomInteraction(_this._interaction) ||\n (isDragInteraction(_this._interaction) &&\n (_this._startOffset.x !== _this._offset.x ||\n _this._startOffset.y !== _this._offset.y)))) {\n cancelEvent(touchEndEvent);\n }\n if (isDragInteraction(_this._interaction) && !_this._enoughToDrag()) {\n _this._handleClick(touchEndEvent);\n }\n _this._updateInteraction(touchEndEvent);\n });\n _this._handlerOnTouchStart = _this._handlerIfEnable(function (touchStartEvent) {\n _this._firstMove = true;\n _this._fingers = touchStartEvent.touches.length;\n _this._detectDoubleTap(touchStartEvent);\n });\n _this._handlerOnTouchMove = _this._handlerIfEnable(function (touchMoveEvent) {\n if (_this._isDoubleTap) {\n return;\n }\n _this._collectInertia(touchMoveEvent);\n if (_this._firstMove) {\n _this._updateInteraction(touchMoveEvent);\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n }\n _this._startOffset = __assign({}, _this._offset);\n _this._startTouches = getPageCoordinatesByTouches(touchMoveEvent.touches);\n }\n else {\n if (isZoomInteraction(_this._interaction)) {\n if (_this._startTouches &&\n _this._startTouches.length === 2 &&\n touchMoveEvent.touches.length === 2) {\n _this._handleZoom(touchMoveEvent, calculateScale(_this._startTouches, getPageCoordinatesByTouches(touchMoveEvent.touches)));\n }\n }\n else if (isDragInteraction(_this._interaction)) {\n _this._handleDrag(touchMoveEvent);\n }\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n _this._update();\n }\n }\n _this._firstMove = false;\n });\n _this._handlerWheel = function (wheelEvent) {\n if (_this.props.shouldInterceptWheel(wheelEvent)) {\n return;\n }\n cancelEvent(wheelEvent);\n var pageX = wheelEvent.pageX, pageY = wheelEvent.pageY, deltaY = wheelEvent.deltaY, deltaMode = wheelEvent.deltaMode;\n var scaleDelta = 1;\n if (isZoomGesture(wheelEvent) || deltaMode === 1) {\n scaleDelta = 15;\n }\n var likeTouchEvent = {\n touches: [\n // @ts-ignore\n { pageX: pageX, pageY: pageY },\n ],\n };\n var center = _this._getOffsetByFirstTouch(likeTouchEvent);\n var dScale = deltaY * scaleDelta;\n _this._stopAnimation();\n _this._scaleTo(_this._zoomFactor - dScale / _this.props.wheelScaleFactor, center);\n _this._update();\n clearTimeout(\n // @ts-ignore\n _this._wheelTimeOut);\n _this._wheelTimeOut = setTimeout(function () { return _this._sanitize(); }, 100);\n };\n // @ts-ignore\n _this._handlers = _this.props.isTouch()\n ? [\n ['touchstart', _this._handlerOnTouchStart],\n ['touchend', _this._handlerOnTouchEnd],\n ['touchmove', _this._handlerOnTouchMove],\n ]\n : [\n [\n 'mousemove',\n _this.simulate(_this._handlerOnTouchMove),\n _this.props._document,\n ],\n [\n 'mouseup',\n _this.simulate(_this._handlerOnTouchEnd),\n _this.props._document,\n ],\n ['mousedown', _this.simulate(_this._handlerOnTouchStart)],\n ['click', _this._handleClick],\n ['wheel', _this._handlerWheel],\n ];\n return _this;\n }\n PinchZoom.prototype._handleDragStart = function (event) {\n this._ignoreNextClick = true;\n this.props.onDragStart();\n this._stopAnimation();\n this._resetInertia();\n this._lastDragPosition = null;\n this._hasInteraction = true;\n this._draggingPoint = this._offset;\n this._handleDrag(event);\n };\n PinchZoom.prototype._handleDrag = function (event) {\n var touch = this._getOffsetByFirstTouch(event);\n if (this._enoughToDrag()) {\n this._drag(touch, this._lastDragPosition);\n }\n else {\n this._virtualDrag(touch, this._lastDragPosition);\n }\n this._offset = this._sanitizeOffset(this._offset);\n this._lastDragPosition = touch;\n };\n PinchZoom.prototype._resetInertia = function () {\n this._velocity = null;\n this._prevDragMovePoint = null;\n };\n PinchZoom.prototype._realizeInertia = function () {\n var _this = this;\n var _a = this.props, inertiaFriction = _a.inertiaFriction, inertia = _a.inertia;\n if (!inertia || !this._velocity) {\n return;\n }\n var _b = this._velocity, x = _b.x, y = _b.y;\n if (x || y) {\n this._stopAnimation();\n this._resetInertia();\n var renderFrame = function () {\n x *= inertiaFriction;\n y *= inertiaFriction;\n if (!x && !y) {\n return _this._stopAnimation();\n }\n var prevOffset = __assign({}, _this._offset);\n _this._addOffset({ x: x, y: y });\n _this._offset = _this._sanitizeOffset(_this._offset);\n if (comparePoints(prevOffset, _this._offset)) {\n return _this._stopAnimation();\n }\n _this._update({ isAnimation: true });\n };\n this._animate(renderFrame, { duration: 9999 });\n }\n };\n PinchZoom.prototype._collectInertia = function (_a) {\n var touches = _a.touches;\n if (!this.props.inertia) {\n return;\n }\n var currentCoordinates = getPageCoordinatesByTouches(touches)[0];\n var prevPoint = this._prevDragMovePoint;\n if (prevPoint) {\n this._velocity = calculateVelocity(currentCoordinates, prevPoint);\n }\n this._prevDragMovePoint = currentCoordinates;\n };\n PinchZoom.prototype._handleDragEnd = function () {\n this.props.onDragEnd();\n this._end();\n this._realizeInertia();\n };\n PinchZoom.prototype._handleZoomStart = function () {\n this.props.onZoomStart();\n this._stopAnimation();\n this._lastScale = 1;\n this._nthZoom = 0;\n this._lastZoomCenter = null;\n this._hasInteraction = true;\n };\n PinchZoom.prototype._handleZoom = function (event, newScale) {\n var touchCenter = getVectorAvg(this._getOffsetTouches(event));\n var scale = newScale / this._lastScale;\n this._lastScale = newScale;\n // The first touch events are thrown away since they are not precise\n this._nthZoom += 1;\n if (this._nthZoom > 3) {\n this._scale(scale, touchCenter);\n this._drag(touchCenter, this._lastZoomCenter);\n if (this.props.enforceBoundsDuringZoom) {\n this._offset = this._sanitizeOffset(this._offset);\n }\n }\n this._lastZoomCenter = touchCenter;\n };\n PinchZoom.prototype._handleZoomEnd = function () {\n this.props.onZoomEnd();\n this._end();\n };\n PinchZoom.prototype._handleDoubleTap = function (event) {\n var _this = this;\n if (this._hasInteraction || this.props.tapZoomFactor === 0) {\n return;\n }\n var needZoomOut = (this.props.doubleTapZoomOutOnMaxScale &&\n this._zoomFactor === this.props.maxZoom) ||\n (this.props.doubleTapToggleZoom && this._zoomFactor > 1);\n this.props.onDoubleTap();\n this._ignoreNextClick = true;\n var zoomFactor = this._zoomFactor + this.props.tapZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var updateProgress = function (progress) {\n _this._scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center);\n };\n var center = this._getOffsetByFirstTouch(event);\n this._isDoubleTap = true;\n if (startZoomFactor > zoomFactor) {\n center = this._getCurrentZoomCenter();\n }\n needZoomOut ? this._zoomOutAnimation() : this._animate(updateProgress);\n };\n PinchZoom.prototype._computeInitialOffset = function () {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var x = -abs(width * this._getInitialZoomFactor() - rect.width) / 2;\n var y = -abs(height * this._getInitialZoomFactor() - rect.height) / 2;\n this._initialOffset = { x: x, y: y };\n };\n PinchZoom.prototype._resetOffset = function () {\n this._offset = __assign({}, this._initialOffset);\n };\n PinchZoom.prototype._setupOffsets = function () {\n if (this.props.setOffsetsOnce && this._isOffsetsSet) {\n return;\n }\n this._isOffsetsSet = true;\n this._computeInitialOffset();\n this._resetOffset();\n };\n PinchZoom.prototype._sanitizeOffset = function (offset) {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var elWidth = width * this._getInitialZoomFactor() * this._zoomFactor;\n var elHeight = height * this._getInitialZoomFactor() * this._zoomFactor;\n var _b = getOffsetBounds({\n containerDimension: rect.width,\n childDimension: elWidth,\n padding: this.props.horizontalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetX = _b[0], maxOffsetX = _b[1];\n var _c = getOffsetBounds({\n containerDimension: rect.height,\n childDimension: elHeight,\n padding: this.props.verticalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetY = _c[0], maxOffsetY = _c[1];\n return {\n x: clamp(minOffsetX, maxOffsetX, offset.x),\n y: clamp(minOffsetY, maxOffsetY, offset.y),\n };\n };\n PinchZoom.prototype.alignCenter = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), __x = _a.x, __y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n // Bug-Fix: https://github.com/retyui/react-quick-pinch-zoom/issues/58\n var x = __x * this._initialZoomFactor;\n var y = __y * this._initialZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n var rect = this._getContainerRect();\n var containerCenter = { x: rect.width / 2, y: rect.height / 2 };\n this._zoomFactor = 1;\n this._offset = { x: -(containerCenter.x - x), y: -(containerCenter.y - y) };\n this._scaleTo(scale, containerCenter);\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = _this._sanitizeOffset({ x: x, y: y });\n _this._update();\n };\n this._animate(updateFrame, {\n callback: function () { return _this._sanitize(); },\n duration: duration,\n });\n };\n PinchZoom.prototype.scaleTo = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), x = _a.x, y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n this._zoomFactor = 1;\n this._offset = { x: 0, y: 0 };\n this._scaleTo(scale, { x: x, y: y });\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateFrame, { callback: function () { return _this._sanitize(); }, duration: duration });\n };\n PinchZoom.prototype._scaleTo = function (zoomFactor, center) {\n this._scale(zoomFactor / this._zoomFactor, center);\n this._offset = this._sanitizeOffset(this._offset);\n };\n PinchZoom.prototype._scale = function (scale, center) {\n scale = this._scaleZoomFactor(scale);\n this._addOffset({\n x: (scale - 1) * (center.x + this._offset.x),\n y: (scale - 1) * (center.y + this._offset.y),\n });\n this.props.onZoomUpdate();\n };\n PinchZoom.prototype._scaleZoomFactor = function (scale) {\n var originalZoomFactor = this._zoomFactor;\n this._zoomFactor *= scale;\n this._zoomFactor = clamp(this.props.minZoom, this.props.maxZoom, this._zoomFactor);\n return this._zoomFactor / originalZoomFactor;\n };\n PinchZoom.prototype._canDrag = function () {\n return this.props.draggableUnZoomed || !isCloseTo(this._zoomFactor, 1);\n };\n PinchZoom.prototype._drag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n if (!this.props.lockDragAxis) {\n this._addOffset({\n x: x,\n y: y,\n });\n }\n else {\n // lock scroll to position that was changed the most\n if (abs(x) > abs(y)) {\n this._addOffset({\n x: x,\n y: 0,\n });\n }\n else {\n this._addOffset({\n y: y,\n x: 0,\n });\n }\n }\n this.props.onDragUpdate();\n }\n };\n PinchZoom.prototype._virtualDrag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n this._draggingPoint = {\n x: x + this._draggingPoint.x,\n y: y + this._draggingPoint.y,\n };\n }\n };\n PinchZoom.prototype._addOffset = function (offset) {\n var _a = this._offset, x = _a.x, y = _a.y;\n this._offset = {\n x: x + offset.x,\n y: y + offset.y,\n };\n };\n PinchZoom.prototype._sanitize = function () {\n if (this._zoomFactor < this.props.zoomOutFactor) {\n this._resetInertia();\n this._zoomOutAnimation();\n }\n else if (this._isInsaneOffset()) {\n this._sanitizeOffsetAnimation();\n }\n };\n PinchZoom.prototype._isInsaneOffset = function () {\n var offset = this._offset;\n var sanitizedOffset = this._sanitizeOffset(offset);\n return sanitizedOffset.x !== offset.x || sanitizedOffset.y !== offset.y;\n };\n PinchZoom.prototype._sanitizeOffsetAnimation = function () {\n var _this = this;\n var targetOffset = this._sanitizeOffset(this._offset);\n var startOffset = __assign({}, this._offset);\n var updateProgress = function (progress) {\n var x = startOffset.x + progress * (targetOffset.x - startOffset.x);\n var y = startOffset.y + progress * (targetOffset.y - startOffset.y);\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._zoomOutAnimation = function () {\n var _this = this;\n if (this._zoomFactor === 1) {\n return;\n }\n var startZoomFactor = this._zoomFactor;\n var zoomFactor = 1;\n var center = this._getCurrentZoomCenter();\n var updateProgress = function (progress) {\n var scaleFactor = startZoomFactor + progress * (zoomFactor - startZoomFactor);\n _this._scaleTo(scaleFactor, center);\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._getInitialZoomFactor = function () {\n return this._initialZoomFactor;\n };\n PinchZoom.prototype._getCurrentZoomCenter = function () {\n var _a = this._offset, x = _a.x, y = _a.y;\n var offsetLeft = x - this._initialOffset.x;\n var offsetTop = y - this._initialOffset.y;\n return {\n x: -1 * x - offsetLeft / (1 / this._zoomFactor - 1),\n y: -1 * y - offsetTop / (1 / this._zoomFactor - 1),\n };\n };\n PinchZoom.prototype._getOffsetByFirstTouch = function (event) {\n return this._getOffsetTouches(event)[0];\n };\n PinchZoom.prototype._getOffsetTouches = function (event) {\n var _document = this.props._document;\n var _html = _document.documentElement;\n var _body = _document.body;\n var _a = this._getContainerRect(), top = _a.top, left = _a.left;\n var scrollTop = _html.scrollTop || _body.scrollTop;\n var scrollLeft = _html.scrollLeft || _body.scrollLeft;\n var posTop = top + scrollTop;\n var posLeft = left + scrollLeft;\n return getPageCoordinatesByTouches(event.touches).map(function (_a) {\n var x = _a.x, y = _a.y;\n return ({\n x: x - posLeft,\n y: y - posTop,\n });\n });\n };\n PinchZoom.prototype._animate = function (frameFn, options) {\n var _this = this;\n var startTime = new Date().getTime();\n var _a = __assign({ timeFn: swing, callback: function () { }, duration: this.props.animationDuration }, options), timeFn = _a.timeFn, callback = _a.callback, duration = _a.duration;\n var renderFrame = function () {\n if (!_this._inAnimation) {\n return;\n }\n var frameTime = new Date().getTime() - startTime;\n var progress = frameTime / duration;\n if (frameTime >= duration) {\n frameFn(1);\n _this._stopAnimation();\n callback();\n _this._update();\n }\n else {\n progress = timeFn(progress);\n frameFn(progress);\n _this._update({ isAnimation: true });\n requestAnimationFrame(renderFrame);\n }\n };\n this._inAnimation = true;\n requestAnimationFrame(renderFrame);\n };\n PinchZoom.prototype._stopAnimation = function () {\n this._inAnimation = false;\n };\n PinchZoom.prototype._end = function () {\n this._hasInteraction = false;\n this._sanitize();\n this._update();\n };\n PinchZoom.prototype._getContainerRect = function () {\n var div = this._containerRef.current;\n return div.getBoundingClientRect();\n };\n PinchZoom.prototype._getChildSize = function () {\n var div = this._containerRef.current;\n return getElementSize(div === null || div === void 0 ? void 0 : div.firstElementChild);\n };\n PinchZoom.prototype._updateInitialZoomFactor = function () {\n var rect = this._getContainerRect();\n var size = this._getChildSize();\n var xZoomFactor = rect.width / size.width;\n var yZoomFactor = rect.height / size.height;\n this._initialZoomFactor = min(xZoomFactor, yZoomFactor);\n };\n PinchZoom.prototype._bindEvents = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (window.ResizeObserver) {\n this._containerObserver = new ResizeObserver(this._onResize);\n this._containerObserver.observe(div);\n }\n else {\n window.addEventListener('resize', this._onResize);\n }\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).addEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.addEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._unSubscribe = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (this._containerObserver) {\n this._containerObserver.disconnect();\n this._containerObserver = null;\n }\n window.removeEventListener('resize', this._onResize);\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).removeEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.removeEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._update = function (options) {\n var _this = this;\n if (this._updatePlaned) {\n return;\n }\n var updateFrame = function () {\n var scale = _this._getInitialZoomFactor() * _this._zoomFactor;\n var x = -_this._offset.x / scale;\n var y = -_this._offset.y / scale;\n _this.props.onUpdate({ scale: scale, x: x, y: y });\n };\n if (options === null || options === void 0 ? void 0 : options.isAnimation) {\n return updateFrame();\n }\n this._updatePlaned = true;\n requestAnimationFrame(function () {\n _this._updatePlaned = false;\n updateFrame();\n });\n };\n PinchZoom.prototype._handlerIfEnable = function (fn) {\n var _this = this;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (_this.props.enabled) {\n fn.apply(void 0, args);\n }\n };\n };\n PinchZoom.prototype._setInteraction = function (newInteraction, event) {\n var interaction = this._interaction;\n if (interaction !== newInteraction) {\n if (interaction && !newInteraction) {\n if (isZoomInteraction(interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(interaction)) {\n this._handleDragEnd();\n }\n }\n if (isZoomInteraction(newInteraction)) {\n this._handleZoomStart();\n }\n else if (isDragInteraction(newInteraction)) {\n this._handleDragStart(event);\n }\n }\n this._interaction = newInteraction;\n };\n PinchZoom.prototype._distanceBetweenNumbers = function (a, b) {\n return a > b ? a - b : b - a;\n };\n PinchZoom.prototype._enoughToDrag = function () {\n if (this._distanceBetweenNumbers(this._startOffset.x, this._draggingPoint.x) >\n 5 ||\n this._distanceBetweenNumbers(this._startOffset.y, this._draggingPoint.y) >\n 5)\n return true;\n return false;\n };\n PinchZoom.prototype._updateInteraction = function (event) {\n var fingers = this._fingers;\n if (fingers === 2) {\n return this._setInteraction('zoom', event);\n }\n if (fingers === 1 && this._canDrag()) {\n return this._setInteraction('drag', event);\n }\n this._setInteraction(null, event);\n };\n PinchZoom.prototype._detectDoubleTap = function (event) {\n var time = new Date().getTime();\n if (this._fingers > 1) {\n this._lastTouchStart = 0;\n }\n if (time - this._lastTouchStart < 300) {\n cancelEvent(event);\n this._handleDoubleTap(event);\n if (isZoomInteraction(this._interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(this._interaction)) {\n this._handleDragEnd();\n }\n }\n else {\n this._isDoubleTap = false;\n }\n if (this._fingers === 1) {\n this._lastTouchStart = time;\n }\n };\n PinchZoom.prototype.simulate = function (fn) {\n var _this = this;\n return function (mouseEvent) {\n var pageX = mouseEvent.pageX, pageY = mouseEvent.pageY, type = mouseEvent.type;\n var isEnd = type === 'mouseup';\n var isStart = type === 'mousedown';\n if (isStart) {\n mouseEvent.preventDefault();\n _this._listenMouseMove = true;\n }\n if (_this._listenMouseMove) {\n // @ts-ignore\n mouseEvent.touches = isEnd ? [] : [{ pageX: pageX, pageY: pageY }];\n fn(\n // @ts-ignore\n mouseEvent);\n }\n if (isEnd) {\n _this._listenMouseMove = false;\n }\n };\n };\n PinchZoom.prototype.componentDidMount = function () {\n this._bindEvents();\n this._update();\n };\n PinchZoom.prototype.componentWillUnmount = function () {\n this._stopAnimation();\n this._unSubscribe();\n };\n PinchZoom.prototype.render = function () {\n var _a = this.props, children = _a.children, containerProps = _a.containerProps;\n var child = Children.only(children);\n var props = containerProps || {};\n return (React.createElement(React.Fragment, null,\n React.createElement(\"style\", null, styles),\n React.createElement(\"div\", __assign({}, props, { ref: this._containerRef, className: classnames(styleRoot, props.className) }), cloneElement(child, {\n className: classnames(styleChild, child.props.className),\n }))));\n };\n PinchZoom.defaultProps = {\n animationDuration: 250,\n draggableUnZoomed: true,\n enforceBoundsDuringZoom: false,\n centerContained: false,\n enabled: true,\n inertia: true,\n inertiaFriction: 0.96,\n horizontalPadding: 0,\n isTouch: isTouch,\n lockDragAxis: false,\n maxZoom: 5,\n minZoom: 0.5,\n onDoubleTap: noup,\n onDragEnd: noup,\n onDragStart: noup,\n onDragUpdate: noup,\n onZoomEnd: noup,\n onZoomStart: noup,\n onZoomUpdate: noup,\n setOffsetsOnce: false,\n shouldInterceptWheel: shouldInterceptWheel,\n shouldCancelHandledTouchEndEvents: false,\n tapZoomFactor: 1,\n verticalPadding: 0,\n wheelScaleFactor: 1500,\n zoomOutFactor: 1.3,\n doubleTapZoomOutOnMaxScale: false,\n doubleTapToggleZoom: false,\n // @ts-expect-error\n _document: isSsr ? null : window.document,\n };\n return PinchZoom;\n}(Component));\nif (process.env.NODE_ENV !== 'production') {\n var _a = require('prop-types'), any = _a.any, element = _a.element, object = _a.object, number = _a.number, func = _a.func, bool = _a.bool;\n // @ts-ignore\n PinchZoom.propTypes = {\n children: element,\n containerProps: object,\n wheelScaleFactor: number,\n animationDuration: number,\n draggableUnZoomed: bool,\n enforceBoundsDuringZoom: bool,\n centerContained: bool,\n enabled: bool,\n horizontalPadding: number,\n lockDragAxis: bool,\n onUpdate: func.isRequired,\n maxZoom: number,\n minZoom: number,\n onDoubleTap: func,\n onDragEnd: func,\n onDragStart: func,\n onDragUpdate: func,\n onZoomEnd: func,\n onZoomStart: func,\n onZoomUpdate: func,\n setOffsetsOnce: bool,\n tapZoomFactor: number,\n verticalPadding: number,\n zoomOutFactor: number,\n doubleTapZoomOutOnMaxScale: bool,\n doubleTapToggleZoom: bool,\n isTouch: func,\n _document: any,\n };\n}\nexport default PinchZoom;\n","export default function formatDuration(time) {\n if (!time) return;\n let hours = Math.floor(time / 3600);\n let minutes = Math.floor((time % 3600) / 60);\n let seconds = Math.round(time % 60);\n\n if (hours === 0) {\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n } else {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n }\n}\n","import { t, Trans } from '@lingui/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport QuickPinchZoom, { make3dTransformValue } from 'react-quick-pinch-zoom';\n\nimport formatDuration from '../utils/format-duration';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\n/*\nMedia type\n===\nunknown = unsupported or unrecognized file type\nimage = Static image\ngifv = Looping, soundless animation\nvideo = Video clip\naudio = Audio track\n*/\n\nconst dataAltLabel = 'ALT';\nconst AltBadge = (props) => {\n const { alt, lang, index, ...rest } = props;\n if (!alt || !alt.trim()) return null;\n return (\n {\n e.stopPropagation();\n e.preventDefault();\n states.showMediaAlt = {\n alt,\n lang,\n };\n }}\n title={t`Media description`}\n >\n {dataAltLabel}\n {!!index && {index}}\n \n );\n};\n\nconst MEDIA_CAPTION_LIMIT = 140;\nconst MEDIA_CAPTION_LIMIT_LONGER = 280;\nexport const isMediaCaptionLong = mem((caption) =>\n caption?.length\n ? caption.length > MEDIA_CAPTION_LIMIT ||\n /[\\n\\r].*[\\n\\r]/.test(caption.trim())\n : false,\n);\n\nfunction Media({\n class: className = '',\n media,\n to,\n lang,\n showOriginal,\n autoAnimate,\n showCaption,\n allowLongerCaption,\n altIndex,\n onClick = () => {},\n}) {\n let {\n blurhash,\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n if (/no\\-preview\\./i.test(previewUrl)) {\n previewUrl = null;\n }\n const { original = {}, small, focus } = meta || {};\n\n const width = showOriginal\n ? original?.width\n : small?.width || original?.width;\n const height = showOriginal\n ? original?.height\n : small?.height || original?.height;\n const mediaURL = showOriginal ? url : previewUrl || url;\n const remoteMediaURL = showOriginal\n ? remoteUrl\n : previewRemoteUrl || remoteUrl;\n const hasDimensions = width && height;\n const orientation = hasDimensions\n ? width > height\n ? 'landscape'\n : 'portrait'\n : null;\n\n const rgbAverageColor = blurhash ? getBlurHashAverageColor(blurhash) : null;\n\n const videoRef = useRef();\n\n let focalPosition;\n if (focus) {\n // Convert focal point to CSS background position\n // Formula from jquery-focuspoint\n // x = -1, y = 1 => 0% 0%\n // x = 0, y = 0 => 50% 50%\n // x = 1, y = -1 => 100% 100%\n const x = ((focus.x + 1) / 2) * 100;\n const y = ((1 - focus.y) / 2) * 100;\n focalPosition = `${x.toFixed(0)}% ${y.toFixed(0)}%`;\n }\n\n const mediaRef = useRef();\n const onUpdate = useCallback(({ x, y, scale }) => {\n const { current: media } = mediaRef;\n\n if (media) {\n const value = make3dTransformValue({ x, y, scale });\n\n if (scale === 1) {\n media.style.removeProperty('transform');\n } else {\n media.style.setProperty('transform', value);\n }\n\n media.closest('.media-zoom').style.touchAction =\n scale <= 1.01 ? 'pan-x' : '';\n }\n }, []);\n\n const [pinchZoomEnabled, setPinchZoomEnabled] = useState(false);\n const quickPinchZoomProps = {\n enabled: pinchZoomEnabled,\n draggableUnZoomed: false,\n inertiaFriction: 0.9,\n tapZoomFactor: 2,\n doubleTapToggleZoom: true,\n containerProps: {\n className: 'media-zoom',\n style: {\n overflow: 'visible',\n // width: 'inherit',\n // height: 'inherit',\n // justifyContent: 'inherit',\n // alignItems: 'inherit',\n // display: 'inherit',\n },\n },\n onUpdate,\n };\n\n const Parent = useMemo(\n () => (to ? (props) => : 'div'),\n [to],\n );\n\n const remoteMediaURLObj = remoteMediaURL ? getURLObj(remoteMediaURL) : null;\n const isVideoMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(remoteMediaURLObj.pathname);\n const isAudioMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(remoteMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' && previewUrl && !isVideoMaybe && !isAudioMaybe);\n\n const parentRef = useRef();\n const [imageSmallerThanParent, setImageSmallerThanParent] = useState(false);\n useLayoutEffect(() => {\n if (!isImage) return;\n if (!showOriginal) return;\n if (!parentRef.current) return;\n const { offsetWidth, offsetHeight } = parentRef.current;\n const smaller = width < offsetWidth && height < offsetHeight;\n if (smaller) setImageSmallerThanParent(smaller);\n }, [width, height]);\n\n const maxAspectHeight =\n window.innerHeight * (orientation === 'portrait' ? 0.45 : 0.33);\n const maxHeight = orientation === 'portrait' ? 0 : 160;\n const averageColorStyle = {\n '--average-color': rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n };\n const mediaStyles =\n width && height\n ? {\n '--width': `${width}px`,\n '--height': `${height}px`,\n // Calculate '--aspectWidth' based on aspect ratio calculated from '--width' and '--height', max height has to be 160px\n '--aspectWidth': `${\n (width / height) * Math.max(maxHeight, maxAspectHeight)\n }px`,\n aspectRatio: `${width} / ${height}`,\n ...averageColorStyle,\n }\n : {\n ...averageColorStyle,\n };\n\n const longDesc = isMediaCaptionLong(description);\n let showInlineDesc =\n !!showCaption && !showOriginal && !!description && !longDesc;\n if (\n allowLongerCaption &&\n !showInlineDesc &&\n description?.length <= MEDIA_CAPTION_LIMIT_LONGER\n ) {\n showInlineDesc = true;\n }\n const Figure = !showInlineDesc\n ? Fragment\n : (props) => {\n const { children, ...restProps } = props;\n return (\n
    \n {children}\n {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: description,\n lang,\n };\n }}\n >\n {description}\n \n
    \n );\n };\n\n const [hasNaturalAspectRatio, setHasNaturalAspectRatio] = useState(undefined);\n\n if (isImage) {\n // Note: type: unknown might not have width/height\n quickPinchZoomProps.containerProps.style.display = 'inherit';\n\n useLayoutEffect(() => {\n if (!isSafari) return;\n if (!showOriginal) return;\n (async () => {\n try {\n await fetch(mediaURL, { mode: 'no-cors' });\n mediaRef.current.src = mediaURL;\n } catch (e) {\n // Ignore\n }\n })();\n }, [mediaURL]);\n\n return (\n
    \n \n {showOriginal ? (\n \n {\n e.target.closest('.media-image').style.backgroundImage = '';\n e.target.closest('.media-zoom').style.display = '';\n setPinchZoomEnabled(true);\n }}\n onError={(e) => {\n const { src } = e.target;\n if (\n src === mediaURL &&\n remoteMediaURL &&\n mediaURL !== remoteMediaURL\n ) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n \n ) : (\n <>\n {\n // e.target.closest('.media-image').style.backgroundImage = '';\n e.target.dataset.loaded = true;\n const $media = e.target.closest('.media');\n if (!hasDimensions && $media) {\n const { naturalWidth, naturalHeight } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight ? 'landscape' : 'portrait';\n $media.style.setProperty('--width', `${naturalWidth}px`);\n $media.style.setProperty('--height', `${naturalHeight}px`);\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n\n // Check natural aspect ratio vs display aspect ratio\n if ($media) {\n const {\n clientWidth,\n clientHeight,\n naturalWidth,\n naturalHeight,\n } = e.target;\n if (\n clientWidth &&\n clientHeight &&\n naturalWidth &&\n naturalHeight\n ) {\n const minDimension = 88;\n if (\n naturalWidth < minDimension ||\n naturalHeight < minDimension\n ) {\n $media.dataset.hasSmallDimension = true;\n } else {\n const displayNaturalHeight =\n (naturalHeight * clientWidth) / naturalWidth;\n const almostSimilarHeight =\n Math.abs(displayNaturalHeight - clientHeight) < 5;\n\n if (almostSimilarHeight) {\n setHasNaturalAspectRatio(true);\n }\n }\n }\n }\n }}\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL && mediaURL !== remoteMediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n {!showInlineDesc && (\n \n )}\n \n )}\n \n
    \n );\n } else if (type === 'gifv' || type === 'video' || isVideoMaybe) {\n const hasDuration = original.duration > 0;\n const shortDuration = original.duration < 31;\n const isGIF = type === 'gifv' && shortDuration;\n // If GIF is too long, treat it as a video\n const loopable = original.duration < 61;\n const formattedDuration = formatDuration(original.duration);\n const hoverAnimate = !showOriginal && !autoAnimate && isGIF;\n const autoGIFAnimate = !showOriginal && autoAnimate && isGIF;\n const showProgress = original.duration > 5;\n\n // This string is only for autoplay + muted to work on Mobile Safari\n const gifHTML = `\n \n `;\n\n const videoHTML = `\n \n `;\n\n return (\n
    \n {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n onClick(e);\n }}\n onMouseEnter={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onMouseLeave={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n onFocus={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onBlur={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n >\n {showOriginal || autoGIFAnimate ? (\n isGIF && showOriginal ? (\n \n \n \n ) : isGIF ? (\n \n ) : (\n \n )\n ) : isGIF ? (\n {\n const { target } = e;\n const container = target?.closest('.media-gif');\n if (container) {\n const percentage =\n (target.currentTime / target.duration) * 100;\n container.style.setProperty(\n '--progress',\n `${percentage}%`,\n );\n }\n }\n : undefined\n }\n />\n ) : (\n <>\n {previewUrl ? (\n {\n if (!hasDimensions) {\n const $media = e.target.closest('.media');\n if ($media) {\n const { naturalHeight, naturalWidth } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight\n ? 'landscape'\n : 'portrait';\n $media.style.setProperty(\n '--width',\n `${naturalWidth}px`,\n );\n $media.style.setProperty(\n '--height',\n `${naturalHeight}px`,\n );\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n }\n }}\n />\n ) : (\n {\n if (!hasDuration) {\n const { duration } = e.target;\n if (duration) {\n const formattedDuration = formatDuration(duration);\n const container = e.target.closest('.media-video');\n if (container) {\n container.dataset.formattedDuration =\n formattedDuration;\n }\n }\n }\n }}\n />\n )}\n
    \n \n
    \n \n )}\n {!showOriginal && !showInlineDesc && (\n \n )}\n \n
    \n );\n } else if (type === 'audio' || isAudioMaybe) {\n const formattedDuration = formatDuration(original.duration);\n return (\n
    \n \n {showOriginal ? (\n
    \n );\n }\n}\n\nfunction getURLObj(url) {\n // Fake base URL if url doesn't have https:// prefix\n return URL.parse(url, location.origin);\n}\n\nexport default memo(Media, (oldProps, newProps) => {\n const oldMedia = oldProps.media || {};\n const newMedia = newProps.media || {};\n\n return (\n oldMedia?.id === newMedia?.id &&\n oldMedia.url === newMedia.url &&\n oldProps.to === newProps.to &&\n oldProps.class === newProps.class\n );\n});\n","import './status.css';\nimport '@justinribeiro/lite-youtube';\n\nimport { msg, plural, Plural, t, Trans } from '@lingui/macro';\nimport { useLingui } from '@lingui/react';\nimport {\n ControlledMenu,\n Menu,\n MenuDivider,\n MenuHeader,\n MenuItem,\n} from '@szhsin/react-menu';\nimport { decodeBlurHash, getBlurHashAverageColor } from 'fast-blurhash';\nimport { shallowEqual } from 'fast-equals';\nimport prettify from 'html-prettify';\nimport pThrottle from 'p-throttle';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\n// import { detectAll } from 'tinyld/light';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport CustomEmoji from '../components/custom-emoji';\nimport EmojiText from '../components/emoji-text';\nimport LazyShazam from '../components/lazy-shazam';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport NameText from '../components/name-text';\nimport Poll from '../components/poll';\nimport { api } from '../utils/api';\nimport emojifyText from '../utils/emojify-text';\nimport enhanceContent from '../utils/enhance-content';\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport getHTMLText from '../utils/getHTMLText';\nimport handleContentLinks from '../utils/handle-content-links';\nimport htmlContentLength from '../utils/html-content-length';\nimport isRTL from '../utils/is-rtl';\nimport isMastodonLinkMaybe from '../utils/isMastodonLinkMaybe';\nimport localeMatch from '../utils/locale-match';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states, { getStatus, saveStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport unfurlMastodonLink from '../utils/unfurl-link';\nimport useTruncated from '../utils/useTruncated';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport Link from './link';\nimport Media, { isMediaCaptionLong } from './media';\nimport MenuLink from './menu-link';\nimport RelativeTime from './relative-time';\nimport TranslationBlock from './translation-block';\n\nconst SHOW_COMMENT_COUNT_LIMIT = 280;\nconst INLINE_TRANSLATE_LIMIT = 140;\n\nconst throttle = pThrottle({\n limit: 1,\n interval: 1000,\n});\nfunction fetchAccount(id, masto) {\n return masto.v1.accounts.$select(id).fetch();\n}\nconst memFetchAccount = pmem(throttle(fetchAccount));\n\nconst visibilityText = {\n public: msg`Public`,\n local: msg`Local`,\n unlisted: msg`Unlisted`,\n private: msg`Followers only`,\n direct: msg`Private mention`,\n};\n\nconst isIOS =\n window.ontouchstart !== undefined &&\n /iPad|iPhone|iPod/.test(navigator.userAgent);\n\nconst rtf = new Intl.RelativeTimeFormat();\n\nconst REACTIONS_LIMIT = 80;\n\nfunction getPollText(poll) {\n if (!poll?.options?.length) return '';\n return `📊:\\n${poll.options\n .map(\n (option) =>\n `- ${option.title}${\n option.votesCount >= 0 ? ` (${option.votesCount})` : ''\n }`,\n )\n .join('\\n')}`;\n}\nfunction getPostText(status) {\n const { spoilerText, content, poll } = status;\n return (\n (spoilerText ? `${spoilerText}\\n\\n` : '') +\n getHTMLText(content) +\n getPollText(poll)\n );\n}\n\nconst HTTP_REGEX = /^http/i;\nconst PostContent =\n /*memo(*/\n ({ post, instance, previewMode }) => {\n const { content, emojis, language, mentions, url } = post;\n\n const divRef = useRef();\n useLayoutEffect(() => {\n if (!divRef.current) return;\n const dom = enhanceContent(content, {\n emojis,\n returnDOM: true,\n });\n // Remove target=\"_blank\" from links\n for (const a of dom.querySelectorAll('a.u-url[target=\"_blank\"]')) {\n if (!HTTP_REGEX.test(a.innerText.trim())) {\n a.removeAttribute('target');\n }\n }\n divRef.current.replaceChildren(dom.cloneNode(true));\n }, [content, emojis.length]);\n\n return (\n {\n // // Remove target=\"_blank\" from links\n // dom.querySelectorAll('a.u-url[target=\"_blank\"]').forEach((a) => {\n // if (!/http/i.test(a.innerText.trim())) {\n // a.removeAttribute('target');\n // }\n // });\n // },\n // }),\n // }}\n />\n );\n }; /*,\n (oldProps, newProps) => {\n const { post: oldPost } = oldProps;\n const { post: newPost } = newProps;\n return oldPost.content === newPost.content;\n },\n);*/\n\nconst SIZE_CLASS = {\n s: 'small',\n m: 'medium',\n l: 'large',\n};\n\nconst detectLang = pmem(async (text) => {\n const { detectAll } = await import('tinyld/light');\n text = text?.trim();\n\n // Ref: https://github.com/komodojp/tinyld/blob/develop/docs/benchmark.md\n // 500 should be enough for now, also the default max chars for Mastodon\n if (text?.length > 500) {\n return null;\n }\n const langs = detectAll(text);\n const lang = langs[0];\n if (lang?.lang && lang?.accuracy > 0.5) {\n // If > 50% accurate, use it\n // It can be accurate if < 50% but better be safe\n // Though > 50% also can be inaccurate 🤷‍♂️\n return lang.lang;\n }\n return null;\n});\n\nconst readMoreText = msg`Read more →`;\n\n// All this work just to make sure this only lazy-run once\n// Because first run is slow due to intl-localematcher\nconst DIFFERENT_LANG_CHECK = {};\nconst checkDifferentLanguage = (\n language,\n contentTranslationHideLanguages = [],\n) => {\n if (!language) return false;\n const targetLanguage = getTranslateTargetLanguage(true);\n const different =\n language !== targetLanguage &&\n !localeMatch([language], [targetLanguage]) &&\n !contentTranslationHideLanguages.find(\n (l) => language === l || localeMatch([language], [l]),\n );\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages] = true;\n return different;\n};\n\nfunction Status({\n statusID,\n status,\n instance: propInstance,\n size = 'm',\n contentTextWeight,\n readOnly,\n enableCommentHint,\n withinContext,\n skeleton,\n enableTranslate,\n forceTranslate: _forceTranslate,\n previewMode,\n // allowFilters,\n onMediaClick,\n quoted,\n onStatusLinkClick = () => {},\n showFollowedTags,\n allowContextMenu,\n showActionsBar,\n showReplyParent,\n mediaFirst,\n}) {\n const { _ } = useLingui();\n\n if (skeleton) {\n return (\n \n {!mediaFirst && }\n
    \n
    \n {(size === 's' || mediaFirst) && } ███ ████████\n
    \n
    \n {mediaFirst &&
    }\n
    \n

    ████ ████████

    \n
    \n
    \n
    \n
    \n );\n }\n const { masto, instance, authenticated } = api({ instance: propInstance });\n const { instance: currentInstance } = api();\n const sameInstance = instance === currentInstance;\n\n let sKey = statusKey(statusID || status?.id, instance);\n const snapStates = useSnapshot(states);\n if (!status) {\n status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n sKey = statusKey(status?.id, instance);\n }\n if (!status) {\n return null;\n }\n\n const {\n account: {\n acct,\n avatar,\n avatarStatic,\n id: accountId,\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n repliesCount,\n reblogged,\n reblogsCount,\n favourited,\n favouritesCount,\n bookmarked,\n poll,\n muted,\n sensitive,\n spoilerText,\n visibility, // public, unlisted, private, direct\n language: _language,\n editedAt,\n filtered,\n card,\n createdAt,\n inReplyToId,\n inReplyToAccountId,\n content,\n mentions,\n mediaAttachments,\n reblog,\n uri,\n url,\n emojis,\n tags,\n pinned,\n // Non-API props\n _deleted,\n _pinned,\n // _filtered,\n // Non-Mastodon\n emojiReactions,\n } = status;\n\n const [languageAutoDetected, setLanguageAutoDetected] = useState(null);\n useEffect(() => {\n if (!content) return;\n if (_language) return;\n let timer;\n timer = setTimeout(async () => {\n let detected = await detectLang(\n getHTMLText(content, {\n preProcess: (dom) => {\n // Remove anything that can skew the language detection\n\n // Remove .mention, .hashtag, pre, code, a:has(.invisible)\n dom\n .querySelectorAll(\n '.mention, .hashtag, pre, code, a:has(.invisible)',\n )\n .forEach((a) => {\n a.remove();\n });\n\n // Remove links that contains text that starts with https?://\n dom.querySelectorAll('a').forEach((a) => {\n const text = a.innerText.trim();\n if (text.startsWith('https://') || text.startsWith('http://')) {\n a.remove();\n }\n });\n },\n }),\n );\n setLanguageAutoDetected(detected);\n }, 1000);\n return () => clearTimeout(timer);\n }, [content, _language]);\n const language = _language || languageAutoDetected;\n\n // if (!mediaAttachments?.length) mediaFirst = false;\n const hasMediaAttachments = !!mediaAttachments?.length;\n if (mediaFirst && hasMediaAttachments) size = 's';\n\n const currentAccount = useMemo(() => {\n return getCurrentAccountID();\n }, []);\n const isSelf = useMemo(() => {\n return currentAccount && currentAccount === accountId;\n }, [accountId, currentAccount]);\n\n const filterContext = useContext(FilterContext);\n const filterInfo =\n !isSelf && !readOnly && !previewMode && isFiltered(filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n return null;\n }\n\n console.debug('RENDER Status', id, status?.account.displayName, quoted);\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...status,\n });\n }\n };\n\n if (/*allowFilters && */ size !== 'l' && filterInfo) {\n return (\n \n );\n }\n\n const createdAtDate = new Date(createdAt);\n const editedAtDate = new Date(editedAt);\n\n let inReplyToAccountRef = mentions?.find(\n (mention) => mention.id === inReplyToAccountId,\n );\n if (!inReplyToAccountRef && inReplyToAccountId === id) {\n inReplyToAccountRef = { url: accountURL, username, displayName };\n }\n const [inReplyToAccount, setInReplyToAccount] = useState(inReplyToAccountRef);\n if (!withinContext && !inReplyToAccount && inReplyToAccountId) {\n const account = states.accounts[inReplyToAccountId];\n if (account) {\n setInReplyToAccount(account);\n } else {\n memFetchAccount(inReplyToAccountId, masto)\n .then((account) => {\n setInReplyToAccount(account);\n states.accounts[account.id] = account;\n })\n .catch((e) => {});\n }\n }\n const mentionSelf =\n inReplyToAccountId === currentAccount ||\n mentions?.find((mention) => mention.id === currentAccount);\n\n const readingExpandSpoilers = useMemo(() => {\n const prefs = store.account.get('preferences') || {};\n return !!prefs['reading:expand:spoilers'];\n }, []);\n const readingExpandMedia = useMemo(() => {\n // default | show_all | hide_all\n // Ignore hide_all because it means hide *ALL* media including non-sensitive ones\n const prefs = store.account.get('preferences') || {};\n return prefs['reading:expand:media']?.toLowerCase() || 'default';\n }, []);\n // FOR TESTING:\n // const readingExpandSpoilers = true;\n // const readingExpandMedia = 'show_all';\n const showSpoiler =\n previewMode || readingExpandSpoilers || !!snapStates.spoilers[id];\n const showSpoilerMedia =\n previewMode ||\n readingExpandMedia === 'show_all' ||\n !!snapStates.spoilersMedia[id];\n\n if (reblog) {\n // If has statusID, means useItemID (cached in states)\n\n if (group) {\n return (\n \n
    \n {' '}\n \n
    \n \n \n );\n }\n\n return (\n \n
    \n {' '}\n \n {' '}\n boosted\n \n
    \n \n \n );\n }\n\n // Check followedTags\n const FollowedTagsParent = useCallback(\n ({ children }) => (\n \n
    \n {' '}\n {snapStates.statusFollowedTags[sKey].slice(0, 3).map((tag) => (\n \n {tag}\n \n ))}\n
    \n {children}\n \n ),\n [sKey, instance, snapStates.statusFollowedTags[sKey]],\n );\n const StatusParent =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length\n ? FollowedTagsParent\n : Fragment;\n\n const isSizeLarge = size === 'l';\n\n const [forceTranslate, setForceTranslate] = useState(_forceTranslate);\n // const targetLanguage = getTranslateTargetLanguage(true);\n // const contentTranslationHideLanguages =\n // snapStates.settings.contentTranslationHideLanguages || [];\n const { contentTranslation, contentTranslationAutoInline } =\n snapStates.settings;\n if (!contentTranslation) enableTranslate = false;\n const inlineTranslate = useMemo(() => {\n if (\n !contentTranslation ||\n !contentTranslationAutoInline ||\n readOnly ||\n (withinContext && !isSizeLarge) ||\n previewMode ||\n spoilerText ||\n sensitive ||\n poll ||\n card ||\n mediaAttachments?.length\n ) {\n return false;\n }\n const contentLength = htmlContentLength(content);\n return contentLength > 0 && contentLength <= INLINE_TRANSLATE_LIMIT;\n }, [\n contentTranslation,\n contentTranslationAutoInline,\n readOnly,\n withinContext,\n isSizeLarge,\n previewMode,\n spoilerText,\n sensitive,\n poll,\n card,\n mediaAttachments,\n content,\n ]);\n\n const [showEdited, setShowEdited] = useState(false);\n const [showEmbed, setShowEmbed] = useState(false);\n\n const spoilerContentRef = useTruncated();\n const contentRef = useTruncated();\n const mediaContainerRef = useTruncated();\n\n const statusRef = useRef(null);\n\n const unauthInteractionErrorMessage = t`Sorry, your current logged-in instance can't interact with this post from another instance.`;\n\n const textWeight = useCallback(\n () =>\n Math.max(\n Math.round((spoilerText.length + htmlContentLength(content)) / 140) ||\n 1,\n 1,\n ),\n [spoilerText, content],\n );\n\n const createdDateText = niceDateTime(createdAtDate);\n const editedDateText = editedAt && niceDateTime(editedAtDate);\n\n // Can boost if:\n // - authenticated AND\n // - visibility != direct OR\n // - visibility = private AND isSelf\n let canBoost =\n authenticated && visibility !== 'direct' && visibility !== 'private';\n if (visibility === 'private' && isSelf) {\n canBoost = true;\n }\n\n const replyStatus = (e) => {\n if (!sameInstance || !authenticated) {\n return alert(unauthInteractionErrorMessage);\n }\n // syntheticEvent comes from MenuItem\n if (e?.shiftKey || e?.syntheticEvent?.shiftKey) {\n const newWin = openCompose({\n replyToStatus: status,\n });\n if (newWin) return;\n }\n showCompose({\n replyToStatus: status,\n });\n };\n\n // Check if media has no descriptions\n const mediaNoDesc = useMemo(() => {\n return mediaAttachments.some(\n (attachment) => !attachment.description?.trim?.(),\n );\n }, [mediaAttachments]);\n\n const statusMonthsAgo = useMemo(() => {\n return Math.floor(\n (new Date() - createdAtDate) / (1000 * 60 * 60 * 24 * 30),\n );\n }, [createdAtDate]);\n\n // const boostStatus = async () => {\n // if (!sameInstance || !authenticated) {\n // alert(unauthInteractionErrorMessage);\n // return false;\n // }\n // try {\n // if (!reblogged) {\n // let confirmText = 'Boost this post?';\n // if (mediaNoDesc) {\n // confirmText += '\\n\\n⚠️ Some media have no descriptions.';\n // }\n // const yes = confirm(confirmText);\n // if (!yes) {\n // return false;\n // }\n // }\n // // Optimistic\n // states.statuses[sKey] = {\n // ...status,\n // reblogged: !reblogged,\n // reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n // };\n // if (reblogged) {\n // const newStatus = await masto.v1.statuses.$select(id).unreblog();\n // saveStatus(newStatus, instance);\n // return true;\n // } else {\n // const newStatus = await masto.v1.statuses.$select(id).reblog();\n // saveStatus(newStatus, instance);\n // return true;\n // }\n // } catch (e) {\n // console.error(e);\n // // Revert optimistism\n // states.statuses[sKey] = status;\n // return false;\n // }\n // };\n const confirmBoostStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n reblogged: !reblogged,\n reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n };\n if (reblogged) {\n const newStatus = await masto.v1.statuses.$select(id).unreblog();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).reblog();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n\n const favouriteStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n favourited: !favourited,\n favouritesCount: favouritesCount + (favourited ? -1 : 1),\n };\n if (favourited) {\n const newStatus = await masto.v1.statuses.$select(id).unfavourite();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).favourite();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const favouriteStatusNotify = async () => {\n try {\n const done = await favouriteStatus();\n if (!isSizeLarge && done) {\n showToast(\n favourited\n ? t`Unliked @${username || acct}'s post`\n : t`Liked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n const bookmarkStatus = async () => {\n if (!supports('@mastodon/post-bookmark')) return;\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n bookmarked: !bookmarked,\n };\n if (bookmarked) {\n const newStatus = await masto.v1.statuses.$select(id).unbookmark();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).bookmark();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const bookmarkStatusNotify = async () => {\n try {\n const done = await bookmarkStatus();\n if (!isSizeLarge && done) {\n showToast(\n bookmarked\n ? t`Unbookmarked @${username || acct}'s post`\n : t`Bookmarked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n // const differentLanguage =\n // !!language &&\n // language !== targetLanguage &&\n // !localeMatch([language], [targetLanguage]) &&\n // !contentTranslationHideLanguages.find(\n // (l) => language === l || localeMatch([language], [l]),\n // );\n const contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages || [];\n const [differentLanguage, setDifferentLanguage] = useState(\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages]\n ? checkDifferentLanguage(language, contentTranslationHideLanguages)\n : false,\n );\n useEffect(() => {\n if (\n !language ||\n differentLanguage ||\n DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages]\n ) {\n return;\n }\n let timeout = setTimeout(() => {\n const different = checkDifferentLanguage(\n language,\n contentTranslationHideLanguages,\n );\n if (different) setDifferentLanguage(different);\n }, 1);\n return () => clearTimeout(timeout);\n }, [language, differentLanguage, contentTranslationHideLanguages]);\n\n const reblogIterator = useRef();\n const favouriteIterator = useRef();\n async function fetchBoostedLikedByAccounts(firstLoad) {\n if (firstLoad) {\n reblogIterator.current = masto.v1.statuses\n .$select(statusID)\n .rebloggedBy.list({\n limit: REACTIONS_LIMIT,\n });\n favouriteIterator.current = masto.v1.statuses\n .$select(statusID)\n .favouritedBy.list({\n limit: REACTIONS_LIMIT,\n });\n }\n const [{ value: reblogResults }, { value: favouriteResults }] =\n await Promise.allSettled([\n reblogIterator.current.next(),\n favouriteIterator.current.next(),\n ]);\n if (reblogResults.value?.length || favouriteResults.value?.length) {\n const accounts = [];\n if (reblogResults.value?.length) {\n accounts.push(\n ...reblogResults.value.map((a) => {\n a._types = ['reblog'];\n return a;\n }),\n );\n }\n if (favouriteResults.value?.length) {\n accounts.push(\n ...favouriteResults.value.map((a) => {\n a._types = ['favourite'];\n return a;\n }),\n );\n }\n return {\n value: accounts,\n done: reblogResults.done && favouriteResults.done,\n };\n }\n return {\n value: [],\n done: true,\n };\n }\n\n const actionsRef = useRef();\n const isPublic = ['public', 'unlisted'].includes(visibility);\n const isPinnable = ['public', 'unlisted', 'private'].includes(visibility);\n const StatusMenuItems = (\n <>\n {!isSizeLarge && sameInstance && (\n <>\n
    \n \n \n \n {repliesCount > 0 ? shortenNumber(repliesCount) : t`Reply`}\n \n \n \n \n {reblogged ? t`Unboost` : t`Boost`}\n \n }\n className={`menu-reblog ${reblogged ? 'checked' : ''}`}\n menuExtras={\n {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n \n \n Quote\n \n \n }\n menuFooter={\n mediaNoDesc && !reblogged ? (\n
    \n \n Some media have no descriptions.\n
    \n ) : (\n statusMonthsAgo >= 3 && (\n
    \n \n \n \n Old post (\n \n {rtf.format(-statusMonthsAgo, 'month')}\n \n )\n \n \n
    \n )\n )\n }\n disabled={!canBoost}\n onClick={async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n }}\n >\n \n \n {reblogsCount > 0\n ? shortenNumber(reblogsCount)\n : reblogged\n ? t`Unboost`\n : t`Boost…`}\n \n \n \n \n \n {favouritesCount > 0\n ? shortenNumber(favouritesCount)\n : favourited\n ? t`Unlike`\n : t`Like`}\n \n \n {supports('@mastodon/post-bookmark') && (\n \n \n {bookmarked ? t`Unbookmark` : t`Bookmark`}\n \n )}\n
    \n \n )}\n {!isSizeLarge && sameInstance && (isSizeLarge || showActionsBar) && (\n \n )}\n {(isSizeLarge || showActionsBar) && (\n <>\n {\n states.showGenericAccounts = {\n heading: t`Boosted/Liked by…`,\n fetchAccounts: fetchBoostedLikedByAccounts,\n instance,\n showReactions: true,\n postID: sKey,\n };\n }}\n >\n \n \n Boosted/Liked by…\n \n \n \n )}\n {!mediaFirst && (\n <>\n {(enableTranslate || !language || differentLanguage) && (\n \n )}\n {enableTranslate ? (\n
    \n {\n setForceTranslate(true);\n }}\n >\n \n \n Translate\n \n \n {supportsTTS && (\n {\n const postText = getPostText(status);\n if (postText) {\n speak(postText, language);\n }\n }}\n >\n \n \n Speak\n \n \n )}\n
    \n ) : (\n (!language || differentLanguage) && (\n
    \n \n \n \n Translate\n \n \n {supportsTTS && (\n {\n const postText = getPostText(status);\n if (postText) {\n speak(postText, language);\n }\n }}\n >\n \n \n Speak\n \n \n )}\n
    \n )\n )}\n \n )}\n {((!isSizeLarge && sameInstance) ||\n enableTranslate ||\n !language ||\n differentLanguage) && }\n {!isSizeLarge && (\n <>\n {\n onStatusLinkClick(e, status);\n }}\n >\n \n \n \n View post by{' '}\n @{username || acct}\n \n
    \n \n {_(visibilityText[visibility])} • {createdDateText}\n \n
    \n \n \n )}\n {!!editedAt && (\n <>\n {\n setShowEdited(id);\n }}\n >\n \n \n Show Edit History\n
    \n \n Edited: {editedDateText}\n \n
    \n \n \n )}\n \n \n \n {nicePostURL(url)}\n \n \n
    \n {\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(url);\n showToast(t`Link copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy link`);\n }\n }}\n >\n \n \n Copy\n \n \n {isPublic &&\n navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n {\n try {\n navigator.share({\n url,\n });\n } catch (e) {\n console.error(e);\n alert(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n \n \n Share…\n \n \n )}\n
    \n {isPublic && isSizeLarge && (\n {\n setShowEmbed(true);\n }}\n >\n \n \n Embed post\n \n \n )}\n {(isSelf || mentionSelf) && }\n {(isSelf || mentionSelf) && (\n {\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [muted ? 'unmute' : 'mute']();\n saveStatus(newStatus, instance);\n showToast(\n muted ? t`Conversation unmuted` : t`Conversation muted`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n muted\n ? t`Unable to unmute conversation`\n : t`Unable to mute conversation`,\n );\n }\n }}\n >\n {muted ? (\n <>\n \n \n Unmute conversation\n \n \n ) : (\n <>\n \n \n Mute conversation\n \n \n )}\n \n )}\n {isSelf && isPinnable && (\n {\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [pinned ? 'unpin' : 'pin']();\n saveStatus(newStatus, instance);\n showToast(\n pinned\n ? t`Post unpinned from profile`\n : t`Post pinned to profile`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n pinned ? t`Unable to unpin post` : t`Unable to pin post`,\n );\n }\n }}\n >\n {pinned ? (\n <>\n \n \n Unpin from profile\n \n \n ) : (\n <>\n \n \n Pin to profile\n \n \n )}\n \n )}\n {isSelf && (\n
    \n {supports('@mastodon/post-edit') && (\n {\n showCompose({\n editStatus: status,\n });\n }}\n >\n \n \n Edit\n \n \n )}\n {isSizeLarge && (\n \n \n \n Delete this post?\n \n \n }\n menuItemClassName=\"danger\"\n onClick={() => {\n // const yes = confirm('Delete this post?');\n // if (yes) {\n (async () => {\n try {\n await masto.v1.statuses.$select(id).remove();\n const cachedStatus = getStatus(id, instance);\n cachedStatus._deleted = true;\n showToast(t`Post deleted`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to delete post`);\n }\n })();\n // }\n }}\n >\n \n \n Delete…\n \n \n )}\n
    \n )}\n {!isSelf && isSizeLarge && (\n <>\n \n {\n states.showReportModal = {\n account: status.account,\n post: status,\n };\n }}\n >\n \n \n Report post…\n \n \n \n )}\n \n );\n\n const contextMenuRef = useRef();\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuProps, setContextMenuProps] = useState({});\n\n const showContextMenu =\n allowContextMenu || (!isSizeLarge && !previewMode && !_deleted && !quoted);\n\n // Only iOS/iPadOS browsers don't support contextmenu\n // Some comments report iPadOS might support contextmenu if a mouse is connected\n const bindLongPressContext = useLongPress(\n isIOS && showContextMenu\n ? (e) => {\n if (e.pointerType === 'mouse') return;\n // There's 'pen' too, but not sure if contextmenu event would trigger from a pen\n\n const { clientX, clientY } = e.touches?.[0] || e;\n // link detection copied from onContextMenu because here it works\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: clientX,\n y: clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }\n : null,\n {\n threshold: 600,\n captureEvent: true,\n detect: 'touch',\n cancelOnMovement: 2, // true allows movement of up to 25 pixels\n },\n );\n\n const hotkeysEnabled = !readOnly && !previewMode && !quoted;\n const rRef = useHotkeys('r, shift+r', replyStatus, {\n enabled: hotkeysEnabled,\n });\n const fRef = useHotkeys('f, l', favouriteStatusNotify, {\n enabled: hotkeysEnabled,\n });\n const dRef = useHotkeys('d', bookmarkStatusNotify, {\n enabled: hotkeysEnabled,\n });\n const bRef = useHotkeys(\n 'shift+b',\n () => {\n (async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n })();\n },\n {\n enabled: hotkeysEnabled && canBoost,\n },\n );\n const xRef = useHotkeys('x', (e) => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n if (activeStatus) {\n const spoilerButton = activeStatus.querySelector(\n '.spoiler-button:not(.spoiling)',\n );\n if (spoilerButton) {\n e.stopPropagation();\n spoilerButton.click();\n } else {\n const spoilerMediaButton = activeStatus.querySelector(\n '.spoiler-media-button:not(.spoiling)',\n );\n if (spoilerMediaButton) {\n e.stopPropagation();\n spoilerMediaButton.click();\n }\n }\n }\n });\n\n const displayedMediaAttachments = mediaAttachments.slice(\n 0,\n isSizeLarge ? undefined : 4,\n );\n const showMultipleMediaCaptions =\n mediaAttachments.length > 1 &&\n displayedMediaAttachments.some(\n (media) => !!media.description && !isMediaCaptionLong(media.description),\n );\n const captionChildren = useMemo(() => {\n if (!showMultipleMediaCaptions) return null;\n const attachments = [];\n displayedMediaAttachments.forEach((media, i) => {\n if (!media.description) return;\n const index = attachments.findIndex(\n (attachment) => attachment.media.description === media.description,\n );\n if (index === -1) {\n attachments.push({\n media,\n indices: [i],\n });\n } else {\n attachments[index].indices.push(i);\n }\n });\n return attachments.map(({ media, indices }) => (\n i + 1).join(' ')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: media.description,\n lang: language,\n };\n }}\n title={media.description}\n >\n {indices.map((i) => i + 1).join(' ')} {media.description}\n \n ));\n\n // return displayedMediaAttachments.map(\n // (media, i) =>\n // !!media.description && (\n // {\n // e.preventDefault();\n // e.stopPropagation();\n // states.showMediaAlt = {\n // alt: media.description,\n // lang: language,\n // };\n // }}\n // title={media.description}\n // >\n // {i + 1} {media.description}\n // \n // ),\n // );\n }, [showMultipleMediaCaptions, displayedMediaAttachments, language]);\n\n const isThread = useMemo(() => {\n return (\n (!!inReplyToId && inReplyToAccountId === status.account?.id) ||\n !!snapStates.statusThreadNumber[sKey]\n );\n }, [\n inReplyToId,\n inReplyToAccountId,\n status.account?.id,\n snapStates.statusThreadNumber[sKey],\n ]);\n\n const showCommentHint = useMemo(() => {\n return (\n enableCommentHint &&\n !isThread &&\n !withinContext &&\n !inReplyToId &&\n visibility === 'public' &&\n repliesCount > 0\n );\n }, [\n enableCommentHint,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n visibility,\n ]);\n const showCommentCount = useMemo(() => {\n if (\n card ||\n poll ||\n sensitive ||\n spoilerText ||\n mediaAttachments?.length ||\n isThread ||\n withinContext ||\n inReplyToId ||\n repliesCount <= 0\n ) {\n return false;\n }\n const questionRegex = /[???︖❓❔⁇⁈⁉¿‽؟]/;\n const containsQuestion = questionRegex.test(content);\n if (!containsQuestion) return false;\n const contentLength = htmlContentLength(content);\n if (contentLength > 0 && contentLength <= SHOW_COMMENT_COUNT_LIMIT) {\n return true;\n }\n }, [\n card,\n poll,\n sensitive,\n spoilerText,\n mediaAttachments,\n reblog,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n content,\n ]);\n\n return (\n \n {showReplyParent && !!(inReplyToId && inReplyToAccountId) && (\n \n )}\n {\n statusRef.current = node;\n // Use parent node if it's in focus\n // Use case: \n // When navigating (j/k), the is focused instead of \n // Hotkey binding doesn't bubble up thus this hack\n const nodeRef =\n node?.closest?.(\n '.timeline-item, .timeline-item-alt, .status-link, .status-focus',\n ) || node;\n rRef(nodeRef);\n fRef(nodeRef);\n dRef(nodeRef);\n bRef(nodeRef);\n xRef(nodeRef);\n }}\n tabindex=\"-1\"\n class={`status ${\n !withinContext && inReplyToId && inReplyToAccount\n ? 'status-reply-to'\n : ''\n } visibility-${visibility} ${_pinned ? 'status-pinned' : ''} ${\n SIZE_CLASS[size]\n } ${_deleted ? 'status-deleted' : ''} ${quoted ? 'status-card' : ''} ${\n isContextMenuOpen ? 'status-menu-open' : ''\n } ${mediaFirst && hasMediaAttachments ? 'status-media-first' : ''}`}\n onMouseEnter={debugHover}\n onContextMenu={(e) => {\n if (!showContextMenu) return;\n if (e.metaKey) return;\n // console.log('context menu', e);\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n\n // If there's selected text, don't show custom context menu\n const selection = window.getSelection?.();\n if (selection.toString().length > 0) {\n const { anchorNode } = selection;\n if (statusRef.current?.contains(anchorNode)) {\n return;\n }\n }\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: e.clientX,\n y: e.clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }}\n {...(showContextMenu ? bindLongPressContext() : {})}\n >\n {showContextMenu && (\n {\n setIsContextMenuOpen(false);\n // statusRef.current?.focus?.();\n if (e?.reason === 'click') {\n statusRef.current?.closest('[tabindex]')?.focus?.();\n }\n }}\n portal={{\n target: document.body,\n }}\n containerProps={{\n style: {\n // Higher than the backdrop\n zIndex: 1001,\n },\n onClick: () => {\n contextMenuRef.current?.closeMenu?.();\n },\n }}\n overflow=\"auto\"\n boundingBoxPadding={safeBoundingBoxPadding()}\n unmountOnClose\n >\n {StatusMenuItems}\n \n )}\n {showActionsBar &&\n size !== 'l' &&\n !previewMode &&\n !readOnly &&\n !_deleted &&\n !quoted && (\n \n \n \n {\n e.preventDefault();\n e.stopPropagation();\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'start',\n direction: 'left',\n gap: 0,\n shift: -8,\n });\n setIsContextMenuOpen('actions-bar');\n }}\n >\n \n \n \n )}\n {size !== 'l' && (\n
    \n {reblogged && (\n \n )}\n {favourited && (\n \n )}\n {bookmarked && (\n \n )}\n {_pinned && (\n \n )}\n
    \n )}\n {size !== 's' && (\n {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: status.account,\n instance,\n };\n }}\n >\n \n
    \n )}\n
    \n
    \n \n \n \n {/* {inReplyToAccount && !withinContext && size !== 's' && (\n <>\n {' '}\n \n {' '}\n \n \n \n )} */}\n {/* */}{' '}\n {size !== 'l' &&\n (_deleted ? (\n \n Deleted\n \n ) : url && !previewMode && !readOnly && !quoted ? (\n {\n if (\n e.metaKey ||\n e.ctrlKey ||\n e.shiftKey ||\n e.altKey ||\n e.which === 2\n ) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n onStatusLinkClick?.(e, status);\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'end',\n direction: 'bottom',\n gap: 4,\n });\n setIsContextMenuOpen(true);\n }}\n class={`time ${\n isContextMenuOpen && contextMenuProps?.anchorRef\n ? 'is-open'\n : ''\n }`}\n >\n {showCommentHint && !showCommentCount ? (\n \n ) : (\n visibility !== 'public' &&\n visibility !== 'direct' && (\n \n )\n )}{' '}\n \n {!previewMode && !readOnly && (\n \n )}\n \n ) : (\n // {\n // if (e.target === e.currentTarget)\n // menuInstanceRef.current?.closeMenu?.();\n // },\n // }}\n // align=\"end\"\n // gap={4}\n // overflow=\"auto\"\n // viewScroll=\"close\"\n // boundingBoxPadding=\"8 8 8 8\"\n // unmountOnClose\n // menuButton={({ open }) => (\n // {\n // e.preventDefault();\n // e.stopPropagation();\n // onStatusLinkClick?.(e, status);\n // }}\n // class={`time ${open ? 'is-open' : ''}`}\n // >\n // {' '}\n // \n // \n // )}\n // >\n // {StatusMenuItems}\n // \n \n {visibility !== 'public' && visibility !== 'direct' && (\n <>\n {' '}\n \n )}\n \n \n ))}\n
    \n {visibility === 'direct' && (\n <>\n
    \n Private mention\n
    {' '}\n \n )}\n {!withinContext && (\n <>\n {isThread ? (\n
    \n \n \n Thread\n {snapStates.statusThreadNumber[sKey]\n ? ` ${snapStates.statusThreadNumber[sKey]}/X`\n : ''}\n \n
    \n ) : (\n !!inReplyToId &&\n !!inReplyToAccount &&\n (!!spoilerText ||\n !mentions.find((mention) => {\n return mention.id === inReplyToAccountId;\n })) && (\n
    \n {' '}\n \n
    \n )\n )}\n \n )}\n \n {mediaFirst && hasMediaAttachments ? (\n <>\n {(!!spoilerText || !!sensitive) && !readingExpandSpoilers && (\n <>\n {!!spoilerText && (\n \n {' '}\n \n )}\n {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n {' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n \n \n )}\n \n {!!content && (\n
    \n \n
    \n )}\n \n ) : (\n <>\n {!!spoilerText && (\n <>\n \n

    \n \n

    \n
    \n {readingExpandSpoilers || previewMode ? (\n
    \n Content warning\n
    \n ) : (\n {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n {' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n \n )}\n \n )}\n {!!content && (\n \n \n \n \n )}\n {!!poll && (\n {\n states.statuses[sKey].poll = newPoll;\n }}\n refresh={() => {\n return masto.v1.polls\n .$select(poll.id)\n .fetch()\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n })\n .catch((e) => {}); // Silently fail\n }}\n votePoll={(choices) => {\n return masto.v1.polls\n .$select(poll.id)\n .votes.create({\n choices,\n })\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n })\n .catch((e) => {}); // Silently fail\n }}\n />\n )}\n {(((enableTranslate || inlineTranslate) &&\n !!content.trim() &&\n !!getHTMLText(emojifyText(content, emojis)) &&\n differentLanguage) ||\n forceTranslate) && (\n \n )}\n {!previewMode &&\n sensitive &&\n !!mediaAttachments.length &&\n readingExpandMedia !== 'show_all' && (\n
    \n );\n}\n\nfunction MultipleMediaFigure(props) {\n const { enabled, children, lang, captionChildren } = props;\n if (!enabled || !captionChildren) return children;\n return (\n
    \n {children}\n
    \n {captionChildren}\n
    \n
    \n );\n}\n\nfunction MediaFirstContainer(props) {\n const { mediaAttachments, language, postID, instance } = props;\n const moreThanOne = mediaAttachments.length > 1;\n\n const carouselRef = useRef();\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(Math.abs(scrollLeft) / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n return (\n <>\n
    \n
    \n {mediaAttachments.map((media, i) => (\n
    \n \n
    \n ))}\n
    \n {moreThanOne && (\n \n )}\n
    \n {moreThanOne && (\n \n {mediaAttachments.map((media, i) => (\n \n ))}\n \n )}\n \n );\n}\n\nfunction getDomain(url) {\n return punycode.toUnicode(\n URL.parse(url)\n .hostname.replace(/^www\\./, '')\n .replace(/\\/$/, ''),\n );\n}\n\n// \"Post\": Quote post + card link preview combo\n// Assume all links from these domains are \"posts\"\n// Mastodon links are \"posts\" too but they are converted to real quote posts and there's too many domains to check\n// This is just \"Progressive Enhancement\"\nfunction isCardPost(domain) {\n return ['x.com', 'twitter.com', 'threads.net', 'bsky.app'].includes(domain);\n}\n\nfunction Byline({ authors, hidden, children }) {\n if (hidden) return children;\n if (!authors?.[0]?.account?.id) return children;\n const author = authors[0].account;\n\n return (\n \n );\n}\n\nfunction Card({ card, selfReferential, selfAuthor, instance }) {\n const snapStates = useSnapshot(states);\n const {\n blurhash,\n title,\n description,\n html,\n providerName,\n providerUrl,\n authorName,\n authorUrl,\n width,\n height,\n image,\n imageDescription,\n url,\n type,\n embedUrl,\n language,\n publishedAt,\n authors,\n } = card;\n\n /* type\n link = Link OEmbed\n photo = Photo OEmbed\n video = Video OEmbed\n rich = iframe OEmbed. Not currently accepted, so won’t show up in practice.\n */\n\n const hasText = title || providerName || authorName;\n const isLandscape = width / height >= 1.2;\n const size = isLandscape ? 'large' : '';\n\n const [cardStatusURL, setCardStatusURL] = useState(null);\n // const [cardStatusID, setCardStatusID] = useState(null);\n useEffect(() => {\n if (hasText && image && !selfReferential && isMastodonLinkMaybe(url)) {\n unfurlMastodonLink(instance, url).then((result) => {\n if (!result) return;\n const { id, url } = result;\n setCardStatusURL('#' + url);\n\n // NOTE: This is for quote post\n // (async () => {\n // const { masto } = api({ instance });\n // const status = await masto.v1.statuses.$select(id).fetch();\n // saveStatus(status, instance);\n // setCardStatusID(id);\n // })();\n });\n }\n }, [hasText, image, selfReferential]);\n\n // if (cardStatusID) {\n // return (\n // \n // );\n // }\n\n if (snapStates.unfurledLinks[url]) return null;\n\n const hasIframeHTML = /