fedipod 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/architecture.svg +89 -0
  4. package/bin/fedipod.mjs +2303 -0
  5. package/cli.md +243 -0
  6. package/groups.md +85 -0
  7. package/gui.md +99 -0
  8. package/lib/account.mjs +87 -0
  9. package/lib/admin.mjs +1606 -0
  10. package/lib/atproto.mjs +310 -0
  11. package/lib/bskyfeed.mjs +166 -0
  12. package/lib/bskygroup.mjs +162 -0
  13. package/lib/c2s.mjs +305 -0
  14. package/lib/certs.mjs +265 -0
  15. package/lib/deliver.mjs +249 -0
  16. package/lib/directory.mjs +90 -0
  17. package/lib/embed.mjs +214 -0
  18. package/lib/export-collections.mjs +161 -0
  19. package/lib/front-core.mjs +322 -0
  20. package/lib/gateway-core.mjs +115 -0
  21. package/lib/guard.mjs +213 -0
  22. package/lib/home.mjs +161 -0
  23. package/lib/httpsig.mjs +109 -0
  24. package/lib/import.mjs +357 -0
  25. package/lib/intake.mjs +1710 -0
  26. package/lib/keys.mjs +139 -0
  27. package/lib/lease.mjs +190 -0
  28. package/lib/localapi.mjs +87 -0
  29. package/lib/mastoapi.mjs +1588 -0
  30. package/lib/migrate.mjs +127 -0
  31. package/lib/oidc-auth.mjs +53 -0
  32. package/lib/podrdf.mjs +132 -0
  33. package/lib/ports.mjs +27 -0
  34. package/lib/publisher.mjs +1003 -0
  35. package/lib/remote.mjs +303 -0
  36. package/lib/safefetch.mjs +235 -0
  37. package/lib/setup.mjs +262 -0
  38. package/lib/social.mjs +505 -0
  39. package/lib/storage.mjs +170 -0
  40. package/lib/store.mjs +470 -0
  41. package/lib/streaming.mjs +154 -0
  42. package/lib/tagfeed.mjs +158 -0
  43. package/lib/ua.mjs +29 -0
  44. package/lib/update.mjs +91 -0
  45. package/lib/webpush.mjs +98 -0
  46. package/lib/wire.mjs +762 -0
  47. package/package.json +60 -0
  48. package/phanpy/dist/404.html +40 -0
  49. package/phanpy/dist/_headers +2 -0
  50. package/phanpy/dist/apple-touch-icon.png +0 -0
  51. package/phanpy/dist/assets/ICONS-DIPJeU0C.js +2 -0
  52. package/phanpy/dist/assets/ICONS-DIPJeU0C.js.map +1 -0
  53. package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js +183 -0
  54. package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js.map +1 -0
  55. package/phanpy/dist/assets/Temml-CCjoacWt.woff2 +0 -0
  56. package/phanpy/dist/assets/__vite-browser-external-C7iut881.js +2 -0
  57. package/phanpy/dist/assets/__vite-browser-external-C7iut881.js.map +1 -0
  58. package/phanpy/dist/assets/boosts-carousel-BiOaNdMT.jpg +0 -0
  59. package/phanpy/dist/assets/catch-up-O5q5C75Z.png +0 -0
  60. package/phanpy/dist/assets/chunk-aKtaBQYM.js +1 -0
  61. package/phanpy/dist/assets/compose-CFEx7wb4.js +2 -0
  62. package/phanpy/dist/assets/compose-CFEx7wb4.js.map +1 -0
  63. package/phanpy/dist/assets/compose-ZJN5xSb4.js +35 -0
  64. package/phanpy/dist/assets/compose-ZJN5xSb4.js.map +1 -0
  65. package/phanpy/dist/assets/debug.module-YFQgwnIr.js +52 -0
  66. package/phanpy/dist/assets/debug.module-YFQgwnIr.js.map +1 -0
  67. package/phanpy/dist/assets/dom-p1YcJ5Rw.js +2 -0
  68. package/phanpy/dist/assets/dom-p1YcJ5Rw.js.map +1 -0
  69. package/phanpy/dist/assets/home-mobile-dark@2x-Dc-J8-SM.png +0 -0
  70. package/phanpy/dist/assets/home-mobile-light@2x-Bd3fod8m.png +0 -0
  71. package/phanpy/dist/assets/home-tablet-dark@2x-BgcNI8le.png +0 -0
  72. package/phanpy/dist/assets/home-tablet-light@2x-BW2RV9T6.png +0 -0
  73. package/phanpy/dist/assets/icons/add-circle-line-WD0mwORD.js +1 -0
  74. package/phanpy/dist/assets/icons/alert-line-CpFUMf9s.js +1 -0
  75. package/phanpy/dist/assets/icons/android-2-line-Bzxnrd3S.js +1 -0
  76. package/phanpy/dist/assets/icons/announcement-line-5nwaJFJm.js +1 -0
  77. package/phanpy/dist/assets/icons/arrow-down-circle-line-a7Id9-Iv.js +1 -0
  78. package/phanpy/dist/assets/icons/arrow-down-line-B8uzXzq6.js +1 -0
  79. package/phanpy/dist/assets/icons/arrow-left-line-CGrGT9C-.js +1 -0
  80. package/phanpy/dist/assets/icons/arrow-right-line-CE-HERfX.js +1 -0
  81. package/phanpy/dist/assets/icons/arrow-to-up-line-CvdQjmcy.js +1 -0
  82. package/phanpy/dist/assets/icons/arrow-up-circle-line-DEparSNF.js +1 -0
  83. package/phanpy/dist/assets/icons/arrow-up-line-C7yBeugc.js +1 -0
  84. package/phanpy/dist/assets/icons/arrows-right-line-BtbXmJGP.js +1 -0
  85. package/phanpy/dist/assets/icons/at-line-CF66Bznk.js +1 -0
  86. package/phanpy/dist/assets/icons/attachment-line-BY8It-l9.js +1 -0
  87. package/phanpy/dist/assets/icons/blockquote-line-BS6pU_hm.js +1 -0
  88. package/phanpy/dist/assets/icons/board-line-C0UWXyA6.js +1 -0
  89. package/phanpy/dist/assets/icons/bookmark-line-1CtX5JLF.js +1 -0
  90. package/phanpy/dist/assets/icons/building-5-line-Dd59MzbO.js +1 -0
  91. package/phanpy/dist/assets/icons/bus-2-line-6_dvA0GG.js +1 -0
  92. package/phanpy/dist/assets/icons/calendar-day-line-Crpl_fmu.js +1 -0
  93. package/phanpy/dist/assets/icons/calendar-month-line-vommts2C.js +1 -0
  94. package/phanpy/dist/assets/icons/calendar-time-add-line-BU_DTlQk.js +1 -0
  95. package/phanpy/dist/assets/icons/camera-line-Cv69MEei.js +1 -0
  96. package/phanpy/dist/assets/icons/celebrate-line-B8DvIoi0.js +1 -0
  97. package/phanpy/dist/assets/icons/chart-bar-line-FK-QOmtF.js +1 -0
  98. package/phanpy/dist/assets/icons/chart-line-line-BGcJAFWw.js +1 -0
  99. package/phanpy/dist/assets/icons/chat-3-line-YFK2-hwz.js +1 -0
  100. package/phanpy/dist/assets/icons/check-circle-line-DsAxFr5-.js +1 -0
  101. package/phanpy/dist/assets/icons/clipboard-line-BBp364gJ.js +1 -0
  102. package/phanpy/dist/assets/icons/close-circle-line-CICdiuGz.js +1 -0
  103. package/phanpy/dist/assets/icons/close-line-DYrFWcjv.js +1 -0
  104. package/phanpy/dist/assets/icons/cloud-line-tiQAbah8.js +1 -0
  105. package/phanpy/dist/assets/icons/code-line-fAl8iiV3.js +1 -0
  106. package/phanpy/dist/assets/icons/comment-2-line-CR3g7WeB.js +1 -0
  107. package/phanpy/dist/assets/icons/copy-2-line-CLW69yF5.js +1 -0
  108. package/phanpy/dist/assets/icons/delete-2-line-B8xmbr4n.js +1 -0
  109. package/phanpy/dist/assets/icons/document-3-line-DBGNhAg2.js +1 -0
  110. package/phanpy/dist/assets/icons/document-line-C7mb9sb7.js +1 -0
  111. package/phanpy/dist/assets/icons/down-line-BGqSSThd.js +1 -0
  112. package/phanpy/dist/assets/icons/edit-4-line-DcgGaEhx.js +1 -0
  113. package/phanpy/dist/assets/icons/emoji-2-line-D8YgnM-y.js +1 -0
  114. package/phanpy/dist/assets/icons/exit-line-Dc07BS-x.js +1 -0
  115. package/phanpy/dist/assets/icons/external-link-line-BvpSkmjO.js +1 -0
  116. package/phanpy/dist/assets/icons/eye-2-line-CiWXx-f_.js +1 -0
  117. package/phanpy/dist/assets/icons/eye-close-line-BgTaSJ4P.js +1 -0
  118. package/phanpy/dist/assets/icons/filter-2-line-B_mR2usy.js +1 -0
  119. package/phanpy/dist/assets/icons/filter-line-C_nm-3cU.js +1 -0
  120. package/phanpy/dist/assets/icons/flag-1-line-C2HB05I0.js +1 -0
  121. package/phanpy/dist/assets/icons/forbid-circle-line-D3LTT9yd.js +1 -0
  122. package/phanpy/dist/assets/icons/formula-line-DLrt2d6j.js +1 -0
  123. package/phanpy/dist/assets/icons/grid-line-CgUmEikf.js +1 -0
  124. package/phanpy/dist/assets/icons/group-line-C5fnX0wU.js +1 -0
  125. package/phanpy/dist/assets/icons/hand-finger-2-line-BGgxbuL9.js +1 -0
  126. package/phanpy/dist/assets/icons/hashtag-line-CyTEEXBb.js +1 -0
  127. package/phanpy/dist/assets/icons/heart-crack-line-BZddbO2C.js +1 -0
  128. package/phanpy/dist/assets/icons/heart-line-CJ7K47J4.js +1 -0
  129. package/phanpy/dist/assets/icons/history-2-line-kWWvFzqv.js +1 -0
  130. package/phanpy/dist/assets/icons/history-line-bGQiwbTH.js +1 -0
  131. package/phanpy/dist/assets/icons/home-3-line-fRU1zeLG.js +1 -0
  132. package/phanpy/dist/assets/icons/information-line-iNk6-sOY.js +1 -0
  133. package/phanpy/dist/assets/icons/keyboard-line-DsCyuQNz.js +1 -0
  134. package/phanpy/dist/assets/icons/layout-4-line-CZkOX52Z.js +1 -0
  135. package/phanpy/dist/assets/icons/layout-5-line-B_znt5wO.js +1 -0
  136. package/phanpy/dist/assets/icons/left-line-eUw0tya4.js +1 -0
  137. package/phanpy/dist/assets/icons/lightning-line-DaKoDdix.js +1 -0
  138. package/phanpy/dist/assets/icons/link-2-line-DCqLmMA7.js +1 -0
  139. package/phanpy/dist/assets/icons/list-check-line-BAxosBh9.js +1 -0
  140. package/phanpy/dist/assets/icons/lock-line-CPoaXeUW.js +1 -0
  141. package/phanpy/dist/assets/icons/mail-line-B0P8aa1L.js +1 -0
  142. package/phanpy/dist/assets/icons/moon-line-CEqNAToP.js +1 -0
  143. package/phanpy/dist/assets/icons/more-1-fill-Dw2e5xab.js +1 -0
  144. package/phanpy/dist/assets/icons/more-3-line-BIiVjYTz.js +1 -0
  145. package/phanpy/dist/assets/icons/notification-line-BZZq2Gtu.js +1 -0
  146. package/phanpy/dist/assets/icons/pencil-line-CKh8-A1v.js +1 -0
  147. package/phanpy/dist/assets/icons/photo-album-line-Bnfg2u40.js +1 -0
  148. package/phanpy/dist/assets/icons/pin-line-DpTolyhs.js +1 -0
  149. package/phanpy/dist/assets/icons/play-fill-B0-G_8lX.js +1 -0
  150. package/phanpy/dist/assets/icons/qrcode-2-line-B6SPCaHn.js +1 -0
  151. package/phanpy/dist/assets/icons/quill-pen-line-B6LUrnCP.js +1 -0
  152. package/phanpy/dist/assets/icons/quote-left-fill-hQZ1cj_6.js +1 -0
  153. package/phanpy/dist/assets/icons/radar-line-CKyroTth.js +1 -0
  154. package/phanpy/dist/assets/icons/react-line-CoIKhhtK.js +1 -0
  155. package/phanpy/dist/assets/icons/refresh-2-line-D0mTF97S.js +1 -0
  156. package/phanpy/dist/assets/icons/right-line-B3KWJaqc.js +1 -0
  157. package/phanpy/dist/assets/icons/rocket-line-4KZl537D.js +1 -0
  158. package/phanpy/dist/assets/icons/round-fill-C69NTrZ0.js +1 -0
  159. package/phanpy/dist/assets/icons/round-line-B9k_1uo-.js +1 -0
  160. package/phanpy/dist/assets/icons/route-line-B28ReHcE.js +1 -0
  161. package/phanpy/dist/assets/icons/rows-4-line-CrBniagM.js +1 -0
  162. package/phanpy/dist/assets/icons/scan-line-DSf74YdP.js +1 -0
  163. package/phanpy/dist/assets/icons/search-2-line-B6geIU1z.js +1 -0
  164. package/phanpy/dist/assets/icons/settings-3-line-azJwK47w.js +1 -0
  165. package/phanpy/dist/assets/icons/settings-6-line-C_5zc5YR.js +1 -0
  166. package/phanpy/dist/assets/icons/share-2-line-D5MxWjrm.js +1 -0
  167. package/phanpy/dist/assets/icons/share-forward-line-Cp61fZzZ.js +1 -0
  168. package/phanpy/dist/assets/icons/sparkles-2-line-DYYyXTaW.js +1 -0
  169. package/phanpy/dist/assets/icons/sparkles-line-C2hY1s6I.js +1 -0
  170. package/phanpy/dist/assets/icons/time-line-BF3eet1v.js +1 -0
  171. package/phanpy/dist/assets/icons/transfer-4-line-oisfvTBw.js +1 -0
  172. package/phanpy/dist/assets/icons/translate-line-BFWol2Ce.js +1 -0
  173. package/phanpy/dist/assets/icons/unlock-line-X_x5vwv3.js +1 -0
  174. package/phanpy/dist/assets/icons/upload-3-line-DgzwUJeW.js +1 -0
  175. package/phanpy/dist/assets/icons/user-4-line-BVSynZCp.js +1 -0
  176. package/phanpy/dist/assets/icons/user-add-2-line-BlGS5Q8q.js +1 -0
  177. package/phanpy/dist/assets/icons/user-add-line-BbXdHG4z.js +1 -0
  178. package/phanpy/dist/assets/icons/user-edit-line-BFAHOV0X.js +1 -0
  179. package/phanpy/dist/assets/icons/user-follow-line-BXux0wSd.js +1 -0
  180. package/phanpy/dist/assets/icons/user-star-line-DdYlpHLU.js +1 -0
  181. package/phanpy/dist/assets/icons/user-warning-line-Cj43j0_E.js +1 -0
  182. package/phanpy/dist/assets/icons/user-x-line-DIDgNlPH.js +1 -0
  183. package/phanpy/dist/assets/icons/volume-line-Bs390KQt.js +1 -0
  184. package/phanpy/dist/assets/icons/volume-mute-line-DzlzIqFZ.js +1 -0
  185. package/phanpy/dist/assets/icons/walk-line-yNXfB-md.js +1 -0
  186. package/phanpy/dist/assets/icons/world-2-line-CenkGIwj.js +1 -0
  187. package/phanpy/dist/assets/icons/zoom-in-line-CaENUphf.js +1 -0
  188. package/phanpy/dist/assets/icons/zoom-out-line-BDNk0EWo.js +1 -0
  189. package/phanpy/dist/assets/instances-BNPptnn-.json +333 -0
  190. package/phanpy/dist/assets/locales/ar-SA-CfheRbCu.js +1 -0
  191. package/phanpy/dist/assets/locales/ca-ES-DHRW86Tz.js +1 -0
  192. package/phanpy/dist/assets/locales/cs-CZ-CKoqEuA1.js +1 -0
  193. package/phanpy/dist/assets/locales/de-DE-ByRPMRFy.js +1 -0
  194. package/phanpy/dist/assets/locales/eo-UY-CPC7wLCS.js +1 -0
  195. package/phanpy/dist/assets/locales/es-ES-dJa0Fd9t.js +1 -0
  196. package/phanpy/dist/assets/locales/eu-ES-C3djlPR2.js +1 -0
  197. package/phanpy/dist/assets/locales/fa-IR-DTT490Ck.js +1 -0
  198. package/phanpy/dist/assets/locales/fi-FI-B23MCPuz.js +1 -0
  199. package/phanpy/dist/assets/locales/fr-FR-BcaQsO5C.js +1 -0
  200. package/phanpy/dist/assets/locales/gl-ES-BR-CVKBN.js +1 -0
  201. package/phanpy/dist/assets/locales/he-IL-CfheRbCu.js +1 -0
  202. package/phanpy/dist/assets/locales/hu-HU-CfheRbCu.js +1 -0
  203. package/phanpy/dist/assets/locales/it-IT-C1136UFV.js +1 -0
  204. package/phanpy/dist/assets/locales/ja-JP-CRZmRAhD.js +1 -0
  205. package/phanpy/dist/assets/locales/kab-Cz8xH_TT.js +1 -0
  206. package/phanpy/dist/assets/locales/ko-KR-CG9UiY4o.js +1 -0
  207. package/phanpy/dist/assets/locales/lt-LT-CJcI6sHZ.js +1 -0
  208. package/phanpy/dist/assets/locales/nb-NO-CfheRbCu.js +1 -0
  209. package/phanpy/dist/assets/locales/nl-NL-DxN4Yc1t.js +1 -0
  210. package/phanpy/dist/assets/locales/oc-FR-CfheRbCu.js +1 -0
  211. package/phanpy/dist/assets/locales/pl-PL-DkwGXf6P.js +1 -0
  212. package/phanpy/dist/assets/locales/pseudo-LOCALE-CQ4XxkQ0.js +1 -0
  213. package/phanpy/dist/assets/locales/pt-BR-nGL0HdFS.js +1 -0
  214. package/phanpy/dist/assets/locales/pt-PT-Cp17aj2z.js +1 -0
  215. package/phanpy/dist/assets/locales/ru-RU-0Y8cIoaK.js +1 -0
  216. package/phanpy/dist/assets/locales/th-TH-CfheRbCu.js +1 -0
  217. package/phanpy/dist/assets/locales/tok-CfheRbCu.js +1 -0
  218. package/phanpy/dist/assets/locales/tr-TR-CfheRbCu.js +1 -0
  219. package/phanpy/dist/assets/locales/uk-UA-C5E3dFBf.js +1 -0
  220. package/phanpy/dist/assets/locales/zh-CN-BHJi7_et.js +1 -0
  221. package/phanpy/dist/assets/locales/zh-TW-CfheRbCu.js +1 -0
  222. package/phanpy/dist/assets/main-BdqNbG-a.js +26 -0
  223. package/phanpy/dist/assets/main-BdqNbG-a.js.map +1 -0
  224. package/phanpy/dist/assets/mock-home-DGhR__He.js +2 -0
  225. package/phanpy/dist/assets/mock-home-DGhR__He.js.map +1 -0
  226. package/phanpy/dist/assets/multi-column-ROck0NVt.jpg +0 -0
  227. package/phanpy/dist/assets/multi-hashtag-timeline-DH5INVHi.jpg +0 -0
  228. package/phanpy/dist/assets/nested-comments-thread-hv59kZLc.jpg +0 -0
  229. package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js +2 -0
  230. package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js.map +1 -0
  231. package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js +20 -0
  232. package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js.map +1 -0
  233. package/phanpy/dist/assets/style-B1iLPTPR.css +2 -0
  234. package/phanpy/dist/assets/temml-DuyIQMei.js +97 -0
  235. package/phanpy/dist/assets/temml-DuyIQMei.js.map +1 -0
  236. package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js +2 -0
  237. package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js.map +1 -0
  238. package/phanpy/dist/assets/year-in-posts-B2lywqdx.png +0 -0
  239. package/phanpy/dist/assets/year-in-posts-DJv_star.js +3 -0
  240. package/phanpy/dist/assets/year-in-posts-DJv_star.js.map +1 -0
  241. package/phanpy/dist/compose/index.html +20 -0
  242. package/phanpy/dist/favicon.ico +0 -0
  243. package/phanpy/dist/index.html +73 -0
  244. package/phanpy/dist/logo-192.png +0 -0
  245. package/phanpy/dist/logo-512.png +0 -0
  246. package/phanpy/dist/logo-badge-72.png +0 -0
  247. package/phanpy/dist/logo-maskable-512.png +0 -0
  248. package/phanpy/dist/logo-monochrome-512.png +0 -0
  249. package/phanpy/dist/logo-monochrome-maskable-512.png +0 -0
  250. package/phanpy/dist/manifest.webmanifest +1 -0
  251. package/phanpy/dist/og-image-2.jpg +0 -0
  252. package/phanpy/dist/og-image.png +0 -0
  253. package/phanpy/dist/robots.txt +2 -0
  254. package/phanpy/dist/sw.js +25 -0
  255. package/phanpy/dist/version.json +1 -0
  256. package/run-agent.mjs +805 -0
  257. package/scripts/build-dist.mjs +37 -0
  258. package/scripts/verify-ui.mjs +60 -0
  259. package/ui/README.md +23 -0
  260. package/vendor/gate.cjs +132 -0
  261. package/vendor/idp-grant.cjs +394 -0
  262. package/vendor/jfetch.cjs +16 -0
  263. package/web/admin/admin.js +958 -0
  264. package/web/admin/bar.css +64 -0
  265. package/web/admin/bar.js +61 -0
  266. package/web/admin/client/client.js +66 -0
  267. package/web/admin/client/index.html +42 -0
  268. package/web/admin/index.html +493 -0
  269. package/web/admin/setup/index.html +172 -0
  270. package/web/admin/setup/setup.js +268 -0
  271. package/web/admin/window.css +55 -0
  272. package/web/admin/window.js +136 -0
  273. package/web/front/install.sh +69 -0
  274. package/web/front/new-account.html +424 -0
  275. package/web/front/run.html +138 -0
  276. package/web/front/solid-client-authn.bundle.js +2 -0
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["K","D","I","U","V","ee","te","T","M","x","se","S","N","ce","z","J","w","window","_showToast","showToast","props","text","onClick","delay","rest","toast","className","destination","gravity","position","setTimeout","useInterval","fn","deps","immediate","savedCallback","useRef","useEffect","current","id","setInterval","clearInterval","unstable_batchedUpdates","useMemo","useState","useCallback","useLayoutEffect","useReducer","useContext","updateState","version","Fragment","l","b","i","y","P","C","haptics","WebHaptics","DTFLOCALE_CACHE_KEY","_getDtfLocale","cachedDtf","store","session","get","dtfLocale","Intl","DateTimeFormat","resolvedOptions","locale","set","getDtfLocale","mem","initLocales","newLocales","navigator","languages","includes","unshift","locales","createLocale","language","options","Locale","langPart","parts","split","fallbackLocale","region","pop","toString","lang","middle","length","join","reg","opts","appLocale","userRegion","loc","matchedLocale","localeMatch","replace","undefined","niceDateTime","date","dtfOpts","Date","hideTime","formatOpts","forceOpts","currentYear","getFullYear","year","month","day","hour","minute","i18n","DTF","format","dateText","openCompose","url","URL","parse","location","width","screenWidth","height","screenHeight","screen","left","Math","max","top","min","winUID","uid","random","newWin","open","__COMPOSE__","alert","_i18n","_","isSafari","test","userAgent","openOSK","fauxEl","document","createElement","style","opacity","body","appendChild","focus","removeChild","root","documentElement","getComputedStyle","defaultBoundingBoxPadding","safeAreaInsets","getSafeAreaInsets","safeAreaInsetTop","getPropertyValue","safeAreaInsetRight","safeAreaInsetBottom","safeAreaInsetLeft","parseInt","requestAnimationFrame","safeBoundingBoxPadding","paddings","map","v","str","CSS","supports","addEventListener","passive","TOAST_DURATION","showCompose","states","composerState","minimized","duration","template","PARAGRAPH_END_RE","LIST_ITEM_END_RE","MULTIPLE_LINE_BREAKS_RE","getHTMLText","html","preProcess","truncateLinks","innerHTML","content","brElements","querySelectorAll","replaceWith","invisibleElements","remove","ellipsisElements","append","textContent","childNodes","n","innerText","trim","statusPeek","status","spoilerText","poll","mediaAttachments","quote","hasQuote","quotedStatus","dom","reContainer","querySelector","o","multiple","title","m","image","gifv","video","audio","unknown","type","quotePeek","SIZES","xs","s","xl","xxl","INVALID_ID_CHARS_REGEX","Icon","icon","size","alt","class","loadIcon","isIconLoaded","useIconSprite","iconSize","iconBlock","ICONS","console","rotate","rtl","isArray","flip","sanitizedTitle","loaded","_jsx","children","role","titleID","transform","memo","prevProps","nextProps","Link","forwardRef","ref","routerLocation","useLocation","hash","to","restProps","parsedHash","origin","searchParams","searchParamsStr","Array","from","entries","key","value","encodeURIComponent","pathname","isActive","decodeURIComponent","href","e","currentTarget","parentNode","closest","stopPropagation","prevLocation","MenuLink","disabled","FocusableItem","closeMenu","detail","RelativeTimeFormat","isValidDate","isNaN","getTime","rtfFromNow","rtf","RTF","seconds","now","absSeconds","abs","floor","twitterFromNow","values","0","RelativeTime","datetime","renderCount","rerender","dateStr","dt","dateStyle","toISOString","toLocaleString","timeout","raf","rafRerender","scheduleRerender","clearTimeout","cancelAnimationFrame","SubMenu2","menuRef","itemRef","label","direction","shift","computedDirection","setComputedDirection","computedShift","setComputedShift","offsetWidth","innerWidth","SubMenu","instanceRef","itemProps","onPointerMove","pointerType","openMenu","onPointerLeave","useCloseWatcher","watcher","CloseWatcher","$modalContainer","getElementById","getBackdropThemeColor","Modal","onClose","modalRef","timer","focusElement","supportsCloseWatcher","escRef","useHotkeys","enabled","keydown","keyup","useKey","ignoreEventWhen","metaKey","ctrlKey","altKey","shiftKey","$deckContainers","page","tabIndex","forEach","$deckContainer","setAttribute","removeAttribute","$meta","metaColor","local","theme","backdropColor","colorScheme","matchMedia","node","inert","onFocus","target","isFocusable","xxxl","alphaCache","Map","canvas","OffscreenCanvas","ctx","getContext","willReadFrequently","imageSmoothingEnabled","scheduleTask","requestIdleCallback","MISSING_IMAGE_PATH_REGEX","Avatar","staticUrl","squircle","avatarRef","isMissing","_jsxs","srcset","media","src","loading","decoding","fetchPriority","crossOrigin","has","onError","onLoad","dataset","naturalWidth","nw","naturalHeight","nh","scale","sampleW","round","sampleH","drawImage","data","getImageData","threshold","alphaCount","hasAlpha","classList","add","IS_RTL","MutationObserver","mutations","mutation","dir","observer","observe","useWindowSize","setSize","handleResize","innerHeight","removeEventListener","Menu2","containerProps","_instanceRef","align","rtlAlign","isRTL","Menu","boundingBoxPadding","repositionFlag","unmountOnClose","MenuConfirm","subMenu","confirm","confirmLabel","menuItemClassName","menuFooter","menuExtras","openTrigger","overflow","gap","menuClassName","menuButton","MenuItem","cloneElement","getGifFirstFrame","gifUrl","buffer","response","fetch","arrayBuffer","gif","frames","dims","patch","imageData","ImageData","putImageData","blob","Promise","resolve","toBlob","createObjectURL","CustomEmoji","isLarger","fetchQueue","PQueue","concurrency","interval","intervalCap","throttledFetch","signal","args","SHORTCODES_REGEX","shortcodesRegexp","shortcodes","RegExp","resolvedEmojisCache","MAX_CACHE_SIZE","resolveEmojis","resolverURL","emojiTags","headers","accept","referrerPolicy","json","tag","filter","t","emojis","all","emoji","shortcode","name","mediaType","firstKey","keys","next","delete","error","renderEmojiText","allEmojis","elements","regex","index","staticEmoji","word","resolvedEmojis","setResolvedEmojis","setLoading","hasUnresolved","matches","some","match","slice","resolved","RolesTags","roles","accountId","accountUrl","hideSelf","isSelf","getCurrentAccountID","parsedAccountInstance","nameCollator","sensitivity","Collator","ACCT_REGEX","SPACES_REGEX","NON_ALPHA_NUMERIC_REGEX","NameText","account","instance","showAvatar","showAcct","short","external","useLingui","acct","avatar","avatarStatic","displayName","bot","username","acct1","acct2","api","trimmedUsername","toLowerCase","trimmedDisplayName","shortenedDisplayName","shortenedAlphaNumericDisplayName","hideUsername","compare","preventDefault","which","internalURL","showAccount","_Fragment","EmojiText","r","u","codeMappings","zh_HANT","mnMong","IntlDN","DisplayNames","notSameIncaseSensitive","s1","s2","_localeCode2Text","code","fallback","of","anotherText","yetAnotherText","translangLanguagesNative","translationTargetLanguages","Object","tl","localeTargetLanguages","getTranslateTargetLanguage","fromSettings","contentTranslationTargetLanguage","settings","NF","NumberFormat","BYTES_UNITS","prettyBytes","bytes","unitIndex","log2","unit","unitDisplay","maximumFractionDigits","supportsNativeQuote","getAPIVersions","mastodon","getPostQuoteApprovalPolicy","quoteApproval","currentUser","ESCAPE_REGEX","HTML_ESCAPE_MAP","HTML_ESCAPE_REGEX","escapeRegex","escapeHTML","char","emojifyText","emojiMap","pattern","sc","escapedShortcode","HTML_CHARS_REGEX","HTML_ENTITIES","c","fauxDiv","whitelistLinkClasses","LINK_REGEX","HTTP_LINK_REGEX","MENTION_REGEX","HASHTAG_REGEX","HASH_EMOJI_REGEX","CODE_BLOCK_REGEX","CODE_BLOCK_START_REGEX","CODE_BLOCK_END_REGEX","INLINE_CODE_REGEX","TWITTER_DOMAIN_REGEX","TWITTER_MENTION_REGEX","TWITTER_MENTION_CAPTURE_REGEX","CODE_INLINE_CAPTURE_REGEX","createDOM","isDocumentFragment","tpl","_enhanceContent","returnDOM","postEnhanceDOM","enhancedContent","hasLink","hasCodeBlock","noTargetBlankLinks","link","links","shortenLink","usernames","hasChildren","atSymbol","domain","d","push","hashSymbol","actualText","textNodes","extractTextNodes","nodeValue","blocks","p","block","pre","br","codeBlocks","paragraphs","nextParagraphs","currentBlock","nextElementSibling","tagName","codeText","replaceAll","rejectFilter","prevIndex","hashtagStuffedParagraphs","hashtagCount","nodeType","Node","TEXT_NODE","linkText","startsWith","imgs","img","getAttribute","setProperty","span","replaceChild","queueMicrotask","enhanceContent","defaultRejectFilterMap","fromEntries","defaultRejectFilter","nodeName","URL_PREFIX_REGEX","URL_DISPLAY_LENGTH","prefix","displayURL","suffix","rejectFilterMap","assign","reduce","acc","cur","walk","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","nextNode","FAMILIAR_FOLLOWERS_MAX_AGE","fetchFamiliarFollowers","currentID","masto","v1","accounts","familiarFollowers","memFetchFamiliarFollowers","pmem","expires","normalizeURL","parsed","sort","search","isSameURL","a","supportsHover","handleContentLinks","mentions","previewMode","statusURL","taggedCollections","kindaLargeRatio","showMediaModal","description","contains","prevText","previousSibling","textBeforeLinkIsAt","endsWith","textStartsWithAt","targetText","mention","find","textBeforeLinkIsHash","hashURL","unfurledLinks","hostname","containsDomain","showOpenLink","shortenNumber","num","notation","roundingMode","containPixelfed","notContainPixelfed","platformFeatures","containPleroma","containAkkoma","supportsCache","semverExtract","atSoftwareSlashMatch","feature","getCurrentInstance","softwareName","getCurrentNodeInfo","software","featureMatch","range","features","doesSoftwareMatch","satisfiesRange","satisfies","includePrerelease","loose","AccountBlock","skeleton","avatarSize","avatarDescription","useAvatarStatic","internal","showActivity","showStats","accountInstance","hideDisplayName","excludeRelationshipAttrs","relationship","hasRelationshipProp","_useLingui","currentInstance","currentAccountID","setFamiliarFollowers","statusesCount","lastStatusAt","fields","note","group","followersCount","createdAt","locked","verifiedField","f","verifiedAt","relationshipObj","excludedRelationship","hasRelationship","following","followedBy","requested","accountDomain","getDomain","sameCurrentInstance","rel","aborted","followers","_t","_Trans","follower","components","fetchRelationships","relationshipsMap","currentAccount","uniqueAccountIds","relationships","newRelationshipsMap","i18nDuration","supportsLanguageDetector","self","supportsBrowserTranslator","langDetector","availability","LanguageDetector","log","originalSource","detect","detectedSourceLanguage","groupLabel","groupCollapsed","targetLanguage","translatorCapabilities","translator","Translator","sourceLanguage","create","React.Component","React.createElement","React3","React3.useInsertionEffect","React3.useLayoutEffect","React3.useEffect","React3.useRef","React3.useCallback","TOP","shazamIDs","LazyShazam","containerRef","visibleStart","setVisibleStart","useOnInView","inView","hidden","onInView","rootMargin","trackVisibility","triggerOnce","skip","rect","getBoundingClientRect","bottom","sourceLanguages","sl","PHANPY_TRANSLANG_INSTANCES","TRANSLANG_INSTANCES","translationQueue","TRANSLATED_MAX_AGE","currentTranslangInstance","_translangTranslate","source","fetchCall","fetchPromise","method","priority","then","res","ok","provider","translated_text","pRetry","retries","onFailedAttempt","translangTranslate","throttledTranslangTranslate","throttledBrowserTranslate","TranslationBlock","targetLang","uiState","setUIState","pronunciationContent","setPronunciationContent","translatedContent","setTranslatedContent","setDetectedLang","detailsRef","abortControllerRef","sourceLangText","apiSourceLang","onTranslate","detectedLangText","pronunciation","mini","behavior","translate","AbortController","onChange","common","native","showCommon","detectedLang","Loader","abrupt","initDB","dbName","storeName","createStore","val","getMany","del","delMany","clear","drafts","catchup","yearInPosts","EditHistoryContext","createContext","supportsViewTransition","startViewTransition","EditHistoryProvider","statusID","editHistoryRef","editHistoryMode","setEditHistoryMode","editedAtIndex","_setEditedAtIndex","setEditedAtIndex","fetchEditHistory","history","statuses","$select","list","initEditHistory","exitEditHistory","FilterContext","_isFiltered","filtered","filterContext","appliedFilters","hasContext","context","expiresAt","filterAction","isHidden","action","every","isBlur","filterTitles","titles","titlesStr","isWarn","isFiltered","filteredItem","item","filterState","filteredItems","items","htmlContentLength","supportsTTS","speak","speechSynthesis","speaking","cancel","utterance","SpeechSynthesisUtterance","useThrottledResizeObserver","onResize","useThrottledCallback","useResizeObserver","useTruncated","onTruncated","prevTruncatedRef","box","scrollHeight","truncated","_height","maxHeight","computedHeight","toggle","public","unlisted","private","direct","visibilityText","ACCOUNT_ITEMS_LIMIT","ACCOUNT_ROTATION_INTERVAL","CollectionCard","collection","creatorAccount","showMeta","snapStates","useSnapshot","itemsCount","updatedAt","discoverable","sensitive","rotationSlot","selectedItems","offset","accountItems","Boolean","bgAccounts","creator","missingIDs","Set","concat","catch","visibleCount","overflowCount","relativeTime","LazyRender","as","Root","renderIfHasChildren","rootRef","Children","toArray","child","observerRef","entry","import","meta","env","DELIMITERS_REGEX","DELIMITERS_PATTERNS","cleanDOMForTemml","startRegex","START_DELIMITERS","walker","textNode","startMatch","endDelimiter","nodesToCombine","currentNode","foundEnd","combinedText","nextSibling","ELEMENT_NODE","MathBlock","contentRef","onRevert","lastIndex","hasLatexContent","mathRendered","setMathRendered","toggleMathRendering","temml","default","originalContentRefHTML","renderMathInElement","fences","annotate","throwOnError","errorCallback","err","hasMath","htmlChanged","isSsr","createRef","React","Component","PinchZoomComp","formatDuration","time","hours","minutes","padStart","dataAltLabel","AltBadge","showMediaAlt","MEDIA_CAPTION_LIMIT","MEDIA_CAPTION_LIMIT_LONGER","isMediaCaptionLong","caption","isStreamingVideoSupported","canPlayType","Media","showOriginal","autoAnimate","showCaption","allowLongerCaption","altIndex","checkAspectRatio","autoplay","blurhash","previewRemoteUrl","previewUrl","remoteUrl","mediaVTN","getSafeViewTransitionName","original","small","mediaURL","remoteMediaURL","hasPreviewDimensions","orientation","rgbAverageColor","getBlurHashAverageColor","videoRef","focalPosition","toFixed","mediaRef","onUpdate","make3dTransformValue","removeProperty","touchAction","pinchZoomEnabled","setPinchZoomEnabled","quickPinchZoomProps","draggableUnZoomed","inertiaFriction","tapZoomFactor","doubleTapToggleZoom","mediaLoadError","setMediaLoadError","Parent","remoteMediaURLObj","getURLObj","isVideoMaybe","isStreamingVideoMaybe","isAudioMaybe","isImage","isPreviewVideoMaybe","parentRef","imageSmallerThanParent","setImageSmallerThanParent","offsetHeight","smaller","maxAspectHeight","averageColorStyle","mediaStyles","aspectRatio","longDesc","showInlineDesc","Figure","postViewState","interceptOnClick","isOnPostPage","el","viewTransitioned","viewTransitionName","mediaElements","pause","backgroundImage","backgroundSize","mediaImage","objectPosition","$media","clientWidth","minDimension","displayNaturalHeight","almostSimilarHeight","$mediaParent","hasDuration","shortDuration","isGIF","loopable","formattedDuration","hoverAnimate","autoGIFAnimate","showProgress","videoURL","onMouseEnter","onMouseLeave","onBlur","dangerouslySetInnerHTML","poster","preload","playsinline","loop","muted","onTimeUpdate","container","percentage","currentTime","disablePictureInPicture","onLoadedMetadata","background","controls","controlsList","autoPlay","playsInline","safeName","inputString","oldProps","oldMedia","newMedia","newProps","MediaFirstContainer","postID","moreThanOne","carouselRef","currentIndex","setCurrentIndex","handleScroll","scrollLeft","scrollTo","MultipleMediaFigure","captionChildren","POLL_OPTIONS_BATCH_SIZE","Poll","readOnly","refresh","votePoll","visibleOptionsCount","setVisibleOptionsCount","loadMoreRef","expired","ownVotes","voted","votersCount","votesCount","expiresAtDate","pollVotesCount","roundPrecision","showResults","setShowResults","optionsHaveVoteCounts","resultsView","selectedOptions","setSelectedOptions","IntersectionObserver","isIntersecting","prev","disconnect","voteOptionsSelectionCount","showPollInfo","setShowPollInfo","option","optionVotesCount","ratio","minHeight","onSubmit","choices","isSelected","checked","1","HTTP_REGEX","PostContent","post","sKey","statusKey","quotes","statusQuotes","divRef","replaceChildren","cloneNode","originalURL","generateHTMLCode","level","accountURL","accountEmojis","editedAt","uniqueQuotes","q","arr","findIndex","q2","quoteStatusesHTML","createdAtDate","contentHTML","sourceMediaURL","previewMediaURL","sourceMediaURLObj","isVideo","isAudio","mediaHTML","htmlCode","PostEmbedModal","readonly","select","clipboard","writeText","download","TruncatedLink","FETCH_DELAY","BATCH_LIMIT","QuoteChainModal","statusId","posts","setPosts","nextPostID","setNextPostID","fetchQuoteChain","fetchCount","currentPostID","fullStatus","getStatus","quotedStatusId","cached","tabindex","_t2","onContextMenu","postEl","dispatchEvent","clientX","Status","showCommentCount","showQuoteCount","QuoteSettingsSheet","currentPolicy","selectedPolicy","setSelectedPolicy","quoteApprovalPolicy","formData","FormData","newStatus","interactionPolicy","update","quote_approval_policy","saveStatus","skipThreading","skipUnfurling","handleFormSubmit","LIMIT","QuotesModal","showMore","setShowMore","quotesIterator","firstLoad","loadQuotes","isFirstLoad","limit","done","clientY","StatusButton","count","extraCount","otherProps","buttonTitle","setButtonTitle","iconAlt","setIconAlt","Byline","authors","author","isCardPost","StatusCard","card","selfReferential","selfAuthor","providerName","providerUrl","authorName","authorUrl","imageDescription","embedUrl","publishedAt","hasText","cardStatusURL","setCardStatusURL","isMastodonLinkMaybe","abortController","unfurlMastodonLink","result","unfurlCollectionLink","abort","collections","hasIframeHTML","handleClick","unfurled","showEmbedModal","blurhashImage","setBlurhashImage","blurhashPixels","decodeBlurHash","h","createImageData","convertToBlob","toDataURL","isPost","videoID","videoid","nocookie","StatusCompact","statusReply","visibility","srKey","statusPeekText","getCurrentAccID","filterInfo","filterTitleStr","ANOTHER_HASHTAG_REGEX","collator","usage","isSameTag","extractTagsFromStatus","indexOf","tags","allLinks","StatusTags","tagsToShow","hashtagsInContent","ht","ThreadCountContext","ThreadIcon","ThreadBadge","showIcon","showText","total","hasIndex","hasTotal","SHOW_COMMENT_COUNT_LIMIT","INLINE_TRANSLATE_LIMIT","MAX_COLLECTIONS","accountQueue","fetchAccount","memFetchAccount","isIOS","ontouchstart","REACTIONS_LIMIT","getPollText","getPostText","maskCustomEmojis","maskURLs","hideInlineQuote","htmlTextOpts","emojisRegex","fullText","forgivingQSA","selectors","selector","getHTMLTextForDetectLang","isTranslateble","SIZE_CLASS","detectLang","langs","detectedLanguage","groupEnd","detectAll","readMoreText","DIFFERENT_LANG_CHECK","diffLangCheckCacheKey","checkDifferentLanguage","contentTranslationHideLanguages","cacheKey","different","quotePrivate","requestQuote","quoteManualReview","quoteFollowersOnly","quoteCannot","nobody","QUESTION_REGEX","DEV","ghost","inReplyToAccountId","ghostAccount","mediaFirst","authenticated","sameInstance","eStatus","_language","languageAutoDetected","detected","setLanguageAutoDetected","hasMediaAttachments","debugHover","allowFilters","FilteredStatus","showFollowedTags","quoted","inReplyToAccount","setInReplyToAccount","withinContext","mentionSelf","prefs","readingExpandMedia","showSpoilerMedia","enableCommentHint","FollowedTagsParent","statusFollowedTags","StatusParent","isSizeLarge","contentLength","forceTranslate","contentTranslation","enableTranslate","contentTranslationAutoInline","showEdited","setShowEdited","showEmbed","setShowEmbed","showQuoteSettings","setShowQuoteSettings","showQuotes","setShowQuotes","showQuoteChain","setShowQuoteChain","spoilerContentRef","mediaContainerRef","reloadPostContentCount","reloadPostContent","unauthInteractionErrorMessage","textWeight","createdDateText","isPublic","canBoost","quoteDisabled","quoteText","quoteMetaText","isMineAndPrivate","isQuoteAutomaticallyAccepted","isQuoteManuallyAccepted","isQuoteFollowersOnly","isMine","quoteMessages","postQuoteApprovalPolicy","replyStatus","replyMode","replyToStatus","mediaNoDesc","attachment","statusMonthsAgo","reblogged","favouriteStatus","favouritesCount","favourited","trigger","bookmarkStatus","bookmarked","bookmarkStatusNotify","differentLanguage","setDifferentLanguage","reblogIterator","favouriteIterator","fetchBoostedLikedByAccounts","reblogResults","favouriteResults","isQuotingMyPost","actionsRef","allMentions","tooManyMentions","mentionsCount","ReplyMenuContent","StatusMenuItems","replyModeMenuItems","quoteStatus","canQuote","showActionsBar","showGenericAccounts","showReactions","setForceTranslate","postText","onStatusLinkClick","editedDateText","nicePostURL","isPinnable","quoteApprovalPolicyMessages","editStatus","MenuDivider","reloadStatusPage","showReportModal","contextMenuRef","isContextMenuOpen","contextMenuProps","showContextMenu","bindLongPressContext","statusRef","setContextMenuProps","anchorPoint","setIsContextMenuOpen","captureEvent","cancelOnMovement","hotkeysEnabled","handler","activeStatus","spoilerButton","spoilerMediaButton","displayedMediaAttachments","showMultipleMediaCaptions","indices","attachments","inReplyToId","statusThreadNumber","showCommentHint","isThread","repliesCount","forceShowCommentCount","reblog","collectionsWithCard","tc","cardUrl","matchIndex","matched","others","nodeRef","rRef","fRef","dRef","xRef","qRef","selection","anchorNode","portal","favouriteStatusNotify","_pinned","quoteDomain","_deleted","anchorRef","visibilityIconsMap","showSpoiler","spoilersMedia","readingExpandSpoilers","newPoll","autoDetected","onMediaClick","QuoteStatuses","collapsed","fallbackQuote","quotesCount","emojiReactions","me","emojiReaction","isShortCode","reblogsCount","viewScroll","fetchStatusHistory","urlObj","revealableUnfulfilledStates","filterHidden","pending","deleted","unauthorized","rejected","revoked","blocked_account","blocked_domain","isStaticQuote","unfulfilledState","isRevealable","isRevealed","quoteKey","quotedAccount","quotedAccountAcct","message","unfulfilledText","revealedQuotes","ShallowQuote","state","QuoteStatus","editHistory","setEditHistory","weekday","second","isReblog","setShowPeek","bindLongPressPeek","statusPeekRef","ssKey","actualStatusID","isFollowedTags","_t3","MIN_SCHEDULED_AT","MAX_SCHEDULED_AT","ScheduledAtField","scheduledAt","setScheduledAt","minStr","setMinStr","setMaxStr","timezoneOffset","updateMinStr","updateMaxStr","intervalId","defaultValue","maxStr","required","getLocalTimezoneName","formatter","formatToParts"],"ignoreList":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,63,64,65,66,67,68,74,91,92,94,97,104,112,113,114,115,116,117,118,125,126,127,133,141,142],"sources":["../../node_modules/toastify-js/src/toastify.js","../../node_modules/react-hotkeys-hook/dist/index.js","../../src/utils/show-toast.js","../../src/utils/useInterval.js","../../node_modules/@szhsin/react-menu/dist/esm/utils/utils.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useBEM.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/constants.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuContainer.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/submenuCtx.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItems.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/getNormalizedClientRect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/getPositionHelpers.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeArrowVertical.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeLeftorRight.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeArrowHorizontal.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeToporBottom.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/positionMenu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useIsomorphicLayoutEffect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useCombinedRef.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuList.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/ControlledMenu.mjs","../../node_modules/react-transition-state/dist/esm/internal.mjs","../../node_modules/react-transition-state/dist/esm/useTransitionState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMenuState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMenuStateAndFocus.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useClick.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/Menu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/withHovering.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMouseOver.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItemEffect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/SubMenu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItemState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuItem.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/FocusableItem.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuDivider.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuHeader.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuGroup.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuRadioGroup.mjs","../../node_modules/use-long-press/index.mjs","../../node_modules/web-haptics/dist/chunk-4NSAIXAB.mjs","../../src/utils/haptics.js","../../src/utils/dtf-locale.js","../../src/utils/date-time-format.js","../../src/utils/nice-date-time.js","../../src/utils/open-compose.js","../../src/utils/open-osk.js","../../src/utils/safe-bounding-box-padding.js","../../src/utils/show-compose.js","../../src/utils/getHTMLText.js","../../src/utils/status-peek.js","../../src/components/icon.jsx","../../src/components/link.jsx","../../src/components/menu-link.jsx","../../src/utils/relative-time-format.js","../../src/components/relative-time.jsx","../../src/components/submenu2.jsx","../../src/utils/useCloseWatcher.js","../../src/components/modal.jsx","../../src/components/avatar.jsx","../../src/utils/is-rtl.js","../../src/utils/useWindowSize.js","../../src/components/menu2.jsx","../../src/components/menu-confirm.jsx","../../node_modules/js-binary-schema-parser/lib/index.js","../../node_modules/js-binary-schema-parser/lib/parsers/uint8.js","../../node_modules/js-binary-schema-parser/lib/schemas/gif.js","../../node_modules/gifuct-js/lib/deinterlace.js","../../node_modules/gifuct-js/lib/lzw.js","../../node_modules/gifuct-js/lib/index.js","../../src/utils/get-gif-first-frame.js","../../src/components/custom-emoji.jsx","../../src/components/emoji-text.jsx","../../src/components/roles-tags.jsx","../../src/components/name-text.jsx","../../node_modules/use-debounce/dist/index.module.js","../../src/utils/localeCode2Text.js","../../src/utils/get-translate-target-language.js","../../src/utils/nf.js","../../src/utils/pretty-bytes.js","../../src/utils/quote-utils.js","../../src/utils/emojify-text.js","../../src/utils/escape-html.js","../../src/utils/enhance-content.js","../../src/utils/familiar-followers.js","../../src/utils/is-same-url.js","../../src/utils/handle-content-links.js","../../src/utils/shorten-number.js","../../src/utils/supports.js","../../src/components/account-block.jsx","../../src/utils/relationships.js","../../src/utils/i18n-duration.js","../../node_modules/is-network-error/index.js","../../node_modules/p-retry/index.js","../../src/utils/browser-translator.js","../../node_modules/react-intersection-observer/dist/index.mjs","../../src/components/lazy-shazam.jsx","../../src/components/translation-block.jsx","../../node_modules/idb-keyval/dist/index.js","../../src/utils/db.js","../../src/utils/edit-history-context.jsx","../../src/utils/filter-context.js","../../src/utils/filters.js","../../src/utils/html-content-length.js","../../src/utils/speech.js","../../node_modules/use-resize-observer/dist/bundle.esm.js","../../src/utils/useThrottledResizeObserver.js","../../src/utils/useTruncated.js","../../src/utils/visibility-icons-map.js","../../src/utils/visibility-text.jsx","../../src/components/collection-card.jsx","../../src/components/lazy-render.jsx","../../src/components/math-block.jsx","../../node_modules/fast-blurhash/index.js","../../node_modules/tslib/tslib.es6.mjs","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/styles.css.js","../../node_modules/react-quick-pinch-zoom/esm/utils.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/getOffsetBounds.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/component.js","../../node_modules/react-quick-pinch-zoom/esm/index.js","../../src/utils/format-duration.js","../../src/components/media.jsx","../../src/components/media-first-container.jsx","../../src/components/multiple-media-figure.jsx","../../src/components/poll.jsx","../../src/components/post-content.jsx","../../node_modules/html-prettify/src/utils/addIndentation.js","../../node_modules/html-prettify/src/utils/toLines.js","../../node_modules/html-prettify/src/index.js","../../src/components/post-embed-modal.jsx","../../src/components/quote-chain-modal.jsx","../../src/components/quote-settings-sheet.jsx","../../src/components/quotes-modal.jsx","../../src/components/status-button.jsx","../../node_modules/@justinribeiro/lite-youtube/lite-youtube.js","../../src/components/byline.jsx","../../src/components/status-card.jsx","../../src/components/status-compact.jsx","../../src/components/status-tags.jsx","../../src/utils/thread-count-context.js","../../src/components/thread-badge.jsx","../../src/components/status.jsx","../../node_modules/uid/single/index.mjs","../../node_modules/fuse.js/dist/fuse.mjs","../../src/components/ScheduledAtField.jsx"],"sourcesContent":["/*!\n * Toastify js 1.12.0\n * https://github.com/apvarun/toastify-js\n * @license MIT licensed\n *\n * Copyright (C) 2018 Varun A P\n */\n(function(root, factory) {\n if (typeof module === \"object\" && module.exports) {\n module.exports = factory();\n } else {\n root.Toastify = factory();\n }\n})(this, function(global) {\n // Object initialization\n var Toastify = function(options) {\n // Returning a new init object\n return new Toastify.lib.init(options);\n },\n // Library version\n version = \"1.12.0\";\n\n // Set the default global options\n Toastify.defaults = {\n oldestFirst: true,\n text: \"Toastify is awesome!\",\n node: undefined,\n duration: 3000,\n selector: undefined,\n callback: function () {\n },\n destination: undefined,\n newWindow: false,\n close: false,\n gravity: \"toastify-top\",\n positionLeft: false,\n position: '',\n backgroundColor: '',\n avatar: \"\",\n className: \"\",\n stopOnFocus: true,\n onClick: function () {\n },\n offset: {x: 0, y: 0},\n escapeMarkup: true,\n ariaLive: 'polite',\n style: {background: ''}\n };\n\n // Defining the prototype of the object\n Toastify.lib = Toastify.prototype = {\n toastify: version,\n\n constructor: Toastify,\n\n // Initializing the object with required parameters\n init: function(options) {\n // Verifying and validating the input object\n if (!options) {\n options = {};\n }\n\n // Creating the options object\n this.options = {};\n\n this.toastElement = null;\n\n // Validating the options\n this.options.text = options.text || Toastify.defaults.text; // Display message\n this.options.node = options.node || Toastify.defaults.node; // Display content as node\n this.options.duration = options.duration === 0 ? 0 : options.duration || Toastify.defaults.duration; // Display duration\n this.options.selector = options.selector || Toastify.defaults.selector; // Parent selector\n this.options.callback = options.callback || Toastify.defaults.callback; // Callback after display\n this.options.destination = options.destination || Toastify.defaults.destination; // On-click destination\n this.options.newWindow = options.newWindow || Toastify.defaults.newWindow; // Open destination in new window\n this.options.close = options.close || Toastify.defaults.close; // Show toast close icon\n this.options.gravity = options.gravity === \"bottom\" ? \"toastify-bottom\" : Toastify.defaults.gravity; // toast position - top or bottom\n this.options.positionLeft = options.positionLeft || Toastify.defaults.positionLeft; // toast position - left or right\n this.options.position = options.position || Toastify.defaults.position; // toast position - left or right\n this.options.backgroundColor = options.backgroundColor || Toastify.defaults.backgroundColor; // toast background color\n this.options.avatar = options.avatar || Toastify.defaults.avatar; // img element src - url or a path\n this.options.className = options.className || Toastify.defaults.className; // additional class names for the toast\n this.options.stopOnFocus = options.stopOnFocus === undefined ? Toastify.defaults.stopOnFocus : options.stopOnFocus; // stop timeout on focus\n this.options.onClick = options.onClick || Toastify.defaults.onClick; // Callback after click\n this.options.offset = options.offset || Toastify.defaults.offset; // toast offset\n this.options.escapeMarkup = options.escapeMarkup !== undefined ? options.escapeMarkup : Toastify.defaults.escapeMarkup;\n this.options.ariaLive = options.ariaLive || Toastify.defaults.ariaLive;\n this.options.style = options.style || Toastify.defaults.style;\n if(options.backgroundColor) {\n this.options.style.background = options.backgroundColor;\n }\n\n // Returning the current object for chaining functions\n return this;\n },\n\n // Building the DOM element\n buildToast: function() {\n // Validating if the options are defined\n if (!this.options) {\n throw \"Toastify is not initialized\";\n }\n\n // Creating the DOM object\n var divElement = document.createElement(\"div\");\n divElement.className = \"toastify on \" + this.options.className;\n\n // Positioning toast to left or right or center\n if (!!this.options.position) {\n divElement.className += \" toastify-\" + this.options.position;\n } else {\n // To be depreciated in further versions\n if (this.options.positionLeft === true) {\n divElement.className += \" toastify-left\";\n console.warn('Property `positionLeft` will be depreciated in further versions. Please use `position` instead.')\n } else {\n // Default position\n divElement.className += \" toastify-right\";\n }\n }\n\n // Assigning gravity of element\n divElement.className += \" \" + this.options.gravity;\n\n if (this.options.backgroundColor) {\n // This is being deprecated in favor of using the style HTML DOM property\n console.warn('DEPRECATION NOTICE: \"backgroundColor\" is being deprecated. Please use the \"style.background\" property.');\n }\n\n // Loop through our style object and apply styles to divElement\n for (var property in this.options.style) {\n divElement.style[property] = this.options.style[property];\n }\n\n // Announce the toast to screen readers\n if (this.options.ariaLive) {\n divElement.setAttribute('aria-live', this.options.ariaLive)\n }\n\n // Adding the toast message/node\n if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) {\n // If we have a valid node, we insert it\n divElement.appendChild(this.options.node)\n } else {\n if (this.options.escapeMarkup) {\n divElement.innerText = this.options.text;\n } else {\n divElement.innerHTML = this.options.text;\n }\n\n if (this.options.avatar !== \"\") {\n var avatarElement = document.createElement(\"img\");\n avatarElement.src = this.options.avatar;\n\n avatarElement.className = \"toastify-avatar\";\n\n if (this.options.position == \"left\" || this.options.positionLeft === true) {\n // Adding close icon on the left of content\n divElement.appendChild(avatarElement);\n } else {\n // Adding close icon on the right of content\n divElement.insertAdjacentElement(\"afterbegin\", avatarElement);\n }\n }\n }\n\n // Adding a close icon to the toast\n if (this.options.close === true) {\n // Create a span for close element\n var closeElement = document.createElement(\"button\");\n closeElement.type = \"button\";\n closeElement.setAttribute(\"aria-label\", \"Close\");\n closeElement.className = \"toast-close\";\n closeElement.innerHTML = \"&#10006;\";\n\n // Triggering the removal of toast from DOM on close click\n closeElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n this.removeElement(this.toastElement);\n window.clearTimeout(this.toastElement.timeOutValue);\n }.bind(this)\n );\n\n //Calculating screen width\n var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n // Adding the close icon to the toast element\n // Display on the right if screen width is less than or equal to 360px\n if ((this.options.position == \"left\" || this.options.positionLeft === true) && width > 360) {\n // Adding close icon on the left of content\n divElement.insertAdjacentElement(\"afterbegin\", closeElement);\n } else {\n // Adding close icon on the right of content\n divElement.appendChild(closeElement);\n }\n }\n\n // Clear timeout while toast is focused\n if (this.options.stopOnFocus && this.options.duration > 0) {\n var self = this;\n // stop countdown\n divElement.addEventListener(\n \"mouseover\",\n function(event) {\n window.clearTimeout(divElement.timeOutValue);\n }\n )\n // add back the timeout\n divElement.addEventListener(\n \"mouseleave\",\n function() {\n divElement.timeOutValue = window.setTimeout(\n function() {\n // Remove the toast from DOM\n self.removeElement(divElement);\n },\n self.options.duration\n )\n }\n )\n }\n\n // Adding an on-click destination path\n if (typeof this.options.destination !== \"undefined\") {\n divElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n if (this.options.newWindow === true) {\n window.open(this.options.destination, \"_blank\");\n } else {\n window.location = this.options.destination;\n }\n }.bind(this)\n );\n }\n\n if (typeof this.options.onClick === \"function\" && typeof this.options.destination === \"undefined\") {\n divElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n this.options.onClick();\n }.bind(this)\n );\n }\n\n // Adding offset\n if(typeof this.options.offset === \"object\") {\n\n var x = getAxisOffsetAValue(\"x\", this.options);\n var y = getAxisOffsetAValue(\"y\", this.options);\n\n var xOffset = this.options.position == \"left\" ? x : \"-\" + x;\n var yOffset = this.options.gravity == \"toastify-top\" ? y : \"-\" + y;\n\n divElement.style.transform = \"translate(\" + xOffset + \",\" + yOffset + \")\";\n\n }\n\n // Returning the generated element\n return divElement;\n },\n\n // Displaying the toast\n showToast: function() {\n // Creating the DOM object for the toast\n this.toastElement = this.buildToast();\n\n // Getting the root element to with the toast needs to be added\n var rootElement;\n if (typeof this.options.selector === \"string\") {\n rootElement = document.getElementById(this.options.selector);\n } else if (this.options.selector instanceof HTMLElement || (typeof ShadowRoot !== 'undefined' && this.options.selector instanceof ShadowRoot)) {\n rootElement = this.options.selector;\n } else {\n rootElement = document.body;\n }\n\n // Validating if root element is present in DOM\n if (!rootElement) {\n throw \"Root element is not defined\";\n }\n\n // Adding the DOM element\n var elementToInsert = Toastify.defaults.oldestFirst ? rootElement.firstChild : rootElement.lastChild;\n rootElement.insertBefore(this.toastElement, elementToInsert);\n\n // Repositioning the toasts in case multiple toasts are present\n Toastify.reposition();\n\n if (this.options.duration > 0) {\n this.toastElement.timeOutValue = window.setTimeout(\n function() {\n // Remove the toast from DOM\n this.removeElement(this.toastElement);\n }.bind(this),\n this.options.duration\n ); // Binding `this` for function invocation\n }\n\n // Supporting function chaining\n return this;\n },\n\n hideToast: function() {\n if (this.toastElement.timeOutValue) {\n clearTimeout(this.toastElement.timeOutValue);\n }\n this.removeElement(this.toastElement);\n },\n\n // Removing the element from the DOM\n removeElement: function(toastElement) {\n // Hiding the element\n // toastElement.classList.remove(\"on\");\n toastElement.className = toastElement.className.replace(\" on\", \"\");\n\n // Removing the element from DOM after transition end\n window.setTimeout(\n function() {\n // remove options node if any\n if (this.options.node && this.options.node.parentNode) {\n this.options.node.parentNode.removeChild(this.options.node);\n }\n\n // Remove the element from the DOM, only when the parent node was not removed before.\n if (toastElement.parentNode) {\n toastElement.parentNode.removeChild(toastElement);\n }\n\n // Calling the callback function\n this.options.callback.call(toastElement);\n\n // Repositioning the toasts again\n Toastify.reposition();\n }.bind(this),\n 400\n ); // Binding `this` for function invocation\n },\n };\n\n // Positioning the toasts on the DOM\n Toastify.reposition = function() {\n\n // Top margins with gravity\n var topLeftOffsetSize = {\n top: 15,\n bottom: 15,\n };\n var topRightOffsetSize = {\n top: 15,\n bottom: 15,\n };\n var offsetSize = {\n top: 15,\n bottom: 15,\n };\n\n // Get all toast messages on the DOM\n var allToasts = document.getElementsByClassName(\"toastify\");\n\n var classUsed;\n\n // Modifying the position of each toast element\n for (var i = 0; i < allToasts.length; i++) {\n // Getting the applied gravity\n if (containsClass(allToasts[i], \"toastify-top\") === true) {\n classUsed = \"toastify-top\";\n } else {\n classUsed = \"toastify-bottom\";\n }\n\n var height = allToasts[i].offsetHeight;\n classUsed = classUsed.substr(9, classUsed.length-1)\n // Spacing between toasts\n var offset = 15;\n\n var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n // Show toast in center if screen with less than or equal to 360px\n if (width <= 360) {\n // Setting the position\n allToasts[i].style[classUsed] = offsetSize[classUsed] + \"px\";\n\n offsetSize[classUsed] += height + offset;\n } else {\n if (containsClass(allToasts[i], \"toastify-left\") === true) {\n // Setting the position\n allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + \"px\";\n\n topLeftOffsetSize[classUsed] += height + offset;\n } else {\n // Setting the position\n allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + \"px\";\n\n topRightOffsetSize[classUsed] += height + offset;\n }\n }\n }\n\n // Supporting function chaining\n return this;\n };\n\n // Helper function to get offset.\n function getAxisOffsetAValue(axis, options) {\n\n if(options.offset[axis]) {\n if(isNaN(options.offset[axis])) {\n return options.offset[axis];\n }\n else {\n return options.offset[axis] + 'px';\n }\n }\n\n return '0px';\n\n }\n\n function containsClass(elem, yourClass) {\n if (!elem || typeof yourClass !== \"string\") {\n return false;\n } else if (\n elem.className &&\n elem.className\n .trim()\n .split(/\\s+/gi)\n .indexOf(yourClass) > -1\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n // Setting up the prototype for the init object\n Toastify.lib.init.prototype = Toastify.lib;\n\n // Returning the Toastify function to be assigned to the window object/module\n return Toastify;\n});\n","import { createContext as T, useContext as M, useState as A, useCallback as w, useRef as S, useLayoutEffect as z, useEffect as J } from \"react\";\nimport { jsx as b } from \"react/jsx-runtime\";\nconst j = [\"shift\", \"alt\", \"meta\", \"mod\", \"ctrl\", \"control\"], Q = {\n esc: \"escape\",\n return: \"enter\",\n left: \"arrowleft\",\n right: \"arrowright\",\n up: \"arrowup\",\n down: \"arrowdown\",\n ShiftLeft: \"shift\",\n ShiftRight: \"shift\",\n AltLeft: \"alt\",\n AltRight: \"alt\",\n MetaLeft: \"meta\",\n MetaRight: \"meta\",\n OSLeft: \"meta\",\n OSRight: \"meta\",\n ControlLeft: \"ctrl\",\n ControlRight: \"ctrl\"\n};\nfunction K(e) {\n return (Q[e.trim()] || e.trim()).toLowerCase().replace(/key|digit|numpad/, \"\");\n}\nfunction D(e) {\n return j.includes(e);\n}\nfunction H(e, r = \",\") {\n return e.toLowerCase().split(r);\n}\nfunction P(e, r = \"+\", o = \">\", i = !1, c, a) {\n let n = [], y = !1;\n e = e.trim(), e.includes(o) ? (y = !0, n = e.toLocaleLowerCase().split(o).map((f) => K(f))) : n = e.toLocaleLowerCase().split(r).map((f) => K(f));\n const u = {\n alt: n.includes(\"alt\"),\n ctrl: n.includes(\"ctrl\") || n.includes(\"control\"),\n shift: n.includes(\"shift\"),\n meta: n.includes(\"meta\"),\n mod: n.includes(\"mod\"),\n useKey: i\n }, l = n.filter((f) => !j.includes(f));\n return {\n ...u,\n keys: l,\n description: c,\n isSequence: y,\n hotkey: e,\n metadata: a\n };\n}\ntypeof document < \"u\" && (document.addEventListener(\"keydown\", (e) => {\n e.code !== void 0 && _([K(e.code)]);\n}), document.addEventListener(\"keyup\", (e) => {\n e.code !== void 0 && I([K(e.code)]);\n})), typeof window < \"u\" && (window.addEventListener(\"blur\", () => {\n L.clear();\n}), window.addEventListener(\"contextmenu\", () => {\n setTimeout(() => {\n L.clear();\n }, 0);\n}));\nconst L = /* @__PURE__ */ new Set();\nfunction R(e) {\n return Array.isArray(e);\n}\nfunction U(e, r = \",\") {\n return (R(e) ? e : e.split(r)).every((i) => L.has(i.trim().toLowerCase()));\n}\nfunction _(e) {\n const r = Array.isArray(e) ? e : [e];\n L.has(\"meta\") && L.forEach((o) => {\n D(o) || L.delete(o.toLowerCase());\n }), r.forEach((o) => {\n L.add(o.toLowerCase());\n });\n}\nfunction I(e) {\n const r = Array.isArray(e) ? e : [e];\n e === \"meta\" ? L.clear() : r.forEach((o) => {\n L.delete(o.toLowerCase());\n });\n}\nfunction V(e, r, o) {\n (typeof o == \"function\" && o(e, r) || o === !0) && e.preventDefault();\n}\nfunction X(e, r, o) {\n return typeof o == \"function\" ? o(e, r) : o === !0 || o === void 0;\n}\nconst Y = [\n \"input\",\n \"textarea\",\n \"select\",\n \"searchbox\",\n \"slider\",\n \"spinbutton\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"textbox\"\n];\nfunction Z(e) {\n return F(e, Y);\n}\nfunction F(e, r = !1) {\n const { target: o, composed: i } = e;\n let c, a;\n return ee(o) && i ? (c = e.composedPath()[0] && e.composedPath()[0].tagName, a = e.composedPath()[0] && e.composedPath()[0].role) : (c = o && o.tagName, a = o && o.role), R(r) ? !!(c && r && r.some((n) => n.toLowerCase() === c.toLowerCase() || n === a)) : !!(c && r && r);\n}\nfunction ee(e) {\n return !!e.tagName && !e.tagName.startsWith(\"-\") && e.tagName.includes(\"-\");\n}\nfunction te(e, r) {\n return e.length === 0 && r ? !1 : r ? e.some((o) => r.includes(o)) || e.includes(\"*\") : !0;\n}\nconst re = (e, r, o = !1) => {\n const { alt: i, meta: c, mod: a, shift: n, ctrl: y, keys: u, useKey: l } = r, { code: f, key: t, ctrlKey: d, metaKey: m, shiftKey: g, altKey: k } = e, p = K(f);\n if (l && u?.length === 1 && u.includes(t.toLowerCase()))\n return !0;\n if (!u?.includes(p) && ![\"ctrl\", \"control\", \"unknown\", \"meta\", \"alt\", \"shift\", \"os\"].includes(p))\n return !1;\n if (!o) {\n if (i !== k && p !== \"alt\" || n !== g && p !== \"shift\")\n return !1;\n if (a) {\n if (!m && !d)\n return !1;\n } else if (c !== m && p !== \"meta\" && p !== \"os\" || y !== d && p !== \"ctrl\" && p !== \"control\")\n return !1;\n }\n return u && u.length === 1 && u.includes(p) ? !0 : u && u.length > 0 ? u.includes(p) ? U(u) : !1 : !u || u.length === 0;\n}, $ = T(void 0), oe = () => M($);\nfunction ne({ addHotkey: e, removeHotkey: r, children: o }) {\n return /* @__PURE__ */ b($.Provider, { value: { addHotkey: e, removeHotkey: r }, children: o });\n}\nfunction x(e, r) {\n return e && r && typeof e == \"object\" && typeof r == \"object\" ? Object.keys(e).length === Object.keys(r).length && // @ts-expect-error TS7053\n Object.keys(e).reduce((o, i) => o && x(e[i], r[i]), !0) : e === r;\n}\nconst W = T({\n hotkeys: [],\n activeScopes: [],\n // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {\n },\n enableScope: () => {\n },\n disableScope: () => {\n }\n}), se = () => M(W), de = ({ initiallyActiveScopes: e = [\"*\"], children: r }) => {\n const [o, i] = A(e), [c, a] = A([]), n = w((t) => {\n i((d) => d.includes(\"*\") ? [t] : Array.from(/* @__PURE__ */ new Set([...d, t])));\n }, []), y = w((t) => {\n i((d) => d.filter((m) => m !== t));\n }, []), u = w((t) => {\n i((d) => d.includes(t) ? d.filter((m) => m !== t) : d.includes(\"*\") ? [t] : Array.from(/* @__PURE__ */ new Set([...d, t])));\n }, []), l = w((t) => {\n a((d) => [...d, t]);\n }, []), f = w((t) => {\n a((d) => d.filter((m) => !x(m, t)));\n }, []);\n return /* @__PURE__ */ b(\n W.Provider,\n {\n value: { activeScopes: o, hotkeys: c, enableScope: n, disableScope: y, toggleScope: u },\n children: /* @__PURE__ */ b(ne, { addHotkey: l, removeHotkey: f, children: r })\n }\n );\n};\nfunction ie(e) {\n const r = S(void 0);\n return x(r.current, e) || (r.current = e), r.current;\n}\nconst N = (e) => {\n e.stopPropagation(), e.preventDefault(), e.stopImmediatePropagation();\n}, ce = typeof window < \"u\" ? z : J;\nfunction fe(e, r, o, i) {\n const c = S(null), a = S(!1), n = Array.isArray(o) ? Array.isArray(i) ? void 0 : i : o, y = R(e) ? e.join(n?.delimiter) : e, u = Array.isArray(o) ? o : Array.isArray(i) ? i : void 0, l = w(r, u ?? []), f = S(l);\n u ? f.current = l : f.current = r;\n const t = ie(n), { activeScopes: d } = se(), m = oe();\n return ce(() => {\n if (t?.enabled === !1 || !te(d, t?.scopes))\n return;\n let g = [], k;\n const p = (s, B = !1) => {\n if (!(Z(s) && !F(s, t?.enableOnFormTags))) {\n if (c.current !== null) {\n const v = c.current.getRootNode();\n if ((v instanceof Document || v instanceof ShadowRoot) && v.activeElement !== c.current && !c.current.contains(v.activeElement)) {\n N(s);\n return;\n }\n }\n s.target?.isContentEditable && !t?.enableOnContentEditable || H(y, t?.delimiter).forEach((v) => {\n if (v.includes(t?.splitKey ?? \"+\") && v.includes(t?.sequenceSplitKey ?? \">\")) {\n console.warn(\n `Hotkey ${v} contains both ${t?.splitKey ?? \"+\"} and ${t?.sequenceSplitKey ?? \">\"} which is not supported.`\n );\n return;\n }\n const h = P(\n v,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n );\n if (h.isSequence) {\n k = setTimeout(() => {\n g = [];\n }, t?.sequenceTimeoutMs ?? 1e3);\n const C = h.useKey ? s.key : K(s.code);\n if (D(C.toLowerCase()))\n return;\n g.push(C);\n const G = h.keys?.[g.length - 1];\n if (C !== G) {\n g = [], k && clearTimeout(k);\n return;\n }\n g.length === h.keys?.length && (f.current(s, h), k && clearTimeout(k), g = []);\n } else if (re(s, h, t?.ignoreModifiers) || h.keys?.includes(\"*\")) {\n if (t?.ignoreEventWhen?.(s) || B && a.current)\n return;\n if (V(s, h, t?.preventDefault), !X(s, h, t?.enabled)) {\n N(s);\n return;\n }\n f.current(s, h), B || (a.current = !0);\n }\n });\n }\n }, O = (s) => {\n s.code !== void 0 && (_(K(s.code)), (t?.keydown === void 0 && t?.keyup !== !0 || t?.keydown) && p(s));\n }, q = (s) => {\n s.code !== void 0 && (I(K(s.code)), a.current = !1, t?.keyup && p(s, !0));\n }, E = c.current || n?.document || document;\n return E.addEventListener(\"keyup\", q, n?.eventListenerOptions), E.addEventListener(\"keydown\", O, n?.eventListenerOptions), m && H(y, t?.delimiter).forEach((s) => {\n m.addHotkey(\n P(\n s,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n )\n );\n }), () => {\n E.removeEventListener(\"keyup\", q, n?.eventListenerOptions), E.removeEventListener(\"keydown\", O, n?.eventListenerOptions), m && H(y, t?.delimiter).forEach((s) => {\n m.removeHotkey(\n P(\n s,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n )\n );\n }), g = [], k && clearTimeout(k);\n };\n }, [y, t, d]), c;\n}\nfunction le(e = !1) {\n const [r, o] = A(/* @__PURE__ */ new Set()), [i, c] = A(!1), a = w(\n (l) => {\n l.code !== void 0 && (l.preventDefault(), l.stopPropagation(), o((f) => {\n const t = new Set(f);\n return t.add(K(e ? l.key : l.code)), t;\n }));\n },\n [e]\n ), n = w(() => {\n typeof document < \"u\" && (document.removeEventListener(\"keydown\", a), c(!1));\n }, [a]), y = w(() => {\n o(/* @__PURE__ */ new Set()), typeof document < \"u\" && (n(), document.addEventListener(\"keydown\", a), c(!0));\n }, [a, n]), u = w(() => {\n o(/* @__PURE__ */ new Set());\n }, []);\n return [r, { start: y, stop: n, resetKeys: u, isRecording: i }];\n}\nexport {\n de as HotkeysProvider,\n U as isHotkeyPressed,\n fe as useHotkeys,\n se as useHotkeysContext,\n le as useRecordHotkeys\n};\n","import Toastify from 'toastify-js';\n\nwindow._showToast = showToast;\n\nfunction showToast(props) {\n if (typeof props === 'string') {\n props = { text: props };\n }\n const { onClick, delay, ...rest } = props;\n const toast = Toastify({\n className: `${onClick || props.destination ? 'shiny-pill' : ''}`,\n gravity: 'bottom',\n position: 'center',\n ...rest,\n onClick: () => {\n onClick?.(toast); // Pass in the object itself!\n },\n });\n if (delay) {\n setTimeout(() => {\n toast.showToast();\n }, delay);\n } else {\n toast.showToast();\n }\n return toast;\n}\n\nexport default showToast;\n","import { useEffect, useRef } from 'preact/hooks';\n\nfunction useInterval(fn, delay, deps, immediate) {\n const savedCallback = useRef(fn);\n useEffect(() => {\n savedCallback.current = fn;\n }, [fn, deps]);\n\n useEffect(() => {\n if (!immediate || delay === null || delay === false) return;\n savedCallback.current();\n }, [immediate]);\n\n useEffect(() => {\n if (delay === null || delay === false) return;\n const tick = () => savedCallback.current();\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n\nexport default useInterval;\n","import { unstable_batchedUpdates } from 'react-dom';\n\nconst isMenuOpen = state => !!state && state[0] === 'o';\nconst batchedUpdates = unstable_batchedUpdates;\nconst getTransition = (transition, name) => transition === true || !!(transition && transition[name]);\nconst safeCall = (fn, arg) => typeof fn === 'function' ? fn(arg) : fn;\nconst internalKey = '_szhsinMenu';\nconst getName = component => component[internalKey];\nconst defineName = (name, component) => Object.defineProperty(component, internalKey, {\n value: name\n});\nconst mergeProps = (target, source) => {\n source && Object.keys(source).forEach(key => {\n const targetProp = target[key];\n const sourceProp = source[key];\n if (typeof sourceProp === 'function' && targetProp) {\n target[key] = (...arg) => {\n sourceProp(...arg);\n targetProp(...arg);\n };\n } else {\n target[key] = sourceProp;\n }\n });\n return target;\n};\nconst parsePadding = paddingStr => {\n if (typeof paddingStr !== 'string') return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n const padding = paddingStr.trim().split(/\\s+/, 4).map(parseFloat);\n const top = !isNaN(padding[0]) ? padding[0] : 0;\n const right = !isNaN(padding[1]) ? padding[1] : top;\n return {\n top,\n right,\n bottom: !isNaN(padding[2]) ? padding[2] : top,\n left: !isNaN(padding[3]) ? padding[3] : right\n };\n};\nconst getScrollAncestor = node => {\n while (node) {\n node = node.parentNode;\n if (!node || node === document.body || !node.parentNode) return;\n const {\n overflow,\n overflowX,\n overflowY\n } = getComputedStyle(node);\n if (/auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)) return node;\n }\n};\nfunction commonProps(isDisabled, isHovering) {\n return {\n 'aria-disabled': isDisabled || undefined,\n tabIndex: isHovering ? 0 : -1\n };\n}\nfunction indexOfNode(nodeList, node) {\n for (let i = 0; i < nodeList.length; i++) {\n if (nodeList[i] === node) return i;\n }\n return -1;\n}\n\nexport { batchedUpdates, commonProps, defineName, getName, getScrollAncestor, getTransition, indexOfNode, isMenuOpen, mergeProps, parsePadding, safeCall };\n","import { useMemo } from 'react';\n\nconst useBEM = ({\n block,\n element,\n modifiers,\n className\n}) => useMemo(() => {\n const blockElement = element ? `${block}__${element}` : block;\n let classString = blockElement;\n modifiers && Object.keys(modifiers).forEach(name => {\n const value = modifiers[name];\n if (value) classString += ` ${blockElement}--${value === true ? name : `${name}-${value}`}`;\n });\n let expandedClassName = typeof className === 'function' ? className(modifiers) : className;\n if (typeof expandedClassName === 'string') {\n expandedClassName = expandedClassName.trim();\n if (expandedClassName) classString += ` ${expandedClassName}`;\n }\n return classString;\n}, [block, element, modifiers, className]);\n\nexport { useBEM };\n","import { createContext } from 'react';\n\nconst menuContainerClass = 'szh-menu-container';\nconst menuClass = 'szh-menu';\nconst menuButtonClass = 'szh-menu-button';\nconst menuArrowClass = 'arrow';\nconst menuItemClass = 'item';\nconst menuDividerClass = 'divider';\nconst menuHeaderClass = 'header';\nconst menuGroupClass = 'group';\nconst subMenuClass = 'submenu';\nconst radioGroupClass = 'radio-group';\nconst HoverItemContext = /*#__PURE__*/createContext();\nconst MenuListItemContext = /*#__PURE__*/createContext({});\nconst MenuListContext = /*#__PURE__*/createContext({});\nconst EventHandlersContext = /*#__PURE__*/createContext({});\nconst RadioGroupContext = /*#__PURE__*/createContext({});\nconst SettingsContext = /*#__PURE__*/createContext({});\nconst Keys = /*#__PURE__*/Object.freeze({\n ENTER: 'Enter',\n ESC: 'Escape',\n SPACE: ' ',\n HOME: 'Home',\n END: 'End',\n LEFT: 'ArrowLeft',\n RIGHT: 'ArrowRight',\n UP: 'ArrowUp',\n DOWN: 'ArrowDown'\n});\nconst HoverActionTypes = /*#__PURE__*/Object.freeze({\n RESET: 0,\n SET: 1,\n UNSET: 2,\n INCREASE: 3,\n DECREASE: 4,\n FIRST: 5,\n LAST: 6,\n SET_INDEX: 7\n});\nconst CloseReason = /*#__PURE__*/Object.freeze({\n CLICK: 'click',\n CANCEL: 'cancel',\n BLUR: 'blur',\n SCROLL: 'scroll'\n});\nconst FocusPositions = /*#__PURE__*/Object.freeze({\n FIRST: 'first',\n LAST: 'last'\n});\nconst MenuStateMap = /*#__PURE__*/Object.freeze({\n entering: 'opening',\n entered: 'open',\n exiting: 'closing',\n exited: 'closed'\n});\nconst positionAbsolute = 'absolute';\nconst roleNone = 'none';\nconst roleMenuitem = 'menuitem';\nconst noScrollFocus = {\n preventScroll: true\n};\n\nexport { CloseReason, EventHandlersContext, FocusPositions, HoverActionTypes, HoverItemContext, Keys, MenuListContext, MenuListItemContext, MenuStateMap, RadioGroupContext, SettingsContext, menuArrowClass, menuButtonClass, menuClass, menuContainerClass, menuDividerClass, menuGroupClass, menuHeaderClass, menuItemClass, noScrollFocus, positionAbsolute, radioGroupClass, roleMenuitem, roleNone, subMenuClass };\n","import { useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { menuContainerClass, CloseReason, Keys } from '../utils/constants.mjs';\nimport { mergeProps, getTransition, safeCall } from '../utils/utils.mjs';\n\nconst MenuContainer = ({\n className,\n containerRef,\n containerProps,\n children,\n isOpen,\n theming,\n transition,\n onClose\n}) => {\n const itemTransition = getTransition(transition, 'item');\n const onKeyDown = ({\n key\n }) => {\n switch (key) {\n case Keys.ESC:\n safeCall(onClose, {\n key,\n reason: CloseReason.CANCEL\n });\n break;\n }\n };\n const onBlur = e => {\n if (isOpen && !e.currentTarget.contains(e.relatedTarget)) {\n safeCall(onClose, {\n reason: CloseReason.BLUR\n });\n }\n };\n return /*#__PURE__*/jsx(\"div\", {\n ...mergeProps({\n onKeyDown,\n onBlur\n }, containerProps),\n className: useBEM({\n block: menuContainerClass,\n modifiers: useMemo(() => ({\n theme: theming,\n itemTransition\n }), [theming, itemTransition]),\n className\n }),\n style: {\n position: 'absolute',\n ...containerProps?.style\n },\n ref: containerRef,\n children: children\n });\n};\n\nexport { MenuContainer };\n","const createSubmenuCtx = () => {\n let timer,\n count = 0;\n return {\n toggle: isOpen => {\n isOpen ? count++ : count--;\n count = Math.max(count, 0);\n },\n on: (closeDelay, pending, settled) => {\n if (count) {\n if (!timer) timer = setTimeout(() => {\n timer = 0;\n pending();\n }, closeDelay);\n } else {\n settled?.();\n }\n },\n off: () => {\n if (timer) {\n clearTimeout(timer);\n timer = 0;\n }\n }\n };\n};\n\nexport { createSubmenuCtx };\n","import { useState, useRef, useCallback } from 'react';\nimport { noScrollFocus, HoverActionTypes } from '../utils/constants.mjs';\nimport { indexOfNode } from '../utils/utils.mjs';\n\nconst useItems = menuRef => {\n const [hoverItem, setHoverItem] = useState();\n const stateRef = useRef({\n items: [],\n hoverIndex: -1,\n sorted: false\n });\n const mutableState = stateRef.current;\n const updateItems = useCallback((item, isMounted) => {\n const {\n items\n } = mutableState;\n if (!item) {\n mutableState.items = [];\n } else if (isMounted) {\n items.push(item);\n } else {\n const index = items.indexOf(item);\n if (index > -1) {\n items.splice(index, 1);\n if (item.contains(document.activeElement)) {\n menuRef.current.focus(noScrollFocus);\n setHoverItem();\n }\n }\n }\n mutableState.hoverIndex = -1;\n mutableState.sorted = false;\n }, [mutableState, menuRef]);\n const dispatch = useCallback((actionType, item, nextIndex) => {\n const {\n items,\n hoverIndex\n } = mutableState;\n const sortItems = () => {\n if (mutableState.sorted) return;\n const orderedNodes = menuRef.current.querySelectorAll('.szh-menu__item');\n items.sort((a, b) => indexOfNode(orderedNodes, a) - indexOfNode(orderedNodes, b));\n mutableState.sorted = true;\n };\n let index = -1,\n newItem = undefined;\n switch (actionType) {\n case HoverActionTypes.RESET:\n break;\n case HoverActionTypes.SET:\n newItem = item;\n break;\n case HoverActionTypes.UNSET:\n newItem = prevItem => prevItem === item ? undefined : prevItem;\n break;\n case HoverActionTypes.FIRST:\n sortItems();\n index = 0;\n newItem = items[index];\n break;\n case HoverActionTypes.LAST:\n sortItems();\n index = items.length - 1;\n newItem = items[index];\n break;\n case HoverActionTypes.SET_INDEX:\n sortItems();\n index = nextIndex;\n newItem = items[index];\n break;\n case HoverActionTypes.INCREASE:\n sortItems();\n index = hoverIndex;\n if (index < 0) index = items.indexOf(item);\n index++;\n if (index >= items.length) index = 0;\n newItem = items[index];\n break;\n case HoverActionTypes.DECREASE:\n sortItems();\n index = hoverIndex;\n if (index < 0) index = items.indexOf(item);\n index--;\n if (index < 0) index = items.length - 1;\n newItem = items[index];\n break;\n default:\n if (process.env.NODE_ENV !== 'production') throw new Error(`[React-Menu] Unknown hover action type: ${actionType}`);\n }\n if (!newItem) index = -1;\n setHoverItem(newItem);\n mutableState.hoverIndex = index;\n }, [menuRef, mutableState]);\n return {\n hoverItem,\n dispatch,\n updateItems\n };\n};\n\nexport { useItems };\n","const getNativeDimension = (transformed, untransformed) => Math.round(transformed) === untransformed ? transformed : untransformed;\nconst getNormalizedClientRect = element => {\n const rect = element.getBoundingClientRect();\n rect.width = getNativeDimension(rect.width, element.offsetWidth);\n rect.height = getNativeDimension(rect.height, element.offsetHeight);\n return rect;\n};\n\nexport { getNormalizedClientRect };\n","import { getNormalizedClientRect } from './getNormalizedClientRect.mjs';\nimport { parsePadding } from '../utils/utils.mjs';\n\nconst getPositionHelpers = (containerElt, menuElt, menuScroll, boundingBoxPadding) => {\n const menuRect = getNormalizedClientRect(menuElt);\n const containerRect = containerElt.getBoundingClientRect();\n const boundingRect = menuScroll === window ? {\n left: 0,\n top: 0,\n right: document.documentElement.clientWidth,\n bottom: window.innerHeight\n } : menuScroll.getBoundingClientRect();\n const padding = parsePadding(boundingBoxPadding);\n const getLeftOverflow = x => x + containerRect.left - boundingRect.left - padding.left;\n const getRightOverflow = x => x + containerRect.left + menuRect.width - boundingRect.right + padding.right;\n const getTopOverflow = y => y + containerRect.top - boundingRect.top - padding.top;\n const getBottomOverflow = y => y + containerRect.top + menuRect.height - boundingRect.bottom + padding.bottom;\n const confineHorizontally = x => {\n let leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) {\n x -= leftOverflow;\n } else {\n const rightOverflow = getRightOverflow(x);\n if (rightOverflow > 0) {\n x -= rightOverflow;\n leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) x -= leftOverflow;\n }\n }\n return x;\n };\n const confineVertically = y => {\n let topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n y -= topOverflow;\n } else {\n const bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n y -= bottomOverflow;\n topOverflow = getTopOverflow(y);\n if (topOverflow < 0) y -= topOverflow;\n }\n }\n return y;\n };\n return {\n menuRect,\n containerRect,\n getLeftOverflow,\n getRightOverflow,\n getTopOverflow,\n getBottomOverflow,\n confineHorizontally,\n confineVertically\n };\n};\n\nexport { getPositionHelpers };\n","const placeArrowVertical = ({\n arrowRef,\n menuY,\n anchorRect,\n containerRect,\n menuRect\n}) => {\n let y = anchorRect.top - containerRect.top - menuY + anchorRect.height / 2;\n const offset = arrowRef.current.offsetHeight * 1.25;\n y = Math.max(offset, y);\n y = Math.min(y, menuRect.height - offset);\n return y;\n};\n\nexport { placeArrowVertical };\n","import { placeArrowVertical } from './placeArrowVertical.mjs';\n\nconst placeLeftorRight = ({\n anchorRect,\n containerRect,\n menuRect,\n placeLeftorRightY,\n placeLeftX,\n placeRightX,\n getLeftOverflow,\n getRightOverflow,\n confineHorizontally,\n confineVertically,\n arrowRef,\n arrow,\n direction,\n position\n}) => {\n let computedDirection = direction;\n let y = placeLeftorRightY;\n if (position !== 'initial') {\n y = confineVertically(y);\n if (position === 'anchor') {\n y = Math.min(y, anchorRect.bottom - containerRect.top);\n y = Math.max(y, anchorRect.top - containerRect.top - menuRect.height);\n }\n }\n let x, leftOverflow, rightOverflow;\n if (computedDirection === 'left') {\n x = placeLeftX;\n if (position !== 'initial') {\n leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) {\n rightOverflow = getRightOverflow(placeRightX);\n if (rightOverflow <= 0 || -leftOverflow > rightOverflow) {\n x = placeRightX;\n computedDirection = 'right';\n }\n }\n }\n } else {\n x = placeRightX;\n if (position !== 'initial') {\n rightOverflow = getRightOverflow(x);\n if (rightOverflow > 0) {\n leftOverflow = getLeftOverflow(placeLeftX);\n if (leftOverflow >= 0 || -leftOverflow < rightOverflow) {\n x = placeLeftX;\n computedDirection = 'left';\n }\n }\n }\n }\n if (position === 'auto') x = confineHorizontally(x);\n const arrowY = arrow ? placeArrowVertical({\n menuY: y,\n arrowRef,\n anchorRect,\n containerRect,\n menuRect\n }) : undefined;\n return {\n arrowY,\n x,\n y,\n computedDirection\n };\n};\n\nexport { placeLeftorRight };\n","const placeArrowHorizontal = ({\n arrowRef,\n menuX,\n anchorRect,\n containerRect,\n menuRect\n}) => {\n let x = anchorRect.left - containerRect.left - menuX + anchorRect.width / 2;\n const offset = arrowRef.current.offsetWidth * 1.25;\n x = Math.max(offset, x);\n x = Math.min(x, menuRect.width - offset);\n return x;\n};\n\nexport { placeArrowHorizontal };\n","import { placeArrowHorizontal } from './placeArrowHorizontal.mjs';\n\nconst placeToporBottom = ({\n anchorRect,\n containerRect,\n menuRect,\n placeToporBottomX,\n placeTopY,\n placeBottomY,\n getTopOverflow,\n getBottomOverflow,\n confineHorizontally,\n confineVertically,\n arrowRef,\n arrow,\n direction,\n position\n}) => {\n let computedDirection = direction === 'top' ? 'top' : 'bottom';\n let x = placeToporBottomX;\n if (position !== 'initial') {\n x = confineHorizontally(x);\n if (position === 'anchor') {\n x = Math.min(x, anchorRect.right - containerRect.left);\n x = Math.max(x, anchorRect.left - containerRect.left - menuRect.width);\n }\n }\n let y, topOverflow, bottomOverflow;\n if (computedDirection === 'top') {\n y = placeTopY;\n if (position !== 'initial') {\n topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n bottomOverflow = getBottomOverflow(placeBottomY);\n if (bottomOverflow <= 0 || -topOverflow > bottomOverflow) {\n y = placeBottomY;\n computedDirection = 'bottom';\n }\n }\n }\n } else {\n y = placeBottomY;\n if (position !== 'initial') {\n bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n topOverflow = getTopOverflow(placeTopY);\n if (topOverflow >= 0 || -topOverflow < bottomOverflow) {\n y = placeTopY;\n computedDirection = 'top';\n }\n }\n }\n }\n if (position === 'auto') y = confineVertically(y);\n const arrowX = arrow ? placeArrowHorizontal({\n menuX: x,\n arrowRef,\n anchorRect,\n containerRect,\n menuRect\n }) : undefined;\n return {\n arrowX,\n x,\n y,\n computedDirection\n };\n};\n\nexport { placeToporBottom };\n","import { placeLeftorRight } from './placeLeftorRight.mjs';\nimport { placeToporBottom } from './placeToporBottom.mjs';\n\nconst positionMenu = ({\n arrow,\n align,\n direction,\n gap,\n shift,\n position,\n anchorRect,\n arrowRef,\n positionHelpers\n}) => {\n const {\n menuRect,\n containerRect\n } = positionHelpers;\n const isHorizontal = direction === 'left' || direction === 'right';\n let horizontalOffset = isHorizontal ? gap : shift;\n let verticalOffset = isHorizontal ? shift : gap;\n if (arrow) {\n const arrowElt = arrowRef.current;\n if (isHorizontal) {\n horizontalOffset += arrowElt.offsetWidth;\n } else {\n verticalOffset += arrowElt.offsetHeight;\n }\n }\n const placeLeftX = anchorRect.left - containerRect.left - menuRect.width - horizontalOffset;\n const placeRightX = anchorRect.right - containerRect.left + horizontalOffset;\n const placeTopY = anchorRect.top - containerRect.top - menuRect.height - verticalOffset;\n const placeBottomY = anchorRect.bottom - containerRect.top + verticalOffset;\n let placeToporBottomX, placeLeftorRightY;\n if (align === 'end') {\n placeToporBottomX = anchorRect.right - containerRect.left - menuRect.width;\n placeLeftorRightY = anchorRect.bottom - containerRect.top - menuRect.height;\n } else if (align === 'center') {\n placeToporBottomX = anchorRect.left - containerRect.left - (menuRect.width - anchorRect.width) / 2;\n placeLeftorRightY = anchorRect.top - containerRect.top - (menuRect.height - anchorRect.height) / 2;\n } else {\n placeToporBottomX = anchorRect.left - containerRect.left;\n placeLeftorRightY = anchorRect.top - containerRect.top;\n }\n placeToporBottomX += horizontalOffset;\n placeLeftorRightY += verticalOffset;\n const options = {\n ...positionHelpers,\n anchorRect,\n placeLeftX,\n placeRightX,\n placeLeftorRightY,\n placeTopY,\n placeBottomY,\n placeToporBottomX,\n arrowRef,\n arrow,\n direction,\n position\n };\n switch (direction) {\n case 'left':\n case 'right':\n return placeLeftorRight(options);\n case 'top':\n case 'bottom':\n default:\n return placeToporBottom(options);\n }\n};\n\nexport { positionMenu };\n","import { useLayoutEffect, useEffect } from 'react';\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport { useIsomorphicLayoutEffect as useLayoutEffect };\n","import { useMemo } from 'react';\n\nfunction setRef(ref, instance) {\n typeof ref === 'function' ? ref(instance) : ref.current = instance;\n}\nconst useCombinedRef = (refA, refB) => useMemo(() => {\n if (!refA) return refB;\n if (!refB) return refA;\n return instance => {\n setRef(refA, instance);\n setRef(refB, instance);\n };\n}, [refA, refB]);\n\nexport { useCombinedRef };\n","import { useState, useReducer, useContext, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { flushSync } from 'react-dom';\nimport { MenuContainer } from './MenuContainer.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { createSubmenuCtx } from '../utils/submenuCtx.mjs';\nimport { SettingsContext, MenuListContext, HoverActionTypes, noScrollFocus, menuClass, menuArrowClass, positionAbsolute, MenuListItemContext, HoverItemContext, CloseReason, FocusPositions, Keys } from '../utils/constants.mjs';\nimport { useItems } from '../hooks/useItems.mjs';\nimport { getScrollAncestor, safeCall, mergeProps, commonProps, isMenuOpen, batchedUpdates, getTransition } from '../utils/utils.mjs';\nimport { getPositionHelpers } from '../positionUtils/getPositionHelpers.mjs';\nimport { positionMenu } from '../positionUtils/positionMenu.mjs';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst offScreen = -9999;\nconst MenuList = ({\n ariaLabel,\n menuClassName,\n menuStyle,\n arrow,\n arrowProps = {},\n anchorPoint,\n anchorRef,\n containerRef,\n containerProps,\n externalRef,\n parentScrollingRef,\n align = 'start',\n direction = 'bottom',\n position = 'auto',\n overflow = 'visible',\n setDownOverflow,\n repositionFlag,\n captureFocus = true,\n state,\n endTransition,\n isDisabled,\n menuItemFocus,\n gap = 0,\n shift = 0,\n children,\n onClose,\n focusProps: _1,\n ...restProps\n}) => {\n const [menuPosition, setMenuPosition] = useState({\n x: offScreen,\n y: offScreen\n });\n const [arrowPosition, setArrowPosition] = useState({});\n const [overflowData, setOverflowData] = useState();\n const [expandedDirection, setExpandedDirection] = useState(direction);\n const [submenuCtx] = useState(createSubmenuCtx);\n const [reposSubmenu, forceReposSubmenu] = useReducer(c => c + 1, 1);\n const {\n transition,\n boundingBoxRef,\n boundingBoxPadding,\n rootMenuRef,\n rootAnchorRef,\n scrollNodesRef,\n reposition,\n viewScroll,\n submenuCloseDelay\n } = useContext(SettingsContext);\n const {\n submenuCtx: parentSubmenuCtx,\n reposSubmenu: reposFlag = repositionFlag\n } = useContext(MenuListContext);\n const menuRef = useRef();\n const arrowRef = useRef();\n const prevOpen = useRef(false);\n const {\n hoverItem,\n dispatch,\n updateItems\n } = useItems(menuRef);\n const isOpen = isMenuOpen(state);\n const openTransition = getTransition(transition, 'open');\n const closeTransition = getTransition(transition, 'close');\n const scrollNodes = scrollNodesRef.current;\n const onKeyDown = e => {\n switch (e.key) {\n case Keys.HOME:\n dispatch(HoverActionTypes.FIRST);\n break;\n case Keys.END:\n dispatch(HoverActionTypes.LAST);\n break;\n case Keys.UP:\n dispatch(HoverActionTypes.DECREASE, hoverItem);\n break;\n case Keys.DOWN:\n dispatch(HoverActionTypes.INCREASE, hoverItem);\n break;\n case Keys.SPACE:\n if (e.target && e.target.className.indexOf(menuClass) !== -1) {\n e.preventDefault();\n }\n return;\n default:\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n };\n const onAnimationEnd = () => {\n if (state === 'closing') {\n setOverflowData();\n }\n safeCall(endTransition);\n };\n const onPointerMove = e => {\n e.stopPropagation();\n submenuCtx.on(submenuCloseDelay, () => {\n dispatch(HoverActionTypes.RESET);\n menuRef.current.focus(noScrollFocus);\n });\n };\n const onPointerLeave = e => {\n if (e.target === e.currentTarget) submenuCtx.off();\n };\n const handlePosition = useCallback(noOverflowCheck => {\n const menuElt = menuRef.current;\n const containerElt = containerRef.current;\n if (!menuElt || !containerElt) return;\n const anchorRect = anchorRef ? anchorRef.current?.getBoundingClientRect() : anchorPoint ? {\n left: anchorPoint.x,\n right: anchorPoint.x,\n top: anchorPoint.y,\n bottom: anchorPoint.y,\n width: 0,\n height: 0\n } : null;\n if (!anchorRect) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[React-Menu] Menu might not be positioned properly as one of the anchorRef or anchorPoint prop should be provided. If `anchorRef` is provided, the anchor must be mounted before menu is open.');\n }\n return;\n }\n if (!scrollNodes.menu) {\n scrollNodes.menu = (boundingBoxRef ? boundingBoxRef.current : getScrollAncestor(rootMenuRef.current)) || window;\n }\n const positionHelpers = getPositionHelpers(containerElt, menuElt, scrollNodes.menu, boundingBoxPadding);\n let {\n arrowX,\n arrowY,\n x,\n y,\n computedDirection\n } = positionMenu({\n arrow,\n align,\n direction,\n gap,\n shift,\n position,\n anchorRect,\n arrowRef,\n positionHelpers\n });\n const {\n menuRect\n } = positionHelpers;\n const menuHeight = menuRect.height;\n if (!noOverflowCheck && overflow !== 'visible') {\n const {\n getTopOverflow,\n getBottomOverflow\n } = positionHelpers;\n let height, overflowAmt;\n const bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n height = menuHeight - bottomOverflow;\n overflowAmt = bottomOverflow;\n } else {\n const topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n height = menuHeight + topOverflow;\n overflowAmt = 0 - topOverflow;\n if (height >= 0) y -= topOverflow;\n }\n }\n if (height >= 0) {\n setOverflowData({\n height,\n overflowAmt\n });\n }\n }\n if (arrow) setArrowPosition({\n x: arrowX,\n y: arrowY\n });\n setMenuPosition({\n x,\n y\n });\n setExpandedDirection(computedDirection);\n }, [arrow, align, boundingBoxPadding, direction, gap, shift, position, overflow, anchorPoint, anchorRef, containerRef, boundingBoxRef, rootMenuRef, scrollNodes]);\n useIsomorphicLayoutEffect(() => {\n if (isOpen) {\n handlePosition();\n if (prevOpen.current) forceReposSubmenu();\n }\n prevOpen.current = isOpen;\n }, [isOpen, handlePosition, reposFlag]);\n useIsomorphicLayoutEffect(() => {\n if (overflowData && !setDownOverflow) menuRef.current.scrollTop = 0;\n }, [overflowData, setDownOverflow]);\n useIsomorphicLayoutEffect(() => updateItems, [updateItems]);\n useEffect(() => {\n let {\n menu: menuScroll\n } = scrollNodes;\n if (!isOpen || !menuScroll) return;\n menuScroll = menuScroll.addEventListener ? menuScroll : window;\n if (!scrollNodes.anchors) {\n scrollNodes.anchors = [];\n let anchorScroll = getScrollAncestor(rootAnchorRef && rootAnchorRef.current);\n while (anchorScroll && anchorScroll !== menuScroll) {\n scrollNodes.anchors.push(anchorScroll);\n anchorScroll = getScrollAncestor(anchorScroll);\n }\n }\n let scroll = viewScroll;\n if (scrollNodes.anchors.length && scroll === 'initial') scroll = 'auto';\n if (scroll === 'initial') return;\n const handleScroll = () => {\n if (scroll === 'auto') {\n batchedUpdates(() => handlePosition(true));\n } else {\n safeCall(onClose, {\n reason: CloseReason.SCROLL\n });\n }\n };\n const scrollObservers = scrollNodes.anchors.concat(viewScroll !== 'initial' ? menuScroll : []);\n scrollObservers.forEach(o => o.addEventListener('scroll', handleScroll));\n return () => scrollObservers.forEach(o => o.removeEventListener('scroll', handleScroll));\n }, [rootAnchorRef, scrollNodes, isOpen, onClose, viewScroll, handlePosition]);\n const hasOverflow = !!overflowData && overflowData.overflowAmt > 0;\n useEffect(() => {\n if (hasOverflow || !isOpen || !parentScrollingRef) return;\n const handleScroll = () => batchedUpdates(handlePosition);\n const parentScroll = parentScrollingRef.current;\n parentScroll.addEventListener('scroll', handleScroll);\n return () => parentScroll.removeEventListener('scroll', handleScroll);\n }, [isOpen, hasOverflow, parentScrollingRef, handlePosition]);\n useEffect(() => {\n if (!isOpen || typeof ResizeObserver !== 'function' || reposition === 'initial') return;\n const targetList = [];\n const resizeObserver = new ResizeObserver(entries => entries.forEach(({\n target\n }) => {\n if (targetList.indexOf(target) < 0) {\n targetList.push(target);\n } else if (target.offsetWidth && target.offsetHeight) {\n flushSync(() => {\n handlePosition();\n forceReposSubmenu();\n });\n }\n }));\n const resizeObserverOptions = {\n box: 'border-box'\n };\n resizeObserver.observe(menuRef.current, resizeObserverOptions);\n const anchor = anchorRef?.current;\n anchor && resizeObserver.observe(anchor, resizeObserverOptions);\n return () => resizeObserver.disconnect();\n }, [isOpen, reposition, anchorRef, handlePosition]);\n useEffect(() => {\n if (!isOpen) {\n dispatch(HoverActionTypes.RESET);\n if (!closeTransition) setOverflowData();\n return;\n }\n const {\n position,\n alwaysUpdate\n } = menuItemFocus || {};\n const setItemFocus = () => {\n if (position === FocusPositions.FIRST) {\n dispatch(HoverActionTypes.FIRST);\n } else if (position === FocusPositions.LAST) {\n dispatch(HoverActionTypes.LAST);\n } else if (position >= -1) {\n dispatch(HoverActionTypes.SET_INDEX, undefined, position);\n }\n };\n if (alwaysUpdate) {\n setItemFocus();\n } else if (captureFocus) {\n const id = setTimeout(() => {\n const menuElt = menuRef.current;\n if (menuElt && !menuElt.contains(document.activeElement)) {\n menuElt.focus(noScrollFocus);\n setItemFocus();\n }\n }, openTransition ? 170 : 100);\n return () => clearTimeout(id);\n }\n }, [isOpen, openTransition, closeTransition, captureFocus, menuItemFocus, dispatch]);\n const itemContext = useMemo(() => ({\n isParentOpen: isOpen,\n submenuCtx,\n dispatch,\n updateItems\n }), [isOpen, submenuCtx, dispatch, updateItems]);\n let maxHeight, overflowAmt;\n if (overflowData) {\n setDownOverflow ? overflowAmt = overflowData.overflowAmt : maxHeight = overflowData.height;\n }\n const listContext = useMemo(() => ({\n reposSubmenu,\n submenuCtx,\n overflow,\n overflowAmt,\n parentMenuRef: menuRef,\n parentDir: expandedDirection\n }), [reposSubmenu, submenuCtx, overflow, overflowAmt, expandedDirection]);\n const overflowStyle = maxHeight >= 0 ? {\n maxHeight,\n overflow\n } : undefined;\n const modifiers = useMemo(() => ({\n state,\n align,\n dir: expandedDirection\n }), [state, align, expandedDirection]);\n const arrowModifiers = useMemo(() => ({\n dir: expandedDirection\n }), [expandedDirection]);\n const _arrowClassName = useBEM({\n block: menuClass,\n element: menuArrowClass,\n modifiers: arrowModifiers,\n className: arrowProps.className\n });\n const menu = /*#__PURE__*/jsxs(\"ul\", {\n role: \"menu\",\n \"aria-label\": ariaLabel,\n ...commonProps(isDisabled),\n ...mergeProps({\n onPointerEnter: parentSubmenuCtx?.off,\n onPointerMove,\n onPointerLeave,\n onKeyDown,\n onAnimationEnd\n }, restProps),\n ref: useCombinedRef(externalRef, menuRef),\n className: useBEM({\n block: menuClass,\n modifiers,\n className: menuClassName\n }),\n style: {\n ...menuStyle,\n ...overflowStyle,\n margin: 0,\n display: state === 'closed' ? 'none' : undefined,\n position: positionAbsolute,\n left: menuPosition.x,\n top: menuPosition.y\n },\n children: [arrow && /*#__PURE__*/jsx(\"li\", {\n \"aria-hidden\": true,\n ...arrowProps,\n className: _arrowClassName,\n style: {\n display: 'block',\n position: positionAbsolute,\n left: arrowPosition.x,\n top: arrowPosition.y,\n ...arrowProps.style\n },\n ref: arrowRef\n }), /*#__PURE__*/jsx(MenuListContext.Provider, {\n value: listContext,\n children: /*#__PURE__*/jsx(MenuListItemContext.Provider, {\n value: itemContext,\n children: /*#__PURE__*/jsx(HoverItemContext.Provider, {\n value: hoverItem,\n children: safeCall(children, modifiers)\n })\n })\n })]\n });\n return containerProps ? /*#__PURE__*/jsx(MenuContainer, {\n ...containerProps,\n isOpen: isOpen,\n children: menu\n }) : menu;\n};\n\nexport { MenuList };\n","import { forwardRef, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuList } from './MenuList.mjs';\nimport { jsx } from 'react/jsx-runtime';\nimport { safeCall } from '../utils/utils.mjs';\nimport { SettingsContext, EventHandlersContext, CloseReason, Keys } from '../utils/constants.mjs';\n\nconst ControlledMenu = /*#__PURE__*/forwardRef(function ControlledMenu({\n 'aria-label': ariaLabel,\n className,\n containerProps,\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout,\n boundingBoxRef,\n boundingBoxPadding,\n reposition = 'auto',\n submenuOpenDelay = 300,\n submenuCloseDelay = 150,\n viewScroll = 'initial',\n portal,\n theming,\n onItemClick,\n ...restProps\n}, externalRef) {\n const containerRef = useRef(null);\n const scrollNodesRef = useRef({});\n const {\n anchorRef,\n state,\n onClose\n } = restProps;\n const settings = useMemo(() => ({\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout,\n boundingBoxRef,\n boundingBoxPadding,\n rootMenuRef: containerRef,\n rootAnchorRef: anchorRef,\n scrollNodesRef,\n reposition,\n viewScroll,\n submenuOpenDelay,\n submenuCloseDelay\n }), [initialMounted, unmountOnClose, transition, transitionTimeout, anchorRef, boundingBoxRef, boundingBoxPadding, reposition, viewScroll, submenuOpenDelay, submenuCloseDelay]);\n const eventHandlers = useMemo(() => ({\n handleClick(event, isCheckorRadio) {\n if (!event.stopPropagation) safeCall(onItemClick, event);\n let keepOpen = event.keepOpen;\n if (keepOpen === undefined) {\n keepOpen = isCheckorRadio && event.key === Keys.SPACE;\n }\n if (!keepOpen) {\n safeCall(onClose, {\n value: event.value,\n key: event.key,\n reason: CloseReason.CLICK\n });\n }\n },\n handleClose(key) {\n safeCall(onClose, {\n key,\n reason: CloseReason.CLICK\n });\n }\n }), [onItemClick, onClose]);\n if (!state) return null;\n const menuList = /*#__PURE__*/jsx(SettingsContext.Provider, {\n value: settings,\n children: /*#__PURE__*/jsx(EventHandlersContext.Provider, {\n value: eventHandlers,\n children: /*#__PURE__*/jsx(MenuList, {\n ...restProps,\n ariaLabel: ariaLabel || 'Menu',\n externalRef: externalRef,\n containerRef: containerRef,\n containerProps: {\n className,\n containerRef,\n containerProps,\n theming,\n transition,\n onClose\n }\n })\n })\n });\n if (portal === true && typeof document !== 'undefined') {\n return /*#__PURE__*/createPortal(menuList, document.body);\n } else if (portal) {\n return portal.target ? /*#__PURE__*/createPortal(menuList, portal.target) : portal.stablePosition ? null : menuList;\n }\n return menuList;\n});\n\nexport { ControlledMenu };\n","const STATUS = [\n\t\"preEnter\",\n\t\"entering\",\n\t\"entered\",\n\t\"preExit\",\n\t\"exiting\",\n\t\"exited\",\n\t\"unmounted\"\n];\nconst getState = (status) => ({\n\t$: status,\n\tstatus: STATUS[status],\n\tisEnter: status < 3,\n\tisMounted: status !== 6,\n\tisResolved: status === 2 || status > 4\n});\nconst startOrEnd = (unmounted) => unmounted ? 6 : 5;\nconst getEndStatus = (status, unmountOnExit) => {\n\tswitch (status) {\n\t\tcase 1:\n\t\tcase 0: return 2;\n\t\tcase 4:\n\t\tcase 3: return startOrEnd(unmountOnExit);\n\t}\n};\nconst getTimeout = (timeout) => typeof timeout === \"object\" ? [timeout.enter, timeout.exit] : [timeout, timeout];\nconst nextTick = (callback, config) => {\n\tconfig.r = requestAnimationFrame(() => {\n\t\tconfig.r = requestAnimationFrame(callback);\n\t});\n};\n//#endregion\nexport { getEndStatus, getState, getTimeout, nextTick, startOrEnd };\n","import { getEndStatus, getState, getTimeout, nextTick, startOrEnd } from \"./internal.mjs\";\nimport { useCallback, useState } from \"react\";\n//#region src/useTransitionState.ts\nconst updateState = (status, setState, ref, onChange) => {\n\tclearTimeout(ref.t);\n\tcancelAnimationFrame(ref.r);\n\tconst state = getState(status);\n\tsetState(state);\n\tref.s = state;\n\tonChange?.({ current: state });\n};\nconst useTransitionState = ({ enter = true, exit = true, preEnter, preExit, timeout, initialEntered, mountOnEnter, unmountOnExit, onStateChange: onChange } = {}) => {\n\tconst [state, setState] = useState(() => getState(initialEntered ? 2 : startOrEnd(mountOnEnter)));\n\tconst [ref] = useState({\n\t\ts: state,\n\t\tr: 0\n\t});\n\tconst [enterTimeout, exitTimeout] = getTimeout(timeout);\n\tconst endTransition = useCallback(() => {\n\t\tconst status = getEndStatus(ref.s.$, unmountOnExit);\n\t\tif (status) updateState(status, setState, ref, onChange);\n\t}, [\n\t\tonChange,\n\t\tunmountOnExit,\n\t\tref\n\t]);\n\treturn [\n\t\tstate,\n\t\tuseCallback((toEnter) => {\n\t\t\tconst transitState = (status) => {\n\t\t\t\tupdateState(status, setState, ref, onChange);\n\t\t\t\tswitch (status) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tif (enterTimeout >= 0) ref.t = setTimeout(endTransition, enterTimeout);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tif (exitTimeout >= 0) ref.t = setTimeout(endTransition, exitTimeout);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tnextTick(() => transitState(status + 1), ref);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst enterStage = ref.s.isEnter;\n\t\t\tif (typeof toEnter !== \"boolean\") toEnter = !enterStage;\n\t\t\tif (toEnter) !enterStage && transitState(enter ? preEnter ? 0 : 1 : 2);\n\t\t\telse enterStage && transitState(exit ? preExit ? 3 : 4 : startOrEnd(unmountOnExit));\n\t\t}, [\n\t\t\tref,\n\t\t\tendTransition,\n\t\t\tonChange,\n\t\t\tenter,\n\t\t\texit,\n\t\t\tpreEnter,\n\t\t\tpreExit,\n\t\t\tenterTimeout,\n\t\t\texitTimeout,\n\t\t\tunmountOnExit\n\t\t]),\n\t\tendTransition\n\t];\n};\n//#endregion\nexport { useTransitionState };\n","import { useCallback } from 'react';\nimport { useTransitionState } from 'react-transition-state';\nimport { MenuStateMap } from '../utils/constants.mjs';\nimport { getTransition } from '../utils/utils.mjs';\n\nconst useMenuState = ({\n initialOpen,\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout = 500,\n onMenuChange\n} = {}) => {\n const enter = getTransition(transition, 'open');\n const exit = getTransition(transition, 'close');\n const [{\n status\n }, toggleMenu, endTransition] = useTransitionState({\n initialEntered: initialOpen,\n mountOnEnter: !initialMounted,\n unmountOnExit: unmountOnClose,\n timeout: transitionTimeout,\n enter,\n exit,\n onStateChange: useCallback(({\n current: {\n isEnter,\n isResolved\n }\n }) => {\n if (!onMenuChange || isEnter && enter && isResolved || !isEnter && exit && isResolved) {\n return;\n }\n onMenuChange({\n open: isEnter\n });\n }, [onMenuChange, enter, exit])\n });\n return [{\n state: MenuStateMap[status],\n endTransition\n }, toggleMenu];\n};\n\nexport { useMenuState };\n","import { useState } from 'react';\nimport { useMenuState } from './useMenuState.mjs';\n\nconst useMenuStateAndFocus = options => {\n const [menuProps, toggleMenu] = useMenuState(options);\n const [menuItemFocus, setMenuItemFocus] = useState();\n const openMenu = (position, alwaysUpdate) => {\n setMenuItemFocus({\n position,\n alwaysUpdate\n });\n toggleMenu(true);\n };\n return [{\n menuItemFocus,\n ...menuProps\n }, toggleMenu, openMenu];\n};\n\nexport { useMenuStateAndFocus };\n","import { useState } from 'react';\n\nconst useClick = (state, onToggle) => {\n if (process.env.NODE_ENV !== 'production' && typeof onToggle !== 'function') {\n throw new Error('[React-Menu] useClick/useHover requires a function in the second parameter.');\n }\n const [skipOpen] = useState({});\n return {\n onMouseDown: () => {\n skipOpen.v = state && state !== 'closed';\n },\n onClick: e => skipOpen.v ? skipOpen.v = false : onToggle(true, e)\n };\n};\n\nexport { useClick };\n","import { forwardRef, useRef, useCallback, useImperativeHandle, Fragment, cloneElement, version } from 'react';\nimport { ControlledMenu } from './ControlledMenu.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.mjs';\nimport { useClick } from '../hooks/useClick.mjs';\nimport { FocusPositions, Keys } from '../utils/constants.mjs';\nimport { safeCall, mergeProps, isMenuOpen, getName } from '../utils/utils.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst isLegacyReact = parseInt(version) < 19;\nconst Menu = /*#__PURE__*/forwardRef(function Menu({\n 'aria-label': ariaLabel,\n captureFocus: _,\n initialOpen: _1,\n menuButton,\n instanceRef,\n onMenuChange,\n ...restProps\n}, externalRef) {\n const [stateProps, toggleMenu, openMenu] = useMenuStateAndFocus({\n ...restProps,\n onMenuChange\n });\n const {\n state\n } = stateProps;\n const isOpen = isMenuOpen(state);\n const buttonRef = useRef(null);\n const anchorProps = useClick(state, (_, e) => openMenu(!e.detail ? FocusPositions.FIRST : undefined));\n const handleClose = useCallback(e => {\n toggleMenu(false);\n if (e.key) buttonRef.current.focus();\n }, [toggleMenu]);\n const onKeyDown = e => {\n switch (e.key) {\n case Keys.UP:\n openMenu(FocusPositions.LAST);\n break;\n case Keys.DOWN:\n openMenu(FocusPositions.FIRST);\n break;\n default:\n return;\n }\n e.preventDefault();\n };\n const button = safeCall(menuButton, {\n open: isOpen\n });\n if (!button || !button.type) throw new Error('Menu requires a menuButton prop.');\n const buttonProps = {\n ...mergeProps({\n onKeyDown,\n ...anchorProps\n }, button.props),\n ref: useCombinedRef(isLegacyReact ? button.ref : button.props.ref, buttonRef)\n };\n if (getName(button.type) === 'MenuButton') {\n buttonProps.isOpen = isOpen;\n }\n const renderButton = /*#__PURE__*/cloneElement(button, buttonProps);\n useImperativeHandle(instanceRef, () => ({\n openMenu,\n closeMenu: () => toggleMenu(false)\n }));\n return /*#__PURE__*/jsxs(Fragment, {\n children: [renderButton, /*#__PURE__*/jsx(ControlledMenu, {\n ...restProps,\n ...stateProps,\n \"aria-label\": ariaLabel || (typeof button.props.children === 'string' ? button.props.children : 'Menu'),\n anchorRef: buttonRef,\n ref: externalRef,\n onClose: handleClose\n })]\n });\n});\n\nexport { Menu };\n","import { forwardRef, useRef, useContext, memo } from 'react';\nimport { HoverItemContext } from './constants.mjs';\nimport { jsx } from 'react/jsx-runtime';\n\nconst withHovering = (name, WrappedComponent) => {\n const Component = /*#__PURE__*/memo(WrappedComponent);\n const WithHovering = /*#__PURE__*/forwardRef((props, ref) => {\n const itemRef = useRef(null);\n return /*#__PURE__*/jsx(Component, {\n ...props,\n itemRef: itemRef,\n externalRef: ref,\n isHovering: useContext(HoverItemContext) === itemRef.current\n });\n });\n WithHovering.displayName = `WithHovering(${name})`;\n return WithHovering;\n};\n\nexport { withHovering };\n","import { useState, useEffect } from 'react';\n\nconst useMouseOver = isHovering => {\n const [mouseOver, setMouseOver] = useState(false);\n useEffect(() => {\n !isHovering && setMouseOver(false);\n }, [isHovering]);\n return [mouseOver, () => !mouseOver && setMouseOver(true), () => setMouseOver(false)];\n};\n\nexport { useMouseOver };\n","import { useLayoutEffect as useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect.mjs';\n\nconst useItemEffect = (isDisabled, itemRef, updateItems) => {\n useIsomorphicLayoutEffect(() => {\n if (process.env.NODE_ENV !== 'production' && !updateItems) {\n throw new Error(`[React-Menu] This menu item or submenu should be rendered under a menu: ${itemRef.current.outerHTML}`);\n }\n if (isDisabled) return;\n const item = itemRef.current;\n updateItems(item, true);\n return () => {\n updateItems(item);\n };\n }, [isDisabled, itemRef, updateItems]);\n};\n\nexport { useItemEffect };\n","import { useContext, useRef, useState, useEffect, useImperativeHandle, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuList } from './MenuList.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { SettingsContext, MenuListContext, MenuListItemContext, roleNone, roleMenuitem, menuClass, menuItemClass, subMenuClass, HoverActionTypes, Keys, FocusPositions } from '../utils/constants.mjs';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.mjs';\nimport { useMouseOver } from '../hooks/useMouseOver.mjs';\nimport { useItemEffect } from '../hooks/useItemEffect.mjs';\nimport { mergeProps, safeCall, commonProps, isMenuOpen, batchedUpdates } from '../utils/utils.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst SubMenu = /*#__PURE__*/withHovering('SubMenu', function SubMenu({\n 'aria-label': ariaLabel,\n className,\n disabled,\n direction,\n label,\n openTrigger,\n onMenuChange,\n isHovering,\n instanceRef,\n itemRef,\n captureFocus: _1,\n repositionFlag: _2,\n itemProps = {},\n portal = false,\n ...restProps\n}) {\n const settings = useContext(SettingsContext);\n const {\n rootMenuRef,\n submenuOpenDelay,\n submenuCloseDelay\n } = settings;\n const {\n parentMenuRef,\n parentDir,\n overflow: parentOverflow\n } = useContext(MenuListContext);\n const {\n isParentOpen,\n submenuCtx,\n dispatch,\n updateItems\n } = useContext(MenuListItemContext);\n const isPortal = portal || parentOverflow !== 'visible';\n const [stateProps, toggleMenu, _openMenu] = useMenuStateAndFocus({\n ...settings,\n onMenuChange\n });\n const [mouseOver, mouseOverStart, mouseOverEnd] = useMouseOver(isHovering);\n const {\n state\n } = stateProps;\n const isDisabled = !!disabled;\n const isOpen = isMenuOpen(state);\n const containerRef = useRef(null);\n const [timerId] = useState({\n v: 0\n });\n const stopTimer = () => {\n submenuCtx.off();\n if (timerId.v) {\n clearTimeout(timerId.v);\n timerId.v = 0;\n }\n };\n const openMenu = (...args) => {\n stopTimer();\n setHover();\n !isDisabled && _openMenu(...args);\n };\n const setHover = () => !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n const delayOpen = delay => {\n setHover();\n if (!openTrigger) timerId.v = setTimeout(() => batchedUpdates(openMenu), Math.max(delay, 0));\n };\n const onPointerMove = e => {\n if (isDisabled) return;\n e.stopPropagation();\n mouseOverStart();\n if (timerId.v || isOpen) return;\n submenuCtx.on(submenuCloseDelay, () => delayOpen(submenuOpenDelay - submenuCloseDelay), () => delayOpen(submenuOpenDelay));\n };\n const onPointerLeave = () => {\n mouseOverEnd();\n stopTimer();\n if (!isOpen) dispatch(HoverActionTypes.UNSET, itemRef.current);\n };\n const onKeyDown = e => {\n if (!isHovering) return;\n switch (e.key) {\n case Keys.ENTER:\n e.preventDefault();\n case Keys.SPACE:\n case Keys.RIGHT:\n openTrigger !== 'none' && openMenu(FocusPositions.FIRST);\n }\n };\n const onKeyDownOfRoot = e => {\n let handled = false;\n switch (e.key) {\n case Keys.LEFT:\n if (isOpen) {\n itemRef.current.focus();\n toggleMenu(false);\n handled = true;\n }\n break;\n case Keys.RIGHT:\n if (!isOpen) handled = true;\n break;\n }\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n useItemEffect(isDisabled, itemRef, updateItems);\n useEffect(() => submenuCtx.toggle(isOpen), [submenuCtx, isOpen]);\n useEffect(() => () => {\n clearTimeout(timerId.v);\n submenuCtx.toggle(false);\n }, [timerId, submenuCtx]);\n useEffect(() => {\n if (isHovering && isParentOpen) {\n itemRef.current.focus();\n } else {\n toggleMenu(false);\n }\n }, [isHovering, isParentOpen, toggleMenu, itemRef]);\n useImperativeHandle(instanceRef, () => ({\n openMenu: (...args) => {\n isParentOpen && openMenu(...args);\n },\n closeMenu: () => {\n if (isOpen) {\n itemRef.current.focus();\n toggleMenu(false);\n }\n }\n }));\n const modifiers = useMemo(() => ({\n open: isOpen,\n hover: mouseOver || isHovering,\n disabled: isDisabled,\n submenu: true\n }), [isOpen, isHovering, isDisabled, mouseOver]);\n const {\n ref: externalItemRef,\n className: itemClassName,\n ...restItemProps\n } = itemProps;\n const mergedItemProps = mergeProps({\n onPointerEnter: submenuCtx.off,\n onPointerMove,\n onPointerLeave,\n onKeyDown,\n onClick: () => openTrigger !== 'none' && openMenu()\n }, restItemProps);\n const getMenuList = () => {\n const menuList = /*#__PURE__*/jsx(MenuList, {\n ...restProps,\n ...stateProps,\n ariaLabel: ariaLabel || (typeof label === 'string' ? label : 'Submenu'),\n anchorRef: itemRef,\n containerRef: isPortal ? rootMenuRef : containerRef,\n direction: direction || (parentDir === 'right' || parentDir === 'left' ? parentDir : 'right'),\n parentScrollingRef: isPortal && parentMenuRef,\n isDisabled: isDisabled\n });\n const container = rootMenuRef.current;\n return isPortal && container ? /*#__PURE__*/createPortal(menuList, container) : menuList;\n };\n return /*#__PURE__*/jsxs(\"li\", {\n className: useBEM({\n block: menuClass,\n element: subMenuClass,\n className\n }),\n style: {\n position: 'relative'\n },\n role: roleNone,\n ref: containerRef,\n onKeyDown: onKeyDownOfRoot,\n children: [/*#__PURE__*/jsx(\"div\", {\n role: roleMenuitem,\n \"aria-haspopup\": true,\n \"aria-expanded\": isOpen,\n ...commonProps(isDisabled, isHovering),\n ...mergedItemProps,\n ref: useCombinedRef(externalItemRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className: itemClassName\n }),\n children: useMemo(() => safeCall(label, modifiers), [label, modifiers])\n }), state && getMenuList()]\n });\n});\n\nexport { SubMenu };\n","import { useContext, useEffect } from 'react';\nimport { useItemEffect } from './useItemEffect.mjs';\nimport { useMouseOver } from './useMouseOver.mjs';\nimport { SettingsContext, MenuListItemContext, HoverActionTypes } from '../utils/constants.mjs';\n\nconst useItemState = (itemRef, focusRef, isHovering, isDisabled) => {\n const [mouseOver, mouseOverStart, mouseOverEnd] = useMouseOver(isHovering);\n const {\n submenuCloseDelay\n } = useContext(SettingsContext);\n const {\n isParentOpen,\n submenuCtx,\n dispatch,\n updateItems\n } = useContext(MenuListItemContext);\n const setHover = () => {\n !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n };\n const unsetHover = () => {\n !isDisabled && dispatch(HoverActionTypes.UNSET, itemRef.current);\n };\n const onBlur = e => {\n if (isHovering && !e.currentTarget.contains(e.relatedTarget)) unsetHover();\n };\n const onPointerMove = e => {\n if (!isDisabled) {\n e.stopPropagation();\n mouseOverStart();\n submenuCtx.on(submenuCloseDelay, setHover, setHover);\n }\n };\n const onPointerLeave = (_, keepHover) => {\n mouseOverEnd();\n submenuCtx.off();\n !keepHover && unsetHover();\n };\n useItemEffect(isDisabled, itemRef, updateItems);\n useEffect(() => {\n if (isHovering && isParentOpen) {\n focusRef.current && focusRef.current.focus();\n }\n }, [focusRef, isHovering, isParentOpen]);\n return {\n mouseOver,\n setHover,\n onBlur,\n onPointerMove,\n onPointerLeave\n };\n};\n\nexport { useItemState };\n","import { useContext, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { useItemState } from '../hooks/useItemState.mjs';\nimport { EventHandlersContext, RadioGroupContext, menuClass, menuItemClass, roleNone, roleMenuitem, Keys } from '../utils/constants.mjs';\nimport { mergeProps, safeCall, commonProps } from '../utils/utils.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst MenuItem = /*#__PURE__*/withHovering('MenuItem', function MenuItem({\n className,\n value,\n href,\n type,\n checked,\n disabled,\n children,\n onClick,\n isHovering,\n itemRef,\n externalRef,\n ...restProps\n}) {\n const isDisabled = !!disabled;\n const {\n mouseOver,\n setHover,\n ...restStateProps\n } = useItemState(itemRef, itemRef, isHovering, isDisabled);\n const eventHandlers = useContext(EventHandlersContext);\n const radioGroup = useContext(RadioGroupContext);\n const isRadio = type === 'radio';\n const isCheckBox = type === 'checkbox';\n const isAnchor = !!href && !isDisabled && !isRadio && !isCheckBox;\n const isChecked = isRadio ? radioGroup.value === value : isCheckBox ? !!checked : false;\n const handleClick = e => {\n if (isDisabled) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n const event = {\n value,\n syntheticEvent: e\n };\n if (e.key !== undefined) event.key = e.key;\n if (isCheckBox) event.checked = !isChecked;\n if (isRadio) event.name = radioGroup.name;\n safeCall(onClick, event);\n if (isRadio) safeCall(radioGroup.onRadioChange, event);\n eventHandlers.handleClick(event, isCheckBox || isRadio);\n };\n const handleKeyDown = e => {\n if (!isHovering) return;\n switch (e.key) {\n case Keys.ENTER:\n e.preventDefault();\n case Keys.SPACE:\n isAnchor ? itemRef.current.click() : handleClick(e);\n }\n };\n const modifiers = useMemo(() => ({\n type,\n disabled: isDisabled,\n hover: mouseOver || isHovering,\n checked: isChecked,\n anchor: isAnchor\n }), [type, isDisabled, mouseOver, isHovering, isChecked, isAnchor]);\n const mergedProps = mergeProps({\n ...restStateProps,\n onPointerDown: setHover,\n onKeyDown: handleKeyDown,\n onClick: handleClick\n }, restProps);\n const menuItemProps = {\n role: isRadio ? 'menuitemradio' : isCheckBox ? 'menuitemcheckbox' : roleMenuitem,\n 'aria-checked': isRadio || isCheckBox ? isChecked : undefined,\n ...commonProps(isDisabled, isHovering),\n ...mergedProps,\n ref: useCombinedRef(externalRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className\n }),\n children: useMemo(() => safeCall(children, modifiers), [children, modifiers])\n };\n return isAnchor ? /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n children: /*#__PURE__*/jsx(\"a\", {\n href: href,\n ...menuItemProps\n })\n }) : /*#__PURE__*/jsx(\"li\", {\n ...menuItemProps\n });\n});\n\nexport { MenuItem };\n","import { useRef, useContext, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { useItemState } from '../hooks/useItemState.mjs';\nimport { EventHandlersContext, roleMenuitem, menuClass, menuItemClass } from '../utils/constants.mjs';\nimport { safeCall, mergeProps, commonProps } from '../utils/utils.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst FocusableItem = /*#__PURE__*/withHovering('FocusableItem', function FocusableItem({\n className,\n disabled,\n children,\n isHovering,\n itemRef,\n externalRef,\n ...restProps\n}) {\n const isDisabled = !!disabled;\n const ref = useRef(null);\n const {\n mouseOver,\n setHover,\n onPointerLeave,\n ...restStateProps\n } = useItemState(itemRef, ref, isHovering, isDisabled);\n const {\n handleClose\n } = useContext(EventHandlersContext);\n const modifiers = useMemo(() => ({\n disabled: isDisabled,\n hover: mouseOver || isHovering,\n focusable: true\n }), [isDisabled, isHovering, mouseOver]);\n const renderChildren = useMemo(() => safeCall(children, {\n ...modifiers,\n ref,\n closeMenu: handleClose\n }), [children, modifiers, handleClose]);\n const mergedProps = mergeProps({\n ...restStateProps,\n onPointerLeave: e => onPointerLeave(e, true),\n onFocus: setHover\n }, restProps);\n return /*#__PURE__*/jsx(\"li\", {\n role: roleMenuitem,\n ...commonProps(isDisabled),\n ...mergedProps,\n ref: useCombinedRef(externalRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className\n }),\n children: renderChildren\n });\n});\n\nexport { FocusableItem };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { menuClass, menuDividerClass } from '../utils/constants.mjs';\n\nconst MenuDivider = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MenuDivider({\n className,\n ...restProps\n}, externalRef) {\n return /*#__PURE__*/jsx(\"li\", {\n role: \"separator\",\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: menuDividerClass,\n className\n })\n });\n}));\n\nexport { MenuDivider };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { roleNone, menuClass, menuHeaderClass } from '../utils/constants.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\n\nconst MenuHeader = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MenuHeader({\n className,\n ...restProps\n}, externalRef) {\n return /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: menuHeaderClass,\n className\n })\n });\n}));\n\nexport { MenuHeader };\n","import { forwardRef, useRef, useState, useContext } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { MenuListContext, menuClass, menuGroupClass } from '../utils/constants.mjs';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.mjs';\nimport { getNormalizedClientRect } from '../positionUtils/getNormalizedClientRect.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst MenuGroup = /*#__PURE__*/forwardRef(function MenuGroup({\n className,\n style,\n takeOverflow,\n ...restProps\n}, externalRef) {\n const ref = useRef(null);\n const [overflowStyle, setOverflowStyle] = useState();\n const {\n overflow,\n overflowAmt\n } = useContext(MenuListContext);\n useIsomorphicLayoutEffect(() => {\n let maxHeight;\n if (takeOverflow && overflowAmt >= 0) {\n maxHeight = getNormalizedClientRect(ref.current).height - overflowAmt;\n if (maxHeight < 0) maxHeight = 0;\n }\n setOverflowStyle(maxHeight >= 0 ? {\n maxHeight,\n overflow\n } : undefined);\n }, [takeOverflow, overflow, overflowAmt]);\n useIsomorphicLayoutEffect(() => {\n if (overflowStyle) ref.current.scrollTop = 0;\n }, [overflowStyle]);\n return /*#__PURE__*/jsx(\"div\", {\n ...restProps,\n ref: useCombinedRef(externalRef, ref),\n className: useBEM({\n block: menuClass,\n element: menuGroupClass,\n className\n }),\n style: {\n ...style,\n ...overflowStyle\n }\n });\n});\n\nexport { MenuGroup };\n","import { forwardRef, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { RadioGroupContext, roleNone, menuClass, radioGroupClass } from '../utils/constants.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\n\nconst MenuRadioGroup = /*#__PURE__*/forwardRef(function MenuRadioGroup({\n 'aria-label': ariaLabel,\n className,\n name,\n value,\n onRadioChange,\n ...restProps\n}, externalRef) {\n const contextValue = useMemo(() => ({\n name,\n value,\n onRadioChange\n }), [name, value, onRadioChange]);\n return /*#__PURE__*/jsx(RadioGroupContext.Provider, {\n value: contextValue,\n children: /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n children: /*#__PURE__*/jsx(\"ul\", {\n role: \"group\",\n \"aria-label\": ariaLabel || name || 'Radio group',\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: radioGroupClass,\n className\n })\n })\n })\n });\n});\n\nexport { MenuRadioGroup };\n","import { useRef as i, useCallback as P, useEffect as C } from \"react\";\nvar f = /* @__PURE__ */ ((e) => (e.Mouse = \"mouse\", e.Touch = \"touch\", e.Pointer = \"pointer\", e))(f || {}), l = /* @__PURE__ */ ((e) => (e.CancelledByMovement = \"cancelled-by-movement\", e.CancelledByRelease = \"cancelled-by-release\", e.CancelledOutsideElement = \"cancelled-outside-element\", e))(l || {});\nconst b = [\n \"mousedown\",\n \"mousemove\",\n \"mouseup\",\n \"mouseleave\",\n \"mouseout\"\n], q = [\n \"touchstart\",\n \"touchmove\",\n \"touchend\",\n \"touchcancel\"\n], z = [\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointerleave\",\n \"pointerout\"\n];\nfunction G(e) {\n return typeof e == \"object\" && e !== null && \"pageX\" in e && typeof e.pageX == \"number\" && \"pageY\" in e && typeof e.pageY == \"number\";\n}\nfunction J(e) {\n var u;\n return b.includes((u = e == null ? void 0 : e.nativeEvent) == null ? void 0 : u.type);\n}\nfunction U(e) {\n var u;\n return q.includes((u = e == null ? void 0 : e.nativeEvent) == null ? void 0 : u.type) || \"touches\" in e;\n}\nfunction K(e) {\n const { nativeEvent: u } = e;\n return u ? z.includes(u == null ? void 0 : u.type) || \"pointerId\" in u : !1;\n}\nfunction D(e) {\n return J(e) || U(e) || K(e);\n}\nfunction A(e) {\n var s;\n const u = U(e) ? (s = e == null ? void 0 : e.touches) == null ? void 0 : s[0] : e;\n return G(u) ? {\n x: u.pageX,\n y: u.pageY\n } : null;\n}\nfunction N(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 V(e, {\n threshold: u = 400,\n captureEvent: s = !1,\n detect: R = f.Pointer,\n cancelOnMovement: p = !1,\n cancelOutsideElement: T = !0,\n filterEvents: M,\n onStart: m,\n onMove: w,\n onFinish: g,\n onCancel: h\n} = {}) {\n const L = i(!1), c = i(!1), H = i(), d = i(), B = i(e), a = i(null), y = P(\n (r) => (t) => {\n c.current || D(t) && (M !== void 0 && !M(t) || (s && t.persist(), m == null || m(t, { context: r }), a.current = A(t), c.current = !0, H.current = t.currentTarget, d.current = setTimeout(() => {\n B.current && (B.current(t, { context: r }), L.current = !0);\n }, u)));\n },\n [s, M, m, u]\n ), o = P(\n (r) => (t, n) => {\n D(t) && c.current && (a.current = null, s && t.persist(), L.current ? g == null || g(t, { context: r }) : c.current && (h == null || h(t, { context: r, reason: n ?? l.CancelledByRelease })), L.current = !1, c.current = !1, d.current !== void 0 && clearTimeout(d.current));\n },\n [s, g, h]\n ), E = P(\n (r) => (t) => {\n if (D(t) && (w == null || w(t, { context: r }), p !== !1 && a.current)) {\n const n = A(t);\n if (n) {\n const X = p === !0 ? 25 : p, Y = {\n x: Math.abs(n.x - a.current.x),\n y: Math.abs(n.y - a.current.y)\n };\n (Y.x > X || Y.y > X) && o(r)(t, l.CancelledByMovement);\n }\n }\n },\n [o, p, w]\n ), I = P(\n (r) => {\n if (e === null)\n return {};\n switch (R) {\n case f.Mouse: {\n const t = {\n onMouseDown: y(r),\n onMouseMove: E(r),\n onMouseUp: o(r)\n };\n return T && (t.onMouseLeave = (n) => {\n o(r)(n, l.CancelledOutsideElement);\n }), t;\n }\n case f.Touch:\n return {\n onTouchStart: y(r),\n onTouchMove: E(r),\n onTouchEnd: o(r)\n };\n case f.Pointer: {\n const t = {\n onPointerDown: y(r),\n onPointerMove: E(r),\n onPointerUp: o(r)\n };\n return T && (t.onPointerLeave = (n) => o(r)(n, l.CancelledOutsideElement)), t;\n }\n }\n },\n [e, o, T, R, E, y]\n );\n return C(() => {\n function r(t) {\n const n = N(t);\n o()(n);\n }\n return window.addEventListener(\"mouseup\", r), window.addEventListener(\"touchend\", r), window.addEventListener(\"pointerup\", r), () => {\n window.removeEventListener(\"mouseup\", r), window.removeEventListener(\"touchend\", r), window.removeEventListener(\"pointerup\", r);\n };\n }, [o]), C(\n () => () => {\n d.current !== void 0 && clearTimeout(d.current);\n },\n []\n ), C(() => {\n B.current = e;\n }, [e]), I;\n}\nexport {\n l as LongPressCallbackReason,\n f as LongPressEventType,\n V as useLongPress\n};\n","\"use client\";\nvar b={success:{pattern:[{duration:30,intensity:.5},{delay:60,duration:40,intensity:1}]},warning:{pattern:[{duration:40,intensity:.8},{delay:100,duration:40,intensity:.6}]},error:{pattern:[{duration:40,intensity:.9},{delay:40,duration:40,intensity:.9},{delay:40,duration:40,intensity:.9}]},light:{pattern:[{duration:15,intensity:.4}]},medium:{pattern:[{duration:25,intensity:.7}]},heavy:{pattern:[{duration:35,intensity:1}]},soft:{pattern:[{duration:40,intensity:.5}]},rigid:{pattern:[{duration:10,intensity:1}]},selection:{pattern:[{duration:8,intensity:.3}]},nudge:{pattern:[{duration:80,intensity:.8},{delay:80,duration:50,intensity:.3}]},buzz:{pattern:[{duration:1e3,intensity:1}]}};var g=16,x=184,m=1e3,p=20;function C(o){if(typeof o==\"number\")return{vibrations:[{duration:o}]};if(typeof o==\"string\"){let i=b[o];return i?{vibrations:i.pattern.map(t=>({...t}))}:(console.warn(`[web-haptics] Unknown preset: \"${o}\"`),null)}if(Array.isArray(o)){if(o.length===0)return{vibrations:[]};if(typeof o[0]==\"number\"){let i=o,t=[];for(let e=0;e<i.length;e+=2){let n=e>0?i[e-1]:0;t.push({...n>0&&{delay:n},duration:i[e]})}return{vibrations:t}}return{vibrations:o.map(i=>({...i}))}}return{vibrations:o.pattern.map(i=>({...i}))}}function w(o,i){if(i>=1)return[o];if(i<=0)return[];let t=Math.max(1,Math.round(p*i)),e=p-t,n=[],s=o;for(;s>=p;)n.push(t),n.push(e),s-=p;if(s>0){let a=Math.max(1,Math.round(s*i));n.push(a);let r=s-a;r>0&&n.push(r)}return n}function M(o,i){let t=[];for(let e=0;e<o.length;e++){let n=o[e],s=Math.max(0,Math.min(1,n.intensity??i)),a=n.delay??0;a>0&&(t.length>0&&t.length%2===0?t[t.length-1]+=a:(t.length===0&&t.push(0),t.push(a)));let r=w(n.duration,s);if(r.length===0){t.length>0&&t.length%2===0?t[t.length-1]+=n.duration:n.duration>0&&(t.push(0),t.push(n.duration));continue}for(let d of r)t.push(d)}return t}var I=0,v=class o{hapticLabel=null;domInitialized=!1;instanceId;debug;showSwitch;rafId=null;patternResolve=null;audioCtx=null;audioFilter=null;audioGain=null;audioBuffer=null;constructor(i){this.instanceId=++I,this.debug=i?.debug??!1,this.showSwitch=i?.showSwitch??!1}static isSupported=typeof navigator<\"u\"&&typeof navigator.vibrate==\"function\";async trigger(i=[{duration:25,intensity:.7}],t){let e=C(i);if(!e)return;let{vibrations:n}=e;if(n.length===0)return;let s=Math.max(0,Math.min(1,t?.intensity??.5));for(let a of n)if(a.duration>m&&(a.duration=m),!Number.isFinite(a.duration)||a.duration<0||a.delay!==void 0&&(!Number.isFinite(a.delay)||a.delay<0)){console.warn(\"[web-haptics] Invalid vibration values. Durations and delays must be finite non-negative numbers.\");return}if(o.isSupported&&navigator.vibrate(M(n,s)),!o.isSupported||this.debug){if(this.ensureDOM(),!this.hapticLabel)return;this.debug&&await this.ensureAudio(),this.stopPattern();let r=(n[0]?.delay??0)===0;if(r&&(this.hapticLabel.click(),this.debug&&this.audioCtx)){let d=Math.max(0,Math.min(1,n[0].intensity??s));this.playClick(d)}await this.runPattern(n,s,r)}}cancel(){this.stopPattern(),o.isSupported&&navigator.vibrate(0)}destroy(){this.stopPattern(),this.hapticLabel&&(this.hapticLabel.remove(),this.hapticLabel=null,this.domInitialized=!1),this.audioCtx&&(this.audioCtx.close(),this.audioCtx=null,this.audioFilter=null,this.audioGain=null,this.audioBuffer=null)}setDebug(i){this.debug=i,!i&&this.audioCtx&&(this.audioCtx.close(),this.audioCtx=null,this.audioFilter=null,this.audioGain=null,this.audioBuffer=null)}setShowSwitch(i){if(this.showSwitch=i,this.hapticLabel){let t=this.hapticLabel.querySelector(\"input\");this.hapticLabel.style.display=i?\"\":\"none\",t&&(t.style.display=i?\"\":\"none\")}}stopPattern(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.patternResolve?.(),this.patternResolve=null}runPattern(i,t,e){return new Promise(n=>{this.patternResolve=n;let s=[],a=0;for(let u of i){let c=Math.max(0,Math.min(1,u.intensity??t)),l=u.delay??0;l>0&&(a+=l,s.push({end:a,isOn:!1,intensity:0})),a+=u.duration,s.push({end:a,isOn:!0,intensity:c})}let r=a,d=0,h=-1,y=u=>{d===0&&(d=u);let c=u-d;if(c>=r){this.rafId=null,this.patternResolve=null,n();return}let l=s[0];for(let f of s)if(c<f.end){l=f;break}if(l.isOn){let f=g+(1-l.intensity)*x;h===-1?(h=u,e||(this.hapticLabel?.click(),this.debug&&this.audioCtx&&this.playClick(l.intensity),e=!0)):u-h>=f&&(this.hapticLabel?.click(),this.debug&&this.audioCtx&&this.playClick(l.intensity),h=u)}this.rafId=requestAnimationFrame(y)};this.rafId=requestAnimationFrame(y)})}playClick(i){if(!this.audioCtx||!this.audioFilter||!this.audioGain||!this.audioBuffer)return;let t=this.audioBuffer.getChannelData(0);for(let a=0;a<t.length;a++)t[a]=(Math.random()*2-1)*Math.exp(-a/25);this.audioGain.gain.value=.5*i;let e=2e3+i*2e3,n=1+(Math.random()-.5)*.3;this.audioFilter.frequency.value=e*n;let s=this.audioCtx.createBufferSource();s.buffer=this.audioBuffer,s.connect(this.audioFilter),s.onended=()=>s.disconnect(),s.start()}async ensureAudio(){if(!this.audioCtx&&typeof AudioContext<\"u\"){this.audioCtx=new AudioContext,this.audioFilter=this.audioCtx.createBiquadFilter(),this.audioFilter.type=\"bandpass\",this.audioFilter.frequency.value=4e3,this.audioFilter.Q.value=8,this.audioGain=this.audioCtx.createGain(),this.audioFilter.connect(this.audioGain),this.audioGain.connect(this.audioCtx.destination);let i=.004;this.audioBuffer=this.audioCtx.createBuffer(1,this.audioCtx.sampleRate*i,this.audioCtx.sampleRate);let t=this.audioBuffer.getChannelData(0);for(let e=0;e<t.length;e++)t[e]=(Math.random()*2-1)*Math.exp(-e/25)}this.audioCtx?.state===\"suspended\"&&await this.audioCtx.resume()}ensureDOM(){if(this.domInitialized||typeof document>\"u\")return;let i=`web-haptics-${this.instanceId}`,t=document.createElement(\"label\");t.setAttribute(\"for\",i),t.textContent=\"Haptic feedback\",t.style.position=\"fixed\",t.style.bottom=\"10px\",t.style.left=\"10px\",t.style.padding=\"5px 10px\",t.style.backgroundColor=\"rgba(0, 0, 0, 0.7)\",t.style.color=\"white\",t.style.fontFamily=\"sans-serif\",t.style.fontSize=\"14px\",t.style.borderRadius=\"4px\",t.style.zIndex=\"9999\",t.style.userSelect=\"none\",this.hapticLabel=t;let e=document.createElement(\"input\");e.type=\"checkbox\",e.setAttribute(\"switch\",\"\"),e.id=i,e.style.all=\"initial\",e.style.appearance=\"auto\",this.showSwitch||(t.style.display=\"none\",e.style.display=\"none\"),t.appendChild(e),document.body.appendChild(t),this.domInitialized=!0}};export{b as a,v as b};\n","import { WebHaptics } from 'web-haptics';\n\nconst haptics = new WebHaptics();\n\nexport default haptics;\n","import mem from './mem';\nimport store from './store';\n\nconst DTFLOCALE_CACHE_KEY = 'dtflocale';\n\nfunction _getDtfLocale() {\n try {\n const cachedDtf = store.session.get(DTFLOCALE_CACHE_KEY);\n if (cachedDtf) return cachedDtf;\n const dtfLocale = new Intl.DateTimeFormat().resolvedOptions().locale;\n store.session.set(DTFLOCALE_CACHE_KEY, dtfLocale);\n return dtfLocale;\n } catch (e) {\n return null;\n }\n}\nexport const getDtfLocale = mem(_getDtfLocale);\n\nexport function clearDtfLocaleCache() {\n store.session.del(DTFLOCALE_CACHE_KEY);\n}\n","import { clearDtfLocaleCache, getDtfLocale } from './dtf-locale';\nimport localeMatch from './locale-match';\nimport mem from './mem';\n\nfunction initLocales() {\n const newLocales = [...navigator.languages];\n const dtfLocale = getDtfLocale();\n if (dtfLocale && !newLocales.includes(dtfLocale)) {\n newLocales.unshift(dtfLocale);\n }\n return newLocales;\n}\n\nlet locales = initLocales();\n\n// For testing: refresh locales from current navigator state\nexport function refreshLocales() {\n clearDtfLocaleCache();\n locales = initLocales();\n}\n\nconst createLocale = mem((language, options = {}) => {\n try {\n return new Intl.Locale(language, options);\n } catch (e) {\n // Fallback to simple string splitting\n // May not work properly due to how complicated this is\n if (!language) return null;\n\n // https://www.w3.org/International/articles/language-tags/\n // Parts: language-extlang-script-region-variant-extension-privateuse\n const [langPart, ...parts] = language.split('-', 4);\n const regionPart = parts.pop() || null;\n const fallbackLocale = {\n language: langPart,\n region: regionPart,\n ...options,\n toString: () => {\n const lang = fallbackLocale.language;\n const middle = parts.length > 0 ? `-${parts.join('-')}-` : '-';\n const reg = fallbackLocale.region;\n return reg ? `${lang}${middle}${reg}` : lang;\n },\n };\n return fallbackLocale;\n }\n});\n\nconst _DateTimeFormat = (locale, opts) => {\n const options = opts;\n\n const appLocale = createLocale(locale);\n\n // Find first user locale with a region\n let userRegion = null;\n for (const loc of locales) {\n const region = createLocale(loc)?.region;\n if (region) {\n userRegion = region;\n break;\n }\n }\n\n const userRegionLocale =\n userRegion && appLocale && appLocale.region !== userRegion\n ? createLocale(appLocale.language, {\n ...appLocale,\n region: userRegion,\n })?.toString()\n : null;\n\n const matchedLocale = localeMatch(\n [userRegionLocale, locale, locale?.replace(/-[a-z]+$/i, '')],\n locales,\n locale,\n );\n\n try {\n return new Intl.DateTimeFormat(matchedLocale, options);\n } catch (e) {\n return new Intl.DateTimeFormat(undefined, options);\n }\n};\n\nconst DateTimeFormat = mem(_DateTimeFormat);\n\nexport default DateTimeFormat;\n","import { i18n } from '@lingui/core';\n\nimport DateTimeFormat from './date-time-format';\n\nfunction niceDateTime(date, dtfOpts) {\n if (!(date instanceof Date)) {\n date = new Date(date);\n }\n\n const { hideTime, formatOpts, forceOpts } = dtfOpts || {};\n const currentYear = new Date().getFullYear();\n const options = forceOpts || {\n // Show year if not current year\n year: date.getFullYear() === currentYear ? undefined : 'numeric',\n month: 'short',\n day: 'numeric',\n // Hide time if requested\n hour: hideTime ? undefined : 'numeric',\n minute: hideTime ? undefined : 'numeric',\n ...formatOpts,\n };\n\n const DTF = DateTimeFormat(i18n.locale, options);\n const dateText = DTF.format(date);\n return dateText;\n}\n\nexport default niceDateTime;\n","import { t } from '@lingui/core/macro';\n\nexport default function openCompose(opts) {\n const url = URL.parse('./compose/', window.location);\n const { width: screenWidth, height: screenHeight } = window.screen;\n const left = Math.max(0, (screenWidth - 600) / 2);\n const top = Math.max(0, (screenHeight - 450) / 2);\n const width = Math.min(screenWidth, 600);\n const height = Math.min(screenHeight, 450);\n const winUID = opts?.uid || Math.random();\n const newWin = window.open(\n url,\n 'compose' + winUID,\n `width=${width},height=${height},left=${left},top=${top}`,\n );\n\n if (newWin) {\n // if (masto) {\n // newWin.masto = masto;\n // }\n\n newWin.__COMPOSE__ = opts;\n } else {\n alert(t`Looks like your browser is blocking popups.`);\n }\n\n return newWin;\n}\n","const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\nexport default function openOSK() {\n if (isSafari) {\n const fauxEl = document.createElement('input');\n fauxEl.style.position = 'absolute';\n fauxEl.style.top = '0';\n fauxEl.style.left = '0';\n fauxEl.style.opacity = '0';\n document.body.appendChild(fauxEl);\n fauxEl.focus();\n setTimeout(() => {\n document.body.removeChild(fauxEl);\n }, 500);\n }\n}\n","const root = document.documentElement;\nconst style = getComputedStyle(root);\nconst defaultBoundingBoxPadding = 8;\n\nlet safeAreaInsets = [0, 0, 0, 0];\nfunction getSafeAreaInsets() {\n // Get safe area inset variables from root\n const safeAreaInsetTop = style.getPropertyValue('--sai-top');\n const safeAreaInsetRight = style.getPropertyValue('--sai-right');\n const safeAreaInsetBottom = style.getPropertyValue('--sai-bottom');\n const safeAreaInsetLeft = style.getPropertyValue('--sai-left');\n safeAreaInsets = [\n // top, right, bottom, left (clockwise)\n Math.max(0, parseInt(safeAreaInsetTop, 10)),\n Math.max(0, parseInt(safeAreaInsetRight, 10)),\n Math.max(0, parseInt(safeAreaInsetBottom, 10)),\n Math.max(0, parseInt(safeAreaInsetLeft, 10)),\n ];\n}\nrequestAnimationFrame(getSafeAreaInsets);\n\nfunction safeBoundingBoxPadding(paddings = []) {\n const str = safeAreaInsets\n .map((v, i) => (v || defaultBoundingBoxPadding) + (paddings[i] || 0))\n .join(' ');\n // console.log(str);\n return str;\n}\n\n// Update safe area insets when orientation or resize\nif (CSS.supports('top: env(safe-area-inset-top)')) {\n window.addEventListener('resize', getSafeAreaInsets, { passive: true });\n}\n\nexport default safeBoundingBoxPadding;\n","import { t } from '@lingui/core/macro';\n\nimport openOSK from './open-osk';\nimport showToast from './show-toast';\nimport states from './states';\n\nconst TOAST_DURATION = 5_000; // 5 seconds\n\nexport default function showCompose(opts) {\n if (!opts) opts = true;\n\n if (states.showCompose) {\n if (states.composerState.minimized) {\n showToast({\n duration: TOAST_DURATION,\n text: t`A draft post is currently minimized. Post or discard it before creating a new one.`,\n });\n } else {\n showToast({\n duration: TOAST_DURATION,\n text: t`A post is currently open. Post or discard it before creating a new one.`,\n });\n }\n return;\n }\n\n openOSK();\n states.showCompose = opts;\n}\n","const template = document.createElement('template');\n\n// Regex patterns for HTML text processing\nconst PARAGRAPH_END_RE = /<\\/p>/g;\nconst LIST_ITEM_END_RE = /<\\/li>/g;\nconst MULTIPLE_LINE_BREAKS_RE = /[\\r\\n]{3,}/g;\nfunction getHTMLText(html, opts) {\n if (!html) return '';\n const { preProcess, truncateLinks = true } = opts || {};\n\n template.innerHTML = html\n .replace(PARAGRAPH_END_RE, '</p>\\n\\n')\n .replace(LIST_ITEM_END_RE, '</li>\\n');\n\n const content = template.content;\n const brElements = content.querySelectorAll('br');\n for (let i = 0; i < brElements.length; i++) {\n brElements[i].replaceWith('\\n');\n }\n\n preProcess?.(content);\n\n if (truncateLinks) {\n // MASTODON-SPECIFIC classes\n // Remove .invisible\n const invisibleElements = content.querySelectorAll('.invisible');\n for (let i = 0; i < invisibleElements.length; i++) {\n invisibleElements[i].remove();\n }\n // Add … at end of .ellipsis\n const ellipsisElements = content.querySelectorAll('.ellipsis');\n for (let i = 0; i < ellipsisElements.length; i++) {\n ellipsisElements[i].append('…');\n }\n }\n\n // Collect innerText from all child nodes since DocumentFragment doesn't have innerText\n let textContent = '';\n for (let i = 0; i < content.childNodes.length; i++) {\n const n = content.childNodes[i];\n textContent += n.innerText || n.textContent || '';\n }\n\n return textContent.replace(MULTIPLE_LINE_BREAKS_RE, '\\n\\n').trim();\n}\n\nexport default getHTMLText;\n","import getHTMLText from './getHTMLText';\n\nfunction statusPeek(status) {\n const { spoilerText, content, poll, mediaAttachments, quote } = status;\n let text = '';\n // Don't need supportsNativeQuote because checking quotedStatus ID is enough\n const hasQuote = !!quote?.quotedStatus?.id;\n if (spoilerText?.trim()) {\n text += spoilerText;\n } else {\n text += getHTMLText(content, {\n preProcess: (dom) => {\n if (hasQuote) {\n const reContainer = dom.querySelector('.quote-inline');\n if (reContainer) {\n reContainer.remove();\n }\n }\n },\n });\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 if (hasQuote) {\n const quotePeek = statusPeek(quote.quotedStatus);\n text += `\\n\\n❝\\n${quotePeek}\\n❞`;\n }\n return text;\n}\n\nexport default statusPeek;\n","import { memo } from 'preact/compat';\nimport { useEffect } from 'preact/hooks';\n\nimport { ICON_NAMESPACE, useIconSprite } from './icon-sprite-manager';\nimport { ICONS } from './ICONS';\n\nconst SIZES = {\n xs: 8,\n s: 12,\n m: 16,\n l: 20,\n xl: 24,\n xxl: 32,\n};\n\nconst INVALID_ID_CHARS_REGEX = /[^a-zA-Z0-9]/g;\n\nfunction Icon({\n icon,\n size = 'm',\n alt,\n title,\n class: className = '',\n style = {},\n}) {\n title = title || alt;\n const { loadIcon, isIconLoaded } = useIconSprite();\n\n if (!icon) return null;\n\n const iconSize = SIZES[size];\n let iconBlock = ICONS[icon];\n if (!iconBlock) {\n console.warn(`Icon ${icon} not found`);\n return null;\n }\n\n let rotate,\n flip,\n rtl = false;\n if (Array.isArray(iconBlock)) {\n [iconBlock, rotate, flip] = iconBlock;\n } else if (typeof iconBlock === 'object') {\n ({ rotate, flip, rtl } = iconBlock);\n iconBlock = iconBlock.module;\n }\n\n const sanitizedTitle = title?.replace(INVALID_ID_CHARS_REGEX, '-');\n const titleID = `${ICON_NAMESPACE}-title-${icon}-${sanitizedTitle}`;\n\n useEffect(() => {\n if (!isIconLoaded(icon)) {\n loadIcon(icon);\n }\n }, [icon]);\n\n const loaded = isIconLoaded(icon);\n\n return (\n <span\n class={`icon ${className} ${rtl ? 'rtl-flip' : ''}`}\n style={{\n width: `${iconSize}px`,\n height: `${iconSize}px`,\n ...style,\n }}\n data-icon={icon}\n title={loaded ? undefined : title || undefined}\n >\n {loaded && (\n <svg\n width={iconSize}\n height={iconSize}\n role={title ? 'img' : 'presentation'}\n aria-labelledby={title ? titleID : undefined}\n style={{\n transform: `${rotate ? `rotate(${rotate})` : ''} ${\n flip ? `scaleX(-1)` : ''\n }`,\n }}\n >\n {title ? <title id={titleID}>{title}</title> : null}\n <use href={`#${ICON_NAMESPACE}-${icon}`} />\n </svg>\n )}\n </span>\n );\n}\n\nexport default memo(Icon, (prevProps, nextProps) => {\n return (\n prevProps.icon === nextProps.icon &&\n prevProps.title === nextProps.title &&\n prevProps.alt === nextProps.alt &&\n prevProps.size === nextProps.size\n );\n});\n","import { forwardRef } from 'preact/compat';\nimport { useLocation } from 'react-router-dom';\n\nimport states from '../utils/states';\n\n/* NOTES\n =====\n Initially this uses <NavLink> from react-router-dom, but it doesn't work:\n 1. It interferes with nested <a> inside <a> and it's difficult to preventDefault/stopPropagation from the nested <a>\n 2. isActive doesn't work properly with the weird routes that's set up in this app, due to the faux \"location\" to make the modals work and prevent unmounting\n 3. Not using <Link state/> because it modifies history.state that *persists* across page reloads. I don't need that, so using valtio's states instead.\n*/\n\nconst Link = forwardRef((props, ref) => {\n let routerLocation;\n try {\n routerLocation = useLocation();\n } catch (e) {}\n let hash = (location.hash || '').replace(/^#/, '').trim();\n if (hash === '') hash = '/';\n const { to, ...restProps } = props;\n\n // Handle encodeURIComponent of searchParams values\n if (!!hash && hash !== '/' && hash.includes('?')) {\n const parsedHash = URL.parse(hash, location.origin); // Fake base URL\n if (parsedHash?.searchParams?.size) {\n const searchParamsStr = Array.from(parsedHash.searchParams.entries())\n .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n .join('&');\n hash = parsedHash.pathname + '?' + searchParamsStr;\n }\n }\n\n const isActive = hash === to || decodeURIComponent(hash) === to;\n return (\n <a\n ref={ref}\n href={`#${to}`}\n {...restProps}\n class={`${props.class || ''} ${isActive ? 'is-active' : ''}`}\n onClick={(e) => {\n if (e.currentTarget?.parentNode?.closest('a')) {\n // If this <a> is nested inside another <a>\n e.stopPropagation();\n }\n if (routerLocation) states.prevLocation = routerLocation;\n props.onClick?.(e);\n }}\n />\n );\n});\n\nexport default Link;\n","import { FocusableItem } from '@szhsin/react-menu';\n\nimport Link from './link';\n\nfunction MenuLink(props) {\n const { className, disabled, ...restProps } = props;\n return (\n <FocusableItem className={className} disabled={disabled}>\n {({ ref, closeMenu }) => (\n <Link\n {...restProps}\n ref={ref}\n onClick={({ detail }) =>\n closeMenu(detail === 0 ? 'Enter' : undefined)\n }\n />\n )}\n </FocusableItem>\n );\n}\n\nexport default MenuLink;\n","import mem from './mem.js';\n\nexport default mem(\n (locale) => new Intl.RelativeTimeFormat(locale || undefined),\n);\n","import { i18n } from '@lingui/core';\nimport { t } from '@lingui/core/macro';\nimport { useEffect, useMemo, useReducer } from 'preact/hooks';\n\nimport DateTimeFormat from '../utils/date-time-format';\nimport RTF from '../utils/relative-time-format';\n\nfunction isValidDate(value) {\n if (value instanceof Date) {\n return !isNaN(value.getTime());\n } else {\n const date = new Date(value);\n return !isNaN(date.getTime());\n }\n}\n\nconst minute = 60;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nconst rtfFromNow = (date) => {\n // date = Date object\n const rtf = RTF(i18n.locale);\n const seconds = (date.getTime() - Date.now()) / 1000;\n const absSeconds = Math.abs(seconds);\n if (absSeconds < minute) {\n return rtf.format(Math.floor(seconds), 'second');\n } else if (absSeconds < hour) {\n return rtf.format(Math.floor(seconds / minute), 'minute');\n } else if (absSeconds < day) {\n return rtf.format(Math.floor(seconds / hour), 'hour');\n } else if (absSeconds < 30 * day) {\n return rtf.format(Math.floor(seconds / day), 'day');\n } else if (absSeconds < 365 * day) {\n return rtf.format(Math.floor(seconds / day / 30), 'month');\n } else {\n return rtf.format(Math.floor(seconds / day / 365), 'year');\n }\n};\n\nconst twitterFromNow = (date) => {\n // date = Date object\n const seconds = (Date.now() - date.getTime()) / 1000;\n if (seconds < minute) {\n return t({\n comment: 'Relative time in seconds, as short as possible',\n message: `${seconds < 1 ? 1 : Math.floor(seconds)}s`,\n });\n } else if (seconds < hour) {\n return t({\n comment: 'Relative time in minutes, as short as possible',\n message: `${Math.floor(seconds / minute)}m`,\n });\n } else {\n return t({\n comment: 'Relative time in hours, as short as possible',\n message: `${Math.floor(seconds / hour)}h`,\n });\n }\n};\n\nexport default function RelativeTime({ datetime, format }) {\n if (!datetime) return null;\n const [renderCount, rerender] = useReducer((x) => x + 1, 0);\n const date = useMemo(() => new Date(datetime), [datetime]);\n const [dateStr, dt, title] = useMemo(() => {\n if (!isValidDate(date))\n return ['' + (typeof datetime === 'string' ? datetime : ''), '', ''];\n let str;\n if (format === 'micro') {\n // If date <= 1 day ago or day is within this year\n const now = new Date();\n const dayDiff = (now.getTime() - date.getTime()) / 1000 / day;\n if (dayDiff <= 1) {\n str = twitterFromNow(date);\n } else {\n const sameYear = now.getFullYear() === date.getFullYear();\n if (sameYear) {\n str = DateTimeFormat(i18n.locale, {\n year: undefined,\n month: 'short',\n day: 'numeric',\n }).format(date);\n } else {\n str = DateTimeFormat(i18n.locale, {\n dateStyle: 'short',\n }).format(date);\n }\n }\n }\n if (!str) str = rtfFromNow(date);\n return [str, date.toISOString(), date.toLocaleString()];\n }, [date, format, renderCount]);\n\n useEffect(() => {\n if (!isValidDate(date)) return;\n let timeout;\n let raf;\n function rafRerender() {\n raf = requestAnimationFrame(() => {\n rerender();\n scheduleRerender();\n });\n }\n function scheduleRerender() {\n // If less than 1 minute, rerender every 10s\n // If less than 1 hour rerender every 1m\n // Else, don't need to rerender\n const seconds = (Date.now() - date.getTime()) / 1000;\n if (seconds < minute) {\n timeout = setTimeout(rafRerender, 10_000);\n } else if (seconds < hour) {\n timeout = setTimeout(rafRerender, 60_000);\n }\n }\n scheduleRerender();\n return () => {\n clearTimeout(timeout);\n cancelAnimationFrame(raf);\n };\n }, []);\n\n return (\n <time datetime={dt} title={title}>\n {dateStr}\n </time>\n );\n}\n","import { SubMenu } from '@szhsin/react-menu';\nimport { useLayoutEffect, useRef, useState } from 'preact/hooks';\n\nexport default function SubMenu2(props) {\n const menuRef = useRef();\n const itemRef = useRef();\n const { label, direction, shift, ...restProps } = props;\n const [computedDirection, setComputedDirection] = useState(direction);\n const [computedShift, setComputedShift] = useState(shift);\n\n // If menu item width is >50% of viewport, use bottom direction\n useLayoutEffect(() => {\n if (itemRef.current) {\n const width = itemRef.current.offsetWidth;\n const viewportWidth = window.innerWidth;\n if (width > viewportWidth * 0.5) {\n setComputedDirection('bottom');\n setComputedShift(shift || 8);\n } else {\n setComputedDirection(direction);\n setComputedShift(shift);\n }\n }\n }, [direction, shift]);\n\n return (\n <SubMenu\n {...restProps}\n direction={computedDirection}\n shift={computedShift}\n label={label}\n instanceRef={menuRef}\n // Test fix for bug; submenus not opening on Android\n itemProps={{\n ref: itemRef,\n onPointerMove: (e) => {\n if (e.pointerType === 'touch') {\n menuRef.current?.openMenu?.();\n }\n },\n onPointerLeave: (e) => {\n if (e.pointerType === 'touch') {\n menuRef.current?.openMenu?.();\n }\n },\n ...props.itemProps,\n }}\n />\n );\n}\n","import { useEffect } from 'preact/hooks';\n\n// NOTE: The order of initialized close watchers is important\n// Last one will intercept first if there are multiple/nested close watchers\n// So if this hook reruns, the previous close watcher will be destroyed, the new one will be created and the order will change\nfunction useCloseWatcher(fn, deps = []) {\n if (!fn || typeof fn !== 'function') return;\n useEffect(() => {\n console.log('useCloseWatcher');\n const watcher = new CloseWatcher();\n watcher.addEventListener('close', fn);\n return () => {\n watcher.destroy();\n };\n }, deps);\n}\n\nexport default window.CloseWatcher ? useCloseWatcher : () => {};\n","import './modal.css';\n\nimport { createPortal } from 'preact/compat';\nimport { useEffect, useLayoutEffect, useRef } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport store from '../utils/store';\nimport useCloseWatcher from '../utils/useCloseWatcher';\n\nconst $modalContainer = document.getElementById('modal-container');\n\nfunction getBackdropThemeColor() {\n return getComputedStyle(document.documentElement).getPropertyValue(\n '--backdrop-theme-color',\n );\n}\n\nfunction Modal({ children, onClose, onClick, class: className, minimized }) {\n if (!children) return null;\n\n const modalRef = useRef();\n useEffect(() => {\n let timer = setTimeout(() => {\n const focusElement = modalRef.current?.querySelector('[tabindex=\"-1\"]');\n if (focusElement) {\n focusElement.focus();\n }\n }, 100);\n return () => clearTimeout(timer);\n }, []);\n\n const supportsCloseWatcher = window.CloseWatcher;\n const escRef = useHotkeys(\n 'esc',\n () => {\n setTimeout(() => {\n onClose?.();\n }, 0);\n },\n {\n enabled: !supportsCloseWatcher && !!onClose,\n // Using keyup and setTimeout above\n // This will run \"later\" to prevent clash with esc handlers from other components\n keydown: false,\n keyup: true,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n [onClose],\n );\n useCloseWatcher(onClose, [onClose]);\n\n useEffect(() => {\n const $deckContainers = document.querySelectorAll('.deck-container');\n if (minimized) {\n // Similar to focusDeck in focus-deck.jsx\n // Focus last deck\n const page = $deckContainers[$deckContainers.length - 1]; // last one\n if (page && page.tabIndex === -1) {\n page.focus();\n }\n } else {\n if (children) {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.setAttribute('inert', '');\n });\n } else {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n }\n }\n return () => {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n };\n }, [children, minimized]);\n\n const $meta = useRef();\n const metaColor = useRef();\n useLayoutEffect(() => {\n if (children && !minimized) {\n const theme = store.local.get('theme');\n if (theme) {\n const backdropColor = getBackdropThemeColor();\n console.log({ backdropColor });\n $meta.current = document.querySelector(\n `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n );\n if ($meta.current) {\n metaColor.current = $meta.current.content;\n $meta.current.content = backdropColor;\n }\n document.documentElement.style.setProperty(\n '--meta-theme-color',\n backdropColor,\n );\n } else {\n const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light';\n const backdropColor = getBackdropThemeColor();\n console.log({ backdropColor });\n $meta.current = document.querySelector(\n `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n );\n if ($meta.current) {\n metaColor.current = $meta.current.content;\n $meta.current.content = backdropColor;\n }\n document.documentElement.style.setProperty(\n '--meta-theme-color',\n backdropColor,\n );\n }\n } else {\n // Reset meta color\n if ($meta.current && metaColor.current) {\n $meta.current.content = metaColor.current;\n }\n document.documentElement.style.removeProperty('--meta-theme-color');\n }\n return () => {\n // Reset meta color\n if ($meta.current && metaColor.current) {\n $meta.current.content = metaColor.current;\n }\n document.documentElement.style.removeProperty('--meta-theme-color');\n };\n }, [children, minimized]);\n\n const Modal = (\n <div\n ref={(node) => {\n modalRef.current = node;\n escRef.current = node?.querySelector?.('[tabindex=\"-1\"]') || node;\n }}\n className={className}\n onClick={(e) => {\n onClick?.(e);\n if (e.target === e.currentTarget) {\n onClose?.(e);\n }\n }}\n tabIndex={minimized ? 0 : '-1'}\n inert={minimized}\n onFocus={(e) => {\n try {\n if (e.target === e.currentTarget) {\n const focusElement =\n modalRef.current?.querySelector('[tabindex=\"-1\"]');\n const isFocusable =\n !!focusElement &&\n getComputedStyle(focusElement)?.pointerEvents !== 'none';\n if (focusElement && isFocusable) {\n focusElement.focus();\n }\n }\n } catch (err) {\n console.error(err);\n }\n }}\n >\n {children}\n </div>\n );\n\n return createPortal(Modal, $modalContainer);\n\n // return createPortal(children, $modalContainer);\n}\n\nexport default Modal;\n","import './avatar.css';\n\nimport { memo } from 'preact/compat';\nimport { useRef } from 'preact/hooks';\n\nconst SIZES = {\n s: 16,\n m: 20,\n l: 24,\n xl: 32,\n xxl: 50,\n xxxl: 64,\n};\n\nconst alphaCache = new Map();\n\nconst canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\nconst ctx = canvas.getContext('2d', {\n willReadFrequently: true,\n});\nctx.imageSmoothingEnabled = false;\n\nconst scheduleTask =\n typeof requestIdleCallback === 'function'\n ? (fn) => requestIdleCallback(fn, { timeout: 500 })\n : (fn) => setTimeout(fn, 1);\n\nconst MISSING_IMAGE_PATH_REGEX = /missing\\.png$/;\n\nfunction Avatar({ url, staticUrl, size, alt = '', squircle, ...props }) {\n if (!url) {\n url = staticUrl;\n staticUrl = undefined;\n }\n size = SIZES[size] || size || SIZES.m;\n const avatarRef = useRef();\n const isMissing = MISSING_IMAGE_PATH_REGEX.test(url);\n return (\n <picture\n ref={avatarRef}\n class={`avatar ${squircle ? 'squircle' : ''} ${\n alphaCache.get(url) ? 'has-alpha' : ''\n }`}\n style={{\n width: size,\n height: size,\n }}\n title={alt}\n {...props}\n >\n {!!staticUrl && (\n <source srcset={staticUrl} media=\"(prefers-reduced-motion: reduce)\" />\n )}\n {!!url && (\n <img\n src={url}\n width={size}\n height={size}\n alt={alt}\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n crossOrigin={\n !alphaCache.has(url) && !isMissing ? 'anonymous' : undefined\n }\n onError={(e) => {\n if (e.target.crossOrigin) {\n e.target.crossOrigin = null;\n e.target.src = url;\n }\n }}\n onLoad={(e) => {\n if (avatarRef.current) avatarRef.current.dataset.loaded = true;\n if (alphaCache.has(url)) return;\n if (isMissing) return;\n scheduleTask(() => {\n try {\n // Check if image has alpha channel\n // Sample at reduced resolution to avoid processing large images\n const { naturalWidth: nw, naturalHeight: nh } = e.target;\n const scale = Math.min(1, SIZES.xxxl / Math.max(nw, nh));\n const sampleW = Math.max(1, Math.round(nw * scale));\n const sampleH = Math.max(1, Math.round(nh * scale));\n if (canvas.width !== sampleW) canvas.width = sampleW;\n if (canvas.height !== sampleH) canvas.height = sampleH;\n ctx.drawImage(e.target, 0, 0, sampleW, sampleH);\n const { data } = ctx.getImageData(0, 0, sampleW, sampleH);\n // Early-exit loop: stop once 10% of pixels have alpha <= 128\n const totalPixels = data.length / 4;\n const threshold = totalPixels * 0.1;\n let alphaCount = 0;\n for (let i = 3; i < data.length; i += 4) {\n if (data[i] <= 128 && ++alphaCount > threshold) break;\n }\n const hasAlpha = alphaCount > threshold;\n if (hasAlpha) {\n avatarRef.current?.classList.add('has-alpha');\n }\n alphaCache.set(url, hasAlpha);\n } catch (e) {\n // Silent fail\n alphaCache.set(url, false);\n }\n });\n }}\n />\n )}\n </picture>\n );\n}\n\nexport default memo(Avatar);\n","let IS_RTL = false;\n\n// Use MutationObserver to detect RTL\nconst observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes') {\n const { dir } = mutation.target;\n if (dir === 'rtl') {\n IS_RTL = true;\n } else {\n IS_RTL = false;\n }\n console.log({ IS_RTL });\n // Fire custom event 'dirchange' on document\n // document.dispatchEvent(new Event('dirchange'));\n }\n });\n});\nobserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n});\n\nexport default function isRTL() {\n return IS_RTL;\n // return document.documentElement.dir === 'rtl';\n}\n","import { useLayoutEffect, useState } from 'preact/hooks';\n\nexport default function useWindowSize() {\n const [size, setSize] = useState({\n width: null,\n height: null,\n });\n\n useLayoutEffect(() => {\n const handleResize = () => {\n setSize({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n handleResize();\n window.addEventListener('resize', handleResize, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n}\n","import { Menu } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\n\nimport isRTL from '../utils/is-rtl';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport useWindowSize from '../utils/useWindowSize';\n\n// It's like Menu but with sensible defaults, bug fixes and improvements.\nfunction Menu2(props) {\n const { containerProps, instanceRef: _instanceRef, align } = props;\n const size = useWindowSize();\n const instanceRef = _instanceRef?.current ? _instanceRef : useRef();\n\n // Values: start, end, center\n // Note: don't mess with 'center'\n const rtlAlign = isRTL()\n ? align === 'end'\n ? 'start'\n : align === 'start'\n ? 'end'\n : align\n : align;\n\n return (\n <Menu\n boundingBoxPadding={safeBoundingBoxPadding()}\n repositionFlag={`${size.width}x${size.height}`}\n unmountOnClose\n {...props}\n align={rtlAlign}\n instanceRef={instanceRef}\n containerProps={{\n onClick: (e) => {\n if (e.target === e.currentTarget) {\n instanceRef.current?.closeMenu?.();\n }\n containerProps?.onClick?.(e);\n },\n ...containerProps,\n }}\n />\n );\n}\n\nexport default Menu2;\n","import { MenuItem } from '@szhsin/react-menu';\nimport { cloneElement } from 'preact';\n\nimport Menu2 from './menu2';\nimport SubMenu2 from './submenu2';\n\nfunction MenuConfirm({\n subMenu = false,\n confirm = true,\n confirmLabel,\n menuItemClassName,\n menuFooter,\n menuExtras,\n ...props\n}) {\n const { children, onClick, ...restProps } = props;\n if (!confirm) {\n if (subMenu) return <MenuItem {...props} />;\n if (onClick) {\n return cloneElement(children, {\n onClick,\n });\n }\n return children;\n }\n const Parent = subMenu ? SubMenu2 : Menu2;\n return (\n <Parent\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n {...restProps}\n menuButton={subMenu ? undefined : children}\n label={subMenu ? children : undefined}\n >\n <MenuItem className={menuItemClassName} onClick={onClick}>\n {confirmLabel}\n </MenuItem>\n {menuExtras}\n {menuFooter}\n </Parent>\n );\n}\n\nexport default MenuConfirm;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.loop = exports.conditional = exports.parse = void 0;\n\nvar parse = function parse(stream, schema) {\n var result = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var parent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : result;\n\n if (Array.isArray(schema)) {\n schema.forEach(function (partSchema) {\n return parse(stream, partSchema, result, parent);\n });\n } else if (typeof schema === 'function') {\n schema(stream, result, parent, parse);\n } else {\n var key = Object.keys(schema)[0];\n\n if (Array.isArray(schema[key])) {\n parent[key] = {};\n parse(stream, schema[key], result, parent[key]);\n } else {\n parent[key] = schema[key](stream, result, parent, parse);\n }\n }\n\n return result;\n};\n\nexports.parse = parse;\n\nvar conditional = function conditional(schema, conditionFunc) {\n return function (stream, result, parent, parse) {\n if (conditionFunc(stream, result, parent)) {\n parse(stream, schema, result, parent);\n }\n };\n};\n\nexports.conditional = conditional;\n\nvar loop = function loop(schema, continueFunc) {\n return function (stream, result, parent, parse) {\n var arr = [];\n var lastStreamPos = stream.pos;\n\n while (continueFunc(stream, result, parent)) {\n var newParent = {};\n parse(stream, schema, result, newParent); // cases when whole file is parsed but no termination is there and stream position is not getting updated as well\n // it falls into infinite recursion, null check to avoid the same\n\n if (stream.pos === lastStreamPos) {\n break;\n }\n\n lastStreamPos = stream.pos;\n arr.push(newParent);\n }\n\n return arr;\n };\n};\n\nexports.loop = loop;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.readBits = exports.readArray = exports.readUnsigned = exports.readString = exports.peekBytes = exports.readBytes = exports.peekByte = exports.readByte = exports.buildStream = void 0;\n\n// Default stream and parsers for Uint8TypedArray data type\nvar buildStream = function buildStream(uint8Data) {\n return {\n data: uint8Data,\n pos: 0\n };\n};\n\nexports.buildStream = buildStream;\n\nvar readByte = function readByte() {\n return function (stream) {\n return stream.data[stream.pos++];\n };\n};\n\nexports.readByte = readByte;\n\nvar peekByte = function peekByte() {\n var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return function (stream) {\n return stream.data[stream.pos + offset];\n };\n};\n\nexports.peekByte = peekByte;\n\nvar readBytes = function readBytes(length) {\n return function (stream) {\n return stream.data.subarray(stream.pos, stream.pos += length);\n };\n};\n\nexports.readBytes = readBytes;\n\nvar peekBytes = function peekBytes(length) {\n return function (stream) {\n return stream.data.subarray(stream.pos, stream.pos + length);\n };\n};\n\nexports.peekBytes = peekBytes;\n\nvar readString = function readString(length) {\n return function (stream) {\n return Array.from(readBytes(length)(stream)).map(function (value) {\n return String.fromCharCode(value);\n }).join('');\n };\n};\n\nexports.readString = readString;\n\nvar readUnsigned = function readUnsigned(littleEndian) {\n return function (stream) {\n var bytes = readBytes(2)(stream);\n return littleEndian ? (bytes[1] << 8) + bytes[0] : (bytes[0] << 8) + bytes[1];\n };\n};\n\nexports.readUnsigned = readUnsigned;\n\nvar readArray = function readArray(byteSize, totalOrFunc) {\n return function (stream, result, parent) {\n var total = typeof totalOrFunc === 'function' ? totalOrFunc(stream, result, parent) : totalOrFunc;\n var parser = readBytes(byteSize);\n var arr = new Array(total);\n\n for (var i = 0; i < total; i++) {\n arr[i] = parser(stream);\n }\n\n return arr;\n };\n};\n\nexports.readArray = readArray;\n\nvar subBitsTotal = function subBitsTotal(bits, startIndex, length) {\n var result = 0;\n\n for (var i = 0; i < length; i++) {\n result += bits[startIndex + i] && Math.pow(2, length - i - 1);\n }\n\n return result;\n};\n\nvar readBits = function readBits(schema) {\n return function (stream) {\n var _byte = readByte()(stream); // convert the byte to bit array\n\n\n var bits = new Array(8);\n\n for (var i = 0; i < 8; i++) {\n bits[7 - i] = !!(_byte & 1 << i);\n } // convert the bit array to values based on the schema\n\n\n return Object.keys(schema).reduce(function (res, key) {\n var def = schema[key];\n\n if (def.length) {\n res[key] = subBitsTotal(bits, def.index, def.length);\n } else {\n res[key] = bits[def.index];\n }\n\n return res;\n }, {});\n };\n};\n\nexports.readBits = readBits;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _ = require(\"../\");\n\nvar _uint = require(\"../parsers/uint8\");\n\n// a set of 0x00 terminated subblocks\nvar subBlocksSchema = {\n blocks: function blocks(stream) {\n var terminator = 0x00;\n var chunks = [];\n var streamSize = stream.data.length;\n var total = 0;\n\n for (var size = (0, _uint.readByte)()(stream); size !== terminator; size = (0, _uint.readByte)()(stream)) {\n // size becomes undefined for some case when file is corrupted and terminator is not proper \n // null check to avoid recursion\n if (!size) break; // catch corrupted files with no terminator\n\n if (stream.pos + size >= streamSize) {\n var availableSize = streamSize - stream.pos;\n chunks.push((0, _uint.readBytes)(availableSize)(stream));\n total += availableSize;\n break;\n }\n\n chunks.push((0, _uint.readBytes)(size)(stream));\n total += size;\n }\n\n var result = new Uint8Array(total);\n var offset = 0;\n\n for (var i = 0; i < chunks.length; i++) {\n result.set(chunks[i], offset);\n offset += chunks[i].length;\n }\n\n return result;\n }\n}; // global control extension\n\nvar gceSchema = (0, _.conditional)({\n gce: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n byteSize: (0, _uint.readByte)()\n }, {\n extras: (0, _uint.readBits)({\n future: {\n index: 0,\n length: 3\n },\n disposal: {\n index: 3,\n length: 3\n },\n userInput: {\n index: 6\n },\n transparentColorGiven: {\n index: 7\n }\n })\n }, {\n delay: (0, _uint.readUnsigned)(true)\n }, {\n transparentColorIndex: (0, _uint.readByte)()\n }, {\n terminator: (0, _uint.readByte)()\n }]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xf9;\n}); // image pipeline block\n\nvar imageSchema = (0, _.conditional)({\n image: [{\n code: (0, _uint.readByte)()\n }, {\n descriptor: [{\n left: (0, _uint.readUnsigned)(true)\n }, {\n top: (0, _uint.readUnsigned)(true)\n }, {\n width: (0, _uint.readUnsigned)(true)\n }, {\n height: (0, _uint.readUnsigned)(true)\n }, {\n lct: (0, _uint.readBits)({\n exists: {\n index: 0\n },\n interlaced: {\n index: 1\n },\n sort: {\n index: 2\n },\n future: {\n index: 3,\n length: 2\n },\n size: {\n index: 5,\n length: 3\n }\n })\n }]\n }, (0, _.conditional)({\n lct: (0, _uint.readArray)(3, function (stream, result, parent) {\n return Math.pow(2, parent.descriptor.lct.size + 1);\n })\n }, function (stream, result, parent) {\n return parent.descriptor.lct.exists;\n }), {\n data: [{\n minCodeSize: (0, _uint.readByte)()\n }, subBlocksSchema]\n }]\n}, function (stream) {\n return (0, _uint.peekByte)()(stream) === 0x2c;\n}); // plain text block\n\nvar textSchema = (0, _.conditional)({\n text: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n blockSize: (0, _uint.readByte)()\n }, {\n preData: function preData(stream, result, parent) {\n return (0, _uint.readBytes)(parent.text.blockSize)(stream);\n }\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0x01;\n}); // application block\n\nvar applicationSchema = (0, _.conditional)({\n application: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n blockSize: (0, _uint.readByte)()\n }, {\n id: function id(stream, result, parent) {\n return (0, _uint.readString)(parent.blockSize)(stream);\n }\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xff;\n}); // comment block\n\nvar commentSchema = (0, _.conditional)({\n comment: [{\n codes: (0, _uint.readBytes)(2)\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xfe;\n});\nvar schema = [{\n header: [{\n signature: (0, _uint.readString)(3)\n }, {\n version: (0, _uint.readString)(3)\n }]\n}, {\n lsd: [{\n width: (0, _uint.readUnsigned)(true)\n }, {\n height: (0, _uint.readUnsigned)(true)\n }, {\n gct: (0, _uint.readBits)({\n exists: {\n index: 0\n },\n resolution: {\n index: 1,\n length: 3\n },\n sort: {\n index: 4\n },\n size: {\n index: 5,\n length: 3\n }\n })\n }, {\n backgroundColorIndex: (0, _uint.readByte)()\n }, {\n pixelAspectRatio: (0, _uint.readByte)()\n }]\n}, (0, _.conditional)({\n gct: (0, _uint.readArray)(3, function (stream, result) {\n return Math.pow(2, result.lsd.gct.size + 1);\n })\n}, function (stream, result) {\n return result.lsd.gct.exists;\n}), // content frames\n{\n frames: (0, _.loop)([gceSchema, applicationSchema, commentSchema, imageSchema, textSchema], function (stream) {\n var nextCode = (0, _uint.peekByte)()(stream); // rather than check for a terminator, we should check for the existence\n // of an ext or image block to avoid infinite loops\n //var terminator = 0x3B;\n //return nextCode !== terminator;\n\n return nextCode === 0x21 || nextCode === 0x2c;\n })\n}];\nvar _default = schema;\nexports[\"default\"] = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.deinterlace = void 0;\n\n/**\r\n * Deinterlace function from https://github.com/shachaf/jsgif\r\n */\nvar deinterlace = function deinterlace(pixels, width) {\n var newPixels = new Array(pixels.length);\n var rows = pixels.length / width;\n\n var cpRow = function cpRow(toRow, fromRow) {\n var fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n }; // See appendix E.\n\n\n var offsets = [0, 4, 2, 1];\n var steps = [8, 8, 4, 2];\n var fromRow = 0;\n\n for (var pass = 0; pass < 4; pass++) {\n for (var toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n\n return newPixels;\n};\n\nexports.deinterlace = deinterlace;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.lzw = void 0;\n\n/**\r\n * javascript port of java LZW decompression\r\n * Original java author url: https://gist.github.com/devunwired/4479231\r\n */\nvar lzw = function lzw(minCodeSize, data, pixelCount) {\n var MAX_STACK_SIZE = 4096;\n var nullCode = -1;\n var npix = pixelCount;\n var available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, i, datum, data_size, first, top, bi, pi;\n var dstPixels = new Array(pixelCount);\n var prefix = new Array(MAX_STACK_SIZE);\n var suffix = new Array(MAX_STACK_SIZE);\n var pixelStack = new Array(MAX_STACK_SIZE + 1); // Initialize GIF data stream decoder.\n\n data_size = minCodeSize;\n clear = 1 << data_size;\n end_of_information = clear + 1;\n available = clear + 2;\n old_code = nullCode;\n code_size = data_size + 1;\n code_mask = (1 << code_size) - 1;\n\n for (code = 0; code < clear; code++) {\n prefix[code] = 0;\n suffix[code] = code;\n } // Decode GIF pixel stream.\n\n\n var datum, bits, count, first, top, pi, bi;\n datum = bits = count = first = top = pi = bi = 0;\n\n for (i = 0; i < npix;) {\n if (top === 0) {\n if (bits < code_size) {\n // get the next byte\n datum += data[bi] << bits;\n bits += 8;\n bi++;\n continue;\n } // Get the next code.\n\n\n code = datum & code_mask;\n datum >>= code_size;\n bits -= code_size; // Interpret the code\n\n if (code > available || code == end_of_information) {\n break;\n }\n\n if (code == clear) {\n // Reset decoder.\n code_size = data_size + 1;\n code_mask = (1 << code_size) - 1;\n available = clear + 2;\n old_code = nullCode;\n continue;\n }\n\n if (old_code == nullCode) {\n pixelStack[top++] = suffix[code];\n old_code = code;\n first = code;\n continue;\n }\n\n in_code = code;\n\n if (code == available) {\n pixelStack[top++] = first;\n code = old_code;\n }\n\n while (code > clear) {\n pixelStack[top++] = suffix[code];\n code = prefix[code];\n }\n\n first = suffix[code] & 0xff;\n pixelStack[top++] = first; // add a new string to the table, but only if space is available\n // if not, just continue with current table until a clear code is found\n // (deferred clear code implementation as per GIF spec)\n\n if (available < MAX_STACK_SIZE) {\n prefix[available] = old_code;\n suffix[available] = first;\n available++;\n\n if ((available & code_mask) === 0 && available < MAX_STACK_SIZE) {\n code_size++;\n code_mask += available;\n }\n }\n\n old_code = in_code;\n } // Pop a pixel off the pixel stack.\n\n\n top--;\n dstPixels[pi++] = pixelStack[top];\n i++;\n }\n\n for (i = pi; i < npix; i++) {\n dstPixels[i] = 0; // clear missing pixels\n }\n\n return dstPixels;\n};\n\nexports.lzw = lzw;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.decompressFrames = exports.decompressFrame = exports.parseGIF = void 0;\n\nvar _gif = _interopRequireDefault(require(\"js-binary-schema-parser/lib/schemas/gif\"));\n\nvar _jsBinarySchemaParser = require(\"js-binary-schema-parser\");\n\nvar _uint = require(\"js-binary-schema-parser/lib/parsers/uint8\");\n\nvar _deinterlace = require(\"./deinterlace\");\n\nvar _lzw = require(\"./lzw\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar parseGIF = function parseGIF(arrayBuffer) {\n var byteData = new Uint8Array(arrayBuffer);\n return (0, _jsBinarySchemaParser.parse)((0, _uint.buildStream)(byteData), _gif[\"default\"]);\n};\n\nexports.parseGIF = parseGIF;\n\nvar generatePatch = function generatePatch(image) {\n var totalPixels = image.pixels.length;\n var patchData = new Uint8ClampedArray(totalPixels * 4);\n\n for (var i = 0; i < totalPixels; i++) {\n var pos = i * 4;\n var colorIndex = image.pixels[i];\n var color = image.colorTable[colorIndex] || [0, 0, 0];\n patchData[pos] = color[0];\n patchData[pos + 1] = color[1];\n patchData[pos + 2] = color[2];\n patchData[pos + 3] = colorIndex !== image.transparentIndex ? 255 : 0;\n }\n\n return patchData;\n};\n\nvar decompressFrame = function decompressFrame(frame, gct, buildImagePatch) {\n if (!frame.image) {\n console.warn('gif frame does not have associated image.');\n return;\n }\n\n var image = frame.image; // get the number of pixels\n\n var totalPixels = image.descriptor.width * image.descriptor.height; // do lzw decompression\n\n var pixels = (0, _lzw.lzw)(image.data.minCodeSize, image.data.blocks, totalPixels); // deal with interlacing if necessary\n\n if (image.descriptor.lct.interlaced) {\n pixels = (0, _deinterlace.deinterlace)(pixels, image.descriptor.width);\n }\n\n var resultImage = {\n pixels: pixels,\n dims: {\n top: frame.image.descriptor.top,\n left: frame.image.descriptor.left,\n width: frame.image.descriptor.width,\n height: frame.image.descriptor.height\n }\n }; // color table\n\n if (image.descriptor.lct && image.descriptor.lct.exists) {\n resultImage.colorTable = image.lct;\n } else {\n resultImage.colorTable = gct;\n } // add per frame relevant gce information\n\n\n if (frame.gce) {\n resultImage.delay = (frame.gce.delay || 10) * 10; // convert to ms\n\n resultImage.disposalType = frame.gce.extras.disposal; // transparency\n\n if (frame.gce.extras.transparentColorGiven) {\n resultImage.transparentIndex = frame.gce.transparentColorIndex;\n }\n } // create canvas usable imagedata if desired\n\n\n if (buildImagePatch) {\n resultImage.patch = generatePatch(resultImage);\n }\n\n return resultImage;\n};\n\nexports.decompressFrame = decompressFrame;\n\nvar decompressFrames = function decompressFrames(parsedGif, buildImagePatches) {\n return parsedGif.frames.filter(function (f) {\n return f.image;\n }).map(function (f) {\n return decompressFrame(f, parsedGif.gct, buildImagePatches);\n });\n};\n\nexports.decompressFrames = decompressFrames;","import { decompressFrames, parseGIF } from 'gifuct-js';\n\nexport async function getGifFirstFrame(gifUrl) {\n try {\n const response = await fetch(gifUrl);\n const buffer = await response.arrayBuffer();\n\n const gif = parseGIF(buffer);\n const frames = decompressFrames(gif, true);\n\n if (!frames?.length) return null;\n\n const { dims, patch } = frames[0];\n const { width, height } = dims;\n\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n const imageData = new ImageData(patch, width, height);\n ctx.putImageData(imageData, 0, 0);\n\n const blob = await new Promise((resolve) => {\n canvas.toBlob(resolve, 'image/png');\n });\n\n return URL.createObjectURL(blob);\n } catch (e) {\n return null;\n }\n}\n","export default function CustomEmoji({ staticUrl, alt, url }) {\n return (\n <picture>\n {staticUrl && (\n <source srcset={staticUrl} media=\"(prefers-reduced-motion: reduce)\" />\n )}\n <img\n key={alt || url}\n src={url}\n alt={alt}\n class=\"shortcode-emoji emoji\"\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n onLoad={(e) => {\n try {\n e.target.dataset.isLarger =\n e.target.naturalWidth > e.target.width * 2 ||\n e.target.naturalHeight > e.target.height * 2;\n } catch (e) {}\n }}\n />\n </picture>\n );\n}\n","import PQueue from 'p-queue';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport { getGifFirstFrame } from '../utils/get-gif-first-frame';\nimport mem from '../utils/mem';\n\nimport CustomEmoji from './custom-emoji';\n\nconst fetchQueue = new PQueue({\n concurrency: 2,\n interval: 1000,\n intervalCap: 2,\n});\n\nconst throttledFetch = (signal, ...args) =>\n fetchQueue.add(() => fetch(...args), { signal });\n\nconst SHORTCODES_REGEX = /(\\:(\\w|\\+|\\-)+\\:)(?=|[\\!\\.\\?]|$)/g;\n\nconst shortcodesRegexp = mem((shortcodes) => {\n return new RegExp(`:(${shortcodes.join('|')}):`, 'g');\n});\n\nconst resolvedEmojisCache = new Map();\nconst MAX_CACHE_SIZE = 30;\n\nconst resolveEmojis = async (resolverURL) => {\n if (resolvedEmojisCache.has(resolverURL)) {\n return resolvedEmojisCache.get(resolverURL);\n }\n\n try {\n const response = await throttledFetch(null, resolverURL, {\n headers: { accept: 'application/activity+json' },\n referrerPolicy: 'no-referrer',\n });\n\n const data = await response.json();\n const emojiTags = data.tag?.filter((t) => t.type === 'Emoji') || [];\n\n const emojis = emojiTags.length\n ? await Promise.all(\n emojiTags.map(async (t) => {\n const emoji = {\n shortcode: t.name.replace(/^:|:$/g, ''),\n url: t.icon.url,\n };\n if (t.icon?.mediaType === 'image/gif') {\n const staticUrl = await getGifFirstFrame(emoji.url);\n if (staticUrl) emoji.staticUrl = staticUrl;\n }\n return emoji;\n }),\n )\n : [];\n\n if (resolvedEmojisCache.size >= MAX_CACHE_SIZE) {\n const firstKey = resolvedEmojisCache.keys().next().value;\n resolvedEmojisCache.delete(firstKey);\n }\n\n resolvedEmojisCache.set(resolverURL, emojis);\n return emojis;\n } catch (error) {\n console.error('Failed to resolve emojis:', error);\n return [];\n }\n};\n\nconst renderEmojiText = mem((text, allEmojis, staticEmoji) => {\n if (!text) return '';\n if (!text.includes(':')) return text;\n if (!allEmojis.length) return text;\n\n const regex = shortcodesRegexp(allEmojis.map((e) => e.shortcode));\n const elements = text.split(regex).map((word, index) => {\n const emoji = allEmojis.find((e) => e.shortcode === word);\n\n if (emoji) {\n const { url, staticUrl } = emoji;\n return (\n <CustomEmoji\n key={`${word}-${index}`}\n staticUrl={staticEmoji ? undefined : staticUrl}\n url={staticEmoji ? staticUrl || url : url}\n alt={word}\n />\n );\n }\n\n return word;\n });\n\n return elements;\n});\n\nfunction EmojiText({ text, emojis = [], staticEmoji, resolverURL }) {\n const [resolvedEmojis, setResolvedEmojis] = useState(\n () => resolvedEmojisCache.get(resolverURL) || [],\n );\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!resolverURL || !text?.includes(':')) return;\n\n const matches = text.match(SHORTCODES_REGEX);\n if (!matches) return;\n\n const hasUnresolved = matches.some((match) => {\n const shortcode = match.slice(1, -1);\n return !emojis.some((e) => e.shortcode === shortcode);\n });\n if (!hasUnresolved) return;\n\n if (resolvedEmojisCache.has(resolverURL)) return;\n\n setLoading(true);\n\n (async () => {\n const emojis = await resolveEmojis(resolverURL);\n setResolvedEmojis(emojis);\n setLoading(false);\n })();\n }, [resolverURL, text, emojis?.length]);\n\n if (!text) return '';\n if (!text.includes(':')) return text;\n\n if (resolverURL && loading) {\n return text.replace(SHORTCODES_REGEX, '');\n }\n\n const allEmojis = [\n ...resolvedEmojis.filter(\n (resolved) =>\n !emojis.some((emoji) => emoji.shortcode === resolved.shortcode),\n ),\n ...emojis,\n ];\n\n return renderEmojiText(text, allEmojis, staticEmoji);\n}\n\nexport default EmojiText;\n","import getDomain from '../utils/get-domain';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nfunction RolesTags({ roles, accountId, accountUrl, hideSelf = false }) {\n if (!roles?.length) return null;\n\n const isSelf = accountId && accountId === getCurrentAccountID();\n if (!accountId && hideSelf) {\n console.warn('accountId is required if hideSelf is true');\n }\n if (hideSelf && isSelf) return null;\n\n const parsedAccountInstance = getDomain(accountUrl);\n\n return roles?.map((role) => (\n <>\n {' '}\n <span class=\"tag collapsed tag-role\">\n {role.name}\n {!!parsedAccountInstance && (\n <>\n {' '}\n <span class=\"more-insignificant\">{parsedAccountInstance}</span>\n </>\n )}\n </span>\n </>\n ));\n}\n\nexport default RolesTags;\n","import './name-text.css';\n\nimport { useLingui } from '@lingui/react';\n\nimport { api } from '../utils/api';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport RolesTags from './roles-tags';\n\nconst nameCollator = mem((locale) => {\n const options = {\n sensitivity: 'base',\n };\n try {\n return new Intl.Collator(locale || undefined, options);\n } catch (e) {\n return new Intl.Collator(undefined, options);\n }\n});\n\nconst ACCT_REGEX = /([^@]+)(@.+)/i;\nconst SHORTCODES_REGEX = /(\\:(\\w|\\+|\\-)+\\:)(?=|[\\!\\.\\?]|$)/g;\nconst SPACES_REGEX = /\\s+/g;\nconst NON_ALPHA_NUMERIC_REGEX = /[^a-z0-9@\\.]/gi;\n\nfunction NameText({\n account,\n instance,\n showAvatar,\n showAcct,\n short,\n external,\n onClick,\n}) {\n const { i18n } = useLingui();\n if (!account) return null;\n const {\n acct,\n avatar,\n avatarStatic,\n id,\n url,\n displayName,\n emojis,\n bot,\n username,\n roles,\n } = account;\n const [_, acct1, acct2] = acct.match(ACCT_REGEX) || [, acct];\n\n if (!instance) instance = api().instance;\n\n const trimmedUsername = username.toLowerCase().trim();\n const trimmedDisplayName = (displayName || '').toLowerCase().trim();\n const shortenedDisplayName = trimmedDisplayName\n .replace(SHORTCODES_REGEX, '') // Remove shortcodes, regex from https://regex101.com/r/iE9uV0/1\n .replace(SPACES_REGEX, ''); // E.g. \"My name\" === \"myname\"\n const shortenedAlphaNumericDisplayName = shortenedDisplayName.replace(\n NON_ALPHA_NUMERIC_REGEX,\n '',\n ); // Remove non-alphanumeric characters\n\n const hideUsername =\n (!short &&\n (trimmedUsername === trimmedDisplayName ||\n trimmedUsername === shortenedDisplayName ||\n trimmedUsername === shortenedAlphaNumericDisplayName ||\n nameCollator(i18n.locale).compare(\n trimmedUsername,\n shortenedDisplayName,\n ) === 0)) ||\n shortenedAlphaNumericDisplayName === acct.toLowerCase();\n\n return (\n <a\n class={`name-text ${showAcct ? 'show-acct' : ''} ${short ? 'short' : ''}`}\n href={url}\n target={external ? '_blank' : null}\n title={\n displayName\n ? `${displayName} (${acct2 ? '' : '@'}${acct})`\n : `${acct2 ? '' : '@'}${acct}`\n }\n onClick={(e) => {\n if (external) return;\n if (e.shiftKey) return; // Save link? 🤷‍♂️\n e.preventDefault();\n e.stopPropagation();\n if (onClick) return onClick(e);\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.which === 2) {\n const internalURL = `#/${instance}/a/${id}`;\n window.open(internalURL, '_blank');\n return;\n }\n states.showAccount = {\n account,\n instance,\n };\n }}\n >\n {showAvatar && (\n <>\n <Avatar url={avatarStatic || avatar} squircle={bot} />{' '}\n </>\n )}\n {displayName && !short ? (\n <>\n <b dir=\"auto\">\n <EmojiText\n text={displayName}\n emojis={emojis}\n resolverURL={account.url}\n staticEmoji\n />\n </b>\n {!showAcct && !hideUsername && (\n <>\n {' '}\n <i class=\"bidi-isolate\">@{username}</i>\n <RolesTags\n roles={roles}\n accountId={id}\n accountUrl={url}\n hideSelf\n />\n </>\n )}\n </>\n ) : short ? (\n <i>{username}</i>\n ) : (\n <b>{username}</b>\n )}\n {showAcct && (\n <>\n <br />\n <i class=\"bidi-isolate\">\n {acct2 ? '' : '@'}\n {acct1}\n {!!acct2 && <span class=\"ib\">{acct2}</span>}\n </i>\n <RolesTags roles={roles} accountUrl={url} />\n </>\n )}\n </a>\n );\n}\n\nexport default NameText;\n","import{useRef as r,useMemo as n,useEffect as t,useState as e,useCallback as u}from\"react\";function c(e,u,c,i){var l=this,a=r(null),o=r(0),f=r(0),v=r(null),d=r([]),s=r(),m=r(),h=r(e),g=r(!0),x=r(),E=r();h.current=e;var b=\"undefined\"!=typeof window,p=!u&&0!==u&&b;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var y=!!(c=c||{}).leading,w=!(\"trailing\"in c)||!!c.trailing,T=!!c.flushOnExit&&w,O=\"maxWait\"in c,F=\"debounceOnServer\"in c&&!!c.debounceOnServer,L=O?Math.max(+c.maxWait||0,u):null,A=n(function(){var r=function(r){var n=d.current,t=s.current;return d.current=s.current=null,o.current=r,f.current=f.current||r,m.current=h.current.apply(t,n)},n=function(r,n){p&&cancelAnimationFrame(v.current),v.current=p?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||O&&r-o.current>=L},e=function(n){return v.current=null,w&&d.current?r(n):(d.current=s.current=null,m.current)},c=function r(){var c=Date.now();if(y&&f.current===o.current&&A(),t(c))return e(c);if(g.current){var i=u-(c-a.current),l=O?Math.min(i,L-(c-o.current)):i;n(r,l)}},A=function(){i&&i({})},D=function(){if(b||F){var e,i=Date.now(),f=t(i);if(d.current=[].slice.call(arguments),s.current=l,a.current=i,T&&!x.current&&(x.current=function(){var r;\"hidden\"===(null==(r=globalThis.document)?void 0:r.visibilityState)&&E.current.flush()},null==(e=globalThis.document)||null==e.addEventListener||e.addEventListener(\"visibilitychange\",x.current)),f){if(!v.current&&g.current)return o.current=a.current,n(c,u),y?r(a.current):m.current;if(O)return n(c,u),r(a.current)}return v.current||n(c,u),m.current}};return D.cancel=function(){var r=v.current;r&&(p?cancelAnimationFrame(v.current):clearTimeout(v.current)),o.current=0,d.current=a.current=s.current=v.current=null,r&&i&&i({})},D.isPending=function(){return!!v.current},D.flush=function(){return v.current?e(Date.now()):m.current},D},[y,O,u,L,w,T,p,b,F,i]);return E.current=A,t(function(){return g.current=!0,function(){var r;T&&E.current.flush(),x.current&&(null==(r=globalThis.document)||null==r.removeEventListener||r.removeEventListener(\"visibilitychange\",x.current),x.current=null),g.current=!1}},[T]),A}function i(r,n){return r===n}function l(n,t,l){var a=l&&l.equalityFn||i,o=r(n),f=e({})[1],v=c(u(function(r){o.current=r,f({})},[f]),t,l,f),d=r(n);return a(d.current,n)||(v(n),d.current=n),[o.current,v]}function a(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing,l=e.flushOnExit;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i,flushOnExit:void 0!==l&&l})}export{l as useDebounce,c as useDebouncedCallback,a as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import { i18n } from '@lingui/core';\n\nimport translangLanguagesNative from '../data/translang-languages-native';\n\nimport mem from './mem';\n\n// Some codes are not supported by Intl.DisplayNames\n// These are mapped to other codes as fallback\nconst codeMappings = {\n 'zh-YUE': 'YUE',\n zh_HANT: 'zh-Hant',\n mnMong: 'mn-Mong',\n};\n\nconst IntlDN = mem(\n (locale) =>\n new Intl.DisplayNames(locale || undefined, {\n type: 'language',\n }),\n);\n\nfunction notSameIncaseSensitive(s1, s2) {\n if (!s1 || !s2) return s1 !== s2;\n return s1.toLowerCase() !== s2.toLowerCase();\n}\n\nfunction _localeCode2Text(code) {\n let locale;\n let fallback;\n if (typeof code === 'object') {\n ({ code, locale, fallback } = code);\n }\n try {\n const text = IntlDN(locale || i18n.locale).of(code);\n if (notSameIncaseSensitive(text, code)) return text;\n if (!fallback) {\n const anotherText = IntlDN(code).of(code);\n if (notSameIncaseSensitive(anotherText, code)) return anotherText;\n const yetAnotherText = translangLanguagesNative?.[locale];\n if (notSameIncaseSensitive(yetAnotherText, code)) return yetAnotherText;\n }\n return fallback || '';\n } catch (e) {\n if (codeMappings[code]) {\n try {\n const text = IntlDN(codeMappings[locale] || locale || i18n.locale).of(\n codeMappings[code],\n );\n if (notSameIncaseSensitive(text, codeMappings[code])) return text;\n return fallback || '';\n } catch (e2) {\n console.warn(code, e2);\n }\n }\n return fallback || '';\n }\n}\n\nexport default mem(_localeCode2Text);\n","import languages from '../data/translang-languages';\n\nimport { getDtfLocale } from './dtf-locale';\nimport localeMatch from './locale-match';\nimport states from './states';\n\nconst translationTargetLanguages = Object.entries(languages.tl).map(\n ([code, { name }]) => ({\n code,\n name,\n }),\n);\n\nconst locales = [...navigator.languages];\nconst dtfLocale = getDtfLocale();\nif (dtfLocale && !locales.includes(dtfLocale)) {\n locales.unshift(dtfLocale);\n}\n\nconst localeTargetLanguages = () =>\n localeMatch(\n locales,\n translationTargetLanguages.map((l) => l.code.replace('_', '-')), // The underscore will fail Intl.Locale inside `match`\n 'en',\n );\n\nfunction getTranslateTargetLanguage(fromSettings = false) {\n if (fromSettings) {\n const { contentTranslationTargetLanguage } = states.settings;\n if (contentTranslationTargetLanguage) {\n return contentTranslationTargetLanguage;\n }\n }\n return localeTargetLanguages();\n}\n\nexport default getTranslateTargetLanguage;\n","import mem from './mem';\n\nconst NF = mem((locale, options) => {\n try {\n return new Intl.NumberFormat(locale || undefined, options);\n } catch (e) {\n return new Intl.NumberFormat(undefined, options);\n }\n});\n\nexport default NF;\n","import { i18n } from '@lingui/core';\n\nimport NF from './nf';\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 NF(i18n.locale, {\n style: 'unit',\n unit: BYTES_UNITS[unitIndex],\n unitDisplay: 'narrow',\n maximumFractionDigits: 0,\n }).format(value);\n}\n","import { getAPIVersions } from './store-utils';\n\nexport function supportsNativeQuote() {\n return getAPIVersions()?.mastodon >= 7;\n}\n\nexport function getPostQuoteApprovalPolicy(quoteApproval) {\n return quoteApproval?.[quoteApproval?.currentUser]?.[0] || 'nobody';\n}\n","const ESCAPE_REGEX = /[.*+?^${}()|[\\]\\\\]/g;\nconst HTML_ESCAPE_MAP = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;',\n};\nconst HTML_ESCAPE_REGEX = /[&\"<>]/g;\n\nfunction escapeRegex(str) {\n return str.replace(ESCAPE_REGEX, '\\\\$&');\n}\n\nfunction escapeHTML(str) {\n return str.replace(HTML_ESCAPE_REGEX, (char) => HTML_ESCAPE_MAP[char]);\n}\n\nfunction emojifyText(text, emojis = []) {\n if (!text) return '';\n if (!emojis.length) return text;\n if (!text.includes(':')) return text;\n\n // Deduplicate emojis by shortcode and filter out invalid entries\n const emojiMap = new Map();\n for (let i = 0; i < emojis.length; i++) {\n const emoji = emojis[i];\n if (emoji?.shortcode && emoji?.url) {\n emojiMap.set(emoji.shortcode, emoji);\n }\n }\n\n if (emojiMap.size === 0) return text;\n\n const shortcodes = Array.from(emojiMap.keys());\n const pattern = shortcodes.map((sc) => `:${escapeRegex(sc)}:`).join('|');\n const regex = new RegExp(pattern, 'g');\n\n return text.replace(regex, (match) => {\n const shortcode = match.slice(1, -1);\n const emoji = emojiMap.get(shortcode);\n\n if (!emoji) return match;\n\n const { staticUrl, url } = emoji;\n const escapedShortcode = escapeHTML(match);\n\n const sourceTag = staticUrl\n ? `<source srcset=\"${staticUrl}\" media=\"(prefers-reduced-motion: reduce)\"></source>`\n : '';\n\n return `<picture>${sourceTag}<img class=\"shortcode-emoji emoji\" src=\"${url}\" alt=\"${escapedShortcode}\" title=\"${shortcode}\" width=\"16\" height=\"16\" loading=\"lazy\" decoding=\"async\" fetchPriority=\"low\" onload=\"try { this.dataset.isLarger = this.naturalWidth > (this.width * 2) || this.naturalHeight > (this.height * 2) } catch (e) {}\" /></picture>`;\n });\n}\n\nexport default emojifyText;\n","const HTML_CHARS_REGEX = /[&<>\"']/g;\nconst HTML_ENTITIES = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&apos;',\n};\n\nexport default function escapeHTML(text) {\n return text.replace(HTML_CHARS_REGEX, (c) => HTML_ENTITIES[c]);\n}\n","import emojifyText from './emojify-text';\nimport escapeHTML from './escape-html';\nimport mem from './mem';\n\nconst fauxDiv = document.createElement('div');\nconst whitelistLinkClasses = ['u-url', 'mention', 'hashtag'];\n\nconst LINK_REGEX = /<a/i;\nconst HTTP_LINK_REGEX = /^https?:\\/\\//i;\nconst MENTION_REGEX = /^[@@][^@@]+(@[^@@]+)?$/;\nconst HASHTAG_REGEX = /^[##][^##]+$/;\nconst HASH_EMOJI_REGEX = /^#️⃣/;\nconst CODE_BLOCK_REGEX = /^```[^]+```$/;\nconst CODE_BLOCK_START_REGEX = /^```/;\nconst CODE_BLOCK_END_REGEX = /```$/;\nconst INLINE_CODE_REGEX = /`[^`]+`/;\nconst TWITTER_DOMAIN_REGEX = /(twitter|x)\\.com/i;\nconst TWITTER_MENTION_REGEX = /@[a-zA-Z0-9_]+@(twitter|x)\\.com/;\nconst TWITTER_MENTION_CAPTURE_REGEX = /(@([a-zA-Z0-9_]+)@(twitter|x)\\.com)/g;\nconst CODE_INLINE_CAPTURE_REGEX = /(`[^]+?`)/g;\n\nfunction createDOM(html, isDocumentFragment) {\n if (isDocumentFragment) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n return tpl.content;\n } else {\n const tpl = document.createElement('div');\n tpl.innerHTML = html;\n return tpl;\n }\n}\n\nfunction _enhanceContent(content, opts = {}) {\n if (!content) return '';\n const { emojis, returnDOM, postEnhanceDOM = () => {} } = opts;\n let enhancedContent = content;\n // const dom = document.createElement('div');\n // dom.innerHTML = enhancedContent;\n const dom = createDOM(enhancedContent, returnDOM);\n const hasLink = LINK_REGEX.test(enhancedContent);\n const hasCodeBlock = enhancedContent.includes('```');\n\n if (hasLink) {\n // Add target=\"_blank\" to all links with no target=\"_blank\"\n // E.g. `note` in `account`\n const noTargetBlankLinks = dom.querySelectorAll('a:not([target=\"_blank\"])');\n for (const link of noTargetBlankLinks) {\n link.setAttribute('target', '_blank');\n }\n\n // Remove all classes except `u-url`, `mention`, `hashtag`\n const links = dom.querySelectorAll('a[class]');\n for (const link of links) {\n for (const c of link.classList) {\n if (!whitelistLinkClasses.includes(c)) {\n link.classList.remove(c);\n }\n }\n }\n }\n\n // Add 'has-url-text' to all links that contains a url\n if (hasLink) {\n const links = dom.querySelectorAll('a[href]');\n for (const link of links) {\n if (HTTP_LINK_REGEX.test(link.textContent.trim())) {\n link.classList.add('has-url-text');\n shortenLink(link);\n }\n }\n }\n\n // Spanify un-spanned mentions\n if (hasLink) {\n const links = dom.querySelectorAll('a[href]');\n const usernames = [];\n for (const link of links) {\n const text = link.innerText.trim();\n const hasChildren = link.querySelector('*');\n // If text looks like @username@domain, then it's a mention\n if (MENTION_REGEX.test(text)) {\n // Only show @username\n const atSymbol = text[0]; // Preserve the original @ or @\n const [_, username, domain] = text.split(/[@@]/);\n if (!hasChildren) {\n if (\n !usernames.some(([u]) => u === username) ||\n usernames.some(([u, d]) => u === username && d === domain)\n ) {\n link.innerHTML = `${atSymbol}<span>${username}</span>`;\n usernames.push([username, domain]);\n } else {\n link.innerHTML = `${atSymbol}<span>${username}@${domain}</span>`;\n }\n }\n link.classList.add('mention');\n }\n // If text looks like #hashtag, then it's a hashtag\n if (HASHTAG_REGEX.test(text)) {\n const hashSymbol = text[0]; // Preserve the original # or #\n if (!hasChildren) {\n link.innerHTML = `${hashSymbol}<span>${text.slice(1)}</span>`;\n } else {\n // Special case for #️⃣\n if (HASH_EMOJI_REGEX.test(text)) {\n // <span> contains half-char of #️⃣\n const actualText = text.replace(HASH_EMOJI_REGEX, '');\n link.innerHTML = `#️⃣<span>${actualText}</span>`;\n }\n }\n link.classList.add('mention', 'hashtag');\n }\n }\n }\n\n // EMOJIS\n // ======\n // Convert :shortcode: to <img />\n let textNodes;\n if (enhancedContent.includes(':') && emojis?.length) {\n textNodes = extractTextNodes(dom);\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n html = emojifyText(html, emojis);\n fauxDiv.innerHTML = html;\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // CODE BLOCKS\n // ===========\n // Convert ```code``` to <pre><code>code</code></pre>\n if (hasCodeBlock) {\n const blocks = [...dom.querySelectorAll('p')].filter((p) =>\n CODE_BLOCK_REGEX.test(p.innerText.trim()),\n );\n for (const block of blocks) {\n const pre = document.createElement('pre');\n // Replace <br /> with newlines\n for (const br of block.querySelectorAll('br')) {\n br.replaceWith('\\n');\n }\n pre.innerHTML = `<code>${block.innerHTML.trim()}</code>`;\n block.replaceWith(pre);\n }\n }\n\n // Convert multi-paragraph code blocks to <pre><code>code</code></pre>\n if (hasCodeBlock) {\n const paragraphs = [...dom.querySelectorAll('p')];\n // Filter out paragraphs with ``` in beginning only\n const codeBlocks = paragraphs.filter((p) =>\n CODE_BLOCK_START_REGEX.test(p.innerText),\n );\n // For each codeBlocks, get all paragraphs until the last paragraph with ``` at the end only\n for (const block of codeBlocks) {\n const nextParagraphs = [block];\n let hasCodeBlock = false;\n let currentBlock = block;\n while (currentBlock.nextElementSibling) {\n const next = currentBlock.nextElementSibling;\n if (next && next.tagName === 'P') {\n if (CODE_BLOCK_END_REGEX.test(next.innerText)) {\n nextParagraphs.push(next);\n hasCodeBlock = true;\n break;\n } else {\n nextParagraphs.push(next);\n }\n } else {\n break;\n }\n currentBlock = next;\n }\n if (hasCodeBlock) {\n const pre = document.createElement('pre');\n for (const p of nextParagraphs) {\n // Replace <br /> with newlines\n for (const br of p.querySelectorAll('br')) {\n br.replaceWith('\\n');\n }\n }\n const codeText = nextParagraphs.map((p) => p.innerHTML).join('\\n\\n');\n pre.innerHTML = `<code tabindex=\"0\">${codeText}</code>`;\n block.replaceWith(pre);\n for (const p of nextParagraphs) {\n p.remove();\n }\n }\n }\n }\n\n // INLINE CODE\n // ===========\n // Convert `code` to <code>code</code>\n if (enhancedContent.includes('`')) {\n textNodes = extractTextNodes(dom);\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n if (INLINE_CODE_REGEX.test(html)) {\n html = html.replaceAll(CODE_INLINE_CAPTURE_REGEX, '<code>$1</code>');\n }\n fauxDiv.innerHTML = html;\n // const nodes = [...fauxDiv.childNodes];\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // TWITTER USERNAMES\n // =================\n // Convert @username@twitter.com to <a href=\"https://twitter.com/username\">@username@twitter.com</a>\n if (TWITTER_DOMAIN_REGEX.test(enhancedContent)) {\n textNodes = extractTextNodes(dom, {\n rejectFilter: ['A'],\n });\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n if (TWITTER_MENTION_REGEX.test(html)) {\n html = html.replaceAll(\n TWITTER_MENTION_CAPTURE_REGEX,\n '<a href=\"https://twitter.com/$2\" rel=\"nofollow noopener\" target=\"_blank\">$1</a>',\n );\n }\n fauxDiv.innerHTML = html;\n // const nodes = [...fauxDiv.childNodes];\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // HASHTAG STUFFING\n // ================\n // Get the <p> that contains a lot of hashtags, add a class to it\n if (enhancedContent.includes('#') || enhancedContent.includes('#')) {\n let prevIndex = null;\n const hashtagStuffedParagraphs = [...dom.querySelectorAll('p')].filter(\n (p, index) => {\n let hashtagCount = 0;\n for (let i = 0; i < p.childNodes.length; i++) {\n const node = p.childNodes[i];\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent.trim();\n if (text !== '') {\n return false;\n }\n } else if (node.tagName === 'BR') {\n // Ignore <br />\n } else if (node.tagName === 'A') {\n const linkText = node.textContent.trim();\n if (\n !linkText ||\n !(linkText.startsWith('#') || linkText.startsWith('#'))\n ) {\n return false;\n } else {\n hashtagCount++;\n }\n } else {\n return false;\n }\n }\n // Only consider \"stuffing\" if:\n // - there are more than 3 hashtags\n // - there are more than 1 hashtag in adjacent paragraphs\n if (hashtagCount > 3) {\n prevIndex = index;\n return true;\n }\n if (hashtagCount > 1 && prevIndex && index === prevIndex + 1) {\n prevIndex = index;\n return true;\n }\n },\n );\n if (hashtagStuffedParagraphs?.length) {\n for (const p of hashtagStuffedParagraphs) {\n p.classList.add('hashtag-stuffing');\n p.title = p.innerText;\n }\n }\n }\n\n // ADD ASPECT RATIO TO ALL IMAGES\n if (enhancedContent.includes('<img')) {\n const imgs = dom.querySelectorAll('img');\n for (let i = 0; i < imgs.length; i++) {\n const img = imgs[i];\n const width = img.getAttribute('width') || img.naturalWidth;\n const height = img.getAttribute('height') || img.naturalHeight;\n if (width && height) {\n img.style.setProperty('--original-aspect-ratio', `${width}/${height}`);\n }\n }\n }\n\n // FIX CLOAK MODE FOR SAFARI\n // Workaround for Safari so that `text-decoration-thickness` works\n // Wrap child text nodes in spans\n for (const node of dom.childNodes) {\n if (node.nodeType === Node.TEXT_NODE && node.textContent.trim?.()) {\n const span = document.createElement('span');\n span.textContent = node.textContent;\n dom.replaceChild(span, node);\n }\n }\n\n if (postEnhanceDOM) {\n queueMicrotask(() => postEnhanceDOM(dom));\n // postEnhanceDOM(dom); // mutate dom\n }\n\n return returnDOM ? dom : dom.innerHTML;\n}\nconst enhanceContent = mem(_enhanceContent);\n\nconst defaultRejectFilter = [\n // Document metadata\n 'STYLE',\n // Image and multimedia\n 'IMG',\n 'VIDEO',\n 'AUDIO',\n 'AREA',\n 'MAP',\n 'TRACK',\n // Embedded content\n 'EMBED',\n 'IFRAME',\n 'OBJECT',\n 'PICTURE',\n 'PORTAL',\n 'SOURCE',\n // SVG and MathML\n 'SVG',\n 'MATH',\n // Scripting\n 'CANVAS',\n 'NOSCRIPT',\n 'SCRIPT',\n // Forms\n 'INPUT',\n 'OPTION',\n 'TEXTAREA',\n // Web Components\n 'SLOT',\n 'TEMPLATE',\n];\nconst defaultRejectFilterMap = Object.fromEntries(\n defaultRejectFilter.map((nodeName) => [nodeName, true]),\n);\n\nconst URL_PREFIX_REGEX = /^(https?:\\/\\/(www\\.)?|xmpp:)/;\nconst URL_DISPLAY_LENGTH = 30;\n// Similar to https://github.com/mastodon/mastodon/blob/1666b1955992e16f4605b414c6563ca25b3a3f18/app/lib/text_formatter.rb#L54-L69\nfunction shortenLink(link) {\n if (!link || link.querySelector?.('*')) {\n return;\n }\n try {\n const url = link.innerText.trim();\n const prefix = (url.match(URL_PREFIX_REGEX) || [])[0] || '';\n if (!prefix) return;\n const displayURL = url.slice(\n prefix.length,\n prefix.length + URL_DISPLAY_LENGTH,\n );\n const suffix = url.slice(prefix.length + URL_DISPLAY_LENGTH);\n const cutoff = url.slice(prefix.length).length > URL_DISPLAY_LENGTH;\n link.innerHTML = `<span class=\"invisible\">${prefix}</span><span class=${\n cutoff ? 'ellipsis' : ''\n }>${displayURL}</span><span class=\"invisible\">${suffix}</span>`;\n } catch (e) {}\n}\n\nfunction extractTextNodes(dom, opts = {}) {\n const textNodes = [];\n const rejectFilterMap = Object.assign(\n {},\n defaultRejectFilterMap,\n opts.rejectFilter?.reduce((acc, cur) => {\n acc[cur] = true;\n return acc;\n }, {}),\n );\n const walk = document.createTreeWalker(\n dom,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode(node) {\n if (rejectFilterMap[node.parentNode.nodeName]) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n },\n false,\n );\n let node;\n while ((node = walk.nextNode())) {\n textNodes.push(node);\n }\n return textNodes;\n}\n\nexport default enhanceContent;\n","import { api } from './api';\nimport pmem from './pmem';\n\nconst FAMILIAR_FOLLOWERS_MAX_AGE = 1000 * 60 * 10; // 10 mins\n\nfunction fetchFamiliarFollowers(currentID) {\n const { masto } = api();\n return masto.v1.accounts.familiarFollowers.fetch({\n id: [currentID],\n });\n}\n\nexport const memFetchFamiliarFollowers = pmem(fetchFamiliarFollowers, {\n expires: FAMILIAR_FOLLOWERS_MAX_AGE,\n});\n","function normalizeURL(url) {\n const parsed = URL.parse(url);\n if (!parsed) return url;\n const origin = parsed.origin;\n const pathname = parsed.pathname.replace(/\\/$/, '') || '/';\n parsed.searchParams.sort();\n return origin + pathname + parsed.search;\n}\n\nexport default function isSameURL(a, b) {\n if (!a || !b) return false;\n if (a === b) return true;\n return normalizeURL(a) === normalizeURL(b);\n}\n","import isSameURL from './is-same-url';\nimport states from './states';\n\nconst supportsHover = window.matchMedia('(hover: hover)').matches;\n\nfunction handleContentLinks(opts) {\n const {\n mentions = [],\n instance,\n previewMode,\n statusURL,\n taggedCollections = [],\n } = opts || {};\n return (e) => {\n // If cmd/ctrl/shift/alt key is pressed or middle-click, let the browser handle it\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.which === 2) {\n return;\n }\n\n let { target } = e;\n\n // Experiment opening custom emoji in a modal\n // TODO: Rename this function because it's not just for links\n if (target.closest('.shortcode-emoji')) {\n const { naturalWidth, naturalHeight, width, height } = target;\n const kindaLargeRatio = 2;\n const kindaLarge =\n naturalWidth > width * kindaLargeRatio ||\n naturalHeight > height * kindaLargeRatio;\n if (kindaLarge) {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaModal = {\n mediaAttachments: [\n {\n type: 'image',\n url: target.src,\n description: target.title || target.alt,\n },\n ],\n };\n return;\n }\n }\n\n target = target.closest('a');\n if (!target) return;\n // Only handle links inside, not itself or anything outside\n if (!e.currentTarget.contains(target)) return;\n\n const { href } = target;\n\n const prevText = target.previousSibling?.textContent;\n const textBeforeLinkIsAt =\n prevText?.endsWith('@') || prevText?.endsWith('@');\n const textStartsWithAt =\n target.innerText.startsWith('@') || target.innerText.startsWith('@');\n if (\n ((target.classList.contains('u-url') ||\n target.classList.contains('mention')) &&\n textStartsWithAt) ||\n (textBeforeLinkIsAt && !textStartsWithAt)\n ) {\n const targetText = (\n target.querySelector('span') || target\n ).innerText.trim();\n const username = targetText.replace(/^[@@]/, '');\n // Only fallback to acct/username check if url doesn't match\n const mention =\n mentions.find((mention) => mention.url === href) ||\n mentions.find(\n (mention) =>\n mention.acct === username || mention.username === username,\n );\n console.warn('MENTION', mention, href);\n if (mention) {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: mention.acct,\n instance,\n };\n return;\n } else if (!/^http/i.test(targetText)) {\n console.log('mention not found', targetText);\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: href,\n instance,\n };\n return;\n }\n } else if (!previewMode) {\n const textBeforeLinkIsHash =\n prevText?.endsWith('#') || prevText?.endsWith('#');\n if (target.classList.contains('hashtag') || textBeforeLinkIsHash) {\n e.preventDefault();\n e.stopPropagation();\n const tag = target.innerText.replace(/^[##]/, '').trim();\n const hashURL = instance ? `#/${instance}/t/${tag}` : `#/t/${tag}`;\n console.log({ hashURL });\n location.hash = hashURL;\n return;\n }\n\n const matchedCollection = taggedCollections.find((c) =>\n isSameURL(c.url, href),\n );\n if (matchedCollection?.id) {\n e.preventDefault();\n e.stopPropagation();\n location.hash = `#/${instance ? `${instance}/` : ''}c/${matchedCollection.id}`;\n return;\n }\n\n if (states.unfurledLinks[href]?.url && statusURL !== href) {\n // If unfurled AND not self-referential\n e.preventDefault();\n e.stopPropagation();\n states.prevLocation = {\n pathname: location.hash.replace(/^#/, ''),\n };\n location.hash = `#${states.unfurledLinks[href].url}`;\n return;\n }\n }\n\n try {\n const urlObj = URL.parse(href);\n const domain = urlObj.hostname.replace(/^www\\./i, '');\n const containsDomain = target.innerText\n .toLowerCase()\n .includes(domain.toLowerCase());\n // Only show this on non-hover devices (touch-only)\n // Assuming that hover-supported = there's a statusbar to see the URL\n // Non-hover devices don't have statusbar, so we show this\n if (!containsDomain && !supportsHover) {\n e.preventDefault();\n e.stopPropagation();\n const linkText = target.innerText.trim();\n states.showOpenLink = {\n url: href,\n linkText,\n };\n }\n } catch (e) {}\n };\n}\n\nexport default handleContentLinks;\n","import { i18n } from '@lingui/core';\n\nimport NF from './nf';\n\nexport default function shortenNumber(num) {\n try {\n return NF(i18n.locale, {\n notation: 'compact',\n roundingMode: 'floor',\n }).format(num);\n } catch (e) {\n return num;\n }\n}\n","import { satisfies } from 'compare-versions';\n\nimport features from '../data/features.json';\n\nimport { getCurrentInstance, getCurrentNodeInfo } from './store-utils';\n\n// Non-semver(?) UA string detection\nconst containPixelfed = /pixelfed/i;\nconst notContainPixelfed = /^(?!.*pixelfed).*$/i;\nconst containPleroma = /pleroma/i;\nconst containAkkoma = /akkoma/i;\nconst containGTS = /gotosocial/i;\nconst platformFeatures = {\n '@mastodon/lists': notContainPixelfed,\n '@mastodon/filters': notContainPixelfed,\n '@mastodon/mentions': notContainPixelfed,\n '@mastodon/trending-hashtags': notContainPixelfed,\n '@mastodon/trending-links': notContainPixelfed,\n '@mastodon/post-bookmark': notContainPixelfed,\n '@mastodon/post-edit': notContainPixelfed,\n '@mastodon/profile-edit': notContainPixelfed,\n '@mastodon/profile-private-note': notContainPixelfed,\n '@mastodon/pinned-posts': notContainPixelfed,\n '@pixelfed/trending': containPixelfed,\n '@pixelfed/home-include-reblogs': containPixelfed,\n '@pixelfed/global-feed': containPixelfed,\n '@pleroma/local-visibility-post': containPleroma,\n '@akkoma/local-visibility-post': containAkkoma,\n};\n\nconst supportsCache = {};\n\nconst semverExtract = /^\\d+\\.\\d+(\\.\\d+)?/;\nconst atSoftwareSlashMatch = /^@([a-z]+)\\//i;\n\nfunction supports(feature) {\n try {\n let { version, domain } = getCurrentInstance();\n let softwareName = getCurrentNodeInfo()?.software?.name || 'mastodon';\n\n if (softwareName === 'hometown') {\n // Hometown is a Mastodon fork and inherits its features\n softwareName = 'mastodon';\n }\n\n const key = `${domain}-${feature}`;\n if (supportsCache[key]) return supportsCache[key];\n\n if (platformFeatures[feature]) {\n return (supportsCache[key] = platformFeatures[feature].test(version));\n }\n\n const featureMatch = feature.match(atSoftwareSlashMatch);\n if (!featureMatch) {\n // Only software match, e.g. supports('@mastodon')\n const software = feature.replace(/^@/, '');\n return (supportsCache[key] = softwareName === software);\n }\n\n const range = features[feature];\n if (!range) return false;\n\n // '@mastodon/blah' => 'mastodon'\n const featureSoftware = featureMatch[1];\n\n const doesSoftwareMatch = featureSoftware === softwareName.toLowerCase();\n let satisfiesRange = satisfies(version, range, {\n includePrerelease: true,\n loose: true,\n });\n if (!satisfiesRange) {\n try {\n // E.g. \"4.2.1 (compatible; Iceshrimp 2023.12.14-dev-046d237af)\" is invalid semver 😅\n // This regex extracts numbers with dots out and tries again\n // Hopefully this doesn't break anything\n satisfiesRange = satisfies(version.match(semverExtract)?.[0], range, {\n includePrerelease: true,\n loose: false,\n });\n } catch (e) {\n // Ignore\n }\n }\n return (supportsCache[key] = doesSoftwareMatch && satisfiesRange);\n } catch (e) {\n return false;\n }\n}\n\nexport default supports;\n","import './account-block.css';\n\nimport { ph } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useState } from 'preact/hooks';\n\n// import { useNavigate } from 'react-router-dom';\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport { memFetchFamiliarFollowers } from '../utils/familiar-followers';\nimport getDomain from '../utils/get-domain';\nimport niceDateTime from '../utils/nice-date-time';\nimport shortenNumber from '../utils/shorten-number';\nimport states from '../utils/states';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RolesTags from './roles-tags';\n\nfunction AccountBlock(props) {\n const {\n skeleton,\n account,\n avatarSize = 'xl',\n avatarDescription,\n useAvatarStatic = false,\n instance,\n external,\n internal,\n onClick,\n showActivity = false,\n showStats = false,\n accountInstance,\n hideDisplayName = false,\n excludeRelationshipAttrs = [],\n } = props;\n const relationship = props.relationship;\n // FOR DEBUGGING\n // const relationship = {\n // id: 'fake',\n // following: false,\n // followedBy: false,\n // requested: false,\n // };\n const hasRelationshipProp = 'relationship' in props;\n\n const { t } = useLingui();\n const { instance: currentInstance } = api();\n const currentAccountID = getCurrentAccountID();\n const [familiarFollowers, setFamiliarFollowers] = useState([]);\n if (skeleton) {\n return (\n <div class=\"account-block skeleton\">\n <Avatar size={avatarSize} />\n <span>\n <b>████████</b>\n <br />\n <span class=\"account-block-acct\">██████</span>\n </span>\n </div>\n );\n }\n\n if (!account) {\n return null;\n }\n\n // const navigate = useNavigate();\n\n const {\n id,\n acct,\n avatar,\n avatarStatic,\n displayName,\n username,\n emojis,\n url,\n statusesCount,\n lastStatusAt,\n bot,\n fields,\n note,\n group,\n followersCount,\n createdAt,\n locked,\n roles,\n } = account;\n let [_, acct1, acct2] = acct.match(/([^@]+)(@.+)/i) || [, acct];\n if (accountInstance) {\n acct2 = `@${accountInstance}`;\n }\n\n const verifiedField = fields?.find((f) => !!f.verifiedAt && !!f.value);\n\n const relationshipObj = relationship || {};\n const excludedRelationship = {};\n for (const r in relationshipObj) {\n if (!excludeRelationshipAttrs.includes(r)) {\n excludedRelationship[r] = relationshipObj[r];\n }\n }\n const hasRelationship =\n excludedRelationship.following ||\n excludedRelationship.followedBy ||\n excludedRelationship.requested;\n\n const accountDomain = getDomain(url);\n const sameCurrentInstance = (instance || accountDomain) === currentInstance;\n useEffect(() => {\n if (!showStats || !id || !currentAccountID || id === currentAccountID)\n return;\n if (!sameCurrentInstance) return;\n if (hasRelationshipProp && !relationship) return;\n const rel = relationship || {};\n if (rel.following || rel.followedBy || rel.requested) return;\n let aborted = false;\n (async () => {\n try {\n const followers = await memFetchFamiliarFollowers(id);\n if (aborted) return;\n setFamiliarFollowers(followers[0]?.accounts || []);\n } catch (e) {\n console.error(e);\n }\n })();\n return () => {\n aborted = true;\n };\n }, [\n showStats,\n id,\n currentAccountID,\n sameCurrentInstance,\n hasRelationshipProp,\n relationship,\n ]);\n\n return (\n <a\n class=\"account-block\"\n href={url}\n target={external ? '_blank' : null}\n title={acct2 ? acct : `@${acct}`}\n onClick={(e) => {\n if (external) return;\n e.preventDefault();\n if (onClick) return onClick(e);\n if (internal) {\n // navigate(`/${instance}/a/${id}`);\n location.hash = `/${instance}/a/${id}`;\n } else {\n states.showAccount = {\n account,\n instance,\n };\n }\n }}\n >\n <div class=\"avatar-container\">\n <Avatar\n url={useAvatarStatic ? avatarStatic : avatar || avatarStatic}\n staticUrl={useAvatarStatic ? undefined : avatarStatic}\n size={avatarSize}\n squircle={bot}\n alt={avatarDescription || ''}\n />\n </div>\n <span class=\"account-block-content\">\n {!hideDisplayName && (\n <>\n {displayName ? (\n <b>\n <EmojiText\n text={displayName}\n emojis={emojis}\n resolverURL={url}\n />\n </b>\n ) : (\n <b>{username}</b>\n )}\n </>\n )}{' '}\n <span class=\"account-block-acct bidi-isolate\">\n {acct2 ? '' : '@'}\n {acct1}\n <wbr />\n {acct2}\n {locked && (\n <>\n {' '}\n <Icon icon=\"lock\" size=\"s\" alt={t`Locked`} />\n </>\n )}\n </span>\n <RolesTags roles={roles} accountUrl={url} />\n {showActivity && (\n <div class=\"account-block-stats\">\n <Trans>Posts: {shortenNumber(statusesCount)}</Trans>\n {!!lastStatusAt && (\n <>\n {' '}\n &middot;{' '}\n <span class=\"ib\">\n <Trans>\n Last active:{' '}\n {ph({\n date: niceDateTime(lastStatusAt, {\n hideTime: true,\n }),\n })}\n </Trans>\n </span>\n </>\n )}\n </div>\n )}\n {showStats && (\n <div class=\"account-block-stats\">\n {bot && (\n <>\n <span class=\"tag collapsed\">\n <Icon icon=\"bot\" /> <Trans>Automated</Trans>\n </span>\n </>\n )}\n {!!group && (\n <>\n <span class=\"tag collapsed\">\n <Icon icon=\"group\" /> <Trans>Group</Trans>\n </span>\n </>\n )}\n {hasRelationship && (\n <div key={relationship.id} class=\"shazam-container-horizontal\">\n <div class=\"shazam-container-inner\">\n {excludedRelationship.following &&\n excludedRelationship.followedBy ? (\n <span class=\"tag minimal\">\n <Trans>Mutual</Trans>\n </span>\n ) : excludedRelationship.requested ? (\n <span class=\"tag minimal\">\n <Trans>Requested</Trans>\n </span>\n ) : excludedRelationship.following ? (\n <span class=\"tag minimal\">\n <Trans>Following</Trans>\n </span>\n ) : excludedRelationship.followedBy ? (\n <span class=\"tag minimal\">\n <Trans>Follows you</Trans>\n </span>\n ) : null}\n </div>\n </div>\n )}\n {((!hasRelationship && !!familiarFollowers?.length) ||\n !!followersCount) && (\n <span class=\"shazam-container-horizontal\">\n <span class=\"shazam-container-inner\">\n {!hasRelationship && !!familiarFollowers?.length && (\n <span class=\"stats-avatars-bunch\">\n {familiarFollowers.slice(0, 3).map((follower) => (\n <Avatar\n url={follower.avatarStatic}\n size=\"s\"\n alt={`${follower.displayName} @${follower.acct}`}\n squircle={follower.bot}\n key={follower.id}\n />\n ))}\n </span>\n )}{' '}\n {!!followersCount && (\n <span class=\"ib\">\n <Plural\n value={followersCount}\n one={\n <Trans>\n <span title={followersCount}>\n {shortenNumber(followersCount)}\n </span>{' '}\n follower\n </Trans>\n }\n other={\n <Trans>\n <span title={followersCount}>\n {shortenNumber(followersCount)}\n </span>{' '}\n followers\n </Trans>\n }\n />\n </span>\n )}\n </span>\n </span>\n )}\n {!!verifiedField && (\n <span class=\"verified-field\">\n <Icon icon=\"check-circle\" size=\"s\" alt={t`Verified`} />{' '}\n <span\n dangerouslySetInnerHTML={{\n __html: enhanceContent(verifiedField.value, { emojis }),\n }}\n />\n </span>\n )}\n {!bot &&\n !group &&\n !hasRelationship &&\n !familiarFollowers?.length &&\n !followersCount &&\n !verifiedField &&\n !!createdAt && (\n <span class=\"created-at\">\n <Trans>\n Joined{' '}\n <time datetime={createdAt}>\n {niceDateTime(createdAt, {\n hideTime: true,\n })}\n </time>\n </Trans>\n </span>\n )}\n </div>\n )}\n </span>\n </a>\n );\n}\n\nexport default AccountBlock;\n","import { api } from './api';\nimport { getCurrentAccountID } from './store-utils';\n\nexport async function fetchRelationships(accounts, relationshipsMap = {}) {\n if (!accounts?.length) return;\n const { masto } = api();\n\n const currentAccount = getCurrentAccountID();\n const uniqueAccountIds = accounts.reduce((acc, a) => {\n // 1. Ignore duplicate accounts\n // 2. Ignore accounts that are already inside relationshipsMap\n // 3. Ignore currently logged in account\n if (\n !acc.includes(a.id) &&\n !relationshipsMap[a.id] &&\n a.id !== currentAccount\n ) {\n acc.push(a.id);\n }\n return acc;\n }, []);\n if (!uniqueAccountIds.length) return null;\n\n try {\n const relationships = await masto.v1.accounts.relationships.fetch({\n id: uniqueAccountIds,\n });\n const newRelationshipsMap = relationships.reduce((acc, r) => {\n acc[r.id] = r;\n return acc;\n }, {});\n return newRelationshipsMap;\n } catch (e) {\n console.error(e);\n // It's okay to fail\n return null;\n }\n}\n","import { i18n } from '@lingui/core';\n\nimport NF from './nf';\n\nexport default function i18nDuration(duration, unit) {\n return () =>\n NF(i18n.locale, {\n style: 'unit',\n unit,\n unitDisplay: 'long',\n }).format(duration);\n}\n","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'network error', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n\t'terminated', // Undici (Node.js)\n\t' A network error occurred.', // Bun (WebKit)\n\t'Network connection lost', // Cloudflare Workers (fetch)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\tconst {message, stack} = error;\n\n\t// Safari 17+ has generic message but no stack for network errors\n\tif (message === 'Load failed' || (message.startsWith('Load failed (') && message.endsWith(')'))) {\n\t\treturn stack === undefined\n\t\t\t// Sentry adds its own stack trace to the fetch error, so also check for that\n\t\t\t|| '__sentry_captured__' in error;\n\t}\n\n\t// Deno network errors start with specific text\n\tif (message.startsWith('error sending request for url')) {\n\t\treturn true;\n\t}\n\n\t// Chrome: exact \"Failed to fetch\" or with hostname: \"Failed to fetch (example.com)\"\n\tif (message === 'Failed to fetch' || (message.startsWith('Failed to fetch (') && message.endsWith(')'))) {\n\t\treturn true;\n\t}\n\n\t// Standard network error messages\n\treturn errorMessages.has(message);\n}\n","import isNetworkError from 'is-network-error';\n\nfunction validateRetries(retries) {\n\tif (typeof retries === 'number') {\n\t\tif (retries < 0) {\n\t\t\tthrow new TypeError('Expected `retries` to be a non-negative number.');\n\t\t}\n\n\t\tif (Number.isNaN(retries)) {\n\t\t\tthrow new TypeError('Expected `retries` to be a valid number or Infinity, got NaN.');\n\t\t}\n\t} else if (retries !== undefined) {\n\t\tthrow new TypeError('Expected `retries` to be a number or Infinity.');\n\t}\n}\n\nfunction validateNumberOption(name, value, {min = 0, allowInfinity = false} = {}) {\n\tif (value === undefined) {\n\t\treturn;\n\t}\n\n\tif (typeof value !== 'number' || Number.isNaN(value)) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a number${allowInfinity ? ' or Infinity' : ''}.`);\n\t}\n\n\tif (!allowInfinity && !Number.isFinite(value)) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a finite number.`);\n\t}\n\n\tif (value < min) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be \\u2265 ${min}.`);\n\t}\n}\n\nfunction validateFunctionOption(name, value) {\n\tif (value === undefined) {\n\t\treturn;\n\t}\n\n\tif (typeof value !== 'function') {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a function.`);\n\t}\n}\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nfunction calculateDelay(retriesConsumed, options) {\n\tconst attempt = Math.max(1, retriesConsumed + 1);\n\tconst random = options.randomize ? (Math.random() + 1) : 1;\n\n\tlet timeout = Math.round(random * options.minTimeout * (options.factor ** (attempt - 1)));\n\ttimeout = Math.min(timeout, options.maxTimeout);\n\n\treturn timeout;\n}\n\nfunction calculateRemainingTime(start, max) {\n\tif (!Number.isFinite(max)) {\n\t\treturn max;\n\t}\n\n\treturn max - (performance.now() - start);\n}\n\nasync function delayForRetry(delay, options) {\n\tif (delay <= 0) {\n\t\treturn;\n\t}\n\n\tawait new Promise((resolve, reject) => {\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeoutToken);\n\t\t\toptions.signal?.removeEventListener('abort', onAbort);\n\t\t\treject(options.signal.reason);\n\t\t};\n\n\t\tconst timeoutToken = setTimeout(() => {\n\t\t\toptions.signal?.removeEventListener('abort', onAbort);\n\t\t\tresolve();\n\t\t}, delay);\n\n\t\tif (options.unref) {\n\t\t\ttimeoutToken.unref?.();\n\t\t}\n\n\t\toptions.signal?.addEventListener('abort', onAbort, {once: true});\n\t});\n}\n\nasync function onAttemptFailure({error, attemptNumber, retriesConsumed, startTime, options}) {\n\tconst normalizedError = error instanceof Error\n\t\t? error\n\t\t: new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\n\tif (normalizedError instanceof AbortError) {\n\t\tthrow normalizedError.originalError;\n\t}\n\n\tconst retriesLeft = Number.isFinite(options.retries)\n\t\t? Math.max(0, options.retries - retriesConsumed)\n\t\t: options.retries;\n\n\tconst maxRetryTime = options.maxRetryTime ?? Number.POSITIVE_INFINITY;\n\tconst delayTime = calculateDelay(retriesConsumed, options);\n\tconst remainingTimeBeforeCallbacks = calculateRemainingTime(startTime, maxRetryTime);\n\n\tif (remainingTimeBeforeCallbacks <= 0) {\n\t\tconst context = Object.freeze({\n\t\t\terror: normalizedError,\n\t\t\tattemptNumber,\n\t\t\tretriesLeft,\n\t\t\tretriesConsumed,\n\t\t\tretryDelay: 0,\n\t\t});\n\n\t\tawait options.onFailedAttempt(context);\n\n\t\tthrow normalizedError;\n\t}\n\n\tconst consumeRetryContext = Object.freeze({\n\t\terror: normalizedError,\n\t\tattemptNumber,\n\t\tretriesLeft,\n\t\tretriesConsumed,\n\t\tretryDelay: retriesLeft > 0 ? delayTime : 0,\n\t});\n\n\tconst consumeRetry = await options.shouldConsumeRetry(consumeRetryContext);\n\tconst effectiveDelay = consumeRetry && retriesLeft > 0 ? delayTime : 0;\n\tconst context = Object.freeze({\n\t\terror: normalizedError,\n\t\tattemptNumber,\n\t\tretriesLeft,\n\t\tretriesConsumed,\n\t\tretryDelay: effectiveDelay,\n\t});\n\n\tawait options.onFailedAttempt(context);\n\n\tif (calculateRemainingTime(startTime, maxRetryTime) <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tconst remainingTime = calculateRemainingTime(startTime, maxRetryTime);\n\n\tif (remainingTime <= 0 || retriesLeft <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (normalizedError instanceof TypeError && !isNetworkError(normalizedError)) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (!await options.shouldRetry(context)) {\n\t\tthrow normalizedError;\n\t}\n\n\tconst remainingTimeAfterShouldRetry = calculateRemainingTime(startTime, maxRetryTime);\n\n\tif (remainingTimeAfterShouldRetry <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (!consumeRetry) {\n\t\toptions.signal?.throwIfAborted();\n\t\treturn false;\n\t}\n\n\tconst finalDelay = Math.min(effectiveDelay, remainingTimeAfterShouldRetry);\n\n\toptions.signal?.throwIfAborted();\n\n\tawait delayForRetry(finalDelay, options);\n\n\toptions.signal?.throwIfAborted();\n\n\treturn true;\n}\n\nexport default async function pRetry(input, options = {}) {\n\toptions = {...options};\n\n\tvalidateRetries(options.retries);\n\n\tif (Object.hasOwn(options, 'forever')) {\n\t\tthrow new Error('The `forever` option is no longer supported. For many use-cases, you can set `retries: Infinity` instead.');\n\t}\n\n\toptions.retries ??= 10;\n\toptions.factor ??= 2;\n\toptions.minTimeout ??= 1000;\n\toptions.maxTimeout ??= Number.POSITIVE_INFINITY;\n\toptions.maxRetryTime ??= Number.POSITIVE_INFINITY;\n\toptions.randomize ??= false;\n\toptions.onFailedAttempt ??= () => {};\n\toptions.shouldRetry ??= () => true;\n\toptions.shouldConsumeRetry ??= () => true;\n\n\t// Validate numeric options and normalize edge cases\n\tvalidateFunctionOption('onFailedAttempt', options.onFailedAttempt);\n\tvalidateFunctionOption('shouldRetry', options.shouldRetry);\n\tvalidateFunctionOption('shouldConsumeRetry', options.shouldConsumeRetry);\n\tvalidateNumberOption('factor', options.factor, {min: 0, allowInfinity: false});\n\tvalidateNumberOption('minTimeout', options.minTimeout, {min: 0, allowInfinity: false});\n\tvalidateNumberOption('maxTimeout', options.maxTimeout, {min: 0, allowInfinity: true});\n\tvalidateNumberOption('maxRetryTime', options.maxRetryTime, {min: 0, allowInfinity: true});\n\n\t// Treat non-positive factor as 1 to avoid zero backoff or negative behavior\n\tif (!(options.factor > 0)) {\n\t\toptions.factor = 1;\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tlet attemptNumber = 0;\n\tlet retriesConsumed = 0;\n\tconst startTime = performance.now();\n\n\twhile (Number.isFinite(options.retries) ? retriesConsumed <= options.retries : true) {\n\t\tattemptNumber++;\n\n\t\ttry {\n\t\t\toptions.signal?.throwIfAborted();\n\n\t\t\tconst result = await input(attemptNumber);\n\n\t\t\toptions.signal?.throwIfAborted();\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (await onAttemptFailure({\n\t\t\t\terror,\n\t\t\t\tattemptNumber,\n\t\t\t\tretriesConsumed,\n\t\t\t\tstartTime,\n\t\t\t\toptions,\n\t\t\t})) {\n\t\t\t\tretriesConsumed++;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Should not reach here, but in case it does, throw an error\n\tthrow new Error('Retry attempts exhausted without throwing an error.');\n}\n\nexport function makeRetriable(function_, options) {\n\treturn function (...arguments_) {\n\t\treturn pRetry(() => function_.apply(this, arguments_), options);\n\t};\n}\n","const supportsLanguageDetector = 'LanguageDetector' in self;\nexport const supportsBrowserTranslator =\n supportsLanguageDetector && 'Translator' in self;\n\n// https://developer.chrome.com/docs/ai/language-detection\nexport let langDetector;\nif (supportsLanguageDetector) {\n (async () => {\n try {\n const availability = await LanguageDetector.availability();\n if (availability === 'unavailable') {\n console.log('🎺 Language detector is unavailable');\n // The language detector isn't usable.\n return;\n }\n if (availability === 'available') {\n console.log('🎺 Language detector is available');\n // The language detector can immediately be used.\n langDetector = await LanguageDetector.create();\n } else {\n console.log(`🎺 Language detector is ${availability}`);\n // The language detector can be used after model download.\n langDetector = await LanguageDetector.create({\n monitor(m) {\n m.addEventListener('downloadprogress', (e) => {\n console.log(\n `🎺 Language detector: Downloaded ${e.loaded * 100}%`,\n );\n });\n },\n });\n await langDetector.ready;\n }\n } catch (e) {\n console.error(e);\n }\n })();\n}\n\n// https://developer.chrome.com/docs/ai/translator-api\nexport const translate = async (text, source, target) => {\n let detectedSourceLanguage;\n const originalSource = source;\n if (source === 'auto') {\n if (!langDetector?.detect) {\n return {\n error: 'No language detector',\n };\n }\n try {\n const results = await langDetector.detect(text);\n source = results[0].detectedLanguage;\n detectedSourceLanguage = source;\n } catch (e) {\n console.warn(e);\n return {\n error: e,\n };\n }\n }\n const groupLabel = `💬 BROWSER TRANSLATE ${text}`;\n console.groupCollapsed(groupLabel);\n console.log(originalSource, detectedSourceLanguage, target);\n try {\n const translatorCapabilities = await Translator.availability({\n sourceLanguage: source,\n targetLanguage: target,\n });\n // Note: Translator.availability() returns 'unavailable', 'downloadable', 'downloading', or 'available'.\n if (translatorCapabilities === 'unavailable') {\n console.groupEnd(groupLabel);\n return {\n error: `Unsupported language pair: ${source} -> ${target}`,\n };\n }\n let translator;\n if (translatorCapabilities === 'available') {\n translator = await Translator.create({\n sourceLanguage: source,\n targetLanguage: target,\n });\n } else {\n translator = await Translator.create({\n sourceLanguage: source,\n targetLanguage: target,\n monitor(m) {\n m.addEventListener('downloadprogress', (e) => {\n console.log(\n `Translate ${source} -> ${target}: Downloaded ${e.loaded * 100}%`,\n );\n });\n },\n });\n await translator.ready;\n }\n\n const content = await translator.translate(text);\n console.log(content);\n console.groupEnd(groupLabel);\n\n return {\n content,\n detectedSourceLanguage,\n provider: 'browser',\n };\n } catch (e) {\n console.groupEnd(groupLabel);\n console.error(e);\n return {\n error: e,\n };\n }\n};\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a2;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n [...(_a2 = elements.get(entry.target)) != null ? _a2 : []].forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"lastInView\");\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n this.lastInView = this.props.initialInView;\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n const previousInView = this.lastInView;\n this.lastInView = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n this.lastInView = props.initialInView;\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n if (this.lastInView === void 0) {\n this.lastInView = this.props.initialInView;\n }\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a2;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef(onChange);\n const lastInViewRef = React2.useRef(initialInView);\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (lastInViewRef.current === void 0) {\n lastInViewRef.current = initialInView;\n }\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a2 = state.entry) == null ? void 0 : _a2.target;\n const previousEntryTarget = React2.useRef(void 0);\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n lastInViewRef.current = initialInView;\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\n\n// src/useOnInView.tsx\nimport * as React3 from \"react\";\nvar _a, _b;\nvar useSyncEffect = (_b = (_a = \"useInsertionEffect\" in React3 ? React3.useInsertionEffect : void 0) != null ? _a : React3.useLayoutEffect) != null ? _b : React3.useEffect;\nvar useOnInView = (onIntersectionChange, {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n} = {}) => {\n const onIntersectionChangeRef = React3.useRef(onIntersectionChange);\n const observedElementRef = React3.useRef(null);\n const observerCleanupRef = React3.useRef(void 0);\n const lastInViewRef = React3.useRef(void 0);\n useSyncEffect(() => {\n onIntersectionChangeRef.current = onIntersectionChange;\n }, [onIntersectionChange]);\n return React3.useCallback(\n (element) => {\n const cleanupExisting = () => {\n if (observerCleanupRef.current) {\n const cleanup = observerCleanupRef.current;\n observerCleanupRef.current = void 0;\n cleanup();\n }\n };\n if (element === observedElementRef.current) {\n return observerCleanupRef.current;\n }\n if (!element || skip) {\n cleanupExisting();\n observedElementRef.current = null;\n lastInViewRef.current = void 0;\n return;\n }\n cleanupExisting();\n observedElementRef.current = element;\n let destroyed = false;\n const destroyObserver = observe(\n element,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n onIntersectionChangeRef.current(\n inView,\n entry\n );\n if (triggerOnce && inView) {\n stopObserving();\n }\n },\n {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay\n }\n );\n function stopObserving() {\n if (destroyed) return;\n destroyed = true;\n destroyObserver();\n observedElementRef.current = null;\n observerCleanupRef.current = void 0;\n lastInViewRef.current = void 0;\n }\n observerCleanupRef.current = stopObserving;\n return observerCleanupRef.current;\n },\n [\n Array.isArray(threshold) ? threshold.toString() : threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n ]\n );\n};\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView,\n useOnInView\n};\n//# sourceMappingURL=index.mjs.map","/*\n Rendered but hidden. Only show when visible\n*/\nimport { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useOnInView } from 'react-intersection-observer';\n\n// The sticky header, usually at the top\nconst TOP = 48;\n\nconst shazamIDs = {};\n\nexport default function LazyShazam({ id, children }) {\n const containerRef = useRef();\n const [visibleStart, setVisibleStart] = useState(!!shazamIDs[id]);\n\n const onInView = useCallback(\n (inView) => {\n if (inView && containerRef.current) {\n containerRef.current.hidden = false;\n if (id) shazamIDs[id] = true;\n }\n },\n [id],\n );\n\n const ref = useOnInView(onInView, {\n rootMargin: `-${TOP}px 0px 0px 0px`,\n trackVisibility: true,\n delay: 1000,\n triggerOnce: true,\n skip: visibleStart,\n });\n\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n if (rect.bottom > TOP) {\n if (rect.top < window.innerHeight) {\n containerRef.current.hidden = false;\n } else {\n setVisibleStart(true);\n }\n if (id) shazamIDs[id] = true;\n }\n }, []);\n\n if (visibleStart) return children;\n\n return (\n <div ref={containerRef} class=\"shazam-container no-animation\" hidden>\n <div ref={ref} class=\"shazam-container-inner\">\n {children}\n </div>\n </div>\n );\n}\n","import './translation-block.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport PQueue from 'p-queue';\nimport pRetry from 'p-retry';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport languages from '../data/translang-languages';\nimport {\n translate as browserTranslate,\n supportsBrowserTranslator,\n} from '../utils/browser-translator';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport pmem from '../utils/pmem';\n\nimport Icon from './icon';\nimport LazyShazam from './lazy-shazam';\nimport Loader from './loader';\n\nconst sourceLanguages = Object.entries(languages.sl).map(([code, name]) => ({\n code,\n name,\n}));\n\nconst { PHANPY_TRANSLANG_INSTANCES } = import.meta.env;\nconst TRANSLANG_INSTANCES = PHANPY_TRANSLANG_INSTANCES\n ? PHANPY_TRANSLANG_INSTANCES.split(/\\s+/)\n : [];\n\nconst translationQueue = new PQueue({\n concurrency: 1,\n interval: 2000,\n intervalCap: 1,\n});\n\nconst TRANSLATED_MAX_AGE = 1000 * 60 * 60; // 1 hour\nlet currentTranslangInstance = 0;\n\nfunction _translangTranslate(text, source, target) {\n console.log('TRANSLATE', text, source, target);\n const fetchCall = () => {\n let instance = TRANSLANG_INSTANCES[currentTranslangInstance];\n const tooLong = text.length > 2000;\n let fetchPromise;\n if (tooLong) {\n // POST\n fetchPromise = fetch(`https://${instance}/api/v1/translate`, {\n method: 'POST',\n priority: 'low',\n referrerPolicy: 'no-referrer',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sl: source,\n tl: target,\n text,\n }),\n });\n } else {\n // GET\n fetchPromise = fetch(\n `https://${instance}/api/v1/translate?sl=${encodeURIComponent(\n source,\n )}&tl=${encodeURIComponent(target)}&text=${encodeURIComponent(text)}`,\n {\n priority: 'low',\n referrerPolicy: 'no-referrer',\n },\n );\n }\n return fetchPromise\n .then((res) => {\n if (!res.ok) throw new Error(res.statusText);\n return res.json();\n })\n .then((res) => {\n return {\n provider: 'translang',\n content: res.translated_text,\n detectedSourceLanguage: res.detected_language,\n pronunciation: res.pronunciation,\n };\n });\n };\n return pRetry(fetchCall, {\n retries: 3,\n onFailedAttempt: (e) => {\n currentTranslangInstance =\n (currentTranslangInstance + 1) % TRANSLANG_INSTANCES.length;\n console.log(\n 'Retrying translation with another instance',\n currentTranslangInstance,\n );\n },\n });\n}\nconst translangTranslate = pmem(_translangTranslate, {\n expires: TRANSLATED_MAX_AGE,\n});\nconst throttledTranslangTranslate = pmem(\n ({ signal, text, source, target }) =>\n translationQueue.add(() => translangTranslate(text, source, target), {\n signal,\n }),\n {\n // I know, this is double-layered memoization\n expires: TRANSLATED_MAX_AGE,\n },\n);\n\nconst throttledBrowserTranslate = ({ text, source, target, signal }) =>\n translationQueue.add(() => browserTranslate(text, source, target), {\n signal,\n });\n\nfunction TranslationBlock({\n forceTranslate,\n sourceLanguage,\n onTranslate,\n text = '',\n mini,\n autoDetected,\n}) {\n const { t } = useLingui();\n const targetLang = getTranslateTargetLanguage(true);\n const [uiState, setUIState] = useState('default');\n const [pronunciationContent, setPronunciationContent] = useState(null);\n const [translatedContent, setTranslatedContent] = useState(null);\n const [detectedLang, setDetectedLang] = useState(null);\n const detailsRef = useRef();\n const abortControllerRef = useRef();\n\n const sourceLangText = sourceLanguage\n ? localeCode2Text(sourceLanguage)\n : null;\n const targetLangText = localeCode2Text(targetLang);\n const apiSourceLang = useRef('auto');\n\n if (!onTranslate) {\n onTranslate = async ({ text, source, target, signal }) => {\n if (supportsBrowserTranslator) {\n const result = await throttledBrowserTranslate({\n text,\n source,\n target,\n signal,\n });\n if (result && !result.error) {\n return result;\n }\n }\n return mini\n ? await throttledTranslangTranslate({ signal, text, source, target })\n : await translangTranslate(text, source, target);\n };\n }\n\n const translate = async () => {\n setUIState('loading');\n try {\n const { content, detectedSourceLanguage, provider, error, ...props } =\n await onTranslate({\n text,\n source: apiSourceLang.current,\n target: targetLang,\n signal: abortControllerRef.current?.signal,\n });\n if (content) {\n if (detectedSourceLanguage) {\n const detectedLangText = localeCode2Text(detectedSourceLanguage);\n setDetectedLang(detectedLangText);\n }\n if (provider === 'translang') {\n const pronunciation = props?.pronunciation;\n if (pronunciation) {\n setPronunciationContent(pronunciation);\n }\n }\n setTranslatedContent(content);\n setUIState('default');\n if (!mini && content.trim() !== text.trim() && detailsRef.current) {\n detailsRef.current.open = true;\n detailsRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n } else {\n if (error) console.error(error);\n setUIState('error');\n }\n } catch (e) {\n if (e.name !== 'AbortError') {\n console.error(e);\n setUIState('error');\n }\n }\n };\n\n useEffect(() => {\n if (forceTranslate) {\n translate();\n }\n }, [forceTranslate]);\n\n useEffect(() => {\n abortControllerRef.current = new AbortController();\n return () => {\n abortControllerRef.current.abort();\n };\n }, []);\n\n if (mini) {\n if (\n !!translatedContent &&\n translatedContent.trim() !== text.trim() &&\n detectedLang !== targetLangText\n ) {\n return (\n <LazyShazam>\n <div class=\"status-translation-block-mini\">\n <Icon\n icon=\"translate\"\n alt={t`Auto-translated from ${sourceLangText}`}\n />\n <output\n lang={targetLang}\n dir=\"auto\"\n title={pronunciationContent || ''}\n >\n {translatedContent}\n </output>\n </div>\n </LazyShazam>\n );\n }\n return null;\n }\n\n return (\n <div\n class=\"status-translation-block\"\n onClick={(e) => {\n e.preventDefault();\n }}\n >\n <details ref={detailsRef}>\n <summary>\n <button\n type=\"button\"\n class={uiState === 'loading' ? 'loading-mask' : ''}\n onClick={async (e) => {\n e.preventDefault();\n e.stopPropagation();\n detailsRef.current.open = !detailsRef.current.open;\n if (uiState === 'loading') return;\n if (!translatedContent) translate();\n }}\n >\n <Icon icon=\"translate\" />{' '}\n <span>\n {uiState === 'loading'\n ? t`Translating…`\n : sourceLanguage && sourceLangText && !detectedLang\n ? autoDetected\n ? t`Translate from ${sourceLangText} (auto-detected)`\n : t`Translate from ${sourceLangText}`\n : t`Translate`}\n </span>\n </button>\n </summary>\n <div class=\"translated-block\">\n <div class=\"translation-info insignificant\">\n <select\n class=\"translated-source-select\"\n disabled={uiState === 'loading'}\n onChange={(e) => {\n apiSourceLang.current = e.target.value;\n translate();\n }}\n >\n {sourceLanguages.map((l) => {\n const common = localeCode2Text({\n code: l.code,\n fallback: l.name,\n });\n const native = localeCode2Text({\n code: l.code,\n locale: l.code,\n });\n const showCommon = native && common !== native;\n return (\n <option value={l.code}>\n {l.code === 'auto'\n ? t`Auto (${detectedLang ?? '…'})`\n : showCommon\n ? `${native} - ${common}`\n : common}\n </option>\n );\n })}\n </select>{' '}\n <span>→ {targetLangText}</span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n </div>\n {uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Failed to translate</Trans>\n </p>\n ) : (\n !!translatedContent && (\n <>\n <output class=\"translated-content\" lang={targetLang} dir=\"auto\">\n {translatedContent}\n </output>\n {!!pronunciationContent && (\n <output\n class=\"translated-pronunciation-content\"\n tabIndex={-1}\n onClick={(e) => {\n e.target.classList.toggle('expand');\n }}\n >\n {pronunciationContent}\n </output>\n )}\n </>\n )\n )}\n </div>\n </details>\n </div>\n );\n}\n\nexport default TRANSLANG_INSTANCES?.length ? TranslationBlock : () => null;\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n let dbp;\n const getDB = () => {\n if (dbp)\n return dbp;\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n dbp = promisifyRequest(request);\n dbp.then((db) => {\n // It seems like Safari sometimes likes to just close the connection.\n // It's supposed to fire this event when that happens. Let's hope it does!\n db.onclose = () => (dbp = undefined);\n }, () => { });\n return dbp;\n };\n return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n const req = store.get(key);\n req.onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n req.onerror = () => reject(req.error);\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import {\n clear,\n createStore,\n del,\n delMany,\n get,\n getMany,\n keys,\n set,\n} from 'idb-keyval';\n\nfunction initDB(dbName, storeName) {\n const store = createStore(dbName, storeName);\n return {\n set: (key, val) => set(key, val, store),\n get: (key) => get(key, store),\n getMany: (keys) => getMany(keys, store),\n del: (key) => del(key, store),\n delMany: (keys) => delMany(keys, store),\n clear: () => clear(store),\n keys: () => keys(store),\n };\n}\n\nexport default {\n drafts: initDB('drafts-db', 'drafts-store'),\n catchup: initDB('catchup-db', 'catchup-store'),\n yearInPosts: initDB('year-in-posts-db', 'year-in-posts-store'),\n};\n","import { createContext } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nconst EditHistoryContext = createContext({});\n\nconst supportsViewTransition = !!document.startViewTransition;\n\nexport function EditHistoryProvider({ children, statusID }) {\n const editHistoryRef = useRef([]);\n const [editHistoryMode, setEditHistoryMode] = useState(false);\n // 0 is latest\n const [editedAtIndex, _setEditedAtIndex] = useState(0);\n\n // setEditedAtIndex, with View Transitions API\n function setEditedAtIndex(i) {\n if (i === editedAtIndex) return;\n if (supportsViewTransition) {\n document.startViewTransition(() => {\n _setEditedAtIndex(i);\n });\n } else {\n _setEditedAtIndex(i);\n }\n }\n\n async function fetchEditHistory() {\n const { masto } = api();\n const history = await masto.v1.statuses.$select(statusID).history.list();\n // sort latest first\n history.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt));\n editHistoryRef.current = history;\n }\n\n async function initEditHistory() {\n console.log('initEditHistory', statusID);\n try {\n await fetchEditHistory();\n setEditHistoryMode(true);\n setEditedAtIndex(0);\n } catch (e) {\n console.error(e);\n setEditHistoryMode(false);\n }\n }\n\n function exitEditHistory() {\n editHistoryRef.current = [];\n setEditHistoryMode(false);\n setEditedAtIndex(0);\n }\n\n function prevEditedAt() {\n setEditedAtIndex((i) => Math.min(i + 1, editHistoryRef.current.length - 1));\n }\n\n function nextEditedAt() {\n setEditedAtIndex((i) => Math.max(i - 1, 0));\n }\n\n return (\n <EditHistoryContext.Provider\n value={{\n editHistoryRef,\n initEditHistory,\n exitEditHistory,\n editHistoryMode,\n editedAtIndex,\n prevEditedAt,\n nextEditedAt,\n }}\n >\n {children}\n </EditHistoryContext.Provider>\n );\n}\n\nexport function useEditHistory() {\n return useContext(EditHistoryContext);\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 Date.parse(filter.expiresAt) > Date.now();\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 isBlur = appliedFilters.every((f) => f.filter.filterAction === 'blur');\n if (isBlur) {\n const filterTitles = appliedFilters.map((f) => f.filter.title);\n return {\n action: 'blur',\n titles: filterTitles,\n titlesStr: filterTitles.join(' • '),\n };\n }\n // const isWarn = appliedFilters.some((f) => f.filter.filterAction === 'warn');\n const isWarn = appliedFilters.some((f) => !!f.filter.filterAction);\n // Re: spec; unknown values for filter_action should be treated as 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 template = document.createElement('template');\nexport default function htmlContentLength(html) {\n if (!html) return 0;\n template.innerHTML = html;\n // .invisible spans for links\n // e.g. <span class=\"invisible\">https://</span>mastodon.social\n const invisibleElements = template.content.querySelectorAll('.invisible');\n for (let i = 0; i < invisibleElements.length; i++) {\n invisibleElements[i].remove();\n }\n // Collect innerText from all child nodes since DocumentFragment doesn't have innerText\n let textContent = '';\n for (let i = 0; i < template.content.childNodes.length; i++) {\n const n = template.content.childNodes[i];\n textContent += n.innerText || n.textContent || '';\n }\n return textContent.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 { 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 { useThrottledCallback } from 'use-debounce';\nimport useResizeObserver from 'use-resize-observer';\n\nexport default function useThrottledResizeObserver(opts = {}) {\n const onResize = useThrottledCallback(opts.onResize, 300);\n return useResizeObserver({\n ...opts,\n onResize,\n });\n}\n","import { useRef } from 'preact/hooks';\n\nimport useThrottledResizeObserver from './useThrottledResizeObserver';\n\nexport default function useTruncated({\n className = 'truncated',\n onTruncated,\n} = {}) {\n const ref = useRef();\n const prevTruncatedRef = useRef();\n const onResize = ({ 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 if (\n prevTruncatedRef.current !== truncated &&\n typeof onTruncated === 'function'\n ) {\n prevTruncatedRef.current = truncated;\n onTruncated(truncated);\n }\n }\n };\n useThrottledResizeObserver({\n ref,\n box: 'border-box',\n onResize,\n });\n return ref;\n}\n","export default {\n public: 'earth',\n unlisted: 'moon',\n private: 'lock',\n direct: 'message',\n local: 'building',\n};\n","import { msg } from '@lingui/core/macro';\n\nconst visibilityText = {\n public: msg`Public`,\n local: msg`Local`,\n unlisted: msg`Quiet public`,\n private: msg`Followers`,\n direct: msg`Private mention`,\n};\n\nexport default visibilityText;\n","import './collection-card.css';\n\nimport { ph } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useMemo } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nconst ACCOUNT_ITEMS_LIMIT = 5;\nconst ACCOUNT_ROTATION_INTERVAL = 300_000; // 5 min in ms\n\nfunction CollectionCard({\n collection,\n instance,\n creatorAccount,\n size,\n showMeta,\n}) {\n const snapStates = useSnapshot(states);\n const { i18n } = useLingui();\n const {\n id,\n name,\n description,\n url,\n items = [],\n itemsCount,\n accountId,\n language,\n updatedAt,\n discoverable,\n sensitive,\n } = collection;\n\n // Rotate start index by 1 every interval when items exceed the limit\n const rotationSlot = Math.floor(Date.now() / ACCOUNT_ROTATION_INTERVAL);\n const selectedItems = useMemo(() => {\n if (items.length > ACCOUNT_ITEMS_LIMIT) {\n const offset = rotationSlot % items.length;\n return [...items.slice(offset), ...items.slice(0, offset)].slice(\n 0,\n ACCOUNT_ITEMS_LIMIT,\n );\n }\n return items;\n }, [rotationSlot, items]);\n\n // Resolve up to ACCOUNT_ITEMS_LIMIT accounts from items\n const accountItems = selectedItems\n .slice(0, ACCOUNT_ITEMS_LIMIT)\n .map((item) => snapStates.accounts[item.accountId])\n .filter(Boolean);\n\n // Background shows first and last account avatars (or just one if there's only one)\n const bgAccounts =\n accountItems.length === 1\n ? [accountItems[0]]\n : [accountItems[0], accountItems[accountItems.length - 1]];\n\n // Resolve creator account\n const creator = creatorAccount || snapStates.accounts[accountId];\n\n // Fetch missing accounts\n useEffect(() => {\n let aborted = false;\n const { masto } = api({ instance });\n\n const missingIDs = [\n ...new Set(\n selectedItems\n .slice(0, ACCOUNT_ITEMS_LIMIT)\n .map((item) => item.accountId)\n .concat(!creatorAccount ? accountId : [])\n .filter(Boolean),\n ),\n ].filter((id) => !states.accounts[id]);\n\n if (missingIDs.length > 0) {\n masto.v1.accounts\n .fetch({ id: missingIDs })\n .then((accounts) => {\n if (!aborted) {\n for (const account of accounts) {\n states.accounts[account.id] = account;\n }\n }\n })\n .catch(() => {});\n }\n\n return () => {\n aborted = true;\n };\n }, [selectedItems, instance]);\n\n const visibleCount = Math.min(selectedItems.length, ACCOUNT_ITEMS_LIMIT);\n const overflowCount = (itemsCount || items.length) - ACCOUNT_ITEMS_LIMIT;\n\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noopener\"\n class={`collection-card ${sensitive ? 'sensitive' : ''} ${size === 'l' ? 'large' : ''}`}\n lang={language || undefined}\n onClick={(e) => {\n if (!id) return;\n // If cmd/ctrl/shift/alt key is pressed or middle-click, let the browser handle it\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.which === 2) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n location.hash = `#${instance ? `/${instance}` : ''}/c/${id}`;\n }}\n >\n {!sensitive && accountItems.length > 0 && (\n <div class=\"collection-card-bg\" aria-hidden=\"true\">\n {bgAccounts.map((a) => (\n <img\n key={a.id}\n src={a.avatarStatic || a.avatar}\n alt=\"\"\n decoding=\"async\"\n loading=\"lazy\"\n />\n ))}\n </div>\n )}\n {items.length > 0 && (\n <div class=\"collection-accounts\">\n {sensitive ? (\n <>\n {Array.from({ length: visibleCount }, (_, i) => (\n <div key={i} class=\"avatar-placeholder\">\n {i === 0 && <Icon icon=\"alert\" />}\n </div>\n ))}\n </>\n ) : (\n Array.from({ length: visibleCount }, (_, i) => {\n const account = snapStates.accounts[selectedItems[i].accountId];\n return account ? (\n <Avatar\n key={account.id}\n url={account.avatarStatic || account.avatar}\n size=\"l\"\n alt={account.displayName || account.username || ''}\n squircle={account.bot}\n />\n ) : (\n <div key={selectedItems[i].accountId} class=\"avatar-spacer\" />\n );\n })\n )}\n {overflowCount > 0 && (\n <span class=\"account-overflow-count\">+{overflowCount}</span>\n )}\n </div>\n )}\n <div class=\"meta-container\">\n <p class=\"title\" dir=\"auto\">\n {name}\n </p>\n {!!description && (\n <p class=\"meta\" dir=\"auto\">\n {description}\n </p>\n )}\n {!!creator && (\n <p class=\"meta\" lang={i18n.locale} dir=\"auto\">\n <Trans>\n Collection by{' '}\n <span class=\"bidi-isolate\">\n @{ph({ username: creator.acct })}\n </span>\n </Trans>\n </p>\n )}\n {showMeta && (\n <p class=\"meta\" dir=\"auto\">\n {updatedAt && (\n <Trans>\n Last updated:{' '}\n <RelativeTime\n _t=\"relativeTime\"\n datetime={updatedAt}\n format=\"micro\"\n />\n </Trans>\n )}\n {discoverable === false && (\n <>\n {updatedAt && ' · '}\n <Trans>Unlisted</Trans>\n </>\n )}\n </p>\n )}\n </div>\n </a>\n );\n}\n\nexport default CollectionCard;\n","import { Children } from 'preact/compat';\nimport { useRef, useMemo } from 'preact/hooks';\nimport { useOnInView } from 'react-intersection-observer';\n\n// The sticky header, usually at the top\nconst TOP = 48;\n\nexport default function LazyRender({\n as: Root = 'div',\n id,\n class: className,\n children,\n renderIfHasChildren = true,\n ...props\n}) {\n const rootRef = useRef(null);\n\n const hasChildren = useMemo(\n () => Children.toArray(children).filter((child) => !!child).length > 0,\n [children],\n );\n\n const observerRef = useOnInView(\n (inView, entry) => {\n if (!rootRef.current) return;\n const node = rootRef.current;\n if (inView) {\n console.log('💥', { id, root: node });\n node.classList.remove('hidden');\n } else if (entry.boundingClientRect.bottom <= TOP) {\n // Element is above the fold (already scrolled past)\n if (hasChildren && renderIfHasChildren) {\n // Don't need to observe if has children\n observerRef(null);\n // Debugging\n if (import.meta.env.DEV) {\n node.dataset.rectBottom = entry.boundingClientRect.bottom;\n }\n } else {\n node.classList.add('hidden');\n }\n }\n },\n {\n rootMargin: `-${TOP}px 0px 0px 0px`,\n triggerOnce: true,\n skip: !hasChildren,\n },\n );\n\n return (\n <Root\n {...props}\n ref={(node) => {\n rootRef.current = node;\n observerRef(node);\n }}\n class={`lazy-render ${className || ''}`}\n >\n {children}\n </Root>\n );\n}\n","import 'temml/dist/Temml-Local.css';\n\nimport { useLingui } from '@lingui/react/macro';\nimport { useCallback, useState } from 'preact/hooks';\n\nimport showToast from '../utils/show-toast';\n\nimport Icon from './icon';\n\n// Follow https://mathstodon.xyz/about\n// > You can use LaTeX in toots here! Use \\( and \\) for inline, and \\[ and \\] for display mode.\nconst DELIMITERS_PATTERNS = [\n // '\\\\$\\\\$[\\\\s\\\\S]*?\\\\$\\\\$', // $$...$$\n '\\\\\\\\\\\\[[\\\\s\\\\S]*?\\\\\\\\\\\\]', // \\[...\\]\n '\\\\\\\\\\\\([\\\\s\\\\S]*?\\\\\\\\\\\\)', // \\(...\\)\n // '\\\\\\\\begin\\\\{(?:equation\\\\*?|align\\\\*?|alignat\\\\*?|gather\\\\*?|CD)\\\\}[\\\\s\\\\S]*?\\\\\\\\end\\\\{(?:equation\\\\*?|align\\\\*?|alignat\\\\*?|gather\\\\*?|CD)\\\\}', // AMS environments\n // '\\\\\\\\(?:ref|eqref)\\\\{[^}]*\\\\}', // \\ref{...}, \\eqref{...}\n];\nconst DELIMITERS_REGEX = new RegExp(DELIMITERS_PATTERNS.join('|'), 'g');\n\nfunction cleanDOMForTemml(dom) {\n // Define start and end delimiter patterns\n const START_DELIMITERS = ['\\\\\\\\\\\\[', '\\\\\\\\\\\\(']; // \\[ and \\(\n const startRegex = new RegExp(`(${START_DELIMITERS.join('|')})`);\n\n // Walk through all text nodes\n const walker = document.createTreeWalker(dom, NodeFilter.SHOW_TEXT);\n const textNodes = [];\n let node;\n while ((node = walker.nextNode())) {\n textNodes.push(node);\n }\n\n for (const textNode of textNodes) {\n const text = textNode.textContent;\n const startMatch = text.match(startRegex);\n\n if (!startMatch) continue; // No start delimiter in this text node\n\n // Find the matching end delimiter\n const startDelimiter = startMatch[0];\n const endDelimiter = startDelimiter === '\\\\[' ? '\\\\]' : '\\\\)';\n\n // Collect nodes from start delimiter until end delimiter\n const nodesToCombine = [textNode];\n let currentNode = textNode;\n let foundEnd = false;\n let combinedText = text;\n\n // Check if end delimiter is in the same text node\n if (text.includes(endDelimiter)) {\n foundEnd = true;\n } else {\n // Look through sibling nodes\n while (currentNode.nextSibling && !foundEnd) {\n const nextSibling = currentNode.nextSibling;\n\n if (nextSibling.nodeType === Node.TEXT_NODE) {\n nodesToCombine.push(nextSibling);\n combinedText += nextSibling.textContent;\n if (nextSibling.textContent.includes(endDelimiter)) {\n foundEnd = true;\n }\n } else if (\n nextSibling.nodeType === Node.ELEMENT_NODE &&\n nextSibling.tagName === 'BR'\n ) {\n nodesToCombine.push(nextSibling);\n combinedText += '\\n';\n } else {\n // Found a non-BR element, stop and don't process\n break;\n }\n\n currentNode = nextSibling;\n }\n }\n\n // Only process if we found the end delimiter and have nodes to combine\n if (foundEnd && nodesToCombine.length > 1) {\n // Replace the first text node with combined text\n textNode.textContent = combinedText;\n\n // Remove the other nodes\n for (let i = 1; i < nodesToCombine.length; i++) {\n nodesToCombine[i].remove();\n }\n }\n }\n}\n\nconst MathBlock = ({ content, contentRef, onRevert }) => {\n DELIMITERS_REGEX.lastIndex = 0; // Reset index to prevent g trap\n const hasLatexContent = DELIMITERS_REGEX.test(content);\n\n if (!hasLatexContent) return null;\n\n const { t } = useLingui();\n const [mathRendered, setMathRendered] = useState(false);\n const toggleMathRendering = useCallback(\n async (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (mathRendered) {\n // Revert to original content by refreshing PostContent\n setMathRendered(false);\n onRevert();\n } else {\n // Render math\n try {\n // This needs global because the codebase inside temml is calling a function from global.temml 🤦‍♂️\n const temml =\n window.temml || (window.temml = (await import('temml'))?.default);\n\n cleanDOMForTemml(contentRef.current);\n const originalContentRefHTML = contentRef.current.innerHTML;\n temml.renderMathInElement(contentRef.current, {\n fences: '(', // This should sync with DELIMITERS_REGEX\n annotate: true,\n throwOnError: true,\n errorCallback: (err) => {\n console.warn('Failed to render LaTeX:', err);\n },\n });\n\n const hasMath = contentRef.current.querySelector('math');\n const htmlChanged =\n contentRef.current.innerHTML !== originalContentRefHTML;\n if (hasMath && htmlChanged) {\n setMathRendered(true);\n } else {\n showToast(t`Unable to format math`);\n setMathRendered(false);\n onRevert(); // Revert because DOM modified by cleanDOMForTemml\n }\n } catch (e) {\n console.error('Failed to LaTeX:', e);\n }\n }\n },\n [mathRendered],\n );\n\n return (\n <div class=\"math-block\">\n <Icon icon=\"formula\" size=\"s\" /> <span>{t`Math expressions found.`}</span>{' '}\n <button type=\"button\" class=\"light small\" onClick={toggleMathRendering}>\n {mathRendered\n ? t({\n comment:\n 'Action to switch from rendered math back to raw (LaTeX) markup',\n message: 'Show markup',\n })\n : t({\n comment:\n 'Action to render math expressions from raw (LaTeX) markup',\n message: 'Format math',\n })}\n </button>\n </div>\n );\n};\n\nexport default MathBlock;\n","const chars =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~';\nconst decode83 = (str, start, end) => {\n let value = 0;\n while (start < end) {\n value = value * 83 + chars.indexOf(str[start++]);\n }\n return value;\n};\n\nconst pow = Math.pow;\nconst PI = Math.PI;\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\n// linear -> sRGB is by far the hottest part of decoding (3 conversions per\n// output pixel). The curve only depends on the linear value, so it is sampled\n// once over [0, 1] at module load into a lookup table and reused for every\n// pixel. Values outside [0, 1] clamp to the 0/255 ends like the exact formula.\nconst LUT_SIZE = 4096;\nconst sRGBLookup = new Uint8ClampedArray(LUT_SIZE + 1);\nfor (let i = 0; i <= LUT_SIZE; i++) {\n sRGBLookup[i] = linearTosRGB(i / LUT_SIZE);\n}\nconst fastLinearTosRGB = (v) =>\n v <= 0 ? 0 : v >= 1 ? 255 : sRGBLookup[(v * LUT_SIZE + 0.5) | 0];\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 for (x += PI / 2; x > PI; ) {\n x -= PI * 2;\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, j, x, y, r, g, b, basis, basisY, colorIndex, pixelIndex, value;\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 // The inverse transform is separable, so it is computed in two passes per\n // row: first collapse the Y basis into per-X-basis color sums (`u`), then\n // collapse the X basis for each pixel. This turns the inner work from\n // O(numX * numY) per pixel into O(numX) per pixel.\n const u = new Float64Array(numX * 3);\n for (y = 0; y < height; y++) {\n for (i = 0; i < numX; i++) {\n r = g = b = 0;\n for (j = 0; j < numY; j++) {\n basisY = cosinesY[j * height + y];\n colorIndex = (i + j * numX) * 3;\n r += colors[colorIndex] * basisY;\n g += colors[colorIndex + 1] * basisY;\n b += colors[colorIndex + 2] * basisY;\n }\n u[i * 3] = r;\n u[i * 3 + 1] = g;\n u[i * 3 + 2] = b;\n }\n for (x = 0; x < width; x++) {\n r = g = b = 0;\n for (i = 0; i < numX; i++) {\n basis = cosinesX[i * width + x];\n colorIndex = i * 3;\n r += u[colorIndex] * basis;\n g += u[colorIndex + 1] * basis;\n b += u[colorIndex + 2] * basis;\n }\n\n pixelIndex = 4 * x + y * bytesPerRow;\n pixels[pixelIndex] = fastLinearTosRGB(r);\n pixels[pixelIndex + 1] = fastLinearTosRGB(g);\n pixels[pixelIndex + 2] = fastLinearTosRGB(b);\n pixels[pixelIndex + 3] = 255; // alpha\n }\n }\n return pixels;\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\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, nonce = _a.nonce;\n var child = Children.only(children);\n var props = containerProps || {};\n return (React.createElement(React.Fragment, null,\n React.createElement(\"style\", { nonce: nonce }, 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, string = _a.string;\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 nonce: string,\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","import PinchZoomComp from './PinchZoom/component';\nexport default PinchZoomComp;\nexport { hasTranslate3DSupport, make2dTransformValue, make3dTransformValue, isTouch, } from './utils';\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 { Trans, useLingui } from '@lingui/react/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\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 { t } = useLingui();\n const { alt, lang, index, ...rest } = props;\n if (!alt || !alt.trim()) return null;\n return (\n <button\n type=\"button\"\n class=\"alt-badge clickable\"\n {...rest}\n onClick={(e) => {\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 && <sup>{index}</sup>}\n </button>\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\n// https://caniuse.com/http-live-streaming\nconst isStreamingVideoSupported = (() => {\n try {\n const video = document.createElement('video');\n if (!video.canPlayType) return false;\n return (\n video.canPlayType('application/vnd.apple.mpegurl') !== '' ||\n video.canPlayType('application/x-mpegURL') !== '' ||\n video.canPlayType('audio/mpegurl') !== ''\n );\n } catch (e) {\n return false;\n }\n})();\n\nfunction Media({\n class: className = '',\n media,\n to,\n lang,\n showOriginal,\n autoAnimate,\n showCaption,\n allowLongerCaption,\n altIndex,\n checkAspectRatio = true,\n onClick,\n autoplay = false,\n}) {\n let {\n id,\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 mediaVTN = getSafeViewTransitionName(id || blurhash || url);\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\n const hasPreviewDimensions = small?.width && small?.height;\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 [mediaLoadError, setMediaLoadError] = useState(false);\n\n const Parent = useMemo(\n () =>\n to && !mediaLoadError ? (props) => <Link to={to} {...props} /> : 'div',\n [to, mediaLoadError],\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 isStreamingVideoMaybe =\n remoteMediaURLObj &&\n /\\.m3u8$/i.test(remoteMediaURLObj.pathname) &&\n isStreamingVideoSupported;\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' &&\n previewUrl &&\n !isVideoMaybe &&\n !isStreamingVideoMaybe &&\n !isAudioMaybe);\n const isPreviewVideoMaybe =\n (previewUrl &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(getURLObj(previewUrl).pathname)) ||\n isStreamingVideoMaybe;\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 <figure {...restProps}>\n {children}\n <figcaption\n class=\"media-caption\"\n lang={lang}\n dir=\"auto\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: description,\n lang,\n };\n }}\n >\n {description}\n </figcaption>\n </figure>\n );\n };\n\n const postViewState = () =>\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? 'large'\n : 'small';\n const interceptOnClick = useCallback(\n (e) => {\n const isOnPostPage = e.target.closest('.status-deck');\n if (\n showOriginal ||\n (postViewState() === 'large' && isOnPostPage) ||\n !document.startViewTransition\n ) {\n onClick?.(e);\n return;\n }\n const el =\n e.target.closest('[data-view-transition-name]') ||\n e.target.querySelector('[data-view-transition-name]');\n if (el) {\n // BUG: both link and onClick is triggered at the same time\n // Temporarily disable view transition if has onClick\n // Detecting preventDefault for an onClick has to happen before view transition but it's only possible after click, and this mean the link is already clicked even before we know it's default prevented.\n if (onClick) {\n onClick(e);\n } else {\n e.preventDefault();\n if (el.dataset.viewTransitioned) {\n el.style.viewTransitionName = mediaVTN;\n try {\n document.startViewTransition(() => {\n el.style.viewTransitionName = '';\n location.hash = `#${to}`;\n });\n } catch (e) {\n console.error(e);\n el.style.viewTransitionName = '';\n location.hash = `#${to}`;\n }\n } else {\n location.hash = `#${to}`;\n }\n }\n } else {\n onClick?.(e);\n }\n },\n [mediaVTN, showOriginal, onClick],\n );\n\n // Prevent media session lingering after unmount\n useEffect(() => {\n return () => {\n const mediaElements =\n parentRef.current?.querySelectorAll?.('video, audio');\n if (mediaElements) {\n mediaElements.forEach((el) => {\n try {\n el.pause();\n el.src = '';\n el.load();\n } catch (e) {}\n });\n }\n if ('mediaSession' in navigator) {\n navigator.mediaSession.playbackState = 'none';\n }\n };\n }, []);\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 <Figure>\n <Parent\n ref={parentRef}\n class={`media media-image ${className}`}\n onClick={interceptOnClick}\n data-orientation={orientation}\n data-has-alt={!showInlineDesc || undefined}\n style={\n showOriginal\n ? {\n backgroundImage: `url(${previewUrl})`,\n '--bg-image': `url(${previewUrl})`,\n backgroundSize: imageSmallerThanParent\n ? `${width}px ${height}px`\n : undefined,\n ...averageColorStyle,\n }\n : mediaStyles\n }\n >\n {showOriginal ? (\n <QuickPinchZoom {...quickPinchZoomProps}>\n <img\n ref={mediaRef}\n src={mediaURL}\n alt={description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"eager\"\n decoding=\"sync\"\n style={{\n 'view-transition-name': mediaVTN,\n }}\n onLoad={(e) => {\n const el = e.target;\n const mediaImage = el.closest('.media-image');\n if (mediaImage) {\n mediaImage.style.backgroundImage = `url(${el.src})`;\n mediaImage.style.removeProperty('--bg-image');\n }\n el.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 </QuickPinchZoom>\n ) : (\n <>\n <img\n src={mediaURL}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n data-view-transition-name={mediaVTN}\n style={{\n // backgroundColor:\n // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n // backgroundPosition: focalBackgroundPosition || 'center',\n // Duration based on width or height in pixels\n objectPosition: focalPosition || 'center',\n // 100px per second (rough estimate)\n // Clamp between 5s and 120s\n '--anim-duration': `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n onLoad={(e) => {\n // e.target.closest('.media-image').style.backgroundImage = '';\n e.target.dataset.loaded = true;\n const $media = e.target.closest('.media');\n if (!hasPreviewDimensions && $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 (checkAspectRatio && $media) {\n const { target } = e;\n setTimeout(() => {\n const {\n clientWidth,\n clientHeight,\n naturalWidth,\n naturalHeight,\n } = 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 const $mediaParent = $media.closest('.media');\n if ($mediaParent) {\n $mediaParent.dataset.hasNaturalAspectRatio = true;\n }\n }\n }\n }\n }, 300);\n }\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 } else {\n setMediaLoadError(true);\n }\n }}\n />\n {!showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </>\n )}\n </Parent>\n {mediaLoadError && (\n <div>\n <a href={remoteUrl} class=\"button plain6 small\" target=\"_blank\">\n <Icon icon=\"external\" />{' '}\n <span>\n <Trans>Open file</Trans>\n </span>\n </a>\n </div>\n )}\n </Figure>\n );\n } else if (\n type === 'gifv' ||\n type === 'video' ||\n isVideoMaybe ||\n isStreamingVideoMaybe\n ) {\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 <video\n src=\"${url}\"\n poster=\"${previewUrl}\"\n width=\"${width}\"\n height=\"${height}\"\n data-orientation=\"${orientation}\"\n style=\"view-transition-name: ${mediaVTN}\"\n preload=\"auto\"\n autoplay\n muted\n playsinline\n ${loopable ? 'loop' : ''}\n ondblclick=\"this.paused ? this.play() : this.pause()\"\n ${\n showProgress\n ? \"ontimeupdate=\\\"this.closest('.media-gif') && this.closest('.media-gif').style.setProperty('--progress', `${~~((this.currentTime / this.duration) * 100)}%`)\\\"\"\n : ''\n }\n ></video>\n `;\n\n const videoURL = isStreamingVideoMaybe ? remoteMediaURL : url;\n const videoHTML = `\n <video\n src=\"${videoURL}\"\n poster=\"${previewUrl}\"\n width=\"${width}\"\n height=\"${height}\"\n data-orientation=\"${orientation}\"\n style=\"view-transition-name: ${mediaVTN}\"\n preload=\"auto\"\n ${autoplay ? 'autoplay' : ''}\n playsinline\n ${loopable ? 'loop' : ''}\n controls\n ></video>\n `;\n\n return (\n <Figure>\n <Parent\n ref={parentRef}\n class={`media ${className} media-${isGIF ? 'gif' : 'video'} ${\n autoGIFAnimate ? 'media-contain' : ''\n } ${hoverAnimate ? 'media-hover-animate' : ''}`}\n data-orientation={orientation}\n data-formatted-duration={\n !showOriginal ? formattedDuration : undefined\n }\n data-label={\n isGIF && !showOriginal && !autoGIFAnimate ? 'GIF' : undefined\n }\n data-has-alt={!showInlineDesc || undefined}\n // style={{\n // backgroundColor:\n // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n // }}\n style={!showOriginal && mediaStyles}\n onClick={(e) => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n interceptOnClick(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 <QuickPinchZoom {...quickPinchZoomProps} enabled>\n <div\n ref={mediaRef}\n dangerouslySetInnerHTML={{\n __html: gifHTML,\n }}\n />\n </QuickPinchZoom>\n ) : isGIF ? (\n <div\n class=\"video-container\"\n dangerouslySetInnerHTML={{\n __html: gifHTML,\n }}\n />\n ) : (\n <div\n class=\"video-container\"\n dangerouslySetInnerHTML={{ __html: videoHTML }}\n />\n )\n ) : isGIF ? (\n <video\n ref={videoRef}\n src={url}\n poster={previewUrl}\n width={width}\n height={height}\n data-orientation={orientation}\n data-view-transition-name={mediaVTN}\n preload=\"auto\"\n // controls\n playsinline\n loop\n muted\n onTimeUpdate={\n showProgress\n ? (e) => {\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 && !isPreviewVideoMaybe ? (\n <img\n src={previewUrl}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n decoding=\"async\"\n data-view-transition-name={mediaVTN}\n onLoad={(e) => {\n if (!hasPreviewDimensions) {\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 <video\n src={videoURL + '#t=0.1'} // Make Safari show 1st-frame preview\n width={width}\n height={height}\n data-orientation={orientation}\n data-view-transition-name={mediaVTN}\n preload=\"metadata\"\n muted\n disablePictureInPicture\n onLoadedMetadata={(e) => {\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 <div class=\"media-play\">\n <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n </div>\n </>\n )}\n {!showOriginal && !showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </Parent>\n </Figure>\n );\n } else if (type === 'audio' || isAudioMaybe) {\n const formattedDuration = formatDuration(original.duration);\n return (\n <Figure>\n <Parent\n class={`media media-audio ${className}`}\n data-formatted-duration={\n !showOriginal ? formattedDuration : undefined\n }\n data-has-alt={!showInlineDesc || undefined}\n onClick={onClick}\n style={!showOriginal && mediaStyles}\n >\n {showOriginal ? (\n previewUrl ? (\n <video\n src={(remoteUrl || url) + '#t=0.1'}\n width={width}\n height={height}\n data-orientation={orientation}\n poster={previewUrl}\n style={{\n background: `url(${previewUrl}) center/cover`,\n aspectRatio: `${width}/${height}`,\n }}\n preload=\"metadata\"\n controls\n controlsList=\"nofullscreen\"\n autoPlay={autoplay}\n playsInline\n />\n ) : (\n <audio\n src={remoteUrl || url}\n preload=\"none\"\n controls\n autoPlay={autoplay}\n />\n )\n ) : previewUrl ? (\n <img\n src={previewUrl}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n onError={(e) => {\n try {\n // Remove self if broken\n e.target?.remove?.();\n } catch (e) {}\n }}\n />\n ) : null}\n {!showOriginal && (\n <>\n <div class=\"media-play\">\n <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n </div>\n {!showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </>\n )}\n </Parent>\n </Figure>\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 function getSafeViewTransitionName(inputString) {\n // Replace any character that is not a letter, number, hyphen, or underscore with a hyphen.\n let safeName = inputString.replace(/[^a-zA-Z0-9_-]/g, '-');\n\n // Ensure it starts with a letter, underscore, or two hyphens (to prevent starting with a number or single hyphen).\n // This covers edge cases where the original string might start with an invalid character after replacement.\n if (safeName.match(/^[0-9-]/)) {\n safeName = 'vt-' + safeName;\n }\n\n return safeName;\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 { useEffect, useRef, useState } from 'preact/hooks';\n\nimport isRTL from '../utils/is-rtl';\n\nimport Icon from './icon';\nimport Media from './media';\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 <div class=\"media-first-container\">\n <div class=\"media-first-carousel\" ref={carouselRef}>\n {mediaAttachments.map((media, i) => (\n <div class=\"media-first-item\" key={media.id}>\n <Media\n media={media}\n lang={language}\n to={`/${instance}/s/${postID}?media=${i + 1}`}\n />\n </div>\n ))}\n </div>\n {moreThanOne && (\n <div class=\"media-carousel-controls\">\n <div class=\"carousel-indexer\">\n {currentIndex + 1}/{mediaAttachments.length}\n </div>\n <label class=\"media-carousel-button\">\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === 0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex - 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-left\" />\n </button>\n </label>\n <label class=\"media-carousel-button\">\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === mediaAttachments.length - 1}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex + 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-right\" />\n </button>\n </label>\n </div>\n )}\n </div>\n {moreThanOne && (\n <div\n class=\"media-carousel-dots\"\n style={{\n '--dots-count': mediaAttachments.length,\n }}\n >\n {mediaAttachments.map((media, i) => (\n <span\n key={media.id}\n class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n />\n ))}\n </div>\n )}\n </>\n );\n}\n\nexport default MediaFirstContainer;\n","function MultipleMediaFigure(props) {\n const { enabled, children, lang, captionChildren } = props;\n if (!enabled || !captionChildren) return children;\n return (\n <figure class=\"media-figure-multiple\">\n {children}\n <figcaption lang={lang} dir=\"auto\">\n {captionChildren}\n </figcaption>\n </figure>\n );\n}\n\nexport default MultipleMediaFigure;\n","import { i18n } from '@lingui/core';\nimport { plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport haptics from '../utils/haptics';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport useTruncated from '../utils/useTruncated';\n\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nconst POLL_OPTIONS_BATCH_SIZE = 40;\n\nexport default function Poll({\n poll,\n lang,\n readOnly,\n refresh = () => {},\n votePoll = () => {},\n}) {\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [visibleOptionsCount, setVisibleOptionsCount] = useState(\n POLL_OPTIONS_BATCH_SIZE,\n );\n const loadMoreRef = useRef(null);\n const {\n expired,\n expiresAt,\n id,\n multiple,\n options,\n ownVotes,\n voted,\n votersCount,\n votesCount = 0,\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 : 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 const resultsView =\n (showResults && optionsHaveVoteCounts) || voted || expired;\n const [selectedOptions, setSelectedOptions] = useState(multiple ? [] : null);\n\n useEffect(() => {\n if (!loadMoreRef.current) return;\n if (visibleOptionsCount >= options.length) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n setVisibleOptionsCount((prev) =>\n Math.min(prev + POLL_OPTIONS_BATCH_SIZE, options.length),\n );\n }\n },\n { threshold: 0.1 },\n );\n\n observer.observe(loadMoreRef.current);\n\n return () => observer.disconnect();\n }, [visibleOptionsCount, options.length]);\n\n useEffect(() => {\n setVisibleOptionsCount(POLL_OPTIONS_BATCH_SIZE);\n }, [resultsView, options.length]);\n\n const voteOptionsSelectionCount = multiple\n ? selectedOptions.length\n : selectedOptions !== null\n ? 1\n : 0;\n const [showPollInfo, setShowPollInfo] = useState(false);\n const ref = useTruncated({\n onTruncated: setShowPollInfo,\n });\n\n return (\n <div\n lang={lang}\n dir=\"auto\"\n class={`poll ${readOnly ? 'read-only' : ''} ${\n uiState === 'loading' ? 'loading' : ''\n }`}\n >\n {resultsView ? (\n <>\n <div class=\"poll-options\" ref={ref}>\n {options.slice(0, visibleOptionsCount).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 <div\n key={`${i}-${title}`}\n class={`poll-option poll-result ${\n isLeading ? 'poll-option-leading' : ''\n }`}\n style={{\n '--percentage': `${ratio * 100}%`,\n }}\n >\n <div class=\"poll-option-title\">\n <span>\n <EmojiText text={title} emojis={emojis} />\n </span>\n </div>\n <div\n class=\"poll-option-votes\"\n title={plural(optionVotesCount, {\n one: `# vote`,\n other: `# votes`,\n })}\n >\n {voted && ownVotes.includes(i) && (\n <>\n <Icon icon=\"check-circle\" alt={t`Voted`} />{' '}\n </>\n )}\n <span class=\"poll-option-votes-percentage\">\n {percentage}\n </span>\n </div>\n </div>\n );\n })}\n {visibleOptionsCount < options.length && (\n <div ref={loadMoreRef} style={{ minHeight: '1em' }} />\n )}\n </div>\n {!expired && !voted && (\n <div class=\"poll-actions\">\n <button\n class=\"poll-hide-results-button plain2\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setShowResults(false);\n }}\n >\n <Icon icon=\"arrow-left\" size=\"s\" /> <Trans>Hide results</Trans>\n </button>{' '}\n <div class=\"poll-info\">\n {showPollInfo && (\n <small class=\"insignificant\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </small>\n )}\n </div>\n </div>\n )}\n </>\n ) : (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n const choices = multiple\n ? selectedOptions\n : selectedOptions !== null\n ? [selectedOptions]\n : [];\n if (!choices.length) return;\n setUIState('loading');\n try {\n await votePoll(choices);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to vote in poll`);\n } finally {\n setUIState('default');\n }\n }}\n >\n <div class=\"poll-options\" ref={ref}>\n {options.slice(0, visibleOptionsCount).map((option, i) => {\n const { title } = option;\n const isSelected = multiple\n ? selectedOptions.includes(i)\n : selectedOptions === i;\n return (\n <div class=\"poll-option\" key={`${i}-${title}`}>\n <label class=\"poll-label\">\n <input\n type={multiple ? 'checkbox' : 'radio'}\n name=\"poll\"\n value={i}\n disabled={uiState === 'loading'}\n readOnly={readOnly}\n checked={isSelected}\n onChange={(e) => {\n const value = i;\n if (multiple) {\n setSelectedOptions((prev) =>\n e.target.checked\n ? [...prev, value]\n : prev.filter((v) => v !== value),\n );\n } else {\n setSelectedOptions(value);\n }\n }}\n />\n <span class=\"poll-option-title\">\n <EmojiText text={title} emojis={emojis} />\n </span>\n </label>\n </div>\n );\n })}\n {visibleOptionsCount < options.length && (\n <div ref={loadMoreRef} style={{ minHeight: '1em' }} />\n )}\n </div>\n <div class=\"poll-actions\">\n <button\n class=\"poll-vote-button\"\n type=\"submit\"\n disabled={\n readOnly ||\n uiState === 'loading' ||\n voteOptionsSelectionCount === 0\n }\n onClick={() => haptics.trigger('medium')}\n >\n <Trans>Vote</Trans>\n </button>{' '}\n <div class=\"poll-info\">\n {showPollInfo &&\n (multiple && voteOptionsSelectionCount > 0 ? (\n <small>\n {voteOptionsSelectionCount}{' '}\n <span class=\"insignificant\">/ {options.length}</span>\n </small>\n ) : (\n <small class=\"insignificant\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </small>\n ))}\n </div>\n </div>\n </form>\n )}\n <p class=\"poll-meta\">\n <span class=\"spacer\">\n {(expired || voted) && showPollInfo && (\n <>\n <span class=\"ib\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </span>{' '}\n &bull;{' '}\n </>\n )}\n <span class=\"ib\">\n <Plural\n value={votesCount}\n one={\n <Trans>\n <span title={votesCount}>{shortenNumber(votesCount)}</span>{' '}\n vote\n </Trans>\n }\n other={\n <Trans>\n <span title={votesCount}>{shortenNumber(votesCount)}</span>{' '}\n votes\n </Trans>\n }\n />\n </span>\n {!!votersCount && votersCount !== votesCount && (\n <>\n {' '}\n &bull;{' '}\n <span class=\"ib\">\n <Plural\n value={votersCount}\n one={\n <Trans>\n <span title={votersCount}>\n {shortenNumber(votersCount)}\n </span>{' '}\n voter\n </Trans>\n }\n other={\n <Trans>\n <span title={votersCount}>\n {shortenNumber(votersCount)}\n </span>{' '}\n voters\n </Trans>\n }\n />\n </span>\n </>\n )}{' '}\n &bull;{' '}\n {expired ? (\n !!expiresAtDate ? (\n <span class=\"ib\">\n <Trans>\n Ended <RelativeTime datetime={expiresAtDate} />\n </Trans>\n </span>\n ) : (\n t`Ended`\n )\n ) : !!expiresAtDate ? (\n <span class=\"ib\">\n <Trans>\n Ending <RelativeTime datetime={expiresAtDate} />\n </Trans>\n </span>\n ) : (\n t`Ending`\n )}\n </span>\n {!voted && !expired && !readOnly && optionsHaveVoteCounts && (\n <button\n type=\"button\"\n class=\"plain small poll-results-button\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setShowResults(!showResults);\n }}\n title={showResults ? t`Hide results` : t`Show results`}\n >\n <Icon\n icon={showResults ? 'eye-open' : 'eye-close'}\n alt={showResults ? t`Hide results` : t`Show results`}\n />{' '}\n </button>\n )}\n {!expired && !readOnly && (\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setUIState('loading');\n\n (async () => {\n await refresh();\n setUIState('default');\n })();\n }}\n title={t`Refresh`}\n >\n <Icon icon=\"refresh\" alt={t`Refresh`} />\n </button>\n )}\n </p>\n </div>\n );\n}\n","import { useEffect, useLayoutEffect, useRef } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport enhanceContent from '../utils/enhance-content';\nimport handleContentLinks from '../utils/handle-content-links';\nimport states, { statusKey } from '../utils/states';\n\nconst HTTP_REGEX = /^http/i;\n\nconst PostContent =\n /*memo(*/\n ({ post, instance, previewMode }) => {\n const { content, emojis, language, mentions, url, taggedCollections } =\n post;\n const snapStates = useSnapshot(states);\n const sKey = statusKey(post.id, instance);\n const quotes = snapStates.statusQuotes[sKey];\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 useEffect(() => {\n // Find all links that's in states.statusQuotes and add 'is-quote' class\n if (quotes?.length) {\n for (const a of divRef.current.querySelectorAll('a')) {\n if (quotes.some((quote) => quote?.originalURL === a.href)) {\n a.classList.add('is-quote');\n }\n }\n }\n }, [quotes?.length]);\n\n return (\n <div\n ref={divRef}\n lang={language}\n dir=\"auto\"\n class=\"inner-content\"\n onClick={handleContentLinks({\n mentions,\n instance,\n previewMode,\n statusURL: url,\n taggedCollections,\n })}\n // dangerouslySetInnerHTML={{\n // __html: enhanceContent(content, {\n // emojis,\n // postEnhanceDOM: (dom) => {\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\nexport default PostContent;\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 level++\n opened[level] = elTag.substring(2, elTag.length - 1)\n }\n\n return newIndented\n }, []).join('\\n')\n}\n\nmodule.exports = addIndentation\n","/**\n * @param {string} nonFormattedString Any non formatted string\n * @returns {string[]} Array of strings separated on new lines\n */\nconst removeEmptyLines = (nonFormattedString) => (\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 { Trans, useLingui } from '@lingui/react/macro';\nimport prettify from 'html-prettify';\n\nimport emojifyText from '../utils/emojify-text';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\n\nimport Icon from './icon';\n\nfunction generateHTMLCode(post, instance, level = 0) {\n const {\n account: {\n url: accountURL,\n displayName,\n acct,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n poll,\n spoilerText,\n language,\n editedAt,\n createdAt,\n content,\n mediaAttachments,\n url,\n emojis,\n } = post;\n\n const sKey = statusKey(id, instance);\n const quotes = states.statusQuotes[sKey] || [];\n const uniqueQuotes = quotes.filter(\n (q, i, arr) => arr.findIndex((q2) => q2.url === q.url) === i,\n );\n const quoteStatusesHTML =\n uniqueQuotes.length && level <= 2\n ? uniqueQuotes\n .map((quote) => {\n const { id, instance } = quote;\n const sKey = statusKey(id, instance);\n const s = states.statuses[sKey];\n if (s) {\n return generateHTMLCode(s, instance, ++level);\n }\n })\n .join('')\n : '';\n\n const createdAtDate = new Date(createdAt);\n // const editedAtDate = editedAt && new Date(editedAt);\n\n const contentHTML =\n emojifyText(content, emojis) +\n '\\n' +\n quoteStatusesHTML +\n '\\n' +\n (poll?.options?.length\n ? `\n <p>📊:</p>\n <ul>\n ${poll.options\n .map(\n (option) => `\n <li>\n ${option.title}\n ${option.votesCount >= 0 ? ` (${option.votesCount})` : ''}\n </li>\n `,\n )\n .join('')}\n </ul>`\n : '') +\n (mediaAttachments.length > 0\n ? '\\n' +\n mediaAttachments\n .map((media) => {\n const {\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n const { original = {}, small } = meta || {};\n const width = small?.width || original?.width;\n const height = small?.height || original?.height;\n\n // Prefer remote over original\n const sourceMediaURL = remoteUrl || url;\n const previewMediaURL = previewRemoteUrl || previewUrl;\n const mediaURL = previewMediaURL || sourceMediaURL;\n\n const sourceMediaURLObj = sourceMediaURL\n ? URL.parse(sourceMediaURL)\n : null;\n const isVideoMaybe =\n type === 'unknown' &&\n sourceMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(sourceMediaURLObj.pathname);\n const isAudioMaybe =\n type === 'unknown' &&\n sourceMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(sourceMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' &&\n previewMediaURL &&\n !isVideoMaybe &&\n !isAudioMaybe);\n const isVideo = type === 'gifv' || type === 'video' || isVideoMaybe;\n const isAudio = type === 'audio' || isAudioMaybe;\n\n let mediaHTML = '';\n if (isImage) {\n mediaHTML = `<img src=\"${mediaURL}\" width=\"${width}\" height=\"${height}\" alt=\"${description}\" loading=\"lazy\" />`;\n } else if (isVideo) {\n mediaHTML = `\n <video src=\"${sourceMediaURL}\" width=\"${width}\" height=\"${height}\" controls preload=\"auto\" poster=\"${previewMediaURL}\" loading=\"lazy\"></video>\n ${description ? `<figcaption>${description}</figcaption>` : ''}\n `;\n } else if (isAudio) {\n mediaHTML = `\n <audio src=\"${sourceMediaURL}\" controls preload=\"auto\"></audio>\n ${description ? `<figcaption>${description}</figcaption>` : ''}\n `;\n } else {\n mediaHTML = `\n <a href=\"${sourceMediaURL}\">📄 ${\n description || sourceMediaURL\n }</a>\n `;\n }\n\n return `<figure>${mediaHTML}</figure>`;\n })\n .join('\\n')\n : '');\n\n const htmlCode = `\n <blockquote lang=\"${language}\" cite=\"${url}\" data-source=\"fediverse\">\n ${\n spoilerText\n ? `\n <details>\n <summary>${spoilerText}</summary>\n ${contentHTML}\n </details>\n `\n : contentHTML\n }\n <footer>\n — ${emojifyText(\n displayName,\n accountEmojis,\n )} (@${acct}) ${!!createdAt ? `<a href=\"${url}\"><time datetime=\"${createdAtDate.toISOString()}\">${createdAtDate.toLocaleString()}</time></a>` : ''}\n </footer>\n </blockquote>\n `;\n\n return prettify(htmlCode);\n}\n\nfunction PostEmbedModal({ post, instance, onClose }) {\n const { t } = useLingui();\n const {\n account: {\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n poll,\n spoilerText,\n language,\n editedAt,\n createdAt,\n content,\n mediaAttachments,\n url,\n emojis,\n } = post;\n\n const htmlCode = generateHTMLCode(post, instance);\n return (\n <div id=\"embed-post\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Embed post</Trans>\n </h2>\n </header>\n <main tabIndex=\"-1\">\n <h3>\n <Trans>HTML Code</Trans>\n </h3>\n <textarea\n class=\"embed-code\"\n readonly\n onClick={(e) => {\n e.target.select();\n }}\n dir=\"auto\"\n >\n {htmlCode}\n </textarea>\n <button\n type=\"button\"\n onClick={() => {\n try {\n navigator.clipboard.writeText(htmlCode);\n showToast(t`HTML code copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy HTML code`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />{' '}\n <span>\n <Trans>Copy</Trans>\n </span>\n </button>\n {!!mediaAttachments?.length && (\n <section>\n <p>\n <Trans>Media attachments:</Trans>\n </p>\n <ol class=\"links-list\">\n {mediaAttachments.map((media) => {\n return (\n <li key={media.id}>\n <a\n href={media.remoteUrl || media.url}\n target=\"_blank\"\n download\n >\n {media.remoteUrl || media.url}\n </a>\n </li>\n );\n })}\n </ol>\n </section>\n )}\n {!!accountEmojis?.length && (\n <section>\n <p>\n <Trans>Account Emojis:</Trans>\n </p>\n <ul>\n {accountEmojis.map((emoji) => {\n return (\n <li key={emoji.shortcode}>\n <picture>\n <source\n srcset={emoji.staticUrl}\n media=\"(prefers-reduced-motion: reduce)\"\n ></source>\n <img\n class=\"shortcode-emoji emoji\"\n src={emoji.url}\n alt={`:${emoji.shortcode}:`}\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </picture>{' '}\n <code>:{emoji.shortcode}:</code> (\n <a href={emoji.url} target=\"_blank\" download>\n URL\n </a>\n )\n {emoji.staticUrl ? (\n <>\n {' '}\n (\n <a href={emoji.staticUrl} target=\"_blank\" download>\n <Trans>static URL</Trans>\n </a>\n )\n </>\n ) : null}\n </li>\n );\n })}\n </ul>\n </section>\n )}\n {!!emojis?.length && (\n <section>\n <p>\n <Trans>Emojis:</Trans>\n </p>\n <ul>\n {emojis.map((emoji) => {\n return (\n <li key={emoji.shortcode}>\n <picture>\n <source\n srcset={emoji.staticUrl}\n media=\"(prefers-reduced-motion: reduce)\"\n ></source>\n <img\n class=\"shortcode-emoji emoji\"\n src={emoji.url}\n alt={`:${emoji.shortcode}:`}\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </picture>{' '}\n <code>:{emoji.shortcode}:</code> (\n <a href={emoji.url} target=\"_blank\" download>\n URL\n </a>\n )\n {emoji.staticUrl ? (\n <>\n {' '}\n (\n <a href={emoji.staticUrl} target=\"_blank\" download>\n <Trans>static URL</Trans>\n </a>\n )\n </>\n ) : null}\n </li>\n );\n })}\n </ul>\n </section>\n )}\n <section>\n <small>\n <p>\n <Trans>Notes:</Trans>\n </p>\n <ul>\n <li>\n <Trans>\n This is static, unstyled and scriptless. You may need to apply\n your own styles and edit as needed.\n </Trans>\n </li>\n <li>\n <Trans>\n Polls are not interactive, becomes a list with vote counts.\n </Trans>\n </li>\n <li>\n <Trans>\n Media attachments can be images, videos, audios or any file\n types.\n </Trans>\n </li>\n <li>\n <Trans>Post could be edited or deleted later.</Trans>\n </li>\n </ul>\n </small>\n </section>\n <h3>\n <Trans>Preview</Trans>\n </h3>\n <output\n class=\"embed-preview\"\n dangerouslySetInnerHTML={{ __html: htmlCode }}\n dir=\"auto\"\n />\n <p>\n <small>\n <Trans>Note: This preview is lightly styled.</Trans>\n </small>\n </p>\n </main>\n </div>\n );\n}\n\nexport default PostEmbedModal;\n","import './quote-chain-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport { getStatus } from '../utils/states';\nimport useTruncated from '../utils/useTruncated';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nfunction TruncatedLink(props) {\n const { t } = useLingui();\n const ref = useTruncated();\n return <Link {...props} data-read-more={t`Read more →`} ref={ref} />;\n}\n\nconst FETCH_DELAY = 500; // Delay between fetches to avoid rate limiting\nconst BATCH_LIMIT = 30; // The chain might get very long, so fetch in batches\n\nexport default function QuoteChainModal({\n statusId,\n instance,\n onClose = () => {},\n}) {\n const { t } = useLingui();\n const { masto } = api();\n\n const [posts, setPosts] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [nextPostID, setNextPostID] = useState(null);\n\n const abortControllerRef = useRef(null);\n\n const fetchQuoteChain = async (postID) => {\n abortControllerRef.current = new AbortController();\n const signal = abortControllerRef.current.signal;\n\n setUIState('loading');\n let fetchCount = 0;\n let currentPostID = postID;\n\n while (currentPostID && !signal.aborted && fetchCount < BATCH_LIMIT) {\n console.log('🔗 WHILE', { currentPostID, fetchCount });\n // Break circular reference if it somehow happens\n // Note that origin post could be edited to add a quote that might reference to any post in the chain ♻️\n if (posts.some((p) => p.id === currentPostID)) {\n break;\n }\n\n let fullStatus = getStatus(currentPostID, instance);\n const cached = !!fullStatus;\n\n if (!cached) {\n try {\n fullStatus = await masto.v1.statuses.$select(currentPostID).fetch();\n fetchCount++;\n } catch (e) {\n console.error('Error fetching quote:', e);\n setUIState('error');\n break;\n }\n }\n\n console.log('🔗 PUSH', fullStatus);\n setPosts((prev) => [...prev, fullStatus]);\n\n currentPostID =\n fullStatus.quote?.quotedStatusId || fullStatus.quote?.quotedStatus?.id;\n\n // Add delay before next fetch to avoid rate limiting\n if (\n !cached &&\n currentPostID &&\n !signal.aborted &&\n fetchCount < BATCH_LIMIT\n ) {\n await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY));\n }\n }\n\n if (!signal.aborted) {\n setNextPostID(currentPostID || null);\n setUIState('default');\n }\n };\n\n useEffect(() => {\n fetchQuoteChain(statusId);\n return () => {\n abortControllerRef.current?.abort();\n };\n }, [statusId]);\n\n return (\n <div id=\"quote-chain-modal\" class=\"sheet\" tabindex=\"-1\">\n {onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <b>\n <Trans>Quote chain</Trans>\n </b>{' '}\n {posts.length > 0 && (\n <small class=\"tag insignificant collapsed\">\n {posts.length}\n {(!!nextPostID || uiState === 'loading') && '+'}\n </small>\n )}\n </header>\n <main>\n <ul class=\"quoted-posts-list\">\n {posts.map((post) => (\n <li key={post.id} class=\"quoted-post-item\">\n <TruncatedLink\n to={instance ? `/${instance}/s/${post.id}` : `/s/${post.id}`}\n class=\"status-link\"\n onContextMenu={(e) => {\n const postEl = e.target.querySelector('.status');\n if (postEl) {\n if (e.metaKey) return;\n e.preventDefault();\n postEl.dispatchEvent(\n new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n }}\n >\n <Status\n status={post}\n instance={instance}\n size=\"s\"\n readOnly\n showCommentCount\n showQuoteCount={(c) => c > 1}\n />\n </TruncatedLink>\n </li>\n ))}\n </ul>\n {uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Failed to unwrap quote chain</Trans>\n </p>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : nextPostID ? (\n <button\n type=\"button\"\n class=\"light block\"\n onClick={() => {\n fetchQuoteChain(nextPostID);\n }}\n >\n <Icon icon=\"arrow-down\" /> <Trans>Continue unwrapping…</Trans>\n </button>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n )}\n </main>\n </div>\n );\n}\n","import './quote-settings-sheet.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport showToast from '../utils/show-toast';\nimport { saveStatus } from '../utils/states';\n\nimport Icon from './icon';\nimport Status from './status';\n\nfunction QuoteSettingsSheet({ onClose, post, currentPolicy }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n\n const [selectedPolicy, setSelectedPolicy] = useState(\n currentPolicy || 'public',\n );\n\n const handleFormSubmit = async (e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const quoteApprovalPolicy = formData.get('quoteApprovalPolicy');\n\n setSelectedPolicy(quoteApprovalPolicy);\n setUIState('loading');\n\n try {\n const newStatus = await masto.v1.statuses\n .$select(post.id)\n .interactionPolicy.update({\n quote_approval_policy: quoteApprovalPolicy,\n });\n onClose(true);\n showToast(t`Quote settings updated`);\n setUIState('default');\n\n // Update the status with new quote policy\n saveStatus(newStatus, post.instance, {\n skipThreading: true,\n skipUnfurling: true,\n });\n } catch (e) {\n console.error(e);\n showToast(t`Failed to update quote settings`);\n setUIState('error');\n }\n };\n\n return (\n <div class=\"sheet\" id=\"quote-settings-container\">\n {!!onClose && (\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={onClose}\n disabled={uiState === 'loading'}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Quote settings for this post</Trans>\n </h2>\n </header>\n <main>\n {!!post && (\n <div class=\"post-preview\">\n <Status status={post} size=\"s\" readOnly />\n </div>\n )}\n <form onSubmit={handleFormSubmit}>\n <select\n value={selectedPolicy}\n name=\"quoteApprovalPolicy\"\n disabled={uiState === 'loading'}\n >\n <option value=\"public\">\n <Trans>Anyone can quote</Trans>\n </option>\n <option value=\"followers\">\n <Trans>Your followers can quote</Trans>\n </option>\n <option value=\"nobody\">\n <Trans>Only you can quote</Trans>\n </option>\n </select>{' '}\n <button disabled={uiState === 'loading'}>\n <Trans>Save</Trans>\n </button>\n </form>\n </main>\n </div>\n );\n}\n\nexport default QuoteSettingsSheet;\n","import './quotes-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nconst LIMIT = 20;\n\nexport default function QuotesModal({\n statusId,\n instance,\n onClose = () => {},\n}) {\n const { t } = useLingui();\n const { masto } = api();\n\n const [posts, setPosts] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [showMore, setShowMore] = useState(false);\n\n const quotesIterator = useRef();\n const firstLoad = useRef(true);\n\n const loadQuotes = (isFirstLoad = false) => {\n if (isFirstLoad || !quotesIterator.current) {\n quotesIterator.current = masto.v1.statuses\n .$select(statusId)\n .quotes.list({\n limit: LIMIT,\n })\n .values();\n }\n\n setUIState('loading');\n\n (async () => {\n try {\n let { done, value } = await quotesIterator.current.next();\n\n if (Array.isArray(value)) {\n if (isFirstLoad) {\n setPosts(value);\n } else {\n setPosts((prev) => [...prev, ...value]);\n }\n if (value.length < LIMIT) {\n done = true;\n }\n setShowMore(!done);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n console.error('Error loading quotes:', e);\n setUIState('error');\n }\n })();\n };\n\n useEffect(() => {\n loadQuotes(true);\n firstLoad.current = false;\n }, [statusId]);\n\n return (\n <div id=\"quotes-modal\" class=\"sheet\" tabindex=\"-1\">\n {onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Quotes</Trans>\n </h2>\n </header>\n <main>\n {posts.length > 0 ? (\n <>\n <ul class=\"quoted-posts-list\">\n {posts.map((post) => (\n <li key={post.id} class=\"quoted-post-item\">\n <Link\n to={\n instance ? `/${instance}/s/${post.id}` : `/s/${post.id}`\n }\n class=\"status-link\"\n onContextMenu={(e) => {\n const post = e.target.querySelector('.status');\n if (post) {\n // Fire a custom event to open the context menu\n if (e.metaKey) return;\n e.preventDefault();\n post.dispatchEvent(\n new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n }}\n >\n <Status\n status={post}\n instance={instance}\n size=\"s\"\n readOnly\n showCommentCount\n showQuoteCount\n />\n </Link>\n </li>\n ))}\n </ul>\n {uiState === 'default' ? (\n showMore ? (\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadQuotes()}\n >\n <Trans>Show more…</Trans>\n </button>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Error loading quotes</Trans>\n </p>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>No quotes yet</Trans>\n </p>\n )}\n </main>\n </div>\n );\n}\n","import { forwardRef } from 'preact/compat';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport shortenNumber from '../utils/shorten-number';\n\nimport Icon from './icon';\n\nconst StatusButton = forwardRef((props, ref) => {\n let {\n checked,\n count,\n extraCount,\n class: className,\n title,\n alt,\n size,\n icon,\n iconSize = 'l',\n onClick,\n ...otherProps\n } = props;\n if (typeof title === 'string') {\n title = [title, title];\n }\n if (typeof alt === 'string') {\n alt = [alt, alt];\n }\n\n const [buttonTitle, setButtonTitle] = useState(title[0] || '');\n const [iconAlt, setIconAlt] = useState(alt[0] || '');\n\n useEffect(() => {\n if (checked) {\n setButtonTitle(title[1] || '');\n setIconAlt(alt[1] || '');\n } else {\n setButtonTitle(title[0] || '');\n setIconAlt(alt[0] || '');\n }\n }, [checked, title, alt]);\n\n return (\n <button\n ref={ref}\n type=\"button\"\n title={buttonTitle}\n class={`plain ${size ? 'small' : ''} ${className} ${\n checked ? 'checked' : ''\n }`}\n onClick={(e) => {\n if (!onClick) return;\n e.preventDefault();\n e.stopPropagation();\n onClick(e);\n }}\n {...otherProps}\n >\n <Icon icon={icon} size={iconSize} alt={iconAlt} />\n {(!!count || !!extraCount) && (\n <>\n {' '}\n {!!count && <small title={count}>{shortenNumber(count)}</small>}\n {!!count && !!extraCount && <small>+</small>}\n {!!extraCount && (\n <small title={extraCount}>{shortenNumber(extraCount)}</small>\n )}\n </>\n )}\n </button>\n );\n});\n\nexport default StatusButton;\n","export class LiteYTEmbed extends HTMLElement {\n constructor() {\n super();\n this.isIframeLoaded = false;\n this.isPlaylistThumbnailLoaded = false;\n this.setupDom();\n }\n static get observedAttributes() {\n return ['videoid', 'playlistid', 'videoplay', 'videotitle'];\n }\n connectedCallback() {\n this.addEventListener('pointerover', () => LiteYTEmbed.warmConnections(this), {\n once: true,\n });\n this.addEventListener('click', () => this.addIframe());\n }\n get videoId() {\n return encodeURIComponent(this.getAttribute('videoid') || '');\n }\n set videoId(id) {\n this.setAttribute('videoid', id);\n }\n get playlistId() {\n return encodeURIComponent(this.getAttribute('playlistid') || '');\n }\n set playlistId(id) {\n this.setAttribute('playlistid', id);\n }\n get videoTitle() {\n return this.getAttribute('videotitle') || 'Video';\n }\n set videoTitle(title) {\n this.setAttribute('videotitle', title);\n }\n get videoPlay() {\n return this.getAttribute('videoplay') || 'Play';\n }\n set videoPlay(name) {\n this.setAttribute('videoplay', name);\n }\n get videoStartAt() {\n return this.getAttribute('videoStartAt') || '0';\n }\n get autoLoad() {\n return this.hasAttribute('autoload');\n }\n get autoPause() {\n return this.hasAttribute('autopause');\n }\n get noCookie() {\n return this.hasAttribute('nocookie');\n }\n get posterQuality() {\n return this.getAttribute('posterquality') || 'hqdefault';\n }\n get posterLoading() {\n return (this.getAttribute('posterloading') ||\n 'lazy');\n }\n get params() {\n return `start=${this.videoStartAt}&${this.getAttribute('params')}`;\n }\n set params(opts) {\n this.setAttribute('params', opts);\n }\n set posterQuality(opts) {\n this.setAttribute('posterquality', opts);\n }\n get disableNoscript() {\n return this.hasAttribute('disablenoscript');\n }\n setupDom() {\n const shadowDom = this.attachShadow({ mode: 'open' });\n let nonce = '';\n if (window.liteYouTubeNonce) {\n nonce = `nonce=\"${window.liteYouTubeNonce}\"`;\n }\n shadowDom.innerHTML = `\n <style ${nonce}>\n :host {\n --aspect-ratio: var(--lite-youtube-aspect-ratio, 16 / 9);\n --aspect-ratio-short: var(--lite-youtube-aspect-ratio-short, 9 / 16);\n --frame-shadow-visible: var(--lite-youtube-frame-shadow-visible, yes);\n contain: content;\n display: block;\n position: relative;\n width: 100%;\n aspect-ratio: var(--aspect-ratio);\n }\n\n @media (max-width: 40em) {\n :host([short]) {\n aspect-ratio: var(--aspect-ratio-short);\n }\n }\n\n #frame, #fallbackPlaceholder, iframe {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n }\n\n #frame {\n cursor: pointer;\n }\n\n #fallbackPlaceholder, slot[name=image]::slotted(*) {\n object-fit: cover;\n width: 100%;\n height: 100%;\n }\n\n @container style(--frame-shadow-visible: yes) {\n #frame::before {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n background-image: linear-gradient(180deg, #111 -20%, transparent 90%);\n height: 60px;\n width: 100%;\n z-index: 1;\n }\n }\n\n #playButton {\n width: 68px;\n height: 48px;\n background-color: transparent;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 68 48\"><path d=\"M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55c-2.93.78-4.63 3.26-5.42 6.19C.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z\" fill=\"red\"/><path d=\"M45 24 27 14v20\" fill=\"white\"/></svg>');\n z-index: 1;\n border: 0;\n border-radius: inherit;\n }\n\n #playButton:before {\n content: '';\n border-style: solid;\n border-width: 11px 0 11px 19px;\n border-color: transparent transparent transparent #fff;\n }\n\n #playButton,\n #playButton:before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate3d(-50%, -50%, 0);\n cursor: inherit;\n }\n\n /* Post-click styles */\n .activated {\n cursor: unset;\n }\n\n #frame.activated::before,\n #frame.activated > #playButton {\n display: none;\n }\n </style>\n <div id=\"frame\">\n <picture>\n <slot name=\"image\">\n <source id=\"webpPlaceholder\" type=\"image/webp\">\n <source id=\"jpegPlaceholder\" type=\"image/jpeg\">\n <img id=\"fallbackPlaceholder\" referrerpolicy=\"origin\" loading=\"lazy\">\n </slot>\n </picture>\n <button id=\"playButton\" part=\"playButton\"></button>\n </div>\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 const hasImgSlot = this.shadowRoot.querySelector('slot[name=image]');\n if (hasImgSlot.assignedNodes().length === 0) {\n this.initImagePlaceholder();\n }\n this.domRefPlayButton.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.setAttribute('title', `${this.videoPlay}: ${this.videoTitle}`);\n if (this.autoLoad || this.isYouTubeShort() || this.autoPause) {\n this.initIntersectionObserver();\n }\n if (!this.disableNoscript) {\n this.injectSearchNoScript();\n }\n }\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal !== newVal) {\n if (name === 'playlistid' && oldVal !== null && oldVal !== newVal) {\n this.isPlaylistThumbnailLoaded = false;\n }\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 }\n injectSearchNoScript() {\n const eleNoScript = document.createElement('noscript');\n this.prepend(eleNoScript);\n eleNoScript.innerHTML = this.generateIframe();\n }\n generateIframe(isIntersectionObserver = false) {\n let autoplay = isIntersectionObserver ? 0 : 1;\n let autoPause = this.autoPause ? '&enablejsapi=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 return `\n<iframe credentialless frameborder=\"0\" title=\"${this.videoTitle}\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\n src=\"https://www.youtube${wantsNoCookie}.com/embed/${embedTarget}autoplay=${autoplay}${autoPause}&${this.params}\"\n></iframe>`;\n }\n addIframe(isIntersectionObserver = false) {\n if (!this.isIframeLoaded) {\n const iframeHTML = this.generateIframe(isIntersectionObserver);\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 if (this.playlistId && !this.videoId) {\n this.loadPlaylistThumbnail();\n }\n else {\n this.testPosterImage();\n }\n this.domRefImg.fallback.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.domRefImg?.fallback?.setAttribute('alt', `${this.videoPlay}: ${this.videoTitle}`);\n }\n async loadPlaylistThumbnail() {\n if (this.isPlaylistThumbnailLoaded) {\n return;\n }\n this.isPlaylistThumbnailLoaded = true;\n try {\n const oEmbedUrl = `https://www.youtube.com/oembed?url=https://www.youtube.com/playlist?list=${this.playlistId}&format=json`;\n const response = await fetch(oEmbedUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch playlist thumbnail: ${response.status}`);\n }\n const data = await response.json();\n if (data.thumbnail_url) {\n const thumbnailUrl = data.thumbnail_url;\n const videoIdMatch = thumbnailUrl.match(/\\/vi\\/([^\\/]+)\\//);\n if (videoIdMatch) {\n const extractedVideoId = videoIdMatch[1];\n this.loadThumbnailImages(extractedVideoId);\n }\n else {\n this.domRefImg.fallback.src = thumbnailUrl;\n this.domRefImg.fallback.loading = this.posterLoading;\n }\n }\n }\n catch (error) {\n console.warn('Failed to load playlist thumbnail:', error);\n }\n }\n loadThumbnailImages(videoId) {\n const posterUrlWebp = `https://i.ytimg.com/vi_webp/${videoId}/${this.posterQuality}.webp`;\n this.domRefImg.webp.srcset = posterUrlWebp;\n const posterUrlJpeg = `https://i.ytimg.com/vi/${videoId}/${this.posterQuality}.jpg`;\n this.domRefImg.jpeg.srcset = posterUrlJpeg;\n this.domRefImg.fallback.src = posterUrlJpeg;\n this.domRefImg.fallback.loading = this.posterLoading;\n }\n async testPosterImage() {\n setTimeout(() => {\n const webpUrl = `https://i.ytimg.com/vi_webp/${this.videoId}/${this.posterQuality}.webp`;\n const img = new Image();\n img.fetchPriority = 'low';\n img.referrerPolicy = 'origin';\n img.src = webpUrl;\n img.onload = async (e) => {\n const target = e.target;\n const noPoster = target?.naturalHeight == 90 && target?.naturalWidth == 120;\n if (noPoster) {\n this.posterQuality = 'hqdefault';\n }\n this.loadThumbnailImages(this.videoId);\n };\n }, 100);\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(this);\n this.addIframe(true);\n observer.unobserve(this);\n }\n });\n }, options);\n observer.observe(this);\n if (this.autoPause) {\n const windowPause = new IntersectionObserver((e, o) => {\n e.forEach(entry => {\n if (entry.intersectionRatio !== 1) {\n this.shadowRoot\n .querySelector('iframe')\n ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n }\n });\n }, { threshold: 1 });\n windowPause.observe(this);\n }\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(context) {\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 if (!context.noCookie) {\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 }\n else {\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube-nocookie.com');\n }\n LiteYTEmbed.isPreconnected = true;\n window.liteYouTubeIsPreconnected = true;\n }\n}\nLiteYTEmbed.isPreconnected = false;\ncustomElements.define('lite-youtube', LiteYTEmbed);\n//# sourceMappingURL=lite-youtube.js.map","import { Trans } from '@lingui/react/macro';\n\nimport Icon from './icon';\nimport NameText from './name-text';\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 <div class=\"card-byline\">\n {children}\n <div class=\"card-byline-author\">\n <Icon icon=\"link\" size=\"s\" />{' '}\n <small>\n <Trans comment=\"More from [Author]\">\n More from <NameText account={author} showAvatar />\n </Trans>\n </small>\n </div>\n </div>\n );\n}\n\nexport default Byline;\n","import '@justinribeiro/lite-youtube';\n\nimport { decodeBlurHash, getBlurHashAverageColor } from 'fast-blurhash';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport getDomain from '../utils/get-domain';\nimport isMastodonLinkMaybe from '../utils/isMastodonLinkMaybe';\nimport states from '../utils/states';\nimport unfurlMastodonLink, { unfurlCollectionLink } from '../utils/unfurl-link';\n\nimport Byline from './byline';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\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 [\n 'x.com',\n 'twitter.com',\n 'threads.net',\n 'bsky.app',\n 'bsky.brid.gy',\n 'fed.brid.gy',\n ].includes(domain);\n}\n\nfunction StatusCard({ 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 return;\n }\n\n const abortController = new AbortController();\n unfurlMastodonLink(instance, url, abortController.signal).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 unfurlCollectionLink(instance, url);\n\n return () => {\n abortController.abort();\n };\n }, [hasText, image, selfReferential]);\n\n // if (cardStatusID) {\n // return (\n // <Status statusID={cardStatusID} instance={instance} size=\"s\" readOnly />\n // );\n // }\n\n if (\n snapStates.unfurledLinks[url]?.url &&\n !snapStates.unfurledLinks[url].collections\n )\n // Hide card after unfurling a regular status;\n // keep it for account collections pages so it's clickable\n return null;\n\n const hasIframeHTML = /<iframe/i.test(html);\n const handleClick = useCallback(\n (e) => {\n const unfurled = states.unfurledLinks[url];\n if (unfurled?.url) {\n e.preventDefault();\n e.stopPropagation();\n location.hash = '#' + unfurled.url;\n return;\n }\n if (hasIframeHTML) {\n e.preventDefault();\n states.showEmbedModal = {\n html,\n url: url || embedUrl,\n width,\n height,\n };\n }\n },\n [hasIframeHTML, url],\n );\n\n const [blurhashImage, setBlurhashImage] = useState(null);\n if (hasText && (image || (type === 'photo' && blurhash))) {\n const domain = getDomain(url);\n const rgbAverageColor =\n image && blurhash ? getBlurHashAverageColor(blurhash) : null;\n if (!image) {\n const w = 44;\n const h = 44;\n const blurhashPixels = decodeBlurHash(blurhash, w, h);\n const canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = false;\n const imageData = ctx.createImageData(w, h);\n imageData.data.set(blurhashPixels);\n ctx.putImageData(imageData, 0, 0);\n try {\n if (window.OffscreenCanvas) {\n canvas.convertToBlob().then((blob) => {\n setBlurhashImage(URL.createObjectURL(blob));\n });\n } else {\n setBlurhashImage(canvas.toDataURL());\n }\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n }\n\n const isPost = isCardPost(domain);\n\n return (\n <Byline hidden={!!selfAuthor} authors={authors}>\n <a\n href={cardStatusURL || url}\n target={cardStatusURL ? null : '_blank'}\n rel=\"nofollow noopener\"\n class={`card link ${isPost ? 'card-post' : ''} ${\n blurhashImage ? '' : size\n } ${hasIframeHTML ? 'can-show-embed' : ''}`}\n style={{\n '--average-color':\n rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n }}\n onClick={handleClick}\n >\n <div class=\"card-image\">\n <img\n src={image || blurhashImage}\n width={width}\n height={height}\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n alt={imageDescription || ''}\n onError={(e) => {\n try {\n e.target.style.display = 'none';\n } catch (e) {}\n }}\n style={{\n '--anim-duration':\n width &&\n height &&\n `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n />\n </div>\n <div class=\"meta-container\" lang={language}>\n <p class=\"meta domain\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>&middot; </>}\n {!!publishedAt && (\n <>\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n </>\n )}\n </p>\n <p class=\"title\" dir=\"auto\" title={title}>\n {title}\n </p>\n <p class=\"meta\" dir=\"auto\" title={description}>\n {description ||\n (!!publishedAt && (\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n ))}\n </p>\n </div>\n </a>\n </Byline>\n );\n } else if (type === 'photo') {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noopener\"\n class=\"card photo\"\n onClick={handleClick}\n >\n <img\n src={embedUrl}\n width={width}\n height={height}\n alt={title || description}\n loading=\"lazy\"\n style={{\n height: 'auto',\n aspectRatio: `${width}/${height}`,\n }}\n />\n </a>\n );\n } else {\n if (type === 'video') {\n if (/youtube/i.test(providerName)) {\n // Get ID from e.g. https://www.youtube.com/watch?v=[VIDEO_ID]\n const videoID = url.match(/watch\\?v=([^&]+)/)?.[1];\n if (videoID) {\n return (\n <a class=\"card video\" onClick={handleClick}>\n <lite-youtube videoid={videoID} nocookie autoPause></lite-youtube>\n </a>\n );\n }\n }\n // return (\n // <div\n // class=\"card video\"\n // style={{\n // aspectRatio: `${width}/${height}`,\n // }}\n // dangerouslySetInnerHTML={{ __html: html }}\n // />\n // );\n }\n if (hasText && !image) {\n const domain = getDomain(url);\n const isPost = isCardPost(domain);\n return (\n <a\n href={cardStatusURL || url}\n target={cardStatusURL ? null : '_blank'}\n rel=\"nofollow noopener\"\n class={`card link ${isPost ? 'card-post' : ''} no-image`}\n lang={language}\n dir=\"auto\"\n onClick={handleClick}\n >\n <div class=\"meta-container\">\n <p class=\"meta domain\">\n <span class=\"domain\">\n <Icon icon=\"link\" size=\"s\" /> <span>{domain}</span>\n </span>{' '}\n {!!publishedAt && <>&middot; </>}\n {!!publishedAt && (\n <>\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n </>\n )}\n </p>\n <p class=\"title\" title={title}>\n {title}\n </p>\n <p class=\"meta\" title={description || providerName || authorName}>\n {description || providerName || authorName}\n </p>\n </div>\n </a>\n );\n }\n }\n}\n\nexport default StatusCard;\n","import { Trans } from '@lingui/react/macro';\nimport { useContext } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport states, { getStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccID } from '../utils/store-utils';\n\nimport Avatar from './avatar';\nimport LazyRender from './lazy-render';\n\nfunction StatusCompact({ sKey }) {\n const snapStates = useSnapshot(states);\n const statusReply = snapStates.statusReply[sKey];\n if (!statusReply) return null;\n\n const { id, instance } = statusReply;\n const status = getStatus(id, instance);\n if (!status) return null;\n\n const {\n account: { id: accountId },\n sensitive,\n spoilerText,\n account: { avatar, avatarStatic, bot } = {},\n visibility,\n content,\n language,\n filtered,\n } = status;\n if (sensitive || spoilerText) return null;\n if (!content) return null;\n\n const srKey = statusKey(id, instance);\n const statusPeekText = statusPeek(status);\n\n const currentAccount = getCurrentAccID();\n const isSelf = currentAccount && currentAccount === accountId;\n\n const filterContext = useContext(FilterContext);\n let filterInfo = !isSelf && isFiltered(filtered, filterContext);\n\n // This is fine. Images are converted to emojis so they are\n // in a way, already \"obscured\"\n if (filterInfo?.action === 'blur') filterInfo = null;\n\n if (filterInfo?.action === 'hide') return null;\n\n const filterTitleStr = filterInfo?.titlesStr || '';\n\n return (\n <LazyRender\n as=\"article\"\n id={srKey}\n class={`status compact-reply ${\n visibility === 'direct' ? 'visibility-direct' : ''\n }`}\n tabindex=\"-1\"\n data-state-post-id={srKey}\n renderIfHasChildren={false}\n >\n <Avatar url={avatarStatic || avatar} squircle={bot} />\n <div\n class=\"content-compact\"\n title={statusPeekText}\n lang={language}\n dir=\"auto\"\n >\n {filterInfo ? (\n <b class=\"status-filtered-badge badge-meta\" title={filterTitleStr}>\n <span>\n <Trans>Filtered</Trans>\n </span>\n <span>{filterTitleStr}</span>\n </b>\n ) : (\n <span>{statusPeekText}</span>\n )}\n </div>\n </LazyRender>\n );\n}\n\nexport default StatusCompact;\n","import { useMemo } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Link from './link';\n\nconst fauxDiv = document.createElement('div');\nconst HASHTAG_REGEX = /^[##][^##]+$/;\nconst ANOTHER_HASHTAG_REGEX = /^[^###️⃣]*[###️⃣]+/;\n\nconst collator = new Intl.Collator(undefined, {\n sensitivity: 'base',\n usage: 'search',\n});\nconst isSameTag = (a, b) => collator.compare(a, b) === 0;\n\nconst extractTagsFromStatus = (content) => {\n if (!content) return [];\n if (content.indexOf('#') === -1) return [];\n fauxDiv.innerHTML = content;\n const tags = [];\n\n const allLinks = fauxDiv.querySelectorAll('a[href]');\n for (const link of allLinks) {\n const text = link.textContent.trim();\n const isHashtagLink =\n link.classList.contains('hashtag') || HASHTAG_REGEX.test(text);\n\n if (isHashtagLink) {\n tags.push(text.replace(ANOTHER_HASHTAG_REGEX, ''));\n }\n }\n\n return tags;\n};\n\nexport default function StatusTags({ tags, content }) {\n if (!tags?.length) return null;\n\n const { instance } = api();\n\n const tagsToShow = useMemo(() => {\n const hashtagsInContent = extractTagsFromStatus(content);\n if (!hashtagsInContent.length) return tags;\n return tags.filter(\n (tag) => !hashtagsInContent.some((ht) => isSameTag(ht, tag.name)),\n );\n }, [tags, content]);\n\n if (!tagsToShow.length) return null;\n\n return (\n <ul class=\"status-tags\">\n {tagsToShow.map((tag) => (\n <li key={tag.name}>\n <Link\n to={\n instance\n ? `/${instance}/t/${encodeURIComponent(tag.name)}`\n : `/t/${encodeURIComponent(tag.name)}`\n }\n >\n <span class=\"more-insignificant\">#</span>\n {tag.name}\n </Link>\n </li>\n ))}\n </ul>\n );\n}\n","import { createContext } from 'preact';\n\nexport const ThreadCountContext = createContext(0);\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useContext } from 'preact/hooks';\n\nimport { ThreadCountContext } from '../utils/thread-count-context';\n\nimport Icon from './icon';\n\nfunction ThreadIcon({ alt }) {\n return <Icon icon=\"thread\" size=\"s\" alt={alt} />;\n}\n\nfunction ThreadBadge({ index, showIcon, showText }) {\n const { t } = useLingui();\n const total = useContext(ThreadCountContext);\n const hasIndex = index > 0;\n const hasTotal = total > 0;\n\n return (\n <div class=\"status-thread-badge\">\n {showIcon && (\n <>\n <ThreadIcon alt={showText ? '' : t`Thread`} />{' '}\n </>\n )}\n {showText ? (\n hasIndex ? (\n hasTotal ? (\n <Trans>\n Thread {index}/{total}\n </Trans>\n ) : (\n <Trans comment=\"X is the unspecified total number of posts in a thread\">\n Thread {index}/X\n </Trans>\n )\n ) : (\n t`Thread`\n )\n ) : hasIndex ? (\n hasTotal ? (\n t({\n message: `${index}/${total}`,\n comment: 'index/total posts in a thread',\n })\n ) : (\n t({\n message: `${index}/X`,\n comment: 'X is the unspecified total number of posts in a thread',\n })\n )\n ) : (\n !showIcon && <ThreadIcon alt={t`Thread`} />\n )}\n </div>\n );\n}\n\nexport default ThreadBadge;\n","import './status.css';\n\nimport { msg, plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { shallowEqual } from 'fast-equals';\nimport PQueue from 'p-queue';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api, getPreferences } from '../utils/api';\nimport { langDetector } from '../utils/browser-translator';\nimport { useEditHistory } from '../utils/edit-history-context';\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 haptics from '../utils/haptics';\nimport htmlContentLength from '../utils/html-content-length';\nimport isSameURL from '../utils/is-same-url';\nimport localeMatch from '../utils/locale-match';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport {\n getPostQuoteApprovalPolicy,\n supportsNativeQuote,\n} from '../utils/quote-utils';\nimport RTF from '../utils/relative-time-format';\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 { getAPIVersions, getCurrentAccID } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport useTruncated from '../utils/useTruncated';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\nimport visibilityText from '../utils/visibility-text';\n\nimport Avatar from './avatar';\nimport CollectionCard from './collection-card';\nimport CustomEmoji from './custom-emoji';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport LazyRender from './lazy-render';\nimport LazyShazam from './lazy-shazam';\nimport Link from './link';\nimport Loader from './loader';\nimport MathBlock from './math-block';\nimport Media, { isMediaCaptionLong } from './media';\nimport MediaFirstContainer from './media-first-container';\nimport MenuConfirm from './menu-confirm';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\nimport Modal from './modal';\nimport MultipleMediaFigure from './multiple-media-figure';\nimport NameText from './name-text';\nimport Poll from './poll';\nimport PostContent from './post-content';\nimport PostEmbedModal from './post-embed-modal';\nimport QuoteChainModal from './quote-chain-modal';\nimport QuoteSettingsSheet from './quote-settings-sheet';\nimport QuotesModal from './quotes-modal';\nimport RelativeTime from './relative-time';\nimport StatusButton from './status-button';\nimport StatusCard from './status-card';\nimport StatusCompact from './status-compact';\nimport StatusTags from './status-tags';\nimport SubMenu2 from './submenu2';\nimport ThreadBadge from './thread-badge';\nimport TranslationBlock from './translation-block';\n\nconst SHOW_COMMENT_COUNT_LIMIT = 280;\nconst INLINE_TRANSLATE_LIMIT = 140;\nconst MAX_COLLECTIONS = 4;\n\nconst accountQueue = new PQueue({\n concurrency: 1,\n interval: 1000,\n intervalCap: 1,\n});\nfunction fetchAccount(id, masto, signal) {\n return accountQueue.add(() => masto.v1.accounts.$select(id).fetch(), {\n signal,\n });\n}\nconst memFetchAccount = pmem(fetchAccount);\n\nconst isIOS =\n window.ontouchstart !== undefined &&\n /iPad|iPhone|iPod/.test(navigator.userAgent);\n\nconst REACTIONS_LIMIT = 80;\n\nfunction getPollText(poll) {\n if (!poll?.options?.length) return '';\n return `📊:\\n${poll.options.map((option) => `- ${option.title}`).join('\\n')}`;\n}\n\nfunction getPostText(status, opts) {\n const {\n maskCustomEmojis,\n maskURLs,\n hideInlineQuote,\n htmlTextOpts = {},\n } = opts || {};\n const { spoilerText, poll, emojis } = status;\n let { content } = status;\n if (maskCustomEmojis && emojis?.length) {\n const emojisRegex = new RegExp(\n `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n 'g',\n );\n content = content.replace(emojisRegex, '⬚');\n }\n const fullText = [\n spoilerText || '',\n getHTMLText(content, {\n ...htmlTextOpts,\n preProcess:\n (maskURLs || hideInlineQuote) &&\n ((dom) => {\n // Remove links that contains text that starts with https?://\n if (maskURLs) {\n for (const a of dom.querySelectorAll('a')) {\n const text = a.innerText.trim();\n if (/^https?:\\/\\//i.test(text)) {\n a.replaceWith('«🔗»');\n }\n }\n }\n // Hide inline quote\n if (hideInlineQuote) {\n const reContainer = dom.querySelector('.quote-inline');\n if (reContainer) {\n reContainer.remove();\n }\n }\n }),\n }),\n getPollText(poll),\n ]\n .join('\\n\\n')\n .trim();\n return fullText;\n}\n\nfunction forgivingQSA(selectors = [], dom = document) {\n // Run QSA for list of selectors\n // If a selector return invalid selector error, try the next one\n for (const selector of selectors) {\n try {\n return dom.querySelectorAll(selector);\n } catch (e) {}\n }\n return [];\n}\n\nconst getHTMLTextForDetectLang = mem((content, emojis) => {\n if (!content) return '';\n if (emojis?.length) {\n const emojisRegex = new RegExp(\n `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n 'g',\n );\n content = content.replace(emojisRegex, '');\n }\n content = content.trim();\n if (!content) return '';\n return 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 for (const a of forgivingQSA(\n [\n '.mention, .hashtag, pre, code, a:has(.invisible)',\n '.mention, .hashtag, pre, code',\n ],\n dom,\n )) {\n a.remove();\n }\n\n // Remove links that contains text that starts with https?://\n for (const a of dom.querySelectorAll('a')) {\n const text = a.innerText.trim();\n if (text.startsWith('https://') || text.startsWith('http://')) {\n a.remove();\n }\n }\n },\n });\n});\n\nfunction isTranslateble(content, emojis) {\n return !!getHTMLTextForDetectLang(content, emojis);\n}\n\nconst SIZE_CLASS = {\n s: 'small',\n m: 'medium',\n l: 'large',\n};\n\nconst detectLang = pmem(async (text) => {\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\n if (langDetector) {\n const langs = await langDetector.detect(text);\n console.groupCollapsed(\n '💬 DETECTLANG BROWSER',\n langs.slice(0, 3).map((l) => l.detectedLanguage),\n );\n console.log(text, langs.slice(0, 3));\n console.groupEnd();\n const lang = langs[0];\n if (lang?.detectedLanguage && lang?.confidence > 0.5) {\n return lang.detectedLanguage;\n }\n }\n\n const { detectAll } = await import('tinyld/light');\n const langs = detectAll(text);\n console.groupCollapsed(\n '💬 DETECTLANG TINYLD',\n langs.slice(0, 3).map((l) => l.lang),\n );\n console.log(text, langs.slice(0, 3));\n console.groupEnd();\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 diffLangCheckCacheKey = (l, hls) => `${l}:${hls.join('|')}`;\nconst checkDifferentLanguage = (\n language,\n contentTranslationHideLanguages = [],\n) => {\n if (!language) return false;\n const cacheKey = diffLangCheckCacheKey(\n language,\n contentTranslationHideLanguages,\n );\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 if (different) {\n DIFFERENT_LANG_CHECK[cacheKey] = true;\n }\n return different;\n};\n\nconst quoteMessages = {\n quotePrivate: msg`Private posts cannot be quoted`,\n requestQuote: msg`Request to quote`,\n quoteManualReview: msg`Author will manually review`,\n quoteFollowersOnly: msg`Only followers can quote this post`,\n quoteCannot: msg`You are not allowed to quote this post`,\n};\n\nconst quoteApprovalPolicyMessages = {\n public: msg`Anyone can quote`,\n followers: msg`Your followers can quote`,\n nobody: msg`Only you can quote`,\n};\n\nconst QUESTION_REGEX = /[???︖❓❔⁇⁈⁉¿‽؟]/;\n\nconst { DEV } = import.meta.env;\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 quoteDomain,\n onStatusLinkClick = () => {},\n showFollowedTags,\n allowContextMenu,\n showActionsBar,\n showReplyParent,\n mediaFirst,\n showCommentCount: forceShowCommentCount,\n showQuoteCount: forceShowQuoteCount,\n ghost,\n}) {\n const { _, t, i18n } = useLingui();\n const rtf = RTF(i18n.locale);\n\n if (ghost) {\n const { inReplyToAccountId } = ghost;\n const ghostAccount = inReplyToAccountId\n ? states.accounts[inReplyToAccountId]\n : null;\n return (\n <article\n class={`status ghost ${mediaFirst ? 'status-media-first small' : ''}`}\n >\n {!mediaFirst && (\n <Avatar\n size=\"xxl\"\n url={ghostAccount?.avatarStatic || ghostAccount?.avatar}\n squircle={ghostAccount?.bot}\n />\n )}\n <div class=\"container\">\n <div class=\"meta\">\n {(size === 's' || mediaFirst) && (\n <Avatar\n size=\"m\"\n url={ghostAccount?.avatarStatic || ghostAccount?.avatar}\n squircle={ghostAccount?.bot}\n />\n )}\n {ghostAccount && (\n <NameText account={ghostAccount} showAvatar={false} />\n )}\n </div>\n <div class=\"content-container\">\n {mediaFirst && <div class=\"media-first-container\" />}\n <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}>\n <p class=\"insignificant\">\n <Trans>Post unavailable</Trans>\n </p>\n </div>\n </div>\n </div>\n </article>\n );\n }\n\n if (skeleton) {\n return (\n <div\n class={`status skeleton ${\n mediaFirst ? 'status-media-first small' : ''\n }`}\n >\n {!mediaFirst && <Avatar size=\"xxl\" />}\n <div class=\"container\">\n <div class=\"meta\">\n {(size === 's' || mediaFirst) && <Avatar size=\"m\" />} ███ ████████\n </div>\n <div class=\"content-container\">\n {mediaFirst && <div class=\"media-first-container\" />}\n <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}>\n <p>████ ████████</p>\n </div>\n </div>\n </div>\n </div>\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 originalStatus = useRef(status);\n const { editHistoryRef, editHistoryMode, editedAtIndex } = useEditHistory();\n if (editHistoryMode && status?.editedAt && editHistoryRef.current.length) {\n const eStatus = editHistoryRef.current[editedAtIndex];\n if (eStatus) {\n status = {\n ...status,\n ...eStatus,\n };\n }\n } else {\n // Revert back to original status\n // Don't need to do anything, re-render will use the original status above\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 quotesCount,\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 taggedCollections,\n createdAt,\n inReplyToId,\n inReplyToAccountId,\n content,\n mentions,\n mediaAttachments = [],\n reblog,\n quote,\n uri,\n url,\n emojis,\n tags,\n pinned,\n quoteApproval,\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 if (languageAutoDetected) return;\n let timer;\n timer = setTimeout(async () => {\n let detected = await detectLang(\n getHTMLTextForDetectLang(content, emojis),\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 = getCurrentAccID();\n const isSelf = currentAccount && currentAccount == accountId;\n\n const filterContext = useContext(FilterContext);\n const filterInfo =\n !isSelf &&\n ((!readOnly && !previewMode) || allowFilters) &&\n 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 (\n (allowFilters || size !== 'l') &&\n filterInfo &&\n filterInfo.action !== 'blur'\n ) {\n return (\n <FilteredStatus\n status={status}\n filterInfo={filterInfo}\n instance={instance}\n containerProps={{\n onMouseEnter: debugHover,\n }}\n showFollowedTags\n quoted={quoted}\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 useEffect(() => {\n if (!withinContext && !inReplyToAccount && inReplyToAccountId) {\n const account = states.accounts[inReplyToAccountId];\n if (account) {\n setInReplyToAccount(account);\n return;\n }\n\n const abortController = new AbortController();\n memFetchAccount(inReplyToAccountId, masto, abortController.signal)\n .then((account) => {\n setInReplyToAccount(account);\n states.accounts[account.id] = account;\n })\n .catch((e) => {});\n\n return () => {\n abortController.abort();\n };\n }\n }, [withinContext, inReplyToAccount, inReplyToAccountId]);\n const mentionSelf =\n (inReplyToAccountId && inReplyToAccountId === currentAccount) ||\n mentions?.find((mention) => mention.id === currentAccount);\n\n const prefs = getPreferences();\n const readingExpandSpoilers = !!prefs['reading:expand:spoilers'];\n\n // default | show_all | hide_all\n const readingExpandMedia =\n 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' && filterInfo?.action !== 'blur') ||\n !!snapStates.spoilersMedia[id];\n\n if (reblog) {\n // If has statusID, means useItemID (cached in states)\n\n if (group) {\n return (\n <div\n data-state-post-id={sKey}\n class=\"status-group\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"group\" size=\"l\" alt={t`Group`} />{' '}\n <NameText account={status.account} instance={instance} showAvatar />\n </div>\n <Status\n status={statusID ? null : reblog}\n statusID={statusID ? reblog.id : null}\n instance={instance}\n size={size}\n contentTextWeight={contentTextWeight}\n readOnly={readOnly}\n mediaFirst={mediaFirst}\n />\n </div>\n );\n }\n\n return (\n <div\n data-state-post-id={sKey}\n class=\"status-reblog\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"rocket\" size=\"l\" />{' '}\n <Trans>\n <NameText account={status.account} instance={instance} showAvatar />{' '}\n <span>boosted</span>\n </Trans>\n </div>\n <Status\n status={statusID ? null : reblog}\n statusID={statusID ? reblog.id : null}\n instance={instance}\n size={size}\n contentTextWeight={contentTextWeight}\n readOnly={readOnly}\n enableCommentHint\n mediaFirst={mediaFirst}\n />\n </div>\n );\n }\n\n // Check followedTags\n const FollowedTagsParent = useCallback(\n ({ children }) => (\n <div\n data-state-post-id={sKey}\n class=\"status-followed-tags\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"hashtag\" size=\"l\" />{' '}\n {snapStates.statusFollowedTags[sKey].slice(0, 3).map((tag) => (\n <Link\n key={tag}\n to={instance ? `/${instance}/t/${tag}` : `/t/${tag}`}\n class=\"status-followed-tag-item\"\n >\n {tag}\n </Link>\n ))}\n </div>\n {children}\n </div>\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 contentLength = useMemo(() => htmlContentLength(content), [content]);\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 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 contentLength,\n ]);\n\n const [showEdited, setShowEdited] = useState(false);\n const [showEmbed, setShowEmbed] = useState(false);\n const [showQuoteSettings, setShowQuoteSettings] = useState(false);\n const [showQuotes, setShowQuotes] = useState(false);\n const [showQuoteChain, setShowQuoteChain] = useState(false);\n\n const spoilerContentRef = useTruncated();\n const contentRef = useTruncated();\n const mediaContainerRef = useTruncated();\n\n const statusRef = useRef(null);\n const [reloadPostContentCount, reloadPostContent] = useReducer(\n (c) => c + 1,\n 0,\n );\n\n const unauthInteractionErrorMessage = t`Sorry, your current logged-in server can't interact with this post from another server.`;\n\n const textWeight = useCallback(\n () =>\n Math.max(\n Math.round(((spoilerText?.length || 0) + contentLength) / 140) || 1,\n 1,\n ),\n [spoilerText, contentLength],\n );\n\n const createdDateText = createdAt && 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 const isPublic = ['public', 'unlisted'].includes(visibility);\n let canBoost = authenticated && isPublic;\n if (visibility === 'private' && isSelf) {\n canBoost = true;\n }\n\n // Quote logic blatantly copied from https://github.com/mastodon/mastodon/blob/854aaec6fe69df02e6d850cb90eef37032b4d72f/app/javascript/mastodon/components/status/boost_button_utils.ts#L131-L163\n let quoteDisabled = false;\n let quoteText = t`Quote`;\n let quoteMetaText;\n\n if (supportsNativeQuote()) {\n const isMine = isSelf;\n const isMineAndPrivate = isMine && visibility === 'private';\n const isQuoteAutomaticallyAccepted =\n quoteApproval?.currentUser === 'automatic' &&\n (isPublic || isMineAndPrivate);\n const isQuoteManuallyAccepted =\n quoteApproval?.currentUser === 'manual' && (isPublic || isMineAndPrivate);\n const isQuoteFollowersOnly =\n quoteApproval?.automatic?.[0] === 'followers' ||\n quoteApproval?.manual?.[0] === 'followers';\n if (!isPublic && !isMine) {\n quoteDisabled = true;\n quoteMetaText = _(quoteMessages.quotePrivate);\n } else if (isQuoteAutomaticallyAccepted) {\n // No need to do anything\n } else if (isQuoteManuallyAccepted) {\n quoteText = _(quoteMessages.requestQuote);\n quoteMetaText = _(quoteMessages.quoteManualReview);\n } else {\n quoteDisabled = true;\n quoteMetaText = isQuoteFollowersOnly\n ? _(quoteMessages.quoteFollowersOnly)\n : _(quoteMessages.quoteCannot);\n }\n }\n const canQuote = supportsNativeQuote() && !quoteDisabled;\n\n const postQuoteApprovalPolicy = getPostQuoteApprovalPolicy(quoteApproval);\n\n const replyStatus = (e, replyMode = 'all') => {\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 replyMode,\n });\n if (newWin) return;\n }\n showCompose({\n replyToStatus: status,\n replyMode,\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 haptics.trigger('light');\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 haptics.trigger('light');\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[\n diffLangCheckCacheKey(language, contentTranslationHideLanguages)\n ],\n );\n useEffect(() => {\n if (!language || differentLanguage) {\n return;\n }\n if (\n !differentLanguage &&\n DIFFERENT_LANG_CHECK[\n diffLangCheckCacheKey(language, contentTranslationHideLanguages)\n ]\n ) {\n setDifferentLanguage(true);\n return;\n }\n let timeout = setTimeout(() => {\n const different = checkDifferentLanguage(\n language,\n contentTranslationHideLanguages,\n );\n if (different) setDifferentLanguage(different);\n }, 100);\n return () => clearTimeout(timeout);\n }, [language, differentLanguage]);\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 .values();\n favouriteIterator.current = masto.v1.statuses\n .$select(statusID)\n .favouritedBy.list({\n limit: REACTIONS_LIMIT,\n })\n .values();\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 isQuotingMyPost =\n quote?.state === 'accepted' &&\n quote?.quotedStatus?.account?.id === currentAccount;\n\n const actionsRef = useRef();\n const isPinnable = ['public', 'unlisted', 'private'].includes(visibility);\n const menuFooter =\n mediaNoDesc && !reblogged ? (\n <div class=\"footer\">\n <Icon icon=\"alert\" />\n <Trans>Some media have no descriptions.</Trans>\n </div>\n ) : (\n statusMonthsAgo >= 3 && (\n <div class=\"footer\">\n <Icon icon=\"info\" />\n <span>\n <Trans>\n Old post (<strong>{rtf.format(-statusMonthsAgo, 'month')}</strong>\n )\n </Trans>\n </span>\n </div>\n )\n );\n const mentionsCount = useMemo(() => {\n if (!mentions?.length) return false;\n const allMentions = new Set([accountId, ...mentions.map((m) => m.id)]);\n return [...allMentions].filter((m) => m !== currentAccount).length;\n }, [accountId, mentions?.length, currentAccount]);\n const tooManyMentions = mentionsCount > 3;\n const ReplyMenuContent = () => (\n <>\n <Icon icon=\"comment\" />\n <span>\n {repliesCount > 0\n ? shortenNumber(repliesCount)\n : tooManyMentions\n ? t`Reply…`\n : t`Reply`}\n </span>\n </>\n );\n const replyModeMenuItems = (\n <>\n <MenuItem\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e, 'all');\n }}\n >\n <small>\n <Trans>Reply all</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Plural value={mentionsCount} other=\"# mentions\" />\n </span>\n </small>\n </MenuItem>\n <MenuItem\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e, 'author-first');\n }}\n >\n <small>\n <Trans>Reply all</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Plural\n value={mentionsCount - 1}\n other={\n <Trans comment=\"Author mention appears first, other mentions appear below with newlines in between\">\n <span class=\"bidi-isolate\">@{username || acct}</span> first, #\n others below\n </Trans>\n }\n />\n </span>\n </small>\n </MenuItem>\n <MenuItem\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e, 'author-only');\n }}\n >\n <small>\n <Trans>Reply</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Trans>\n Only <span class=\"bidi-isolate\">@{username || acct}</span>\n </Trans>\n </span>\n </small>\n </MenuItem>\n </>\n );\n const StatusMenuItems = (\n <>\n {!isSizeLarge && sameInstance && (\n <>\n <div class=\"menu-control-group-horizontal status-menu\">\n {tooManyMentions ? (\n <SubMenu2\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n label={<ReplyMenuContent />}\n >\n {replyModeMenuItems}\n </SubMenu2>\n ) : (\n <MenuItem\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e);\n }}\n >\n <ReplyMenuContent />\n </MenuItem>\n )}\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"rocket\" />\n <span>{reblogged ? t`Unboost` : t`Boost`}</span>\n </>\n }\n className={`menu-reblog ${reblogged ? 'checked' : ''}`}\n menuExtras={\n <>\n {supportsNativeQuote() && (\n <MenuItem\n disabled={quoteDisabled}\n onClick={() => {\n showCompose({\n quoteStatus: status,\n });\n }}\n >\n <Icon icon=\"quote\" />\n {quoteMetaText ? (\n <small>\n {quoteText}\n <br />\n {quoteMetaText}\n </small>\n ) : (\n <span>{quoteText}</span>\n )}\n </MenuItem>\n )}\n {(DEV || !supportsNativeQuote()) && (\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Quote with link</Trans>\n </span>\n {supportsNativeQuote() && DEV && (\n <small class=\"tag collapsed\">DEV</small>\n )}\n </MenuItem>\n )}\n </>\n }\n menuFooter={menuFooter}\n disabled={!canBoost}\n onClick={async () => {\n haptics.trigger('light');\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 {canQuote ? (\n <span class=\"icon\">\n <Icon icon=\"rocket\" />\n <Icon icon=\"quote\" />\n </span>\n ) : (\n <Icon icon=\"rocket\" />\n )}\n <span>\n {reblogsCount > 0 || quotesCount > 0\n ? `${reblogsCount > 0 ? shortenNumber(reblogsCount) : ''}${\n reblogsCount > 0 && quotesCount > 0 ? '+' : ''\n }${quotesCount > 0 ? shortenNumber(quotesCount) : ''}`\n : reblogged\n ? t`Unboost`\n : canQuote\n ? t`Boost/Quote…`\n : t`Boost…`}\n </span>\n </MenuConfirm>\n <MenuItem\n onClick={favouriteStatusNotify}\n className={`menu-favourite ${favourited ? 'checked' : ''}`}\n >\n <Icon icon=\"heart\" />\n <span>\n {favouritesCount > 0\n ? shortenNumber(favouritesCount)\n : favourited\n ? t`Unlike`\n : t`Like`}\n </span>\n </MenuItem>\n {supports('@mastodon/post-bookmark') && (\n <MenuItem\n onClick={bookmarkStatusNotify}\n className={`menu-bookmark ${bookmarked ? 'checked' : ''}`}\n >\n <Icon icon=\"bookmark\" />\n <span>{bookmarked ? t`Unbookmark` : t`Bookmark`}</span>\n </MenuItem>\n )}\n </div>\n </>\n )}\n {!isSizeLarge && sameInstance && (isSizeLarge || showActionsBar) && (\n <MenuDivider />\n )}\n {(isSizeLarge || showActionsBar) && (\n <>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n heading: t`Boosted/Liked by…`,\n fetchAccounts: fetchBoostedLikedByAccounts,\n instance,\n showReactions: true,\n postID: sKey,\n };\n }}\n >\n <Icon icon=\"react\" />\n <span>\n <Trans>Boosted/Liked by…</Trans>\n </span>\n </MenuItem>\n {supportsNativeQuote() && (\n <MenuItem\n onClick={() => {\n setShowQuotes(true);\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>View Quotes</Trans>\n </span>\n </MenuItem>\n )}\n {quote?.quotedStatus?.quote && (\n <MenuItem\n onClick={() => {\n setShowQuoteChain(true);\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Unwrap quote chain</Trans>\n </span>\n </MenuItem>\n )}\n </>\n )}\n {(isSizeLarge ||\n (!mediaFirst &&\n (enableTranslate || !language || differentLanguage))) && (\n <MenuDivider />\n )}\n {!mediaFirst && (enableTranslate || !language || differentLanguage) && (\n <div class={supportsTTS ? 'menu-horizontal' : ''}>\n {enableTranslate ? (\n <MenuItem\n disabled={forceTranslate}\n onClick={() => setForceTranslate(true)}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuItem>\n ) : (\n <MenuLink\n to={`${instance ? `/${instance}` : ''}/s/${id}?translate=1`}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuLink>\n )}\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n try {\n const postText = getPostText(status, {\n hideInlineQuote: supportsNativeQuote(),\n });\n if (postText) {\n speak(postText, language);\n }\n } catch (error) {\n console.error('Failed to speak text:', error);\n }\n }}\n >\n <Icon icon=\"speak\" />\n <span>\n <Trans>Speak</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n )}\n {isSizeLarge && (\n <MenuItem\n onClick={() => {\n try {\n const postText = getPostText(status, {\n hideInlineQuote: supportsNativeQuote(),\n htmlTextOpts: {\n truncateLinks: false,\n },\n });\n navigator.clipboard.writeText(postText);\n showToast(t`Post text copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy post text`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />\n <span>\n <Trans>Copy post text</Trans>\n </span>\n </MenuItem>\n )}\n {((!isSizeLarge && sameInstance) ||\n enableTranslate ||\n !language ||\n differentLanguage) && <MenuDivider />}\n {!isSizeLarge && (\n <>\n <MenuLink\n to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n onClick={(e) => {\n onStatusLinkClick(e, status);\n }}\n >\n <Icon icon=\"arrows-right\" />\n <small>\n <Trans>\n View post by{' '}\n <span class=\"bidi-isolate\">@{username || acct}</span>\n </Trans>\n <br />\n <span class=\"more-insignificant\">\n {_(visibilityText[visibility])} • {createdDateText}\n </span>\n </small>\n </MenuLink>\n </>\n )}\n {!!editedAt && (\n <>\n <MenuItem\n onClick={() => {\n setShowEdited(id);\n }}\n >\n <Icon icon=\"history\" />\n <small>\n <Trans>Show Edit History</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Trans>Edited: {editedDateText}</Trans>\n </span>\n </small>\n </MenuItem>\n </>\n )}\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <small\n class=\"menu-double-lines should-cloak\"\n style={{\n maxWidth: '16em',\n }}\n >\n {nicePostURL(url)}\n </small>\n </MenuItem>\n <div class=\"menu-horizontal\">\n <MenuItem\n onClick={() => {\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 <Icon icon=\"link\" />\n <span>\n <Trans>Copy</Trans>\n </span>\n </MenuItem>\n {isPublic &&\n navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n <MenuItem\n onClick={() => {\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 <Icon icon=\"share\" />\n <span>\n <Trans>Share…</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n {isPublic && isSizeLarge && (\n <MenuItem\n onClick={() => {\n setShowEmbed(true);\n }}\n >\n <Icon icon=\"code\" />\n <span>\n <Trans>Embed post</Trans>\n </span>\n </MenuItem>\n )}\n {authenticated && (\n <>\n {(isSelf || mentionSelf) && <MenuDivider />}\n {(isSelf || mentionSelf) && (\n <MenuItem\n onClick={async () => {\n haptics.trigger('light');\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 <Icon icon=\"unmute\" />\n <span>\n <Trans>Unmute conversation</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"mute\" />\n <span>\n <Trans>Mute conversation</Trans>\n </span>\n </>\n )}\n </MenuItem>\n )}\n {isSelf && isPinnable && (\n <MenuItem\n onClick={async () => {\n haptics.trigger('light');\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 <Icon icon=\"unpin\" />\n <span>\n <Trans>Unpin from profile</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"pin\" />\n <span>\n <Trans>Pin to profile</Trans>\n </span>\n </>\n )}\n </MenuItem>\n )}\n {isSelf && (\n <>\n {supportsNativeQuote() &&\n !['private', 'direct'].includes(visibility) && (\n <MenuItem onClick={() => setShowQuoteSettings(true)}>\n <Icon icon=\"quote2\" />\n <small>\n <Trans>Quote settings</Trans>\n <br />\n <span class=\"more-insignificant\">\n {_(\n quoteApprovalPolicyMessages[postQuoteApprovalPolicy],\n )}\n </span>\n </small>\n </MenuItem>\n )}\n <div class=\"menu-horizontal\">\n {supports('@mastodon/post-edit') && (\n <MenuItem\n onClick={() => {\n showCompose({\n editStatus: status,\n quoteStatus: status.quote?.quotedStatus,\n });\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n <Trans>Edit</Trans>\n </span>\n </MenuItem>\n )}\n {isSizeLarge && (\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"trash\" />\n <span>\n <Trans>Delete this post?</Trans>\n </span>\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 <Icon icon=\"trash\" />\n <span>\n <Trans>Delete…</Trans>\n </span>\n </MenuConfirm>\n )}\n </div>\n </>\n )}\n {!isSelf && isSizeLarge && (\n <>\n <MenuDivider />\n {isQuotingMyPost && (\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"quote\" />\n <span>\n <Trans>\n Remove my post from{' '}\n <span class=\"bidi-isolate\">@{username || acct}</span>\n 's post?\n </Trans>\n </span>\n </>\n }\n itemProps={{\n className: 'danger',\n }}\n menuItemClassName=\"danger\"\n onClick={() => {\n haptics.trigger('light');\n (async () => {\n try {\n // POST /api/v1/statuses/:id/quotes/:quoting_status_id/revoke\n const quotedStatusID = quote.quotedStatus.id;\n await masto.v1.statuses\n .$select(quotedStatusID)\n .quotes.$select(id)\n .revoke.create();\n showToast(t`Quote removed`);\n states.reloadStatusPage++;\n } catch (e) {\n console.error(e);\n showToast(t`Unable to remove quote`);\n }\n })();\n }}\n >\n <Icon icon=\"quote\" />\n <Trans>Remove quote…</Trans>\n </MenuConfirm>\n )}\n <MenuItem\n className=\"danger\"\n onClick={() => {\n states.showReportModal = {\n account: status.account,\n post: status,\n };\n }}\n >\n <Icon icon=\"flag\" />\n <span>\n <Trans>Report post…</Trans>\n </span>\n </MenuItem>\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(\n 'r, shift+r',\n (e, handler) => {\n // Fix bug: shift+r is fired even when r is pressed due to useKey: true\n if (e.shiftKey !== handler.shift) return;\n replyStatus(e);\n },\n {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey || e.ctrlKey || e.altKey || e.key.toLowerCase() !== 'r',\n },\n );\n const fRef = useHotkeys('f, l', favouriteStatusNotify, {\n enabled: hotkeysEnabled,\n ignoreEventWhen: (e) =>\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey ||\n !['f', 'l'].includes(e.key.toLowerCase()),\n useKey: true,\n });\n const dRef = useHotkeys('d', bookmarkStatusNotify, {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey ||\n e.key.toLowerCase() !== 'd',\n });\n const bRef = useHotkeys(\n 'shift+b',\n (e) => {\n // Need shiftKey check due to useKey: true\n if (!e.shiftKey) return;\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 useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey || e.ctrlKey || e.altKey || e.key.toLowerCase() !== 'b',\n },\n );\n const xRef = useHotkeys(\n 'x',\n (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 useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey ||\n e.key.toLowerCase() !== 'x',\n },\n );\n const qRef = useHotkeys(\n 'q',\n (e) => {\n if (!sameInstance || !authenticated) {\n return alert(unauthInteractionErrorMessage);\n }\n\n if (supportsNativeQuote()) {\n if (quoteDisabled) {\n showToast(quoteMetaText);\n } else {\n showCompose({\n quoteStatus: status,\n });\n }\n // Don't fallback to non-native if quoteDisabled\n } else {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }\n },\n {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey ||\n e.key.toLowerCase() !== 'q',\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 <div\n key={media.id}\n data-caption-index={indices.map((i) => 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 <sup>{indices.map((i) => i + 1).join(' ')}</sup> {media.description}\n </div>\n ));\n\n // return displayedMediaAttachments.map(\n // (media, i) =>\n // !!media.description && (\n // <div\n // key={media.id}\n // data-caption-index={i + 1}\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 // <sup>{i + 1}</sup> {media.description}\n // </div>\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 (forceShowCommentCount && repliesCount > 0) return true;\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 containsQuestion = QUESTION_REGEX.test(content);\n if (!containsQuestion) return false;\n if (contentLength > 0 && contentLength <= SHOW_COMMENT_COUNT_LIMIT) {\n return true;\n }\n }, [\n forceShowCommentCount,\n card,\n poll,\n sensitive,\n spoilerText,\n mediaAttachments,\n reblog,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n content,\n contentLength,\n ]);\n\n // Keep this simple for now, unlike showCommentCount\n const showQuoteCount =\n typeof forceShowQuoteCount === 'function'\n ? forceShowQuoteCount(quotesCount)\n : forceShowQuoteCount && quotesCount > 0;\n\n const collectionsWithCard = useMemo(() => {\n const tc = taggedCollections ?? [];\n const cardUrl = card?.url;\n const matchIndex = tc.findIndex((c) => isSameURL(c.url, cardUrl));\n\n if (matchIndex === -1) return [];\n\n const matched = tc[matchIndex];\n const others = tc.filter((_, i) => i !== matchIndex);\n\n return [matched, ...others].slice(0, MAX_COLLECTIONS);\n }, [taggedCollections, card?.url]);\n\n return (\n <StatusParent>\n {showReplyParent && !!(inReplyToId && inReplyToAccountId) && (\n <StatusCompact sKey={sKey} />\n )}\n <article\n data-state-post-id={sKey}\n ref={(node) => {\n statusRef.current = node;\n // Use parent node if it's in focus\n // Use case: <a><status /></a>\n // When navigating (j/k), the <a> is focused instead of <status />\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.current = nodeRef;\n fRef.current = nodeRef;\n dRef.current = nodeRef;\n bRef.current = nodeRef;\n xRef.current = nodeRef;\n qRef.current = 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 <ControlledMenu\n ref={contextMenuRef}\n state={isContextMenuOpen ? 'open' : undefined}\n {...contextMenuProps}\n onClose={(e) => {\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 </ControlledMenu>\n )}\n {showActionsBar &&\n size !== 'l' &&\n !previewMode &&\n !readOnly &&\n !_deleted &&\n !quoted && (\n <div\n class={`status-actions ${\n isContextMenuOpen === 'actions-bar' ? 'open' : ''\n }`}\n ref={actionsRef}\n >\n <StatusButton\n size=\"s\"\n title={t`Reply`}\n alt={t`Reply`}\n class=\"reply-button\"\n icon=\"comment\"\n iconSize=\"m\"\n // Menu doesn't work here\n // Temporary solution: reply author-first if too many mentions\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e, tooManyMentions ? 'author-first' : 'all');\n }}\n />\n <StatusButton\n size=\"s\"\n checked={favourited}\n title={[t`Like`, t`Unlike`]}\n alt={[t`Like`, t`Liked`]}\n class=\"favourite-button\"\n icon=\"heart\"\n iconSize=\"m\"\n count={favouritesCount}\n onClick={favouriteStatusNotify}\n />\n <button\n type=\"button\"\n title={t`More`}\n class=\"plain more-button\"\n onClick={(e) => {\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 <Icon icon=\"more2\" size=\"m\" alt={t`More`} />\n </button>\n </div>\n )}\n {size !== 'l' && (\n <div class=\"status-badge\">\n {reblogged && (\n <Icon class=\"reblog\" icon=\"rocket\" size=\"s\" alt={t`Boosted`} />\n )}\n {favourited && (\n <Icon class=\"favourite\" icon=\"heart\" size=\"s\" alt={t`Liked`} />\n )}\n {bookmarked && (\n <Icon\n class=\"bookmark\"\n icon=\"bookmark\"\n size=\"s\"\n alt={t`Bookmarked`}\n />\n )}\n {_pinned && (\n <Icon class=\"pin\" icon=\"pin\" size=\"s\" alt={t`Pinned`} />\n )}\n </div>\n )}\n {size !== 's' && (\n <a\n href={accountURL}\n tabindex=\"-1\"\n // target=\"_blank\"\n title={`@${acct}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: status.account,\n instance,\n };\n }}\n >\n <Avatar url={avatarStatic || avatar} size=\"xxl\" squircle={bot} />\n </a>\n )}\n <div class=\"container\">\n {!!quoteDomain && (\n <div class=\"status-quote-meta\">\n <span class=\"domain\">{quoteDomain}</span>\n </div>\n )}\n {!!(status.account || createdAt) && (\n <div class=\"meta\">\n <span class=\"meta-name\">\n <NameText\n account={status.account}\n instance={instance}\n showAvatar={size === 's'}\n showAcct={isSizeLarge}\n />\n </span>\n {withinContext && isThread && (\n <ThreadBadge\n showIcon={isSizeLarge}\n index={snapStates.statusThreadNumber[sKey]}\n />\n )}\n {/* {inReplyToAccount && !withinContext && size !== 's' && (\n <>\n {' '}\n <span class=\"ib\">\n <Icon icon=\"arrow-right\" class=\"arrow\" />{' '}\n <NameText account={inReplyToAccount} instance={instance} short />\n </span>\n </>\n )} */}\n {/* </span> */}{' '}\n {size !== 'l' &&\n (_deleted ? (\n <span class=\"status-deleted-tag\">\n <Trans>Deleted</Trans>\n </span>\n ) : url && !previewMode && !readOnly && !quoted ? (\n <Link\n to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n onClick={(e) => {\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 <Icon\n icon=\"comment2\"\n size=\"s\"\n alt={plural(repliesCount, {\n one: '# reply',\n other: '# replies',\n })}\n />\n ) : visibility !== 'public' && visibility !== 'direct' ? (\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />\n ) : editedAt && size === 's' ? (\n <Icon icon=\"pencil\" size=\"s\" alt={t`Edited`} />\n ) : null}{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n {!previewMode && !readOnly && (\n <Icon icon=\"more2\" class=\"more\" alt={t`More`} />\n )}\n </Link>\n ) : (\n // <Menu\n // instanceRef={menuInstanceRef}\n // portal={{\n // target: document.body,\n // }}\n // containerProps={{\n // style: {\n // // Higher than the backdrop\n // zIndex: 1001,\n // },\n // onClick: (e) => {\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 // <Link\n // to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // onStatusLinkClick?.(e, status);\n // }}\n // class={`time ${open ? 'is-open' : ''}`}\n // >\n // <Icon\n // icon={visibilityIconsMap[visibility]}\n // alt={visibilityText[visibility]}\n // size=\"s\"\n // />{' '}\n // <RelativeTime datetime={createdAtDate} format=\"micro\" />\n // </Link>\n // )}\n // >\n // {StatusMenuItems}\n // </Menu>\n <span class=\"time\">\n {showCommentHint && !showCommentCount ? (\n <Icon\n icon=\"comment2\"\n size=\"s\"\n alt={plural(repliesCount, {\n one: '# reply',\n other: '# replies',\n })}\n />\n ) : visibility !== 'public' && visibility !== 'direct' ? (\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />\n ) : editedAt && size === 's' ? (\n <Icon icon=\"pencil\" size=\"s\" alt={t`Edited`} />\n ) : null}{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n </span>\n ))}\n </div>\n )}\n <LazyRender id={sKey} class=\"pre-content-container\">\n {visibility === 'direct' && (\n <>\n <div class=\"status-direct-badge\">\n <Trans>Private mention</Trans>\n </div>{' '}\n </>\n )}\n {!withinContext &&\n (isThread ? (\n <ThreadBadge\n showIcon\n showText\n index={snapStates.statusThreadNumber[sKey]}\n />\n ) : (\n !!inReplyToId &&\n !!inReplyToAccount &&\n (!!spoilerText ||\n !mentions.find((mention) => {\n return mention.id === inReplyToAccountId;\n })) && (\n <div class=\"status-reply-badge\">\n <Icon icon=\"reply\" />{' '}\n <NameText\n account={inReplyToAccount}\n instance={instance}\n short\n />\n </div>\n )\n ))}\n </LazyRender>\n <div\n class={`content-container ${\n spoilerText ||\n sensitive ||\n filterInfo?.action === 'blur' ||\n readingExpandMedia === 'hide_all'\n ? 'has-spoiler'\n : ''\n } ${showSpoiler ? 'show-spoiler' : ''} ${\n showSpoilerMedia ? 'show-media' : ''\n }`}\n data-content-text-weight={contentTextWeight ? textWeight() : null}\n style={\n (isSizeLarge || contentTextWeight) && {\n '--content-text-weight': textWeight(),\n }\n }\n >\n {mediaFirst && hasMediaAttachments ? (\n <>\n {(!!spoilerText || !!sensitive) && !readingExpandSpoilers && (\n <>\n {!!spoilerText && (\n <span\n class=\"spoiler-content media-first-spoiler-content\"\n lang={language}\n dir=\"auto\"\n ref={spoilerContentRef}\n data-read-more={_(readMoreText)}\n >\n <EmojiText text={spoilerText} emojis={emojis} />{' '}\n </span>\n )}\n <button\n class={`light spoiler-button media-first-spoiler-button ${\n showSpoiler ? 'spoiling' : ''\n }`}\n type=\"button\"\n onClick={(e) => {\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 <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n </button>\n </>\n )}\n <MediaFirstContainer\n mediaAttachments={mediaAttachments}\n language={language}\n postID={id}\n instance={instance}\n />\n {!!content && (\n <div class=\"media-first-content content\" ref={contentRef}>\n <PostContent\n post={status}\n instance={instance}\n previewMode={previewMode}\n />\n </div>\n )}\n </>\n ) : (\n <>\n {!!spoilerText && (\n <>\n <div\n class=\"content spoiler-content\"\n lang={language}\n dir=\"auto\"\n ref={spoilerContentRef}\n data-read-more={_(readMoreText)}\n >\n <p>\n <EmojiText text={spoilerText} emojis={emojis} />\n </p>\n </div>\n {readingExpandSpoilers || previewMode ? (\n <div class=\"spoiler-divider\">\n <Icon icon=\"eye-open\" /> <Trans>Content warning</Trans>\n </div>\n ) : (\n <button\n class={`light spoiler-button ${\n showSpoiler ? 'spoiling' : ''\n }`}\n type=\"button\"\n onClick={(e) => {\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 <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n </button>\n )}\n </>\n )}\n {!!content && (\n <div\n class=\"content\"\n ref={contentRef}\n data-read-more={_(readMoreText)}\n inert={!!spoilerText && !showSpoiler ? true : undefined}\n >\n <PostContent\n key={reloadPostContentCount}\n post={status}\n instance={instance}\n previewMode={previewMode}\n />\n </div>\n )}\n {!!content && (\n <MathBlock\n content={content}\n contentRef={contentRef}\n onRevert={reloadPostContent}\n />\n )}\n {!!poll && (\n <Poll\n lang={language}\n poll={poll}\n readOnly={readOnly || !sameInstance || !authenticated}\n onUpdate={(newPoll) => {\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 }}\n />\n )}\n {(((enableTranslate || inlineTranslate) &&\n isTranslateble(content, emojis) &&\n differentLanguage) ||\n forceTranslate) && (\n <TranslationBlock\n forceTranslate={forceTranslate || inlineTranslate}\n mini={!isSizeLarge && !withinContext}\n sourceLanguage={language}\n autoDetected={languageAutoDetected}\n text={getPostText(status, {\n maskCustomEmojis: true,\n maskURLs: true,\n // Hide regardless of native quote support\n // They are not useful in translation context\n hideInlineQuote: true,\n })}\n />\n )}\n {!previewMode &&\n (sensitive ||\n filterInfo?.action === 'blur' ||\n readingExpandMedia === 'hide_all') &&\n !!mediaAttachments.length &&\n (readingExpandMedia !== 'show_all' ||\n filterInfo?.action === 'blur') && (\n <button\n class={`plain spoiler-media-button ${\n showSpoilerMedia ? 'spoiling' : ''\n }`}\n type=\"button\"\n hidden={!readingExpandSpoilers && !!spoilerText}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoilerMedia) {\n delete states.spoilersMedia[id];\n } else {\n states.spoilersMedia[id] = true;\n }\n }}\n >\n <Icon\n icon={showSpoilerMedia ? 'eye-open' : 'eye-close'}\n />{' '}\n <span>\n {filterInfo?.action === 'blur' && (\n <small>\n <Trans>Filtered: {filterInfo?.titlesStr}</Trans>\n <br />\n </small>\n )}\n {showSpoilerMedia ? t`Show less` : t`Show media`}\n </span>\n </button>\n )}\n {!!mediaAttachments.length &&\n (mediaAttachments.length > 1 &&\n (isSizeLarge || (withinContext && size === 'm')) ? (\n <div class=\"media-large-container\">\n {mediaAttachments.map((media, i) => (\n <div key={media.id} class={`media-container media-eq1`}>\n <Media\n media={media}\n autoAnimate\n showCaption\n allowLongerCaption={!content || isSizeLarge}\n lang={language}\n to={`/${instance}/s/${id}?${\n withinContext ? 'media' : 'media-only'\n }=${i + 1}`}\n onClick={\n onMediaClick\n ? (e) => onMediaClick(e, i, media, status)\n : undefined\n }\n />\n </div>\n ))}\n </div>\n ) : (\n <MultipleMediaFigure\n lang={language}\n enabled={showMultipleMediaCaptions}\n captionChildren={captionChildren}\n >\n <div\n ref={mediaContainerRef}\n class={`media-container media-eq${\n mediaAttachments.length\n } ${mediaAttachments.length > 2 ? 'media-gt2' : ''} ${\n mediaAttachments.length > 4 ? 'media-gt4' : ''\n }`}\n >\n {displayedMediaAttachments.map((media, i) => (\n <Media\n key={media.id}\n media={media}\n autoAnimate={isSizeLarge}\n showCaption={mediaAttachments.length === 1}\n allowLongerCaption={\n !content && mediaAttachments.length === 1\n }\n lang={language}\n altIndex={\n showMultipleMediaCaptions &&\n !!media.description &&\n i + 1\n }\n to={`/${instance}/s/${id}?${\n withinContext ? 'media' : 'media-only'\n }=${i + 1}`}\n onClick={\n onMediaClick\n ? (e) => {\n onMediaClick(e, i, media, status);\n }\n : undefined\n }\n checkAspectRatio={mediaAttachments.length === 1}\n />\n ))}\n </div>\n </MultipleMediaFigure>\n ))}\n <QuoteStatuses\n id={id}\n instance={instance}\n level={quoted}\n collapsed={!isSizeLarge && !withinContext}\n fallbackQuote={quote}\n />\n {!poll &&\n !mediaAttachments.length &&\n !snapStates.statusQuotes[sKey] &&\n (collectionsWithCard.length ? (\n <div class=\"collections-container\">\n {collectionsWithCard.map((collection) => (\n <CollectionCard\n key={collection.id}\n collection={collection}\n instance={currentInstance}\n creatorAccount={\n collection.accountId === accountId\n ? status.account\n : undefined\n }\n size={size}\n />\n ))}\n </div>\n ) : !!card && /^https/i.test(card?.url) ? (\n <StatusCard\n card={card}\n selfReferential={\n card?.url === status.url || card?.url === status.uri\n }\n selfAuthor={card?.authors?.some(\n (a) => a.account?.url === accountURL,\n )}\n instance={currentInstance}\n />\n ) : taggedCollections?.length ? (\n <div class=\"collections-container\">\n {/* Limit to 4, for now. */}\n {taggedCollections.slice(0, 4).map((collection) => (\n <CollectionCard\n key={collection.id}\n collection={collection}\n instance={currentInstance}\n creatorAccount={\n collection.accountId === accountId\n ? status.account\n : undefined\n }\n size={size}\n />\n ))}\n </div>\n ) : null)}\n {size !== 's' && <StatusTags tags={tags} content={content} />}\n </>\n )}\n </div>\n {!isSizeLarge && (showCommentCount || showQuoteCount) && (\n <div class=\"content-comment-hint insignificant\">\n {showCommentCount && (\n <>\n <Icon icon=\"comment2\" alt={t`Replies`} /> {repliesCount}\n </>\n )}{' '}\n {showQuoteCount && (\n <>\n <Icon icon=\"quote\" alt={t`Quotes`} /> {quotesCount}\n </>\n )}\n </div>\n )}\n {isSizeLarge && (\n <>\n <div class=\"extra-meta\">\n {_deleted ? (\n <span class=\"status-deleted-tag\">\n <Trans>Deleted</Trans>\n </span>\n ) : (\n <>\n <Icon icon={visibilityIconsMap[visibility]} alt=\"\" />{' '}\n <span>{_(visibilityText[visibility])}</span> &bull;{' '}\n <a href={url} target=\"_blank\" rel=\"noopener\">\n {\n // within a day\n Date.now() - createdAtDate.getTime() < 86400000 && (\n <>\n <RelativeTime\n datetime={createdAtDate}\n format=\"micro\"\n />{' '}\n ‒{' '}\n </>\n )\n }\n {!!createdAt && (\n <time\n class=\"created\"\n datetime={createdAtDate.toISOString()}\n title={createdAtDate.toLocaleString()}\n >\n {createdDateText}\n </time>\n )}\n </a>\n {editedAt && (\n <span class=\"edited-container\">\n {' '}\n &bull; <Icon icon=\"pencil\" alt={t`Edited`} />{' '}\n <time\n tabIndex=\"0\"\n class=\"edited\"\n datetime={editedAtDate.toISOString()}\n onClick={() => {\n setShowEdited(id);\n }}\n >\n {editedDateText}\n </time>\n </span>\n )}\n </>\n )}\n </div>\n {!!emojiReactions?.length && (\n <div class=\"emoji-reactions\">\n {emojiReactions.map((emojiReaction) => {\n const { name, count, me, url, staticUrl } = emojiReaction;\n if (url) {\n // Some servers return url and staticUrl\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n <CustomEmoji\n alt={name}\n url={url}\n staticUrl={staticUrl}\n />{' '}\n {count}\n </span>\n );\n }\n const isShortCode = /^:.+?:$/.test(name);\n if (isShortCode) {\n const emoji = emojis.find(\n (e) =>\n e.shortcode ===\n name.replace(/^:/, '').replace(/:$/, ''),\n );\n if (emoji) {\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n <CustomEmoji\n alt={name}\n url={emoji.url}\n staticUrl={emoji.staticUrl}\n />{' '}\n {count}\n </span>\n );\n }\n }\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n {name} {count}\n </span>\n );\n })}\n </div>\n )}\n <div class={`actions ${_deleted ? 'disabled' : ''}`}>\n <div class=\"action has-count\">\n {tooManyMentions ? (\n <Menu2\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n menuButton={\n <StatusButton\n title={t`Reply`}\n alt={t`Comments`}\n class=\"reply-button\"\n icon=\"comment\"\n count={repliesCount}\n />\n }\n >\n {replyModeMenuItems}\n </Menu2>\n ) : (\n <StatusButton\n title={t`Reply`}\n alt={t`Comments`}\n class=\"reply-button\"\n icon=\"comment\"\n count={repliesCount}\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e);\n }}\n />\n )}\n </div>\n {/* <div class=\"action has-count\">\n <StatusButton\n checked={reblogged}\n title={['Boost', 'Unboost']}\n alt={['Boost', 'Boosted']}\n class=\"reblog-button\"\n icon=\"rocket\"\n count={reblogsCount}\n onClick={boostStatus}\n disabled={!canBoost}\n />\n </div> */}\n <div\n class={`action ${canQuote && reblogsCount > 0 && quotesCount > 0 ? 'has-counts' : 'has-count'}`}\n >\n <MenuConfirm\n disabled={!canBoost}\n onClick={() => {\n haptics.trigger('light');\n return confirmBoostStatus();\n }}\n confirmLabel={\n <>\n <Icon icon=\"rocket\" />\n <span class=\"menu-grow\">\n {reblogged ? t`Unboost` : t`Boost`}\n </span>\n {reblogsCount > 0 && (\n <small class=\"more-insignificant\">\n {shortenNumber(reblogsCount)}\n </small>\n )}\n </>\n }\n menuExtras={\n <>\n {supportsNativeQuote() && (\n <MenuItem\n disabled={quoteDisabled}\n onClick={() => {\n showCompose({\n quoteStatus: status,\n });\n }}\n >\n <Icon icon=\"quote\" />\n {quoteMetaText ? (\n <small>\n {quoteText}\n <br />\n {quoteMetaText}\n </small>\n ) : (\n <span class=\"menu-grow\">{quoteText}</span>\n )}\n {quotesCount > 0 && (\n <small class=\"more-insignificant\">\n {shortenNumber(quotesCount)}\n </small>\n )}\n </MenuItem>\n )}\n {(DEV || !supportsNativeQuote()) && (\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Quote with link</Trans>\n </span>\n {supportsNativeQuote() && DEV && (\n <small class=\"tag collapsed\">DEV</small>\n )}\n </MenuItem>\n )}\n </>\n }\n menuFooter={menuFooter}\n >\n <StatusButton\n checked={reblogged}\n title={[\n canQuote ? t`Boost/Quote…` : t`Boost…`,\n t`Unboost`,\n ]}\n alt={[t`Boost`, t`Boosted`]}\n class=\"reblog-button\"\n icon={\n reblogsCount <= 0 && quotesCount > 0\n ? 'quote'\n : 'rocket'\n }\n count={reblogsCount}\n extraCount={quotesCount}\n // onClick={boostStatus}\n disabled={!canBoost}\n />\n </MenuConfirm>\n </div>\n <div class=\"action has-count\">\n <StatusButton\n checked={favourited}\n title={[t`Like`, t`Unlike`]}\n alt={[t`Like`, t`Liked`]}\n class=\"favourite-button\"\n icon=\"heart\"\n count={favouritesCount}\n onClick={(e) => {\n haptics.trigger('light');\n favouriteStatus(e);\n }}\n />\n </div>\n {supports('@mastodon/post-bookmark') && (\n <div class=\"action\">\n <StatusButton\n checked={bookmarked}\n title={[t`Bookmark`, t`Unbookmark`]}\n alt={[t`Bookmark`, t`Bookmarked`]}\n class=\"bookmark-button\"\n icon=\"bookmark\"\n onClick={(e) => {\n haptics.trigger('light');\n bookmarkStatus(e);\n }}\n />\n </div>\n )}\n <Menu2\n portal={{\n target:\n document.querySelector('.status-deck') || document.body,\n }}\n align=\"end\"\n gap={4}\n overflow=\"auto\"\n viewScroll=\"close\"\n menuButton={\n <div class=\"action\">\n <button\n type=\"button\"\n title={t`More`}\n class=\"plain more-button\"\n >\n <Icon icon=\"more2\" size=\"l\" alt={t`More`} />\n </button>\n </div>\n }\n >\n {StatusMenuItems}{' '}\n </Menu2>\n </div>\n </>\n )}\n </div>\n {!!showEdited && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowEdited(false);\n // statusRef.current?.focus();\n }\n }}\n >\n <EditedAtModal\n statusID={showEdited}\n instance={instance}\n fetchStatusHistory={() => {\n return masto.v1.statuses.$select(showEdited).history.list();\n }}\n onClose={() => {\n setShowEdited(false);\n statusRef.current?.focus();\n }}\n />\n </Modal>\n )}\n {!!showEmbed && (\n <Modal\n onClose={() => {\n setShowEmbed(false);\n }}\n >\n <PostEmbedModal\n post={status}\n instance={instance}\n onClose={() => {\n setShowEmbed(false);\n }}\n />\n </Modal>\n )}\n {!!showQuoteSettings && (\n <Modal\n onClose={() => {\n setShowQuoteSettings(false);\n states.reloadStatusPage++;\n }}\n >\n <QuoteSettingsSheet\n onClose={() => {\n setShowQuoteSettings(false);\n states.reloadStatusPage++;\n }}\n post={status}\n currentPolicy={postQuoteApprovalPolicy}\n />\n </Modal>\n )}\n {!!showQuotes && (\n <Modal\n onClose={() => {\n setShowQuotes(false);\n }}\n >\n <QuotesModal\n statusId={id}\n instance={instance}\n onClose={() => {\n setShowQuotes(false);\n }}\n />\n </Modal>\n )}\n {!!showQuoteChain && (\n <Modal\n onClose={() => {\n setShowQuoteChain(false);\n }}\n >\n <QuoteChainModal\n statusId={id}\n instance={instance}\n onClose={() => {\n setShowQuoteChain(false);\n }}\n />\n </Modal>\n )}\n </article>\n </StatusParent>\n );\n}\n\nfunction nicePostURL(url) {\n if (!url) return;\n const urlObj = URL.parse(url);\n if (!urlObj) return;\n const { host, pathname } = urlObj;\n const path = pathname.replace(/\\/$/, '');\n // split only first slash\n const [_, username, restPath] = path.match(/\\/(@[^\\/]+)\\/(.*)/) || [];\n return (\n <>\n {punycode.toUnicode(host)}\n {username ? (\n <>\n /{username}\n <wbr />\n <span class=\"more-insignificant\">/{restPath}</span>\n </>\n ) : (\n <span class=\"more-insignificant\">{path}</span>\n )}\n </>\n );\n}\n\nconst handledUnfulfilledStates = [\n 'deleted',\n 'unauthorized',\n 'pending',\n 'rejected',\n 'revoked',\n 'blocked_account',\n 'blocked_domain',\n 'muted_account',\n];\nconst revealableUnfulfilledStates = [\n 'blocked_account',\n 'blocked_domain',\n 'muted_account',\n];\nconst unfulfilledText = {\n filterHidden: msg`Post hidden by your filters`,\n pending: msg`Post pending`,\n deleted: msg`Post unavailable`,\n unauthorized: msg`Post unavailable`,\n rejected: msg`Post unavailable`,\n revoked: msg`Post removed by author`,\n blocked_account: (name) => msg`Post hidden because you've blocked @${name}.`,\n blocked_domain: (domain) =>\n msg`Post hidden because you've blocked ${domain}.`,\n muted_account: (name) => msg`Post hidden because you've muted @${name}.`,\n};\n\nconst QuoteStatus = memo(({ quote, level = 0 }) => {\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const filterContext = useContext(FilterContext);\n const currentAccount = getCurrentAccID();\n\n const q = quote;\n let unfulfilledState;\n\n // Static as in there's no live update (edited, liked, etc.)\n const isStaticQuote = !!q.quoteStatus;\n\n const quoteStatus =\n snapStates.statuses[statusKey(q.id, q.instance)] || q.quoteStatus;\n if (quoteStatus) {\n const isSelf = currentAccount && currentAccount === quoteStatus.account?.id;\n const filterInfo =\n !isSelf && isFiltered(quoteStatus.filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n unfulfilledState = 'filterHidden';\n }\n }\n\n if (!unfulfilledState) {\n unfulfilledState = handledUnfulfilledStates.find(\n (state) => q.state === state,\n );\n }\n\n const isRevealable = revealableUnfulfilledStates.includes(unfulfilledState);\n const quoteKey = q.id ? statusKey(q.id, q.instance) : null;\n const isRevealed = quoteKey && snapStates.revealedQuotes[quoteKey];\n\n if (unfulfilledState && (!isRevealable || !isRevealed)) {\n // Get account info for revealable states\n const quotedAccount = quoteStatus?.account;\n const quotedAccountAcct = quotedAccount?.acct;\n const domain = quotedAccountAcct?.split('@')[1];\n\n let message;\n if (isRevealable) {\n if (unfulfilledState === 'blocked_account') {\n message = _(unfulfilledText.blocked_account(quotedAccountAcct));\n } else if (unfulfilledState === 'blocked_domain') {\n message = _(unfulfilledText.blocked_domain(domain));\n } else if (unfulfilledState === 'muted_account') {\n message = _(unfulfilledText.muted_account(quotedAccountAcct));\n }\n } else {\n message = _(unfulfilledText[unfulfilledState]);\n }\n\n return (\n <div\n key={quoteKey}\n class={`status-card-unfulfilled ${\n unfulfilledState === 'filterHidden' || isRevealable\n ? 'status-card-ghost'\n : ''\n } ${q.native ? 'quote-post-native' : ''}`}\n >\n <Icon icon=\"quote\" />\n <i>{message}</i>\n {isRevealable && quoteKey && (\n <button\n type=\"button\"\n class=\"textual\"\n onClick={() => {\n states.revealedQuotes[quoteKey] = true;\n }}\n >\n <Trans>Show anyway</Trans>\n </button>\n )}\n </div>\n );\n }\n\n const Parent = q.native ? Fragment : LazyShazam;\n return (\n <Parent id={q.instance + q.id} key={q.instance + q.id}>\n <Link\n key={q.instance + q.id}\n to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`}\n class={`status-card-link ${q.native ? 'quote-post-native' : ''}`}\n data-read-more={_(readMoreText)}\n >\n <Status\n statusID={q.id}\n status={isStaticQuote ? quoteStatus : undefined}\n instance={q.instance}\n size=\"s\"\n quoted={level + 1}\n quoteDomain={q.originalDomain}\n enableCommentHint\n />\n </Link>\n </Parent>\n );\n});\n\nconst ShallowQuote = ({ quote } = {}) => {\n const { account, native, instance } = quote || {};\n if (!account) return null;\n return (\n <div class=\"status-card-container\">\n <div class={native ? 'quote-post-native' : ''}>\n <div class=\"status-card status-shallow-card\">\n <NameText account={account} instance={instance} showAvatar />{' '}\n <span class=\"insignificant\">…</span>\n </div>\n </div>\n </div>\n );\n};\n\nconst QuoteStatuses = memo(\n ({ id, instance, level = 0, collapsed = false, fallbackQuote }) => {\n if (!id || !instance) return;\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const sKey = statusKey(id, instance);\n const quotes = snapStates.statusQuotes[sKey];\n let uniqueQuotes = quotes?.filter(\n (q, i, arr) => q.native || arr.findIndex((q2) => q2.url === q.url) === i,\n );\n\n const containerRef = useTruncated();\n\n if (!uniqueQuotes?.length && fallbackQuote?.quotedStatus) {\n // Just render it\n return (\n <div\n class=\"status-card-container\"\n ref={containerRef}\n data-read-more={_(readMoreText)}\n data-quote-container-static={true}\n >\n <QuoteStatus\n quote={{\n // Same structure as the one in saveStatus (utils/states)\n id,\n instance,\n // url\n state: fallbackQuote.state,\n // account\n native: true,\n // Inject whole quoteStatus instead of reading from states\n quoteStatus: fallbackQuote.quotedStatus,\n }}\n />\n </div>\n );\n }\n\n if (!uniqueQuotes?.length) return;\n if (level > 2) {\n return <ShallowQuote quote={uniqueQuotes[0]} />;\n }\n\n if (collapsed) {\n // Only show the first quote if \"collapsed\"\n uniqueQuotes = [uniqueQuotes[0]];\n }\n\n return (\n <div\n class=\"status-card-container\"\n ref={containerRef}\n data-read-more={_(readMoreText)}\n >\n {uniqueQuotes.map((q) => {\n const quoteKey = q.id\n ? statusKey(q.id, q.instance)\n : `${q.instance || ''}-${q.state}`;\n return <QuoteStatus key={quoteKey} quote={q} level={level} />;\n })}\n </div>\n );\n },\n);\n\nfunction EditedAtModal({\n statusID,\n instance,\n fetchStatusHistory = () => {},\n onClose,\n}) {\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [editHistory, setEditHistory] = useState([]);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const editHistory = await fetchStatusHistory();\n console.log(editHistory);\n setEditHistory(editHistory);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, []);\n\n return (\n <div id=\"edit-history\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Edit History</Trans>\n </h2>\n {uiState === 'error' && (\n <p>\n <Trans>Failed to load history</Trans>\n </p>\n )}\n {uiState === 'loading' && (\n <p>\n <Loader abrupt /> <Trans>Loading…</Trans>\n </p>\n )}\n </header>\n <main tabIndex=\"-1\">\n {editHistory.length > 0 && (\n <ol>\n {editHistory.map((status) => {\n const { createdAt } = status;\n const createdAtDate = new Date(createdAt);\n return (\n <li key={createdAt} class=\"history-item\">\n <h3>\n <time>\n {niceDateTime(createdAtDate, {\n formatOpts: {\n weekday: 'short',\n second: 'numeric',\n },\n })}\n </time>\n </h3>\n <Status\n status={status}\n instance={instance}\n size=\"s\"\n withinContext\n readOnly\n previewMode\n />\n </li>\n );\n })}\n </ol>\n )}\n </main>\n </div>\n );\n}\n\nfunction FilteredStatus({\n status,\n filterInfo,\n instance,\n containerProps = {},\n showFollowedTags,\n quoted,\n}) {\n const { _, t } = useLingui();\n const snapStates = useSnapshot(states);\n const {\n id: statusID,\n account: { avatar, avatarStatic, bot, group },\n createdAt,\n visibility,\n reblog,\n } = status;\n const isReblog = !!reblog;\n const filterTitleStr = filterInfo?.titlesStr || '';\n const createdAtDate = new Date(createdAt);\n const statusPeekText = statusPeek(status.reblog || status);\n\n const [showPeek, setShowPeek] = useState(false);\n const bindLongPressPeek = useLongPress(\n () => {\n setShowPeek(true);\n },\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 statusPeekRef = useTruncated();\n const sKey = statusKey(status.id, instance);\n const ssKey =\n statusKey(status.id, instance) +\n ' ' +\n (statusKey(reblog?.id, instance) || '');\n\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n const isFollowedTags =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length;\n\n return (\n <div\n class={`${\n quoted\n ? ''\n : isReblog\n ? group\n ? 'status-group'\n : 'status-reblog'\n : isFollowedTags\n ? 'status-followed-tags'\n : ''\n } visibility-${visibility}`}\n {...containerProps}\n // title={statusPeekText}\n onContextMenu={(e) => {\n e.preventDefault();\n setShowPeek(true);\n }}\n {...bindLongPressPeek()}\n >\n <article\n data-state-post-id={ssKey}\n class={`status filtered ${quoted ? 'status-card' : ''}`}\n tabindex=\"-1\"\n >\n <b\n class=\"status-filtered-badge clickable badge-meta\"\n title={filterTitleStr}\n onClick={(e) => {\n e.preventDefault();\n setShowPeek(true);\n }}\n >\n <span>\n <Trans>Filtered</Trans>\n </span>\n <span>{filterTitleStr}</span>\n </b>{' '}\n <Avatar url={avatarStatic || avatar} squircle={bot} />\n <span class=\"status-filtered-info\">\n <span class=\"status-filtered-info-1\">\n {isReblog ? (\n <Trans comment=\"[Name] [Visibility icon] boosted\">\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n boosted\n </Trans>\n ) : isFollowedTags ? (\n <>\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n <span>\n {snapStates.statusFollowedTags[sKey]\n .slice(0, 3)\n .map((tag) => (\n <span key={tag} class=\"status-followed-tag-item\">\n #{tag}\n </span>\n ))}\n </span>\n </>\n ) : (\n <>\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n </>\n )}\n </span>\n <span class=\"status-filtered-info-2\">\n {isReblog && (\n <>\n <Avatar\n url={reblog.account.avatarStatic || reblog.account.avatar}\n squircle={bot}\n />{' '}\n </>\n )}\n {statusPeekText}\n </span>\n </span>\n </article>\n {!!showPeek && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowPeek(false);\n }\n }}\n >\n <div id=\"filtered-status-peek\" class=\"sheet\">\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={() => setShowPeek(false)}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <b class=\"status-filtered-badge\">\n <Trans>Filtered</Trans>\n </b>{' '}\n {filterTitleStr}\n </header>\n <main tabIndex=\"-1\">\n <Link\n ref={statusPeekRef}\n class=\"status-link\"\n to={url}\n onClick={() => {\n setShowPeek(false);\n }}\n data-read-more={_(readMoreText)}\n >\n <Status status={status} instance={instance} size=\"s\" readOnly />\n </Link>\n </main>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nexport default memo(Status, (oldProps, newProps) => {\n // Shallow equal all props except 'status'\n // This will be pure static until status ID changes\n const { status, ...restOldProps } = oldProps;\n const { status: newStatus, ...restNewProps } = newProps;\n return (\n status?.id === newStatus?.id && shallowEqual(restOldProps, restNewProps)\n );\n});\n","var IDX=36, HEX='';\nwhile (IDX--) HEX += IDX.toString(36);\n\nexport function uid(len) {\n\tvar str='', num = len || 11;\n\twhile (num--) str += HEX[Math.random() * 36 | 0];\n\treturn str;\n}\n","/**\n * Fuse.js v7.4.2 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2026 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n//#region src/helpers/typeGuards.ts\nfunction isArray(value) {\n\treturn !Array.isArray ? getTag(value) === \"[object Array]\" : Array.isArray(value);\n}\nfunction baseToString(value) {\n\tif (typeof value == \"string\") return value;\n\tif (typeof value === \"bigint\") return value.toString();\n\tconst result = value + \"\";\n\treturn result == \"0\" && 1 / value == -Infinity ? \"-0\" : result;\n}\nfunction toString(value) {\n\treturn value == null ? \"\" : baseToString(value);\n}\nfunction isString(value) {\n\treturn typeof value === \"string\";\n}\nfunction isNumber(value) {\n\treturn typeof value === \"number\";\n}\nfunction isBoolean(value) {\n\treturn value === true || value === false || isObjectLike(value) && getTag(value) == \"[object Boolean]\";\n}\nfunction isObject(value) {\n\treturn typeof value === \"object\";\n}\nfunction isObjectLike(value) {\n\treturn isObject(value) && value !== null;\n}\nfunction isDefined(value) {\n\treturn value !== void 0 && value !== null;\n}\nfunction isBlank(value) {\n\treturn !value.trim().length;\n}\nfunction getTag(value) {\n\treturn value == null ? value === void 0 ? \"[object Undefined]\" : \"[object Null]\" : Object.prototype.toString.call(value);\n}\n\n//#endregion\n//#region src/core/errorMessages.ts\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\nconst INVALID_DOC_INDEX = \"Invalid doc index: must be a non-negative integer within the bounds of the docs array\";\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => `Invalid value for key ${key}`;\nconst PATTERN_LENGTH_TOO_LARGE = (max) => `Pattern length exceeds max of ${max}.`;\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\nconst INVALID_KEY_WEIGHT_VALUE = (key) => `Property 'weight' in key '${key}' must be a positive integer`;\nconst FUSE_MATCH_TOKEN_SEARCH_UNSUPPORTED = \"Fuse.match does not support useTokenSearch: token search requires corpus-level statistics (df, fieldCount) that a one-off string comparison does not have. Use new Fuse(...).search(...) instead.\";\n\n//#endregion\n//#region src/tools/KeyStore.ts\nconst hasOwn = Object.prototype.hasOwnProperty;\nvar KeyStore = class {\n\tconstructor(keys) {\n\t\tthis._keys = [];\n\t\tthis._keyMap = {};\n\t\tlet totalWeight = 0;\n\t\tkeys.forEach((key) => {\n\t\t\tconst obj = createKey(key);\n\t\t\tthis._keys.push(obj);\n\t\t\tthis._keyMap[obj.id] = obj;\n\t\t\ttotalWeight += obj.weight;\n\t\t});\n\t\tthis._keys.forEach((key) => {\n\t\t\tkey.weight /= totalWeight;\n\t\t});\n\t}\n\tget(keyId) {\n\t\treturn this._keyMap[keyId];\n\t}\n\tkeys() {\n\t\treturn this._keys;\n\t}\n\ttoJSON() {\n\t\treturn JSON.stringify(this._keys);\n\t}\n};\nfunction createKey(key) {\n\tlet path = null;\n\tlet id = null;\n\tlet src = null;\n\tlet weight = 1;\n\tlet getFn = null;\n\tif (isString(key) || isArray(key)) {\n\t\tsrc = key;\n\t\tpath = createKeyPath(key);\n\t\tid = createKeyId(key);\n\t} else {\n\t\tif (!hasOwn.call(key, \"name\")) throw new Error(MISSING_KEY_PROPERTY(\"name\"));\n\t\tconst name = key.name;\n\t\tsrc = name;\n\t\tif (hasOwn.call(key, \"weight\") && key.weight !== void 0) {\n\t\t\tweight = key.weight;\n\t\t\tif (weight <= 0) throw new Error(INVALID_KEY_WEIGHT_VALUE(createKeyId(name)));\n\t\t}\n\t\tpath = createKeyPath(name);\n\t\tid = createKeyId(name);\n\t\tgetFn = key.getFn ?? null;\n\t}\n\treturn {\n\t\tpath,\n\t\tid,\n\t\tweight,\n\t\tsrc,\n\t\tgetFn\n\t};\n}\nfunction createKeyPath(key) {\n\treturn isArray(key) ? key : key.split(\".\");\n}\nfunction createKeyId(key) {\n\treturn isArray(key) ? key.join(\".\") : key;\n}\n\n//#endregion\n//#region src/helpers/get.ts\nfunction get(obj, path) {\n\tconst list = [];\n\tlet arr = false;\n\tconst deepGet = (obj, path, index, arrayIndex) => {\n\t\tif (!isDefined(obj)) return;\n\t\tif (!path[index]) list.push(arrayIndex !== void 0 ? {\n\t\t\tv: obj,\n\t\t\ti: arrayIndex\n\t\t} : obj);\n\t\telse {\n\t\t\tconst value = obj[path[index]];\n\t\t\tif (!isDefined(value)) return;\n\t\t\tif (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value) || typeof value === \"bigint\")) list.push(arrayIndex !== void 0 ? {\n\t\t\t\tv: toString(value),\n\t\t\t\ti: arrayIndex\n\t\t\t} : toString(value));\n\t\t\telse if (isArray(value)) {\n\t\t\t\tarr = true;\n\t\t\t\tfor (let i = 0, len = value.length; i < len; i += 1) deepGet(value[i], path, index + 1, i);\n\t\t\t} else if (path.length) deepGet(value, path, index + 1, arrayIndex);\n\t\t}\n\t};\n\tdeepGet(obj, isString(path) ? path.split(\".\") : path, 0);\n\treturn arr ? list : list[0];\n}\n\n//#endregion\n//#region src/core/config.ts\nconst MatchOptions = {\n\tincludeMatches: false,\n\tfindAllMatches: false,\n\tminMatchCharLength: 1\n};\nconst BasicOptions = {\n\tisCaseSensitive: false,\n\tignoreDiacritics: false,\n\tincludeScore: false,\n\tkeys: [],\n\tshouldSort: true,\n\tsortFn: (a, b) => a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1\n};\nconst FuzzyOptions = {\n\tlocation: 0,\n\tthreshold: .6,\n\tdistance: 100\n};\nconst AdvancedOptions = {\n\tuseExtendedSearch: false,\n\tuseTokenSearch: false,\n\ttokenize: void 0,\n\ttokenMatch: \"any\",\n\tgetFn: get,\n\tignoreLocation: false,\n\tignoreFieldNorm: false,\n\tfieldNormWeight: 1\n};\nconst Config = Object.freeze({\n\t...BasicOptions,\n\t...MatchOptions,\n\t...FuzzyOptions,\n\t...AdvancedOptions\n});\n\n//#endregion\n//#region src/tools/fieldNorm.ts\nfunction norm(weight = 1, mantissa = 3) {\n\tconst cache = /* @__PURE__ */ new Map();\n\tconst m = Math.pow(10, mantissa);\n\treturn {\n\t\tget(value) {\n\t\t\tlet numTokens = 1;\n\t\t\tlet inSpace = false;\n\t\t\tfor (let i = 0; i < value.length; i++) if (value.charCodeAt(i) === 32) {\n\t\t\t\tif (!inSpace) {\n\t\t\t\t\tnumTokens++;\n\t\t\t\t\tinSpace = true;\n\t\t\t\t}\n\t\t\t} else inSpace = false;\n\t\t\tif (cache.has(numTokens)) return cache.get(numTokens);\n\t\t\tconst n = Math.round(m / Math.pow(numTokens, .5 * weight)) / m;\n\t\t\tcache.set(numTokens, n);\n\t\t\treturn n;\n\t\t},\n\t\tclear() {\n\t\t\tcache.clear();\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/tools/FuseIndex.ts\nvar FuseIndex = class {\n\tconstructor({ getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\t\tthis.norm = norm(fieldNormWeight, 3);\n\t\tthis.getFn = getFn;\n\t\tthis.isCreated = false;\n\t\tthis.docs = [];\n\t\tthis.keys = [];\n\t\tthis._keysMap = {};\n\t\tthis.setIndexRecords();\n\t}\n\tsetSources(docs = []) {\n\t\tthis.docs = docs;\n\t}\n\tsetIndexRecords(records = []) {\n\t\tthis.records = records;\n\t}\n\tsetKeys(keys = []) {\n\t\tthis.keys = keys;\n\t\tthis._keysMap = {};\n\t\tkeys.forEach((key, idx) => {\n\t\t\tthis._keysMap[key.id] = idx;\n\t\t});\n\t}\n\tcreate() {\n\t\tif (this.isCreated || !this.docs.length) return;\n\t\tthis.isCreated = true;\n\t\tconst len = this.docs.length;\n\t\tthis.records = new Array(len);\n\t\tlet recordCount = 0;\n\t\tif (isString(this.docs[0])) for (let i = 0; i < len; i++) {\n\t\t\tconst record = this._createStringRecord(this.docs[i], i);\n\t\t\tif (record) this.records[recordCount++] = record;\n\t\t}\n\t\telse for (let i = 0; i < len; i++) this.records[recordCount++] = this._createObjectRecord(this.docs[i], i);\n\t\tthis.records.length = recordCount;\n\t\tthis.norm.clear();\n\t}\n\tadd(doc, docIndex) {\n\t\tif (!Number.isInteger(docIndex) || docIndex < 0) throw new Error(INVALID_DOC_INDEX);\n\t\tif (isString(doc)) {\n\t\t\tconst record = this._createStringRecord(doc, docIndex);\n\t\t\tif (record) this.records.push(record);\n\t\t\treturn record;\n\t\t}\n\t\tconst record = this._createObjectRecord(doc, docIndex);\n\t\tthis.records.push(record);\n\t\treturn record;\n\t}\n\tremoveAt(idx) {\n\t\tif (!Number.isInteger(idx) || idx < 0) throw new Error(INVALID_DOC_INDEX);\n\t\tfor (let i = 0, len = this.records.length; i < len; i += 1) if (this.records[i].i === idx) {\n\t\t\tthis.records.splice(i, 1);\n\t\t\tbreak;\n\t\t}\n\t\tfor (let i = 0, len = this.records.length; i < len; i += 1) if (this.records[i].i > idx) this.records[i].i -= 1;\n\t}\n\tremoveAll(indices) {\n\t\tconst toRemove = /* @__PURE__ */ new Set();\n\t\tfor (const v of indices) if (Number.isInteger(v) && v >= 0) toRemove.add(v);\n\t\tif (toRemove.size === 0) return;\n\t\tthis.records = this.records.filter((r) => !toRemove.has(r.i));\n\t\tconst sorted = Array.from(toRemove).sort((a, b) => a - b);\n\t\tfor (const record of this.records) {\n\t\t\tlet lo = 0;\n\t\t\tlet hi = sorted.length;\n\t\t\twhile (lo < hi) {\n\t\t\t\tconst mid = lo + hi >>> 1;\n\t\t\t\tif (sorted[mid] < record.i) lo = mid + 1;\n\t\t\t\telse hi = mid;\n\t\t\t}\n\t\t\trecord.i -= lo;\n\t\t}\n\t}\n\tgetValueForItemAtKeyId(item, keyId) {\n\t\treturn item[this._keysMap[keyId]];\n\t}\n\tsize() {\n\t\treturn this.records.length;\n\t}\n\t_createStringRecord(doc, docIndex) {\n\t\tif (!isDefined(doc) || isBlank(doc)) return null;\n\t\treturn {\n\t\t\tv: doc,\n\t\t\ti: docIndex,\n\t\t\tn: this.norm.get(doc)\n\t\t};\n\t}\n\t_createObjectRecord(doc, docIndex) {\n\t\tconst record = {\n\t\t\ti: docIndex,\n\t\t\t$: {}\n\t\t};\n\t\tfor (let keyIndex = 0, keyLen = this.keys.length; keyIndex < keyLen; keyIndex++) {\n\t\t\tconst key = this.keys[keyIndex];\n\t\t\tconst value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\t\t\tif (!isDefined(value)) continue;\n\t\t\tif (isArray(value)) {\n\t\t\t\tconst subRecords = [];\n\t\t\t\tfor (let i = 0, len = value.length; i < len; i += 1) {\n\t\t\t\t\tconst item = value[i];\n\t\t\t\t\tif (!isDefined(item)) continue;\n\t\t\t\t\tif (isString(item)) {\n\t\t\t\t\t\tif (!isBlank(item)) {\n\t\t\t\t\t\t\tconst subRecord = {\n\t\t\t\t\t\t\t\tv: item,\n\t\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\t\tn: this.norm.get(item)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsubRecords.push(subRecord);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (isDefined(item.v)) {\n\t\t\t\t\t\tconst text = isString(item.v) ? item.v : toString(item.v);\n\t\t\t\t\t\tif (!isBlank(text)) {\n\t\t\t\t\t\t\tconst subRecord = {\n\t\t\t\t\t\t\t\tv: text,\n\t\t\t\t\t\t\t\ti: item.i,\n\t\t\t\t\t\t\t\tn: this.norm.get(text)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsubRecords.push(subRecord);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trecord.$[keyIndex] = subRecords;\n\t\t\t} else if (isString(value) && !isBlank(value)) {\n\t\t\t\tconst subRecord = {\n\t\t\t\t\tv: value,\n\t\t\t\t\tn: this.norm.get(value)\n\t\t\t\t};\n\t\t\t\trecord.$[keyIndex] = subRecord;\n\t\t\t}\n\t\t}\n\t\treturn record;\n\t}\n\ttoJSON() {\n\t\treturn {\n\t\t\tkeys: this.keys.map(({ getFn, ...key }) => key),\n\t\t\trecords: this.records\n\t\t};\n\t}\n};\nfunction createIndex(keys, docs, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\tconst myIndex = new FuseIndex({\n\t\tgetFn,\n\t\tfieldNormWeight\n\t});\n\tmyIndex.setKeys(keys.map(createKey));\n\tmyIndex.setSources(docs);\n\tmyIndex.create();\n\treturn myIndex;\n}\nfunction parseIndex(data, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\tconst { keys, records } = data;\n\tconst myIndex = new FuseIndex({\n\t\tgetFn,\n\t\tfieldNormWeight\n\t});\n\tmyIndex.setKeys(keys);\n\tmyIndex.setIndexRecords(records);\n\treturn myIndex;\n}\n\n//#endregion\n//#region src/search/bitap/convertMaskToIndices.ts\nfunction convertMaskToIndices(matchmask = [], minMatchCharLength = Config.minMatchCharLength) {\n\tconst indices = [];\n\tlet start = -1;\n\tlet end = -1;\n\tlet i = 0;\n\tfor (let len = matchmask.length; i < len; i += 1) {\n\t\tconst match = matchmask[i];\n\t\tif (match && start === -1) start = i;\n\t\telse if (!match && start !== -1) {\n\t\t\tend = i - 1;\n\t\t\tif (end - start + 1 >= minMatchCharLength) indices.push([start, end]);\n\t\t\tstart = -1;\n\t\t}\n\t}\n\tif (matchmask[i - 1] && i - start >= minMatchCharLength) indices.push([start, i - 1]);\n\treturn indices;\n}\n\n//#endregion\n//#region src/search/bitap/search.ts\nfunction search(text, pattern, patternAlphabet, { location = Config.location, distance = Config.distance, threshold = Config.threshold, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, includeMatches = Config.includeMatches, ignoreLocation = Config.ignoreLocation } = {}) {\n\tif (pattern.length > 32) throw new Error(PATTERN_LENGTH_TOO_LARGE(32));\n\tconst patternLen = pattern.length;\n\tconst textLen = text.length;\n\tconst expectedLocation = Math.max(0, Math.min(location, textLen));\n\tlet currentThreshold = threshold;\n\tlet bestLocation = expectedLocation;\n\tconst calcScore = (errors, currentLocation) => {\n\t\tconst accuracy = errors / patternLen;\n\t\tif (ignoreLocation) return accuracy;\n\t\tconst proximity = Math.abs(expectedLocation - currentLocation);\n\t\tif (!distance) return proximity ? 1 : accuracy;\n\t\treturn accuracy + proximity / distance;\n\t};\n\tconst computeMatches = minMatchCharLength > 1 || includeMatches;\n\tconst matchMask = computeMatches ? Array(textLen) : [];\n\tlet index;\n\twhile ((index = text.indexOf(pattern, bestLocation)) > -1) {\n\t\tconst score = calcScore(0, index);\n\t\tcurrentThreshold = Math.min(score, currentThreshold);\n\t\tbestLocation = index + patternLen;\n\t\tif (computeMatches) {\n\t\t\tlet i = 0;\n\t\t\twhile (i < patternLen) {\n\t\t\t\tmatchMask[index + i] = 1;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\t}\n\tbestLocation = -1;\n\tlet lastBitArr = [];\n\tlet finalScore = 1;\n\tlet bestErrors = 0;\n\tlet binMax = patternLen + textLen;\n\tconst mask = 1 << patternLen - 1;\n\tfor (let i = 0; i < patternLen; i += 1) {\n\t\tlet binMin = 0;\n\t\tlet binMid = binMax;\n\t\twhile (binMin < binMid) {\n\t\t\tif (calcScore(i, expectedLocation + binMid) <= currentThreshold) binMin = binMid;\n\t\t\telse binMax = binMid;\n\t\t\tbinMid = Math.floor((binMax - binMin) / 2 + binMin);\n\t\t}\n\t\tbinMax = binMid;\n\t\tlet start = Math.max(1, expectedLocation - binMid + 1);\n\t\tconst finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\t\tconst bitArr = Array(finish + 2);\n\t\tbitArr[finish + 1] = (1 << i) - 1;\n\t\tfor (let j = finish; j >= start; j -= 1) {\n\t\t\tconst currentLocation = j - 1;\n\t\t\tconst charMatch = patternAlphabet[text[currentLocation]];\n\t\t\tbitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch;\n\t\t\tif (i) bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1];\n\t\t\tif (bitArr[j] & mask) {\n\t\t\t\tfinalScore = calcScore(i, currentLocation);\n\t\t\t\tif (finalScore <= currentThreshold) {\n\t\t\t\t\tcurrentThreshold = finalScore;\n\t\t\t\t\tbestLocation = currentLocation;\n\t\t\t\t\tbestErrors = i;\n\t\t\t\t\tif (bestLocation <= expectedLocation) break;\n\t\t\t\t\tstart = Math.max(1, 2 * expectedLocation - bestLocation);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (calcScore(i + 1, expectedLocation) > currentThreshold) break;\n\t\tlastBitArr = bitArr;\n\t}\n\tif (computeMatches && bestLocation >= 0) {\n\t\tconst matchEnd = Math.min(textLen - 1, bestLocation + patternLen - 1 + bestErrors);\n\t\tfor (let k = bestLocation; k <= matchEnd; k += 1) if (patternAlphabet[text[k]]) matchMask[k] = 1;\n\t}\n\tconst result = {\n\t\tisMatch: bestLocation >= 0,\n\t\tscore: Math.max(.001, finalScore)\n\t};\n\tif (computeMatches) {\n\t\tconst indices = convertMaskToIndices(matchMask, minMatchCharLength);\n\t\tif (!indices.length) result.isMatch = false;\n\t\telse if (includeMatches) result.indices = indices;\n\t}\n\treturn result;\n}\n\n//#endregion\n//#region src/search/bitap/createPatternAlphabet.ts\nfunction createPatternAlphabet(pattern) {\n\tconst mask = {};\n\tfor (let i = 0, len = pattern.length; i < len; i += 1) {\n\t\tconst char = pattern.charAt(i);\n\t\tmask[char] = (mask[char] || 0) | 1 << len - i - 1;\n\t}\n\treturn mask;\n}\n\n//#endregion\n//#region src/helpers/mergeIndices.ts\nfunction mergeIndices(indices) {\n\tif (indices.length <= 1) return indices;\n\tindices.sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n\tconst merged = [indices[0]];\n\tfor (let i = 1, len = indices.length; i < len; i += 1) {\n\t\tconst last = merged[merged.length - 1];\n\t\tconst curr = indices[i];\n\t\tif (curr[0] <= last[1] + 1) last[1] = Math.max(last[1], curr[1]);\n\t\telse merged.push(curr);\n\t}\n\treturn merged;\n}\n\n//#endregion\n//#region src/helpers/diacritics.ts\nconst NON_DECOMPOSABLE_MAP = {\n\t\"ł\": \"l\",\n\t\"Ł\": \"L\",\n\t\"đ\": \"d\",\n\t\"Đ\": \"D\",\n\t\"ø\": \"o\",\n\t\"Ø\": \"O\",\n\t\"ħ\": \"h\",\n\t\"Ħ\": \"H\",\n\t\"ŧ\": \"t\",\n\t\"Ŧ\": \"T\",\n\t\"ı\": \"i\",\n\t\"ß\": \"ss\"\n};\nconst NON_DECOMPOSABLE_RE = new RegExp(\"[\" + Object.keys(NON_DECOMPOSABLE_MAP).join(\"\") + \"]\", \"g\");\nconst stripDiacritics = typeof String.prototype.normalize === \"function\" ? (str) => str.normalize(\"NFD\").replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, \"\").replace(NON_DECOMPOSABLE_RE, (ch) => NON_DECOMPOSABLE_MAP[ch]) : (str) => str;\n\n//#endregion\n//#region src/search/bitap/index.ts\nvar BitapSearch = class {\n\tconstructor(pattern, { location = Config.location, threshold = Config.threshold, distance = Config.distance, includeMatches = Config.includeMatches, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, ignoreLocation = Config.ignoreLocation } = {}) {\n\t\tthis.options = {\n\t\t\tlocation,\n\t\t\tthreshold,\n\t\t\tdistance,\n\t\t\tincludeMatches,\n\t\t\tfindAllMatches,\n\t\t\tminMatchCharLength,\n\t\t\tisCaseSensitive,\n\t\t\tignoreDiacritics,\n\t\t\tignoreLocation\n\t\t};\n\t\tpattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\t\tpattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n\t\tthis.pattern = pattern;\n\t\tthis.chunks = [];\n\t\tif (!this.pattern.length) return;\n\t\tconst addChunk = (pattern, startIndex) => {\n\t\t\tthis.chunks.push({\n\t\t\t\tpattern,\n\t\t\t\talphabet: createPatternAlphabet(pattern),\n\t\t\t\tstartIndex\n\t\t\t});\n\t\t};\n\t\tconst len = this.pattern.length;\n\t\tif (len > 32) {\n\t\t\tlet i = 0;\n\t\t\tconst remainder = len % 32;\n\t\t\tconst end = len - remainder;\n\t\t\twhile (i < end) {\n\t\t\t\taddChunk(this.pattern.substr(i, 32), i);\n\t\t\t\ti += 32;\n\t\t\t}\n\t\t\tif (remainder) {\n\t\t\t\tconst startIndex = len - 32;\n\t\t\t\taddChunk(this.pattern.substr(startIndex), startIndex);\n\t\t\t}\n\t\t} else addChunk(this.pattern, 0);\n\t}\n\tsearchIn(text) {\n\t\tconst { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\t\ttext = isCaseSensitive ? text : text.toLowerCase();\n\t\ttext = ignoreDiacritics ? stripDiacritics(text) : text;\n\t\tif (this.pattern === text) {\n\t\t\tconst result = {\n\t\t\t\tisMatch: true,\n\t\t\t\tscore: 0\n\t\t\t};\n\t\t\tif (includeMatches) result.indices = [[0, text.length - 1]];\n\t\t\treturn result;\n\t\t}\n\t\tconst { location, distance, threshold, findAllMatches, minMatchCharLength, ignoreLocation } = this.options;\n\t\tconst allIndices = [];\n\t\tlet totalScore = 0;\n\t\tlet hasMatches = false;\n\t\tthis.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n\t\t\tconst { isMatch, score, indices } = search(text, pattern, alphabet, {\n\t\t\t\tlocation: location + startIndex,\n\t\t\t\tdistance,\n\t\t\t\tthreshold,\n\t\t\t\tfindAllMatches,\n\t\t\t\tminMatchCharLength,\n\t\t\t\tincludeMatches,\n\t\t\t\tignoreLocation\n\t\t\t});\n\t\t\tif (isMatch) hasMatches = true;\n\t\t\ttotalScore += score;\n\t\t\tif (isMatch && indices) allIndices.push(...indices);\n\t\t});\n\t\tconst result = {\n\t\t\tisMatch: hasMatches,\n\t\t\tscore: hasMatches ? totalScore / this.chunks.length : 1\n\t\t};\n\t\tif (hasMatches && includeMatches) result.indices = mergeIndices(allIndices);\n\t\treturn result;\n\t}\n};\n\n//#endregion\n//#region src/search/extended/matchers.ts\nconst MULTI_MATCH_TYPES = new Set([\"fuzzy\", \"include\"]);\nfunction isInverse(type) {\n\treturn type.startsWith(\"inverse\");\n}\nconst matchers = [\n\t{\n\t\ttype: \"exact\",\n\t\tmultiRegex: /^=\"(.*)\"$/,\n\t\tsingleRegex: /^=(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text === pattern;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, pattern.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"include\",\n\t\tmultiRegex: /^'\"(.*)\"$/,\n\t\tsingleRegex: /^'(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"include\",\n\t\t\tsearch(text) {\n\t\t\t\tlet location = 0;\n\t\t\t\tlet index;\n\t\t\t\tconst indices = [];\n\t\t\t\tconst patternLen = pattern.length;\n\t\t\t\twhile ((index = text.indexOf(pattern, location)) > -1) {\n\t\t\t\t\tlocation = index + patternLen;\n\t\t\t\t\tindices.push([index, location - 1]);\n\t\t\t\t}\n\t\t\t\tconst isMatch = !!indices.length;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"prefix-exact\",\n\t\tmultiRegex: /^\\^\"(.*)\"$/,\n\t\tsingleRegex: /^\\^(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"prefix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.startsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, pattern.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-prefix-exact\",\n\t\tmultiRegex: /^!\\^\"(.*)\"$/,\n\t\tsingleRegex: /^!\\^(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-prefix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = !text.startsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-suffix-exact\",\n\t\tmultiRegex: /^!\"(.*)\"\\$$/,\n\t\tsingleRegex: /^!(.*)\\$$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-suffix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = !text.endsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"suffix-exact\",\n\t\tmultiRegex: /^\"(.*)\"\\$$/,\n\t\tsingleRegex: /^(.*)\\$$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"suffix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.endsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [text.length - pattern.length, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-exact\",\n\t\tmultiRegex: /^!\"(.*)\"$/,\n\t\tsingleRegex: /^!(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.indexOf(pattern) === -1;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"fuzzy\",\n\t\tmultiRegex: /^\"(.*)\"$/,\n\t\tsingleRegex: /^(.*)$/,\n\t\tcreate: (pattern, options = {}) => {\n\t\t\tconst bitap = new BitapSearch(pattern, {\n\t\t\t\tlocation: options.location ?? Config.location,\n\t\t\t\tthreshold: options.threshold ?? Config.threshold,\n\t\t\t\tdistance: options.distance ?? Config.distance,\n\t\t\t\tincludeMatches: options.includeMatches ?? Config.includeMatches,\n\t\t\t\tfindAllMatches: options.findAllMatches ?? Config.findAllMatches,\n\t\t\t\tminMatchCharLength: options.minMatchCharLength ?? Config.minMatchCharLength,\n\t\t\t\tisCaseSensitive: options.isCaseSensitive ?? Config.isCaseSensitive,\n\t\t\t\tignoreDiacritics: options.ignoreDiacritics ?? Config.ignoreDiacritics,\n\t\t\t\tignoreLocation: options.ignoreLocation ?? Config.ignoreLocation\n\t\t\t});\n\t\t\treturn {\n\t\t\t\ttype: \"fuzzy\",\n\t\t\t\tsearch(text) {\n\t\t\t\t\treturn bitap.searchIn(text);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n];\n\n//#endregion\n//#region src/search/extended/parseQuery.ts\nconst matchersLen = matchers.length;\nconst ESCAPED_PIPE = \"\\0\";\nconst OR_TOKEN = \"|\";\nfunction tokenize(pattern) {\n\tconst tokens = [];\n\tconst len = pattern.length;\n\tlet i = 0;\n\twhile (i < len) {\n\t\twhile (i < len && pattern[i] === \" \") i++;\n\t\tif (i >= len) break;\n\t\tlet j = i;\n\t\twhile (j < len && pattern[j] !== \" \" && pattern[j] !== \"\\\"\") j++;\n\t\tif (j < len && pattern[j] === \"\\\"\") {\n\t\t\tj++;\n\t\t\twhile (j < len) {\n\t\t\t\tif (pattern[j] === \"\\\"\") {\n\t\t\t\t\tconst next = j + 1;\n\t\t\t\t\tif (next >= len || pattern[next] === \" \") {\n\t\t\t\t\t\tj++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (pattern[next] === \"$\" && (next + 1 >= len || pattern[next + 1] === \" \")) {\n\t\t\t\t\t\tj += 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tj++;\n\t\t\t}\n\t\t\ttokens.push(pattern.substring(i, j));\n\t\t\ti = j;\n\t\t} else {\n\t\t\twhile (j < len && pattern[j] !== \" \") j++;\n\t\t\ttokens.push(pattern.substring(i, j));\n\t\t\ti = j;\n\t\t}\n\t}\n\treturn tokens;\n}\nfunction getMatch(pattern, exp) {\n\tconst matches = pattern.match(exp);\n\treturn matches ? matches[1] : null;\n}\nfunction parseQuery(pattern, options = {}) {\n\treturn pattern.replace(/\\\\\\|/g, ESCAPED_PIPE).split(OR_TOKEN).map((item) => {\n\t\tconst query = tokenize(item.replace(/\\u0000/g, \"|\").trim()).filter((item) => item && !!item.trim());\n\t\tconst results = [];\n\t\tfor (let i = 0, len = query.length; i < len; i += 1) {\n\t\t\tconst queryItem = query[i];\n\t\t\tlet found = false;\n\t\t\tlet idx = -1;\n\t\t\twhile (!found && ++idx < matchersLen) {\n\t\t\t\tconst def = matchers[idx];\n\t\t\t\tconst token = getMatch(queryItem, def.multiRegex);\n\t\t\t\tif (token) {\n\t\t\t\t\tresults.push(def.create(token, options));\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (found) continue;\n\t\t\tidx = -1;\n\t\t\twhile (++idx < matchersLen) {\n\t\t\t\tconst def = matchers[idx];\n\t\t\t\tconst token = getMatch(queryItem, def.singleRegex);\n\t\t\t\tif (token) {\n\t\t\t\t\tresults.push(def.create(token, options));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t});\n}\n\n//#endregion\n//#region src/search/extended/index.ts\nvar ExtendedSearch = class {\n\tconstructor(pattern, { isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, includeMatches = Config.includeMatches, minMatchCharLength = Config.minMatchCharLength, ignoreLocation = Config.ignoreLocation, findAllMatches = Config.findAllMatches, location = Config.location, threshold = Config.threshold, distance = Config.distance } = {}) {\n\t\tthis.query = null;\n\t\tthis.options = {\n\t\t\tisCaseSensitive,\n\t\t\tignoreDiacritics,\n\t\t\tincludeMatches,\n\t\t\tminMatchCharLength,\n\t\t\tfindAllMatches,\n\t\t\tignoreLocation,\n\t\t\tlocation,\n\t\t\tthreshold,\n\t\t\tdistance\n\t\t};\n\t\tpattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\t\tpattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n\t\tthis.pattern = pattern;\n\t\tthis.query = parseQuery(this.pattern, this.options);\n\t}\n\tstatic condition(_, options) {\n\t\treturn options.useExtendedSearch;\n\t}\n\tsearchIn(text) {\n\t\tconst query = this.query;\n\t\tif (!query) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\t\ttext = isCaseSensitive ? text : text.toLowerCase();\n\t\ttext = ignoreDiacritics ? stripDiacritics(text) : text;\n\t\tlet numMatches = 0;\n\t\tconst allIndices = [];\n\t\tlet totalScore = 0;\n\t\tlet hasInverse = false;\n\t\tfor (let i = 0, qLen = query.length; i < qLen; i += 1) {\n\t\t\tconst searchers = query[i];\n\t\t\tallIndices.length = 0;\n\t\t\tnumMatches = 0;\n\t\t\thasInverse = false;\n\t\t\tfor (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n\t\t\t\tconst matcher = searchers[j];\n\t\t\t\tconst { isMatch, indices, score } = matcher.search(text);\n\t\t\t\tif (isMatch) {\n\t\t\t\t\tnumMatches += 1;\n\t\t\t\t\ttotalScore += score;\n\t\t\t\t\tif (isInverse(matcher.type)) hasInverse = true;\n\t\t\t\t\tif (includeMatches) if (MULTI_MATCH_TYPES.has(matcher.type)) allIndices.push(...indices);\n\t\t\t\t\telse allIndices.push(indices);\n\t\t\t\t} else {\n\t\t\t\t\ttotalScore = 0;\n\t\t\t\t\tnumMatches = 0;\n\t\t\t\t\tallIndices.length = 0;\n\t\t\t\t\thasInverse = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (numMatches) {\n\t\t\t\tconst result = {\n\t\t\t\t\tisMatch: true,\n\t\t\t\t\tscore: totalScore / numMatches\n\t\t\t\t};\n\t\t\t\tif (hasInverse) result.hasInverse = true;\n\t\t\t\tif (includeMatches) result.indices = mergeIndices(allIndices);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t}\n};\n\n//#endregion\n//#region src/core/register.ts\nconst registeredSearchers = [];\nfunction register(...args) {\n\tregisteredSearchers.push(...args);\n}\nfunction createSearcher(pattern, options) {\n\tfor (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n\t\tconst searcherClass = registeredSearchers[i];\n\t\tif (searcherClass.condition(pattern, options)) return new searcherClass(pattern, options);\n\t}\n\treturn new BitapSearch(pattern, options);\n}\n\n//#endregion\n//#region src/core/queryParser.ts\nconst LogicalOperator = {\n\tAND: \"$and\",\n\tOR: \"$or\"\n};\nconst KeyType = {\n\tPATH: \"$path\",\n\tPATTERN: \"$val\"\n};\nconst isExpression = (query) => !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\nconst isPath = (query) => !!query[KeyType.PATH];\nconst isLeaf = (query) => !isArray(query) && isObject(query) && !isExpression(query);\nconst convertToExplicit = (query) => ({ [LogicalOperator.AND]: Object.keys(query).map((key) => ({ [key]: query[key] })) });\nfunction parse(query, options, { auto = true } = {}) {\n\tconst next = (query) => {\n\t\tif (isString(query)) {\n\t\t\tconst obj = {\n\t\t\t\tkeyId: null,\n\t\t\t\tpattern: query\n\t\t\t};\n\t\t\tif (auto) obj.searcher = createSearcher(query, options);\n\t\t\treturn obj;\n\t\t}\n\t\tconst keys = Object.keys(query);\n\t\tconst isQueryPath = isPath(query);\n\t\tif (!isQueryPath && keys.length > 1 && !isExpression(query)) return next(convertToExplicit(query));\n\t\tif (isLeaf(query)) {\n\t\t\tconst key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\t\t\tconst pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\t\t\tif (!isString(pattern)) throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key));\n\t\t\tconst obj = {\n\t\t\t\tkeyId: createKeyId(key),\n\t\t\t\tpattern\n\t\t\t};\n\t\t\tif (auto) obj.searcher = createSearcher(pattern, options);\n\t\t\treturn obj;\n\t\t}\n\t\tconst node = {\n\t\t\tchildren: [],\n\t\t\toperator: keys[0]\n\t\t};\n\t\tkeys.forEach((key) => {\n\t\t\tconst value = query[key];\n\t\t\tif (isArray(value)) value.forEach((item) => {\n\t\t\t\tnode.children.push(next(item));\n\t\t\t});\n\t\t});\n\t\treturn node;\n\t};\n\tif (!isExpression(query)) query = convertToExplicit(query);\n\treturn next(query);\n}\n\n//#endregion\n//#region src/core/computeScore.ts\nfunction computeScoreSingle(matches, { ignoreFieldNorm = Config.ignoreFieldNorm }) {\n\tlet totalScore = 1;\n\tmatches.forEach(({ key, norm, score }) => {\n\t\tconst weight = key ? key.weight : null;\n\t\ttotalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm));\n\t});\n\treturn totalScore;\n}\nfunction computeScore(results, { ignoreFieldNorm = Config.ignoreFieldNorm }) {\n\tresults.forEach((result) => {\n\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t});\n}\n\n//#endregion\n//#region src/tools/MaxHeap.ts\nvar MaxHeap = class {\n\tconstructor(limit) {\n\t\tthis.limit = limit;\n\t\tthis.heap = [];\n\t}\n\tget size() {\n\t\treturn this.heap.length;\n\t}\n\tshouldInsert(score) {\n\t\treturn this.size < this.limit || score < this.heap[0].score;\n\t}\n\tinsert(item) {\n\t\tif (this.size < this.limit) {\n\t\t\tthis.heap.push(item);\n\t\t\tthis._bubbleUp(this.size - 1);\n\t\t} else if (item.score < this.heap[0].score) {\n\t\t\tthis.heap[0] = item;\n\t\t\tthis._sinkDown(0);\n\t\t}\n\t}\n\textractSorted(sortFn) {\n\t\treturn this.heap.sort(sortFn);\n\t}\n\t_bubbleUp(i) {\n\t\tconst heap = this.heap;\n\t\twhile (i > 0) {\n\t\t\tconst parent = i - 1 >> 1;\n\t\t\tif (heap[i].score <= heap[parent].score) break;\n\t\t\tconst tmp = heap[i];\n\t\t\theap[i] = heap[parent];\n\t\t\theap[parent] = tmp;\n\t\t\ti = parent;\n\t\t}\n\t}\n\t_sinkDown(i) {\n\t\tconst heap = this.heap;\n\t\tconst len = heap.length;\n\t\tlet largest = i;\n\t\tdo {\n\t\t\ti = largest;\n\t\t\tconst left = 2 * i + 1;\n\t\t\tconst right = 2 * i + 2;\n\t\t\tif (left < len && heap[left].score > heap[largest].score) largest = left;\n\t\t\tif (right < len && heap[right].score > heap[largest].score) largest = right;\n\t\t\tif (largest !== i) {\n\t\t\t\tconst tmp = heap[i];\n\t\t\t\theap[i] = heap[largest];\n\t\t\t\theap[largest] = tmp;\n\t\t\t}\n\t\t} while (largest !== i);\n\t}\n};\n\n//#endregion\n//#region src/core/formatMatches.ts\nfunction formatMatches(result) {\n\tconst matches = [];\n\tresult.matches.forEach((match) => {\n\t\tif (!isDefined(match.indices) || !match.indices.length) return;\n\t\tconst obj = {\n\t\t\tindices: match.indices,\n\t\t\tvalue: match.value\n\t\t};\n\t\tif (match.key) obj.key = match.key.id;\n\t\tif (match.idx > -1) obj.refIndex = match.idx;\n\t\tmatches.push(obj);\n\t});\n\treturn matches;\n}\n\n//#endregion\n//#region src/core/format.ts\nfunction format(results, docs, { includeMatches = Config.includeMatches, includeScore = Config.includeScore } = {}) {\n\treturn results.map((result) => {\n\t\tconst { idx } = result;\n\t\tconst data = {\n\t\t\titem: docs[idx],\n\t\t\trefIndex: idx\n\t\t};\n\t\tif (includeMatches) data.matches = formatMatches(result);\n\t\tif (includeScore) data.score = result.score;\n\t\treturn data;\n\t});\n}\n\n//#endregion\n//#region src/search/token/analyzer.ts\nconst DEFAULT_TOKEN = /[\\p{L}\\p{M}\\p{N}_]+/gu;\nconst warned = /* @__PURE__ */ new WeakSet();\nfunction warnNonGlobal(regex) {\n\tif (!warned.has(regex)) {\n\t\twarned.add(regex);\n\t\tconsole.warn(`[Fuse] tokenize regex ${regex} lacks the global flag; only the first match per text will be returned. Add the 'g' flag.`);\n\t}\n}\nfunction resolveTokenize(tokenize) {\n\tif (typeof tokenize === \"function\") {\n\t\tlet validated = false;\n\t\treturn (text) => {\n\t\t\tconst result = tokenize(text);\n\t\t\tif (!validated) {\n\t\t\t\tvalidated = true;\n\t\t\t\tif (!Array.isArray(result) || result.some((t) => typeof t !== \"string\")) throw new Error(`[Fuse] tokenize function must return string[]; received ${Array.isArray(result) ? \"array containing non-strings\" : typeof result}.`);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t}\n\tif (tokenize instanceof RegExp) {\n\t\tif (!tokenize.global) warnNonGlobal(tokenize);\n\t\treturn (text) => text.match(tokenize) || [];\n\t}\n\treturn (text) => text.match(DEFAULT_TOKEN) || [];\n}\nfunction createAnalyzer({ isCaseSensitive = false, ignoreDiacritics = false, tokenize } = {}) {\n\tconst tokenizeFn = resolveTokenize(tokenize);\n\treturn { tokenize(text) {\n\t\tif (!isCaseSensitive) text = text.toLowerCase();\n\t\tif (ignoreDiacritics) text = stripDiacritics(text);\n\t\treturn tokenizeFn(text);\n\t} };\n}\n\n//#endregion\n//#region src/search/token/index.ts\nconst MAX_MASK_TERMS = 31;\nvar TokenSearch = class {\n\tstatic condition(_, options) {\n\t\treturn options.useTokenSearch;\n\t}\n\tconstructor(pattern, options) {\n\t\tthis.options = options;\n\t\tthis.analyzer = createAnalyzer({\n\t\t\tisCaseSensitive: options.isCaseSensitive,\n\t\t\tignoreDiacritics: options.ignoreDiacritics,\n\t\t\ttokenize: options.tokenize\n\t\t});\n\t\tconst queryTerms = this.analyzer.tokenize(pattern);\n\t\tconst { df, fieldCount } = options._invertedIndex;\n\t\tthis.termSearchers = [];\n\t\tthis.idfWeights = [];\n\t\tfor (const term of queryTerms) {\n\t\t\tthis.termSearchers.push(new BitapSearch(term, {\n\t\t\t\tlocation: options.location,\n\t\t\t\tthreshold: options.threshold,\n\t\t\t\tdistance: options.distance,\n\t\t\t\tincludeMatches: options.includeMatches,\n\t\t\t\tfindAllMatches: options.findAllMatches,\n\t\t\t\tminMatchCharLength: options.minMatchCharLength,\n\t\t\t\tisCaseSensitive: options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: options.ignoreDiacritics,\n\t\t\t\tignoreLocation: true\n\t\t\t}));\n\t\t\tconst docFreq = df.get(term) || 0;\n\t\t\tconst idf = Math.log(1 + (fieldCount - docFreq + .5) / (docFreq + .5));\n\t\t\tthis.idfWeights.push(idf);\n\t\t}\n\t\tthis.combineAll = options.tokenMatch === \"all\";\n\t\tthis.numTerms = this.termSearchers.length;\n\t\tthis.useMask = this.numTerms <= 31;\n\t}\n\tsearchIn(text) {\n\t\tif (!this.termSearchers.length) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst allIndices = [];\n\t\tlet weightedScore = 0;\n\t\tlet maxPossibleScore = 0;\n\t\tlet matchedCount = 0;\n\t\tlet matchedMask = 0;\n\t\tconst matchedTerms = this.combineAll && !this.useMask ? /* @__PURE__ */ new Set() : null;\n\t\tfor (let i = 0; i < this.termSearchers.length; i++) {\n\t\t\tconst result = this.termSearchers[i].searchIn(text);\n\t\t\tconst idf = this.idfWeights[i];\n\t\t\tmaxPossibleScore += idf;\n\t\t\tif (result.isMatch) {\n\t\t\t\tmatchedCount++;\n\t\t\t\tweightedScore += idf * (1 - result.score);\n\t\t\t\tif (result.indices) allIndices.push(...result.indices);\n\t\t\t\tif (this.combineAll) if (this.useMask) matchedMask |= 1 << i;\n\t\t\t\telse matchedTerms.add(i);\n\t\t\t}\n\t\t}\n\t\tif (matchedCount === 0) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst normalized = maxPossibleScore > 0 ? 1 - weightedScore / maxPossibleScore : 0;\n\t\tconst searchResult = {\n\t\t\tisMatch: true,\n\t\t\tscore: Math.max(.001, normalized)\n\t\t};\n\t\tif (this.options.includeMatches && allIndices.length) searchResult.indices = mergeIndices(allIndices);\n\t\tif (this.combineAll) {\n\t\t\tif (this.useMask) searchResult.matchedMask = matchedMask;\n\t\t\telse searchResult.matchedTerms = matchedTerms;\n\t\t\tsearchResult.termCount = this.numTerms;\n\t\t}\n\t\treturn searchResult;\n\t}\n};\n\n//#endregion\n//#region src/search/token/InvertedIndex.ts\nfunction addField(index, text, docIdx, analyzer) {\n\tconst tokens = analyzer.tokenize(text);\n\tif (!tokens.length) return;\n\tindex.fieldCount++;\n\tindex.docFieldCount.set(docIdx, (index.docFieldCount.get(docIdx) || 0) + 1);\n\tconst distinctTerms = new Set(tokens);\n\tlet perDocTerms = index.docTermFieldHits.get(docIdx);\n\tif (!perDocTerms) {\n\t\tperDocTerms = /* @__PURE__ */ new Map();\n\t\tindex.docTermFieldHits.set(docIdx, perDocTerms);\n\t}\n\tfor (const term of distinctTerms) {\n\t\tperDocTerms.set(term, (perDocTerms.get(term) || 0) + 1);\n\t\tindex.df.set(term, (index.df.get(term) || 0) + 1);\n\t}\n}\nfunction ingestRecord(index, record, keyCount, analyzer) {\n\tconst { i: docIdx, v, $: fields } = record;\n\tif (v !== void 0) {\n\t\taddField(index, v, docIdx, analyzer);\n\t\treturn;\n\t}\n\tif (!fields) return;\n\tfor (let keyIdx = 0; keyIdx < keyCount; keyIdx++) {\n\t\tconst value = fields[keyIdx];\n\t\tif (!value) continue;\n\t\tif (Array.isArray(value)) for (const sub of value) addField(index, sub.v, docIdx, analyzer);\n\t\telse addField(index, value.v, docIdx, analyzer);\n\t}\n}\nfunction buildInvertedIndex(records, keyCount, analyzer) {\n\tconst index = {\n\t\tfieldCount: 0,\n\t\tdf: /* @__PURE__ */ new Map(),\n\t\tdocFieldCount: /* @__PURE__ */ new Map(),\n\t\tdocTermFieldHits: /* @__PURE__ */ new Map()\n\t};\n\tfor (const record of records) ingestRecord(index, record, keyCount, analyzer);\n\treturn index;\n}\nfunction addToInvertedIndex(index, record, keyCount, analyzer) {\n\tingestRecord(index, record, keyCount, analyzer);\n}\nfunction removeFromInvertedIndex(index, docIdx) {\n\tconst fieldCount = index.docFieldCount.get(docIdx);\n\tif (fieldCount === void 0) return;\n\tindex.fieldCount -= fieldCount;\n\tindex.docFieldCount.delete(docIdx);\n\tconst perDocTerms = index.docTermFieldHits.get(docIdx);\n\tif (!perDocTerms) return;\n\tfor (const [term, hits] of perDocTerms) {\n\t\tconst next = (index.df.get(term) || 0) - hits;\n\t\tif (next <= 0) index.df.delete(term);\n\t\telse index.df.set(term, next);\n\t}\n\tindex.docTermFieldHits.delete(docIdx);\n}\nfunction removeAndShiftInvertedIndex(index, removedIndices) {\n\tif (removedIndices.length === 0) return;\n\tconst sorted = Array.from(new Set(removedIndices)).sort((a, b) => a - b);\n\tfor (const idx of sorted) removeFromInvertedIndex(index, idx);\n\tconst shift = (oldIdx) => {\n\t\tlet lo = 0;\n\t\tlet hi = sorted.length;\n\t\twhile (lo < hi) {\n\t\t\tconst mid = lo + hi >>> 1;\n\t\t\tif (sorted[mid] < oldIdx) lo = mid + 1;\n\t\t\telse hi = mid;\n\t\t}\n\t\treturn oldIdx - lo;\n\t};\n\tconst firstRemoved = sorted[0];\n\tconst shiftedDocFieldCount = /* @__PURE__ */ new Map();\n\tfor (const [oldKey, count] of index.docFieldCount) shiftedDocFieldCount.set(oldKey > firstRemoved ? shift(oldKey) : oldKey, count);\n\tindex.docFieldCount = shiftedDocFieldCount;\n\tconst shiftedDocTermFieldHits = /* @__PURE__ */ new Map();\n\tfor (const [oldKey, terms] of index.docTermFieldHits) shiftedDocTermFieldHits.set(oldKey > firstRemoved ? shift(oldKey) : oldKey, terms);\n\tindex.docTermFieldHits = shiftedDocTermFieldHits;\n}\n\n//#endregion\n//#region src/core/index.ts\nvar Fuse = class {\n\tconstructor(docs, options, index) {\n\t\tthis.options = {\n\t\t\t...Config,\n\t\t\t...options\n\t\t};\n\t\tif (this.options.useExtendedSearch && false);\n\t\tif (this.options.useTokenSearch && false);\n\t\tthis._keyStore = new KeyStore(this.options.keys);\n\t\tthis._docs = docs;\n\t\tthis._myIndex = null;\n\t\tthis._invertedIndex = null;\n\t\tthis.setCollection(docs, index);\n\t\tthis._lastQuery = null;\n\t\tthis._lastSearcher = null;\n\t}\n\t_getSearcher(query) {\n\t\tif (this._lastQuery === query) return this._lastSearcher;\n\t\tconst searcher = createSearcher(query, this._invertedIndex ? {\n\t\t\t...this.options,\n\t\t\t_invertedIndex: this._invertedIndex\n\t\t} : this.options);\n\t\tthis._lastQuery = query;\n\t\tthis._lastSearcher = searcher;\n\t\treturn searcher;\n\t}\n\tsetCollection(docs, index) {\n\t\tthis._docs = docs;\n\t\tif (index && !(index instanceof FuseIndex)) throw new Error(INCORRECT_INDEX_TYPE);\n\t\tthis._myIndex = index || createIndex(this.options.keys, this._docs, {\n\t\t\tgetFn: this.options.getFn,\n\t\t\tfieldNormWeight: this.options.fieldNormWeight\n\t\t});\n\t\tif (this.options.useTokenSearch) {\n\t\t\tconst analyzer = createAnalyzer({\n\t\t\t\tisCaseSensitive: this.options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: this.options.ignoreDiacritics,\n\t\t\t\ttokenize: this.options.tokenize\n\t\t\t});\n\t\t\tthis._invertedIndex = buildInvertedIndex(this._myIndex.records, this._myIndex.keys.length, analyzer);\n\t\t}\n\t\tthis._invalidateSearcherCache();\n\t}\n\tadd(doc) {\n\t\tif (!isDefined(doc)) return;\n\t\tthis._docs.push(doc);\n\t\tconst record = this._myIndex.add(doc, this._docs.length - 1);\n\t\tif (this._invertedIndex && record) {\n\t\t\tconst analyzer = createAnalyzer({\n\t\t\t\tisCaseSensitive: this.options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: this.options.ignoreDiacritics,\n\t\t\t\ttokenize: this.options.tokenize\n\t\t\t});\n\t\t\taddToInvertedIndex(this._invertedIndex, record, this._myIndex.keys.length, analyzer);\n\t\t}\n\t\tthis._invalidateSearcherCache();\n\t}\n\tremove(predicate = () => false) {\n\t\tconst results = [];\n\t\tconst indicesToRemove = [];\n\t\tfor (let i = 0, len = this._docs.length; i < len; i += 1) if (predicate(this._docs[i], i)) {\n\t\t\tresults.push(this._docs[i]);\n\t\t\tindicesToRemove.push(i);\n\t\t}\n\t\tif (indicesToRemove.length) {\n\t\t\tif (this._invertedIndex) removeAndShiftInvertedIndex(this._invertedIndex, indicesToRemove);\n\t\t\tconst toRemove = new Set(indicesToRemove);\n\t\t\tthis._docs = this._docs.filter((_, i) => !toRemove.has(i));\n\t\t\tthis._myIndex.removeAll(indicesToRemove);\n\t\t\tthis._invalidateSearcherCache();\n\t\t}\n\t\treturn results;\n\t}\n\tremoveAt(idx) {\n\t\tif (!Number.isInteger(idx) || idx < 0 || idx >= this._docs.length) throw new Error(INVALID_DOC_INDEX);\n\t\tif (this._invertedIndex) removeAndShiftInvertedIndex(this._invertedIndex, [idx]);\n\t\tconst doc = this._docs.splice(idx, 1)[0];\n\t\tthis._myIndex.removeAt(idx);\n\t\tthis._invalidateSearcherCache();\n\t\treturn doc;\n\t}\n\t_invalidateSearcherCache() {\n\t\tthis._lastQuery = null;\n\t\tthis._lastSearcher = null;\n\t}\n\tgetIndex() {\n\t\treturn this._myIndex;\n\t}\n\tsearch(query, options) {\n\t\tconst { limit = -1 } = options || {};\n\t\tconst { includeMatches, includeScore, shouldSort, sortFn, ignoreFieldNorm } = this.options;\n\t\tif (isString(query) && !query.trim()) {\n\t\t\tlet docs = this._docs.map((item, idx) => ({\n\t\t\t\titem,\n\t\t\t\trefIndex: idx\n\t\t\t}));\n\t\t\tif (isNumber(limit) && limit > -1) docs = docs.slice(0, limit);\n\t\t\treturn docs;\n\t\t}\n\t\tconst useHeap = isNumber(limit) && limit > 0 && isString(query);\n\t\tlet results;\n\t\tif (useHeap) {\n\t\t\tconst heap = new MaxHeap(limit);\n\t\t\tif (isString(this._docs[0])) this._searchStringList(query, {\n\t\t\t\theap,\n\t\t\t\tignoreFieldNorm\n\t\t\t});\n\t\t\telse this._searchObjectList(query, {\n\t\t\t\theap,\n\t\t\t\tignoreFieldNorm\n\t\t\t});\n\t\t\tresults = heap.extractSorted(sortFn);\n\t\t} else {\n\t\t\tresults = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query) : this._searchLogical(query);\n\t\t\tcomputeScore(results, { ignoreFieldNorm });\n\t\t\tif (shouldSort) results.sort(sortFn);\n\t\t\tif (isNumber(limit) && limit > -1) results = results.slice(0, limit);\n\t\t}\n\t\treturn format(results, this._docs, {\n\t\t\tincludeMatches,\n\t\t\tincludeScore\n\t\t});\n\t}\n\t_searchStringList(query, { heap, ignoreFieldNorm } = {}) {\n\t\tconst searcher = this._getSearcher(query);\n\t\tconst requireAllTokens = this.options.useTokenSearch && this.options.tokenMatch === \"all\";\n\t\tconst { records } = this._myIndex;\n\t\tconst results = heap ? null : [];\n\t\trecords.forEach(({ v: text, i: idx, n: norm }) => {\n\t\t\tif (!isDefined(text)) return;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices\n\t\t\t\t};\n\t\t\t\tif (requireAllTokens) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tconst matches = [match];\n\t\t\t\tif (!requireAllTokens || this._coversAllTokens(matches)) {\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\titem: text,\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\tmatches\n\t\t\t\t\t};\n\t\t\t\t\tif (heap) {\n\t\t\t\t\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t\t\t\t\t\tif (heap.shouldInsert(result.score)) heap.insert(result);\n\t\t\t\t\t} else results.push(result);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_searchLogical(query) {\n\t\tconst expression = parse(query, this.options);\n\t\tconst evaluate = (node, item, idx) => {\n\t\t\tif (!(\"children\" in node)) {\n\t\t\t\tconst { keyId, searcher } = node;\n\t\t\t\tlet matches;\n\t\t\t\tif (keyId === null) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tthis._myIndex.keys.forEach((key, keyIndex) => {\n\t\t\t\t\t\tmatches.push(...this._findMatches({\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tvalue: item[keyIndex],\n\t\t\t\t\t\t\tsearcher\n\t\t\t\t\t\t}));\n\t\t\t\t\t});\n\t\t\t\t} else matches = this._findMatches({\n\t\t\t\t\tkey: this._keyStore.get(keyId),\n\t\t\t\t\tvalue: this._myIndex.getValueForItemAtKeyId(item, keyId),\n\t\t\t\t\tsearcher\n\t\t\t\t});\n\t\t\t\tif (matches && matches.length) return [{\n\t\t\t\t\tidx,\n\t\t\t\t\titem,\n\t\t\t\t\tmatches\n\t\t\t\t}];\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst { children, operator } = node;\n\t\t\tconst res = [];\n\t\t\tfor (let i = 0, len = children.length; i < len; i += 1) {\n\t\t\t\tconst child = children[i];\n\t\t\t\tconst result = evaluate(child, item, idx);\n\t\t\t\tif (result.length) res.push(...result);\n\t\t\t\telse if (operator === LogicalOperator.AND) return [];\n\t\t\t}\n\t\t\treturn res;\n\t\t};\n\t\tconst records = this._myIndex.records;\n\t\tconst resultMap = /* @__PURE__ */ new Map();\n\t\tconst results = [];\n\t\trecords.forEach(({ $: item, i: idx }) => {\n\t\t\tif (isDefined(item)) {\n\t\t\t\tconst expResults = evaluate(expression, item, idx);\n\t\t\t\tif (expResults.length) {\n\t\t\t\t\tif (!resultMap.has(idx)) {\n\t\t\t\t\t\tresultMap.set(idx, {\n\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\tmatches: []\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresults.push(resultMap.get(idx));\n\t\t\t\t\t}\n\t\t\t\t\texpResults.forEach(({ matches }) => {\n\t\t\t\t\t\tresultMap.get(idx).matches.push(...matches);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_searchObjectList(query, { heap, ignoreFieldNorm } = {}) {\n\t\tconst searcher = this._getSearcher(query);\n\t\tconst requireAllTokens = this.options.useTokenSearch && this.options.tokenMatch === \"all\";\n\t\tconst { keys, records } = this._myIndex;\n\t\tconst results = heap ? null : [];\n\t\trecords.forEach(({ $: item, i: idx }) => {\n\t\t\tif (!isDefined(item)) return;\n\t\t\tconst matches = [];\n\t\t\tlet anyKeyFailed = false;\n\t\t\tlet hasInverse = false;\n\t\t\tkeys.forEach((key, keyIndex) => {\n\t\t\t\tconst keyMatches = this._findMatches({\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: item[keyIndex],\n\t\t\t\t\tsearcher\n\t\t\t\t});\n\t\t\t\tif (keyMatches.length) {\n\t\t\t\t\tmatches.push(...keyMatches);\n\t\t\t\t\tif (keyMatches[0].hasInverse) hasInverse = true;\n\t\t\t\t} else anyKeyFailed = true;\n\t\t\t});\n\t\t\tif (hasInverse && anyKeyFailed) return;\n\t\t\tif (matches.length && (!requireAllTokens || this._coversAllTokens(matches))) {\n\t\t\t\tconst result = {\n\t\t\t\t\tidx,\n\t\t\t\t\titem,\n\t\t\t\t\tmatches\n\t\t\t\t};\n\t\t\t\tif (heap) {\n\t\t\t\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t\t\t\t\tif (heap.shouldInsert(result.score)) heap.insert(result);\n\t\t\t\t} else results.push(result);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_findMatches({ key, value, searcher }) {\n\t\tif (!isDefined(value)) return [];\n\t\tconst matches = [];\n\t\tif (isArray(value)) value.forEach(({ v: text, i: idx, n: norm }) => {\n\t\t\tif (!isDefined(text)) return;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tidx,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices,\n\t\t\t\t\thasInverse: searchResult.hasInverse\n\t\t\t\t};\n\t\t\t\tif (searchResult.termCount !== void 0) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t});\n\t\telse {\n\t\t\tconst { v: text, n: norm } = value;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices,\n\t\t\t\t\thasInverse: searchResult.hasInverse\n\t\t\t\t};\n\t\t\t\tif (searchResult.termCount !== void 0) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t}\n\t\treturn matches;\n\t}\n\t_coversAllTokens(matches) {\n\t\tconst termCount = matches.length ? matches[0].termCount : void 0;\n\t\tif (termCount === void 0) return true;\n\t\tif (termCount <= 31) {\n\t\t\tlet coverage = 0;\n\t\t\tfor (let i = 0; i < matches.length; i++) coverage |= matches[i].matchedMask || 0;\n\t\t\treturn coverage === 2 ** termCount - 1;\n\t\t}\n\t\tconst coverage = /* @__PURE__ */ new Set();\n\t\tfor (let i = 0; i < matches.length; i++) {\n\t\t\tconst terms = matches[i].matchedTerms;\n\t\t\tif (terms) for (const t of terms) coverage.add(t);\n\t\t}\n\t\treturn coverage.size === termCount;\n\t}\n};\n\n//#endregion\n//#region src/entry.ts\nFuse.version = \"7.4.2\";\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\nFuse.match = function(pattern, text, options) {\n\tif (options && options.useTokenSearch) throw new Error(FUSE_MATCH_TOKEN_SEARCH_UNSUPPORTED);\n\treturn createSearcher(pattern, {\n\t\t...Config,\n\t\t...options\n\t}).searchIn(text);\n};\nFuse.parseQuery = parse;\nregister(ExtendedSearch);\nregister(TokenSearch);\nFuse.use = function(...plugins) {\n\tplugins.forEach((plugin) => register(plugin));\n};\nvar entry_default = Fuse;\n\n//#endregion\nexport { entry_default as default };","import { useEffect, useState } from 'preact/hooks';\n\nexport const MIN_SCHEDULED_AT = 6 * 60 * 1000; // 6 mins\nconst MAX_SCHEDULED_AT = 90 * 24 * 60 * 60 * 1000; // 90 days\n\nexport default function ScheduledAtField({ scheduledAt, setScheduledAt }) {\n if (!scheduledAt || !scheduledAt?.getTime) {\n // Not using \"instanceof Date\" check due to \"cross-realm\" issues\n console.warn('scheduledAt is invalid', scheduledAt);\n return;\n }\n const [minStr, setMinStr] = useState();\n const [maxStr, setMaxStr] = useState();\n const timezoneOffset = scheduledAt.getTimezoneOffset();\n\n useEffect(() => {\n function updateMinStr() {\n const min = new Date(Date.now() + MIN_SCHEDULED_AT);\n const str = new Date(min.getTime() - timezoneOffset * 60000)\n .toISOString()\n .slice(0, 16);\n setMinStr(str);\n }\n updateMinStr();\n\n function updateMaxStr() {\n const max = new Date(Date.now() + MAX_SCHEDULED_AT);\n const str = new Date(max.getTime() - timezoneOffset * 60000)\n .toISOString()\n .slice(0, 16);\n setMaxStr(str);\n }\n updateMaxStr();\n\n // Update every 10s\n const intervalId = setInterval(() => {\n updateMinStr();\n updateMaxStr();\n }, 1000 * 10);\n return () => clearInterval(intervalId);\n }, []);\n\n const defaultValue = scheduledAt\n ? new Date(scheduledAt.getTime() - scheduledAt.getTimezoneOffset() * 60000)\n .toISOString()\n .slice(0, 16)\n : null;\n\n return (\n <input\n type=\"datetime-local\"\n name=\"scheduledAt\"\n defaultValue={defaultValue}\n min={minStr}\n max={maxStr}\n required\n onChange={(e) => {\n setScheduledAt(new Date(e.target.value));\n }}\n />\n );\n}\n\nexport function getLocalTimezoneName() {\n const date = new Date();\n const formatter = new Intl.DateTimeFormat(undefined, {\n timeZoneName: 'long',\n });\n const parts = formatter.formatToParts(date);\n const timezoneName = parts.find(\n (part) => part.type === 'timeZoneName',\n )?.value;\n return timezoneName;\n}\n"],"file":"ScheduledAtField-D-Abfo4J.js"}