ghost 6.52.0 → 6.52.1

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 (220) hide show
  1. package/components/tryghost-kg-card-factory-5.2.3.tgz +0 -0
  2. package/components/tryghost-kg-clean-basic-html-4.3.3.tgz +0 -0
  3. package/components/tryghost-kg-converters-1.2.3.tgz +0 -0
  4. package/components/tryghost-kg-default-cards-10.3.3.tgz +0 -0
  5. package/components/tryghost-kg-default-nodes-2.1.3.tgz +0 -0
  6. package/components/tryghost-kg-default-transforms-1.3.3.tgz +0 -0
  7. package/components/tryghost-kg-html-to-lexical-1.3.3.tgz +0 -0
  8. package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
  9. package/components/tryghost-kg-markdown-html-renderer-7.2.3.tgz +0 -0
  10. package/components/tryghost-kg-utils-1.1.3.tgz +0 -0
  11. package/core/built/admin/assets/Growth-CczbRexv.js +3 -0
  12. package/core/built/admin/assets/Newsletters-rFycX4x8.js +1 -0
  13. package/core/built/admin/assets/Overview-DFubBJaR.js +1 -0
  14. package/core/built/admin/assets/Web-BDE2lN4_.js +2 -0
  15. package/core/built/admin/assets/{account-migration-DiS76mRS.js → account-migration-gvH5a8ea.js} +1 -1
  16. package/core/built/admin/assets/audience-CMWMCxFS.js +1 -0
  17. package/core/built/admin/assets/{automated-emails-Cel18g7S.js → automated-emails-293Lcj5S.js} +1 -1
  18. package/core/built/admin/assets/automations-BxnjfCKn.js +1 -0
  19. package/core/built/admin/assets/automations-kPr44AmD.js +1 -0
  20. package/core/built/admin/assets/bluesky-sharing-Cww54F3Y.js +1 -0
  21. package/core/built/admin/assets/{chunk.912.9d6df5a6da679d905bbf.js → chunk.251.dd82df30188bb633b4ae.js} +9 -9
  22. package/core/built/admin/assets/{chunk.730.2457b7fede040aa52c88.js → chunk.341.20e7d2936dfa5877deea.js} +3 -3
  23. package/core/built/admin/assets/{chunk.524.d6d399b571454ea0234d.js → chunk.524.697bf0ded48e7c994fc3.js} +5 -5
  24. package/core/built/admin/assets/{chunk.582.50a9a5cbab6996daf0fe.js → chunk.582.6b742e9ba932688c442c.js} +6 -6
  25. package/core/built/admin/assets/{code-editor-view-BLGzcLub.js → code-editor-view-DSY5RHLf.js} +1 -1
  26. package/core/built/admin/assets/comments-BwNUmaNM.js +1 -0
  27. package/core/built/admin/assets/constants-c-JNF9c2.js +1 -0
  28. package/core/built/admin/assets/container-CD33Rm0u.js +1 -0
  29. package/core/built/admin/assets/content-helpers-CNBPrwsi.js +1 -0
  30. package/core/built/admin/assets/date-range-select-BkkNN98H.js +1 -0
  31. package/core/built/admin/assets/disabled-sources-indicator-ChHTF69d.js +1 -0
  32. package/core/built/admin/assets/{domain-2REz20SO.js → domain-CGk9SMa-.js} +1 -1
  33. package/core/built/admin/assets/dropzone-9zocztX0.js +5 -0
  34. package/core/built/admin/assets/{edit-profile-7QEh0VtN.js → edit-profile-C0B2Kbsl.js} +1 -1
  35. package/core/built/admin/assets/editor-Bz2Sm2O8.js +8 -0
  36. package/core/built/admin/assets/{esm-CEtFqV1y.js → esm-CsHLKmLh.js} +1 -1
  37. package/core/built/admin/assets/explore-CpRAMnx7.js +1 -0
  38. package/core/built/admin/assets/feed-BRoOWghO.js +1 -0
  39. package/core/built/admin/assets/filter-sources-DhxqZID1.js +1 -0
  40. package/core/built/admin/assets/{filters-DUy8rzI5.js → filters-B8nLLYGO.js} +1 -1
  41. package/core/built/admin/assets/{gh-chart-DdBGmBS8.js → gh-chart-Cqy9gGq7.js} +1 -1
  42. package/core/built/admin/assets/{gift-link-modal-CSgyxenA.js → gift-link-modal-v55u0VUL.js} +1 -1
  43. package/core/built/admin/assets/growth-BIfM3w1p.js +1 -0
  44. package/core/built/admin/assets/{inbox-CTD-ix6u.js → inbox-CDX57fXK.js} +11 -11
  45. package/core/built/admin/assets/index-B5yxmQNp.js +69 -0
  46. package/core/built/admin/assets/inline-DdrWe7D3.js +1 -0
  47. package/core/built/admin/assets/{input-group-DkR63-nk.js → input-group-DUPGQck1.js} +1 -1
  48. package/core/built/admin/assets/{koenig-lexical-D09TwwLs.js → koenig-lexical-CUVpp-dC.js} +1 -1
  49. package/core/built/admin/assets/{kpi-card-Fr_HJH78.js → kpi-card-DyDbok3h.js} +1 -1
  50. package/core/built/admin/assets/kpi-helpers-Bx9IHIMq.js +1 -0
  51. package/core/built/admin/assets/{kpi-tabs-Dc4Nt4a5.js → kpi-tabs-DmUcThFc.js} +1 -1
  52. package/core/built/admin/assets/labels-DLL8dl-7.js +1 -0
  53. package/core/built/admin/assets/layout-B7K3SmL0.js +1 -0
  54. package/core/built/admin/assets/{links-CfAB2Yeq.js → link-helpers-DHG_8GIT.js} +1 -1
  55. package/core/built/admin/assets/list-page-COAUFrmV.js +1 -0
  56. package/core/built/admin/assets/members-BxWs_mjq.js +10 -0
  57. package/core/built/admin/assets/{modals-Bu-1Uxdc.js → modals-DF2sECo6.js} +4 -4
  58. package/core/built/admin/assets/moderation-DYKTx5x0.js +1 -0
  59. package/core/built/admin/assets/newsletter-C-ZD1dI8.js +1 -0
  60. package/core/built/admin/assets/note-oaRdU_5z.js +1 -0
  61. package/core/built/admin/assets/notifications-BF4fAiP1.js +1 -0
  62. package/core/built/admin/assets/{nql-lang-CvCSOQG3.js → nql-lang-BoHzkNg5.js} +1 -1
  63. package/core/built/admin/assets/{onboarding-route-BDaa9hd3.js → onboarding-route-SS-e9Aeb.js} +1 -1
  64. package/core/built/admin/assets/overview-Cbn6bIoR.js +1 -0
  65. package/core/built/admin/assets/post-analytics-Bk9-KEgB.js +1 -0
  66. package/core/built/admin/assets/post-analytics-context-C8t_048I.js +1 -0
  67. package/core/built/admin/assets/post-analytics-header-xTjcg4H0.js +1 -0
  68. package/core/built/admin/assets/post-analytics-provider-CqnWwLMk.js +1 -0
  69. package/core/built/admin/assets/{post-share-modal-59Ujf4t1.js → post-share-modal-ZUCX7JZo.js} +1 -1
  70. package/core/built/admin/assets/preferences-BgjgxiBB.js +5 -0
  71. package/core/built/admin/assets/profile-qIwaxKTm.js +1 -0
  72. package/core/built/admin/assets/{router-provider-DcttGCQn.js → router-provider-S8Wf6jdu.js} +1 -1
  73. package/core/built/admin/assets/select-Cp27ScMR.js +1 -0
  74. package/core/built/admin/assets/{settings-dLraw6et.js → settings-CdDfyF90.js} +1 -1
  75. package/core/built/admin/assets/{settings-CIslWMfh.js → settings-CynBh-YN.js} +4 -4
  76. package/core/built/admin/assets/{share-modal-CI3E67kW.js → share-modal-DTIFYNI1.js} +1 -1
  77. package/core/built/admin/assets/social-urls-DVvRfwEp.js +16 -0
  78. package/core/built/admin/assets/{sort-button-BYwI0xdN.js → sort-button-BHh5Ba1K.js} +1 -1
  79. package/core/built/admin/assets/source-icon--egCE7iN.js +1 -0
  80. package/core/built/admin/assets/stats-DkqCtrPh.js +1 -0
  81. package/core/built/admin/assets/stats-view-BvWWxegf.js +1 -0
  82. package/core/built/admin/assets/step-1-DWjw7rIn.js +1 -0
  83. package/core/built/admin/assets/{step-2-CVOvLQ2n.js → step-2-D1LrETIB.js} +1 -1
  84. package/core/built/admin/assets/{step-3-BsVXcpWU.js → step-3-BAdJdZw4.js} +2 -2
  85. package/core/built/admin/assets/{tabs-Bw8aEqsd.js → tabs-DSrHPjWP.js} +1 -1
  86. package/core/built/admin/assets/tags-BWZqBj19.js +1 -0
  87. package/core/built/admin/assets/{textarea-CNaqhk5P.js → textarea-CUVQjsrM.js} +1 -1
  88. package/core/built/admin/assets/{toggle-group-CMp1taHd.js → toggle-group-CrFpl-Xz.js} +1 -1
  89. package/core/built/admin/assets/{topic-filter-D2_9eEw4.js → topic-filter-jAxwwd9I.js} +1 -1
  90. package/core/built/admin/assets/types-uYQ1HgqL.js +1 -0
  91. package/core/built/admin/assets/url-helpers-CCyfRrKj.js +1 -0
  92. package/core/built/admin/assets/use-analytics-data-DXG7mpgK.js +1 -0
  93. package/core/built/admin/assets/use-filter-params-EoQBXfP3.js +1 -0
  94. package/core/built/admin/assets/use-growth-stats-DJoXxVfD.js +1 -0
  95. package/core/built/admin/assets/use-post-referrers-B-onYbuS.js +1 -0
  96. package/core/built/admin/assets/use-reply-chain-data-D8IFALoz.js +1 -0
  97. package/core/built/admin/assets/{use-tinybird-query-CNCaUn39.js → use-tinybird-query-BSL3iVCc.js} +1 -1
  98. package/core/built/admin/assets/{use-tinybird-token-1T80Odca.js → use-tinybird-token-DHgOnrNu.js} +1 -1
  99. package/core/built/admin/assets/virtual-list-AQrbRAXP.js +1 -0
  100. package/core/built/admin/assets/web-zEFi98DS.js +1 -0
  101. package/core/built/admin/index.html +6 -6
  102. package/core/server/services/automations/automations-api.js +20 -0
  103. package/core/server/services/automations/automations-api.ts +31 -0
  104. package/core/server/services/automations/poll.js +7 -7
  105. package/core/server/services/automations/poll.ts +12 -9
  106. package/core/server/services/email-analytics/email-analytics-provider-mailgun.js +2 -2
  107. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +1 -4
  108. package/core/server/services/email-analytics/email-analytics-service.js +5 -7
  109. package/core/server/services/webhooks/serialize.js +6 -5
  110. package/package.json +1 -1
  111. package/pnpm-lock.yaml +14 -14
  112. package/pnpm-workspace.yaml +5 -0
  113. package/core/built/admin/assets/Growth-Dx0vv-BS.js +0 -3
  114. package/core/built/admin/assets/Newsletters-v1GnbUjW.js +0 -1
  115. package/core/built/admin/assets/Overview-BgM7o-Z8.js +0 -1
  116. package/core/built/admin/assets/Web-DRv-83Ow.js +0 -2
  117. package/core/built/admin/assets/automations-DFLgH14-.js +0 -1
  118. package/core/built/admin/assets/automations-Dc4DUKBb.js +0 -1
  119. package/core/built/admin/assets/bluesky-sharing-Dk1RTUaz.js +0 -1
  120. package/core/built/admin/assets/comments-DgH1rC7w.js +0 -1
  121. package/core/built/admin/assets/constants-BlvYJTqz.js +0 -1
  122. package/core/built/admin/assets/content-helpers-BEgGpvyE.js +0 -1
  123. package/core/built/admin/assets/editor-u3BPqQed.js +0 -8
  124. package/core/built/admin/assets/en-DA2zVD_n.js +0 -1
  125. package/core/built/admin/assets/explore-BgHmdFVz.js +0 -1
  126. package/core/built/admin/assets/feed-Cs7-F3I5.js +0 -1
  127. package/core/built/admin/assets/filter-query-core-D6GjHUFB.js +0 -1
  128. package/core/built/admin/assets/growth-IkQZ1ZV9.js +0 -1
  129. package/core/built/admin/assets/index-BMhs4O3N.js +0 -69
  130. package/core/built/admin/assets/inline-C1CpHxuO.js +0 -1
  131. package/core/built/admin/assets/kpis-BTZ8cyw-.js +0 -1
  132. package/core/built/admin/assets/labels-sA9m188H.js +0 -5
  133. package/core/built/admin/assets/layout-szLkuQ88.js +0 -1
  134. package/core/built/admin/assets/list-page-DWkOdljb.js +0 -1
  135. package/core/built/admin/assets/main-layout-B-K8KliJ.js +0 -1
  136. package/core/built/admin/assets/members-PNNhalbu.js +0 -10
  137. package/core/built/admin/assets/moderation-DqnsNTiw.js +0 -1
  138. package/core/built/admin/assets/newsletter-BhuQeWFL.js +0 -1
  139. package/core/built/admin/assets/note-DFy2JTpP.js +0 -1
  140. package/core/built/admin/assets/notifications-BVu-JOkB.js +0 -1
  141. package/core/built/admin/assets/overview-Bhg8M7VS.js +0 -1
  142. package/core/built/admin/assets/pagemenu-C4paivNj.js +0 -1
  143. package/core/built/admin/assets/post-analytics-BhQUmZyA.js +0 -1
  144. package/core/built/admin/assets/post-analytics-context-Dy17HR1_.js +0 -1
  145. package/core/built/admin/assets/post-analytics-header-DAQep1VQ.js +0 -1
  146. package/core/built/admin/assets/posts/_react-dom-Blmuc0OL.js +0 -21
  147. package/core/built/admin/assets/posts/alert-dialog-DBJeQQTK.js +0 -154
  148. package/core/built/admin/assets/posts/app-provider-BJr9fdEC.js +0 -22
  149. package/core/built/admin/assets/posts/app-utils-9O53Czfw.js +0 -83
  150. package/core/built/admin/assets/posts/automations-BM0oBTjO.js +0 -275
  151. package/core/built/admin/assets/posts/automations-Dbp-gdHS.js +0 -223
  152. package/core/built/admin/assets/posts/avatar-kOk1tTvT.js +0 -144
  153. package/core/built/admin/assets/posts/badge-DnByIHe9.js +0 -25
  154. package/core/built/admin/assets/posts/button-Dd8Xreln.js +0 -40844
  155. package/core/built/admin/assets/posts/chunk-KS7C4IRE-ECXkcZq6.js +0 -7740
  156. package/core/built/admin/assets/posts/comments-D-7hbbdw.js +0 -8032
  157. package/core/built/admin/assets/posts/data-list-DdD_glQ-.js +0 -14219
  158. package/core/built/admin/assets/posts/dialog-DDkTy_np.js +0 -229
  159. package/core/built/admin/assets/posts/editor-D7-01KV_.js +0 -14633
  160. package/core/built/admin/assets/posts/empty-indicator-Ze-bwJ27.js +0 -38
  161. package/core/built/admin/assets/posts/filters-CmKfKtpS.js +0 -5611
  162. package/core/built/admin/assets/posts/get-site-timezone-DVbWc-NA.js +0 -39
  163. package/core/built/admin/assets/posts/growth-DlhFUzVg.js +0 -299
  164. package/core/built/admin/assets/posts/heading-BBl-8tMC.js +0 -92
  165. package/core/built/admin/assets/posts/hooks-gZAmj4Al.js +0 -5429
  166. package/core/built/admin/assets/posts/input-DuPLeCGW.js +0 -16
  167. package/core/built/admin/assets/posts/input-surface-ClwNIxfd.js +0 -17
  168. package/core/built/admin/assets/posts/jsx-runtime-BfZnKD4L.js +0 -95
  169. package/core/built/admin/assets/posts/koenig-lexical-DCHiJJou.js +0 -77579
  170. package/core/built/admin/assets/posts/kpis-Fsx0XmYK.js +0 -2061
  171. package/core/built/admin/assets/posts/label-D1wSl69p.js +0 -32
  172. package/core/built/admin/assets/posts/links-DLozzgMh.js +0 -1243
  173. package/core/built/admin/assets/posts/loading-indicator-BgU2kK3v.js +0 -44
  174. package/core/built/admin/assets/posts/main-layout-DDlTMrnF.js +0 -15
  175. package/core/built/admin/assets/posts/newsletter-DAQJ1GLe.js +0 -736
  176. package/core/built/admin/assets/posts/overview-G3MfRm-S.js +0 -426
  177. package/core/built/admin/assets/posts/page-header-CanFyB95.js +0 -284
  178. package/core/built/admin/assets/posts/popover-Cta8ZDHJ.js +0 -221
  179. package/core/built/admin/assets/posts/post-analytics-cS07-wo_.js +0 -121
  180. package/core/built/admin/assets/posts/post-analytics-context-D868SMoq.js +0 -150
  181. package/core/built/admin/assets/posts/post-analytics-header-CZYiuaEL.js +0 -42249
  182. package/core/built/admin/assets/posts/post-share-modal-BJfswZzf.js +0 -352
  183. package/core/built/admin/assets/posts/posts-CpusjBC0.js +0 -37
  184. package/core/built/admin/assets/posts/posts-app-context-CPC7dOlt.js +0 -26
  185. package/core/built/admin/assets/posts/posts.js +0 -145
  186. package/core/built/admin/assets/posts/router-provider-DrqpOc8m.js +0 -114
  187. package/core/built/admin/assets/posts/separator-DAZNzARU.js +0 -37
  188. package/core/built/admin/assets/posts/settings-CMfUn5Hq.js +0 -66
  189. package/core/built/admin/assets/posts/shade-app-DLbeExcd-NeEZjE3R.js +0 -4764
  190. package/core/built/admin/assets/posts/sheet-CEuv-0a5.js +0 -62
  191. package/core/built/admin/assets/posts/site-WJ6ldary.js +0 -10
  192. package/core/built/admin/assets/posts/skeleton-CO0qCdQF.js +0 -2426
  193. package/core/built/admin/assets/posts/source-icon-Bs6o84W3.js +0 -143
  194. package/core/built/admin/assets/posts/stats-B1Z8H0JT.js +0 -92
  195. package/core/built/admin/assets/posts/table-CbJ9bOpM.js +0 -77
  196. package/core/built/admin/assets/posts/tabs-BvzzwQ4P.js +0 -242
  197. package/core/built/admin/assets/posts/tags-D-4TwsD0.js +0 -462
  198. package/core/built/admin/assets/posts/tooltip-BI7VtFUY.js +0 -380
  199. package/core/built/admin/assets/posts/update-queries-DiUznIQ1.js +0 -60
  200. package/core/built/admin/assets/posts/users-UgRPrTKW.js +0 -83
  201. package/core/built/admin/assets/posts/value-DF_wOhJe.js +0 -415
  202. package/core/built/admin/assets/posts/virtual-list-window-DP63Onpm.js +0 -853
  203. package/core/built/admin/assets/posts/web-axp2l3kK.js +0 -8077
  204. package/core/built/admin/assets/preferences-ChOzBKcF.js +0 -5
  205. package/core/built/admin/assets/profile-DlcrYKay.js +0 -1
  206. package/core/built/admin/assets/select-BbtNHCBq.js +0 -1
  207. package/core/built/admin/assets/social-urls-DVzIHh2W.js +0 -16
  208. package/core/built/admin/assets/source-icon-Uuhttjun.js +0 -1
  209. package/core/built/admin/assets/source-utils-BchD0sF0.js +0 -1
  210. package/core/built/admin/assets/stats-CrlPzgdd.js +0 -1
  211. package/core/built/admin/assets/stats-view-UNMhTMCZ.js +0 -1
  212. package/core/built/admin/assets/step-1-C2HY6pyi.js +0 -1
  213. package/core/built/admin/assets/tags-DjCsJo0X.js +0 -1
  214. package/core/built/admin/assets/typeof-Ca-duI-z.js +0 -1
  215. package/core/built/admin/assets/url-helpers-DxA844rA.js +0 -1
  216. package/core/built/admin/assets/use-growth-stats-DNIGdI8h.js +0 -1
  217. package/core/built/admin/assets/use-reply-chain-data-DtEC2Azp.js +0 -1
  218. package/core/built/admin/assets/virtual-list-window-BTXGwpf5.js +0 -1
  219. package/core/built/admin/assets/web-Cj8VEw3s.js +0 -1
  220. /package/core/built/admin/assets/{chunk.912.9d6df5a6da679d905bbf.js.LICENSE.txt → chunk.251.dd82df30188bb633b4ae.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-DAXXjFlN.js";import{t}from"./react-Bb3IsNbi.js";import{t as n}from"./react-dom-C6aoWSfl.js";import{t as r}from"./jsx-runtime-CtMZ-PAS.js";import{l as i}from"./chunk-KS7C4IRE-DG9HTHQ3.js";import{$n as a,t as o}from"./button-DiwO9Rof.js";var s=e(t(),1),c=e(n(),1);function l(e,t,n){let r=Array(e);return new Proxy(r,{get(r,i,a){if(typeof i==`string`){let a=i.charCodeAt(0);if(a>=48&&a<=57){let a=+i;if(Number.isInteger(a)&&a>=0&&a<e){let e=r[a];if(!e){let i=t[a*2];e=r[a]={index:a,key:n(a),start:i,size:t[a*2+1],end:i+t[a*2+1],lane:0}}return e}}if(i===`length`)return e}return Reflect.get(r,i,a)}})}function u(e,t,n){let r=n.initialDeps??[],i,a=!0;function o(){let o=e();return o.length!==r.length||o.some((e,t)=>r[t]!==e)?(r=o,i=t(...o),n?.onChange&&!(a&&n.skipInitialOnChange)&&n.onChange(i),a=!1,i):i}return o.updateDeps=e=>{r=e},o}function d(e,t){if(e===void 0)throw Error(`Unexpected undefined${t?`: ${t}`:``}`);return e}var f=(e,t)=>Math.abs(e-t)<1.01,p=(e,t,n)=>{let r;return function(...i){e.clearTimeout(r),r=e.setTimeout(()=>t.apply(this,i),n)}},m,h=()=>{if(m!==void 0)return m;if(typeof navigator>`u`)return m=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return m=!0;let e=navigator.maxTouchPoints;return m=navigator.platform===`MacIntel`&&e!==void 0&&e>0},g=e=>{let{offsetWidth:t,offsetHeight:n}=e;return{width:t,height:n}},_=e=>e,v=e=>{let t=Math.max(e.startIndex-e.overscan,0),n=Math.min(e.endIndex+e.overscan,e.count-1)-t+1,r=Array(n);for(let e=0;e<n;e++)r[e]=t+e;return r},y=(e,t)=>{let n=e.scrollElement;if(!n)return;let r=e.targetWindow;if(!r)return;let i=e=>{let{width:n,height:r}=e;t({width:Math.round(n),height:Math.round(r)})};if(i(g(n)),!r.ResizeObserver)return()=>{};let a=new r.ResizeObserver(t=>{let r=()=>{let e=t[0];if(e?.borderBoxSize){let t=e.borderBoxSize[0];if(t){i({width:t.inlineSize,height:t.blockSize});return}}i(g(n))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(r):r()});return a.observe(n,{box:`border-box`}),()=>{a.unobserve(n)}},b={passive:!0},x=typeof window>`u`?!0:`onscrollend`in window,S=(e,t,n)=>{let r=e.scrollElement;if(!r)return;let i=e.targetWindow;if(!i)return;let a=e.options.useScrollendEvent&&x,o=0,s=a?null:p(i,()=>t(o,!1),e.options.isScrollingResetDelay),c=e=>()=>{o=n(r),s?.(),t(o,e)},l=c(!0),u=c(!1);return r.addEventListener(`scroll`,l,b),a&&r.addEventListener(`scrollend`,u,b),()=>{r.removeEventListener(`scroll`,l),a&&r.removeEventListener(`scrollend`,u)}},C=(e,t)=>S(e,t,t=>{let{horizontal:n,isRtl:r}=e.options;return n?t.scrollLeft*(r&&-1||1):t.scrollTop}),w=(e,t,n)=>{if(n.options.useCachedMeasurements){let t=n.indexFromElement(e),r=n.options.getItemKey(t);return n.itemSizeCache.get(r)??n.options.estimateSize(t)}if(t?.borderBoxSize){let e=t.borderBoxSize[0];if(e)return Math.round(e[n.options.horizontal?`inlineSize`:`blockSize`])}if(!t){let t=n.indexFromElement(e),r=n.options.getItemKey(t),i=n.itemSizeCache.get(r);if(i!==void 0)return i}return e[n.options.horizontal?`offsetWidth`:`offsetHeight`]},T=(e,{adjustments:t=0,behavior:n},r)=>{var i,a;(a=(i=r.scrollElement)?.scrollTo)==null||a.call(i,{[r.options.horizontal?`left`:`top`]:e+t,behavior:n})},E=class{constructor(e){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var e;return((e=this.targetWindow?.performance)?.now)?.call(e)??Date.now()},this.observer=(()=>{let e=null,t=()=>e||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:e=new this.targetWindow.ResizeObserver(e=>{e.forEach(e=>{let t=()=>{let t=e.target,n=this.indexFromElement(t);if(!t.isConnected){this.observer.unobserve(t);for(let[e,n]of this.elementsCache)if(n===t){this.elementsCache.delete(e);break}return}this.shouldMeasureDuringScroll(n)&&this.resizeItem(n,this.options.measureElement(t,e,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(t):t()})}));return{disconnect:()=>{var n;(n=t())==null||n.disconnect(),e=null},observe:e=>t()?.observe(e,{box:`border-box`}),unobserve:e=>t()?.unobserve(e)}})(),this.range=null,this.setOptions=e=>{let t={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:_,rangeExtractor:v,onChange:()=>{},measureElement:w,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:`data-index`,initialMeasurementsCache:[],lanes:1,anchorTo:`start`,followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:`estimate`,useCachedMeasurements:!1};for(let n in e){let r=e[n];r!==void 0&&(t[n]=r)}let n=this.options,r=null,i=null,a=!1;if(n!==void 0&&n.enabled&&t.enabled&&t.anchorTo===`end`&&this.scrollElement!==null){let e=n.count,o=t.count,s=this.getMeasurements(),c=e>0?s[0]?.key??n.getItemKey(0):null,l=e>0?s[e-1]?.key??n.getItemKey(e-1):null;if(o!==e||e>0&&o>0&&(t.getItemKey(0)!==c||t.getItemKey(o-1)!==l)){a=!0;let c=e>0?this.getVirtualItemForOffset(this.getScrollOffset())??s[0]:null;c&&(r=[c.key,this.getScrollOffset()-c.start]);let u=t.followOnAppend===!0?`auto`:t.followOnAppend||null;u&&o>e&&this.isAtEnd(n.scrollEndThreshold)&&(e===0||t.getItemKey(o-1)!==l)&&(i=u)}}this.options=t,a&&(this.pendingMin=0,this.itemSizeCacheVersion++);let o=!1,s=0;if(r&&this.scrollOffset!==null){let[e,t]=r,n=this.getMeasurements(),{count:i,getItemKey:a}=this.options,c=0;for(;c<i&&a(c)!==e;)c++;if(c<i){let e=n[c];if(e){let n=e.start+t;n!==this.scrollOffset&&(s=n-this.scrollOffset,this.scrollOffset=n,o=!0)}}}(o||i)&&(this.pendingScrollAnchor=[o?r[0]:null,o?r[1]:0,i,s])},this.notify=e=>{var t,n;(n=(t=this.options).onChange)==null||n.call(t,this,e)},this.maybeNotify=u(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{let e=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==e){if(this.cleanup(),!e){this.maybeNotify();return}if(this.scrollElement=e,this.scrollElement&&`ownerDocument`in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=this.scrollElement?.window??null,this.elementsCache.forEach(e=>{this.observer.observe(e)}),this.unsubs.push(this.options.observeElementRect(this,e=>{this.scrollRect=e,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(e,t)=>{if(t&&this._intendedScrollOffset===null&&e===this.scrollOffset)return;this._intendedScrollOffset!==null&&Math.abs(e-this._intendedScrollOffset)<1.5&&(e=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0;let n=this.getScrollOffset();this.scrollDirection=t?n===e?this.scrollDirection:n<e?`forward`:`backward`:null,this.scrollOffset=e,this.isScrolling=t,this._flushIosDeferredIfReady(),this.scrollState&&this.scheduleScrollReconcile(),this.maybeNotify()})),`addEventListener`in this.scrollElement){let e=this.scrollElement,t=()=>{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},n=()=>{this._iosTouching=!1,!(!h()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};e.addEventListener(`touchstart`,t,b),e.addEventListener(`touchend`,n,b),this.unsubs.push(()=>{e.removeEventListener(`touchstart`,t),e.removeEventListener(`touchend`,n),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}let t=this.pendingScrollAnchor;if(this.pendingScrollAnchor=null,t&&this.scrollElement&&this.options.enabled){let[e,n,r,i]=t;e!==null&&!r&&(h()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?i!==0&&(this._iosDeferredAdjustment+=i):this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})),r&&this.scrollToEnd({behavior:r})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;let e=this.getScrollOffset(),t=this.getMaxScrollOffset();if(e<0||e>t)return;let n=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(e,{adjustments:this.scrollAdjustments+=n,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?`width`:`height`]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset==`function`?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(e,t)=>{let n=new Map,r=new Map;for(let i=t-1;i>=0;i--){let t=e[i];if(n.has(t.lane))continue;let a=r.get(t.lane);if(a==null||t.end>a.end?r.set(t.lane,t):t.end<a.end&&n.set(t.lane,!0),n.size===this.options.lanes)break}return r.size===this.options.lanes?Array.from(r.values()).sort((e,t)=>e.end===t.end?e.index-t.index:e.end-t.end)[0]:void 0},this.getMeasurementOptions=u(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode],(e,t,n,r,i,a,o)=>(this.prevLanes!==void 0&&this.prevLanes!==a&&(this.lanesChangedFlag=!0),this.prevLanes=a,this.pendingMin=null,{count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i,lanes:a,laneAssignmentMode:o}),{key:!1}),this.getMeasurements=u(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i,lanes:a,laneAssignmentMode:o},s)=>{let c=this.itemSizeCache;if(!i)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>e)for(let t of this.laneAssignments.keys())t>=e&&this.laneAssignments.delete(t);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(e=>{this.itemSizeCache.set(e.key,e.size)}));let u=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===e&&(this.lanesSettling=!1),a===1){let i=this.options.gap,a=e*2,o=this._flatMeasurements;if(!o||o.length<a){let e=new Float64Array(a);o&&u>0&&e.set(o.subarray(0,u*2)),o=e,this._flatMeasurements=o}let s;if(u===0)s=t+n;else{let e=u-1;s=o[e*2]+o[e*2+1]+i}for(let t=u;t<e;t++){let e=r(t),n=c.get(e),a=typeof n==`number`?n:this.options.estimateSize(t);o[t*2]=s,o[t*2+1]=a,s+=a+i}let d=l(e,o,r);return this.measurementsCache=d,d}let d=this.measurementsCache.slice(0,u),f=Array(a).fill(void 0);for(let e=0;e<u;e++){let t=d[e];t&&(f[t.lane]=e)}for(let i=u;i<e;i++){let e=r(i),a=this.laneAssignments.get(i),s,l,u=o===`estimate`||c.has(e);if(a!==void 0&&this.options.lanes>1){s=a;let e=f[s],r=e===void 0?void 0:d[e];l=r?r.end+this.options.gap:t+n}else{let e=this.options.lanes===1?d[i-1]:this.getFurthestMeasurement(d,i);l=e?e.end+this.options.gap:t+n,s=e?e.lane:i%this.options.lanes,this.options.lanes>1&&u&&this.laneAssignments.set(i,s)}let p=c.get(e),m=typeof p==`number`?p:this.options.estimateSize(i),h=l+m;d[i]={index:i,start:l,size:m,end:h,key:e,lane:s},f[s]=i}return this.measurementsCache=d,d},{key:!1,debug:()=>this.options.debug}),this.calculateRange=u(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,t,n,r)=>e.length===0||t===0?(this.range=null,null):(this.range=k(e,t,n,r,r===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=u(()=>{let e=null,t=null,n=this.calculateRange();return n&&(e=n.startIndex,t=n.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,t]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,t]},(e,t,n,r,i)=>r===null||i===null?[]:e({startIndex:r,endIndex:i,overscan:t,count:n}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{let t=this.options.indexAttribute,n=e.getAttribute(t);return n?parseInt(n,10):(console.warn(`Missing attribute name '${t}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=e=>{if(!this.scrollState||this.scrollState.behavior!==`smooth`)return!0;let t=this.scrollState.index??this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)?.index;if(t!==void 0&&this.range){let n=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),r=Math.max(0,t-n),i=Math.min(this.options.count-1,t+n);return e>=r&&e<=i}return!0},this.measureElement=e=>{if(!e){this.elementsCache.forEach((e,t)=>{e.isConnected||(this.observer.unobserve(e),this.elementsCache.delete(t))});return}let t=this.indexFromElement(e),n=this.options.getItemKey(t),r=this.elementsCache.get(n);r!==e&&(r&&this.observer.unobserve(r),this.observer.observe(e),this.elementsCache.set(n,e)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(t)&&this.resizeItem(t,this.options.measureElement(e,void 0,this))},this.resizeItem=(e,t)=>{if(e<0||e>=this.options.count)return;let n,r,i,a=this._flatMeasurements;if(this.options.lanes===1&&a!==null)i=this.options.getItemKey(e),r=a[e*2],n=a[e*2+1];else{let t=this.measurementsCache[e];if(!t)return;i=t.key,r=t.start,n=t.size}let o=t-(this.itemSizeCache.get(i)??n);if(o!==0){let a=this.options.anchorTo===`end`&&this.scrollState?.behavior!==`smooth`&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,s=a?this.getTotalSize():0,c=this.scrollState?.behavior!==`smooth`&&(this.shouldAdjustScrollPositionOnItemSizeChange===void 0?r<this.getScrollOffset()+this.scrollAdjustments&&(!this.itemSizeCache.has(i)||this.scrollDirection!==`backward`):this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[e]??{index:e,key:i,start:r,size:n,end:r+n,lane:0},o,this));(this.pendingMin===null||e<this.pendingMin)&&(this.pendingMin=e),this.itemSizeCache.set(i,t),this.itemSizeCacheVersion++,a?this.applyScrollAdjustment(this.getTotalSize()-s):c&&this.applyScrollAdjustment(o),this.notify(!1)}},this.getVirtualItems=u(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,t)=>{let n=[];for(let r=0,i=e.length;r<i;r++){let i=t[e[r]];n.push(i)}return n},{key:!1,debug:()=>this.options.debug}),this.getVirtualItemForOffset=e=>{let t=this.getMeasurements();if(t.length===0)return;let n=this._flatMeasurements,r=this.options.lanes===1&&n!=null;return d(t[D(0,t.length-1,r?e=>n[e*2]:e=>d(t[e]).start,e)])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if(`scrollHeight`in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{let e=this.scrollElement.document.documentElement;return this.options.horizontal?e.scrollWidth-this.scrollElement.innerWidth:e.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(e=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=e,this.getOffsetForAlignment=(e,t,n=0)=>{if(!this.scrollElement)return 0;let r=this.getSize(),i=this.getScrollOffset();t===`auto`&&(t=e>=i+r?`end`:`start`),t===`center`?e+=(n-r)/2:t===`end`&&(e-=r);let a=this.getMaxScrollOffset();return Math.max(Math.min(a,e),0)},this.getOffsetForIndex=(e,t=`auto`)=>{e=Math.max(0,Math.min(e,this.options.count-1));let n=this.getSize(),r=this.getScrollOffset(),i=this.measurementsCache[e];if(!i)return;if(t===`auto`)if(i.end>=r+n-this.options.scrollPaddingEnd)t=`end`;else if(i.start<=r+this.options.scrollPaddingStart)t=`start`;else return[r,t];if(t===`end`&&e===this.options.count-1)return[this.getMaxScrollOffset(),t];let a=t===`end`?i.end+this.options.scrollPaddingEnd:i.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(a,t,i.size),t]},this.scrollToOffset=(e,{align:t=`start`,behavior:n=`auto`}={})=>{let r=this.getOffsetForAlignment(e,t),i=this.now();this.scrollState={index:null,align:t,behavior:n,startedAt:i,lastTargetOffset:r,stableFrames:0},this._scrollToOffset(r,{adjustments:void 0,behavior:n}),this.scheduleScrollReconcile()},this.scrollToIndex=(e,{align:t=`auto`,behavior:n=`auto`}={})=>{e=Math.max(0,Math.min(e,this.options.count-1));let r=this.getOffsetForIndex(e,t);if(!r)return;let[i,a]=r,o=this.now();this.scrollState={index:e,align:a,behavior:n,startedAt:o,lastTargetOffset:i,stableFrames:0},this._scrollToOffset(i,{adjustments:void 0,behavior:n}),this.scheduleScrollReconcile()},this.scrollBy=(e,{behavior:t=`auto`}={})=>{let n=this.getScrollOffset()+e,r=this.now();this.scrollState={index:null,align:`start`,behavior:t,startedAt:r,lastTargetOffset:n,stableFrames:0},this._scrollToOffset(n,{adjustments:void 0,behavior:t}),this.scheduleScrollReconcile()},this.scrollToEnd=({behavior:e=`auto`}={})=>{if(this.options.count>0){this.scrollToIndex(this.options.count-1,{align:`end`,behavior:e});return}this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:e})},this.getTotalSize=()=>{let e=this.getMeasurements(),t;if(e.length===0)t=this.options.paddingStart;else if(this.options.lanes===1){let n=e.length-1,r=this._flatMeasurements;t=r==null?e[n]?.end??0:r[n*2]+r[n*2+1]}else{let n=Array(this.options.lanes).fill(null),r=e.length-1;for(;r>=0&&n.some(e=>e===null);){let t=e[r];n[t.lane]===null&&(n[t.lane]=t.end),r--}t=Math.max(...n.filter(e=>e!==null))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{let e=[];if(this.itemSizeCache.size===0)return e;let t=this.getMeasurements();for(let n of t)n&&this.itemSizeCache.has(n.key)&&e.push({index:n.index,key:n.key,start:n.start,size:n.size,end:n.end,lane:n.lane});return e},this._scrollToOffset=(e,{adjustments:t,behavior:n})=>{this._intendedScrollOffset=e+(t??0),this.options.scrollToFn(e,{behavior:n,adjustments:t},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(e)}applyScrollAdjustment(e,t){e!==0&&(h()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?this._iosDeferredAdjustment+=e:(this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=e,behavior:t}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollAdjustments=0)))}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId??=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()})}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}let e=this.scrollState.index==null?void 0:this.getOffsetForIndex(this.scrollState.index,this.scrollState.align),t=e?e[0]:this.scrollState.lastTargetOffset,n=t!==this.scrollState.lastTargetOffset;if(!n&&f(t,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=1){this.getScrollOffset()!==t&&this._scrollToOffset(t,{adjustments:void 0,behavior:`auto`}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,n){let e=this.getSize()||600,n=Math.abs(t-this.getScrollOffset()),r=this.scrollState.behavior===`smooth`&&n>e;this.scrollState.lastTargetOffset=t,r||(this.scrollState.behavior=`auto`),this._scrollToOffset(t,{adjustments:void 0,behavior:r?`smooth`:`auto`})}this.scheduleScrollReconcile()}},D=(e,t,n,r)=>{for(;e<=t;){let i=(e+t)/2|0,a=n(i);if(a<r)e=i+1;else if(a>r)t=i-1;else return i}return e>0?e-1:0};function O(e,t,n){let r=0;for(;r<=t;){let i=(r+t)/2|0,a=e[i*2];if(a<n)r=i+1;else if(a>n)t=i-1;else return i}return r>0?r-1:0}function k(e,t,n,r,i){let a=e.length-1;if(e.length<=r)return{startIndex:0,endIndex:a};if(r===1&&i!==null){let e=O(i,a,n),r=e,o=n+t;for(;r<a&&i[r*2]+i[r*2+1]<o;)r++;return{startIndex:e,endIndex:r}}let o=D(0,a,t=>e[t].start,n),s=o;if(r===1)for(;s<a&&e[s].end<n+t;)s++;else if(r>1){let i=Array(r).fill(0);for(;s<a&&i.some(e=>e<n+t);){let t=e[s];i[t.lane]=t.end,s++}let c=Array(r).fill(n+t);for(;o>=0&&c.some(e=>e>=n);){let t=e[o];c[t.lane]=t.start,o--}o=Math.max(0,o-o%r),s=Math.min(a,s+(r-1-s%r))}return{startIndex:o,endIndex:s}}var A=typeof document<`u`?s.useLayoutEffect:s.useEffect;function j({useFlushSync:e=!0,directDomUpdates:t=!1,directDomUpdatesMode:n=`transform`,...r}){let i=s.useReducer(e=>e+1,0)[1],a=s.useRef({enabled:t,mode:n,container:null,lastSize:null,lastPositions:new WeakMap,prevRange:null});a.current.enabled=t,a.current.mode=n;let o=e=>{let t=a.current;if(!t.enabled||!t.container)return;let n=e.getTotalSize();if(n!==t.lastSize){t.lastSize=n;let r=e.options.horizontal?`width`:`height`;t.container.style[r]=`${n}px`}let r=!!e.options.horizontal,i=t.mode===`transform`,o=r?`left`:`top`,s=e.options.scrollMargin,c=e.getVirtualItems();for(let n of c){let a=n.start-s,c=e.elementsCache.get(n.key);c&&t.lastPositions.get(c)!==a&&(t.lastPositions.set(c,a),i?c.style.transform=r?`translate3d(${a}px, 0, 0)`:`translate3d(0, ${a}px, 0)`:c.style[o]=`${a}px`)}},l={...r,onChange:(t,n)=>{var s;let l=a.current,u=!0;if(l.enabled){o(t);let e=t.range,n=l.prevRange;u=!n||n.isScrolling!==t.isScrolling||n.startIndex!==e?.startIndex||n.endIndex!==e?.endIndex,u&&(l.prevRange=e?{startIndex:e.startIndex,endIndex:e.endIndex,isScrolling:t.isScrolling}:null)}u&&(e&&n?(0,c.flushSync)(i):i()),(s=r.onChange)==null||s.call(r,t,n)}},[u]=s.useState(()=>{let e=new E(l);return Object.assign(e,{containerRef:t=>{let n=a.current;if(n.container=t,n.lastSize=null,t&&n.enabled){let r=e.getTotalSize();n.lastSize=r;let i=e.options.horizontal?`width`:`height`;t.style[i]=`${r}px`}}})});return u.setOptions(l),A(()=>u._didMount(),[]),A(()=>u._willUpdate()),A(()=>{o(u)}),u}function M(e){return j({observeElementRect:y,observeElementOffset:C,scrollToFn:T,...e})}function N({items:e,totalItems:t,parentRef:n,hasNextPage:r,isFetchingNextPage:i,fetchNextPage:o,estimateSize:c=()=>100,overscan:l=5,getScrollElement:u=a}){let d=M({count:t,getScrollElement:()=>u(n.current),estimateSize:c,overscan:l}),f=d.getVirtualItems(),p=f.length>0?(f.at(0)?.start??0)-d.options.scrollMargin:0,m=f.length>0?d.getTotalSize()-(f.at(-1)?.end??0):0,h=f.map(t=>({virtualItem:t,key:t.key,item:e[t.index],props:{ref:d.measureElement,"data-index":t.index}})),g=h.at(-1)&&!h.at(-1)?.item;return(0,s.useEffect)(()=>{r&&g&&!i&&o()},[r,g,i,o]),{visibleItems:h,virtualizer:d,spaceBefore:p,spaceAfter:m}}var P=1e3,F=`ghostVirtualListWindow`;function I({totalItems:e,unlockedItemCount:t}){let n=Math.min(e,t);return{visibleItemCount:n,canLoadMore:e>n}}function L(e,t){return e+t}function R(e,t){return`${e}::${t}`}function z(e,t,n){let r=e?.[F];if(!r||typeof r!=`object`)return n;let i=r[t];return typeof i!=`number`||!Number.isFinite(i)?n:Math.max(1,Math.floor(i))}function B(e,t,n){if(typeof window>`u`)return;let r=e?.[F],i={...e??{},[F]:{...r&&typeof r==`object`?r:{},[t]:n}};window.history.replaceState(i,``)}function V(){if(!(typeof window>`u`))return window.history.state}function H(e,{resetKey:t,windowSize:n=P}={}){let{key:r,pathname:a,search:o}=i(),c=R(a,t??o),[l,u]=(0,s.useState)(()=>z(V(),c,n)),d=(0,s.useRef)(c);(0,s.useEffect)(()=>{if(d.current!==c){d.current=c,u(z(V(),c,n));return}B(V(),c,l)},[c,r,l,n]);let{visibleItemCount:f,canLoadMore:p}=I({totalItems:e,unlockedItemCount:l});return{visibleItemCount:f,canLoadMore:p,loadMore:()=>u(e=>L(e,n))}}var U=new Map,W=`ghostVirtualListScrollPosition`,G=150,K=500;function q(){if(!(typeof window>`u`))return window.history.state}function J(e){let t=e?.key;if(typeof t==`string`||typeof t==`number`)return String(t);let n=e?.idx;if(typeof n==`number`)return String(n)}function Y(e,t){let n=J(e);if(n)return`${n}::${t}`}function X(e,t){let n=e?.[W];if(!n||typeof n!=`object`)return;let r=n[t];if(typeof r==`number`)return r}function Z(e,t,n){if(typeof window>`u`)return;let r=e?.[W],i={...e??{},[W]:{...r&&typeof r==`object`?r:{},[t]:n}};window.history.replaceState(i,``)}function Q({parentRef:e,enabled:t=!0,isLoading:n=!1,getScrollElement:r=a}){let o=i(),[c,l]=(0,s.useState)(null),u=(0,s.useRef)(null),d=(0,s.useRef)(0),f=(0,s.useRef)(0),p=(0,s.useRef)(0),m=(0,s.useRef)(null),h=(0,s.useRef)(new Set),g=o.pathname+o.search;(0,s.useEffect)(()=>{if(!t||!e.current)return;let n=r(e.current);l(n)},[t,e,r]),(0,s.useEffect)(()=>{if(!t||!c)return;let e=q(),n=J(e),r=Y(e,g),i=()=>{m.current!==null&&(window.clearTimeout(m.current),m.current=null)},a=e=>{r&&U.set(r,e);let t=q();J(t)===n&&Z(t,g,e),f.current=Date.now(),p.current=e},o=({persistToHistory:e=!0}={})=>{if(i(),!e){let e=d.current;r&&U.set(r,e),f.current=Date.now(),p.current=e;return}a(d.current)},s=()=>{let e=Date.now();if(Math.abs(d.current-p.current)>=K||e-f.current>=G){i(),a(d.current);return}m.current===null&&(m.current=window.setTimeout(()=>{m.current=null,a(d.current)},G))},l=()=>{d.current=c.scrollTop,s()},u=()=>{o()};return d.current=c.scrollTop,c.addEventListener(`scroll`,l),window.addEventListener(`pagehide`,u),()=>{o({persistToHistory:!1}),c.removeEventListener(`scroll`,l),window.removeEventListener(`pagehide`,u)}},[t,g,c]),(0,s.useEffect)(()=>{let e=q(),r=Y(e,g),i=(r?U.get(r):void 0)??X(e,g);if(!(!t||!c||n)){if(i!==void 0&&u.current!==g){u.current=g;let e=0,t=()=>{for(let e of h.current)window.clearTimeout(e);h.current.clear()},n=(e,t)=>{let n=window.setTimeout(()=>{h.current.delete(n),e()},t);h.current.add(n)},r=()=>{if(e+=1,!c)return;let t=c.scrollTop,a=c.scrollHeight-c.clientHeight;if(i>a&&e<20){n(r,100);return}Math.abs(i-t)>5&&(c.scrollTop=Math.min(i,a))};return n(r,150),()=>t()}u.current=g}},[t,g,c,n])}var $=r(),ee=({isLoading:e,onClick:t,label:n=`Load more`,loadingLabel:r=`Loading more...`,className:i=`flex justify-center px-4 py-6`})=>{let a=!!e;return(0,$.jsx)(`div`,{className:i,children:(0,$.jsx)(o,{disabled:a,variant:`outline`,onClick:t,children:a?r:n})})};export{N as i,Q as n,H as r,ee as t};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-DAXXjFlN.js";import{t}from"./react-Bb3IsNbi.js";import{t as n}from"./jsx-runtime-CtMZ-PAS.js";import{r,t as i}from"./tabs-DSrHPjWP.js";import{t as a}from"./use-tinybird-query-BSL3iVCc.js";import{C as o,S as s,b as c,g as l,v as u,x as d,y as f}from"./stats-DkqCtrPh.js";import{g as p,m as ee}from"./chunk-KS7C4IRE-DG9HTHQ3.js";import{a as te,t as ne}from"./router-provider-S8Wf6jdu.js";import{$n as re,Rt as ie,Xn as m,Zn as h,j as g,t as _}from"./button-DiwO9Rof.js";import{t as v}from"./gh-chart-Cqy9gGq7.js";import{r as ae}from"./filters-B8nLLYGO.js";import{r as oe,t as se}from"./post-analytics-header-xTjcg4H0.js";import{a as y,c as b,i as x,l as S,n as C,o as w,r as T,s as E,t as D,u as O}from"./data-list-D3nkd86L.js";import{t as ce}from"./empty-indicator-Cl63eDpB.js";import{a as k,i as le,n as ue,o as A,r as de,s as j}from"./use-filter-params-EoQBXfP3.js";import{Ar as M,Cn as N,Dn as fe,Er as P,Nr as F,Or as I,Pi as pe,Sn as L,ai as R,bn as z,c as me,cr as B,dr as he,ei as V,jn as H,pr as ge,s as _e,u as U,ur as W,wn as ve,xn as ye,yn as be}from"./index-B5yxmQNp.js";import{t as G}from"./date-range-select-BkkNN98H.js";import{n as K,r as q,t as xe}from"./kpi-tabs-DmUcThFc.js";import{t as Se}from"./use-analytics-data-DXG7mpgK.js";import{n as Ce,t as we}from"./audience-CMWMCxFS.js";import{n as Te}from"./post-analytics-context-C8t_048I.js";import{i as Ee,n as J,r as De,t as Y}from"./kpi-helpers-Bx9IHIMq.js";var X=e(t(),1),Z=n(),Oe=({data:e,range:t})=>{let[n]=p(),[a,o]=(0,X.useState)(n.get(`tab`)||`visits`),s=J[a],c=ge(e||[],t,s.dataKey,`sum`)?.map(e=>{let t=Number(e[s.dataKey]);return{date:String(e.date),value:t,formattedValue:s.formatter(t),label:s.label}}),l=Y(e);return(0,Z.jsx)(u,{children:(0,Z.jsx)(f,{children:(0,Z.jsxs)(i,{defaultValue:a,variant:`kpis`,children:[(0,Z.jsxs)(r,{className:`-mx-6 hidden grid-cols-2 md:visible! md:grid!`,children:[(0,Z.jsx)(K,{value:`visits`,onClick:()=>{o(`visits`)},children:(0,Z.jsx)(q,{color:J.visits.color,label:`Unique visitors`,value:l.visits})}),(0,Z.jsx)(K,{value:`views`,onClick:()=>{o(`views`)},children:(0,Z.jsx)(q,{color:J.views.color,label:`Total views`,value:l.views})})]}),(0,Z.jsxs)(P,{children:[(0,Z.jsx)(F,{className:`md:hidden`,asChild:!0,children:(0,Z.jsxs)(xe,{children:[a===`visits`&&(0,Z.jsx)(q,{color:`var(--chart-blue)`,label:`Unique visitors`,value:l.visits}),a===`views`&&(0,Z.jsx)(q,{color:`var(--chart-teal)`,label:`Total views`,value:l.views})]})}),(0,Z.jsxs)(I,{align:`end`,className:`w-56`,children:[(0,Z.jsx)(M,{onClick:()=>o(`visits`),children:`Unique visitors`}),(0,Z.jsx)(M,{onClick:()=>o(`views`),children:`Total views`})]})]}),(0,Z.jsx)(`div`,{className:`my-4 [&_.recharts-cartesian-axis-tick-value]:fill-gray-500`,children:(0,Z.jsx)(v,{className:`-mb-3 aspect-auto h-[16vw] max-h-[320px] min-h-[180px] w-full`,color:s.color,data:c,id:s.dataKey,range:t,showHours:!0,syncId:`overview-charts`})})]})})})},Q=e(A(),1);Q.registerLocale(k);var ke=e=>_e[e]||Q.getName(e,`en`,{select:`alias`})||`Unknown`,Ae=e=>({"UNITED STATES":`US`,"UNITED STATES OF AMERICA":`US`,USA:`US`,"UNITED KINGDOM":`GB`,UK:`GB`,"GREAT BRITAIN":`GB`,NETHERLANDS:`NL`})[e.toUpperCase()]||(e.length>2?e.substring(0,2):e),$=({tableHeader:e,data:t,onLocationClick:n})=>(0,Z.jsxs)(D,{children:[e&&(0,Z.jsxs)(y,{children:[(0,Z.jsx)(x,{children:`Country`}),(0,Z.jsx)(x,{children:`Visitors`})]}),(0,Z.jsx)(T,{children:t.map(e=>{let t=ke(`${e.location}`)||`Unknown`,r=n&&e.location!==`Unknown`,i=e.location?e.location.toLowerCase():`unknown`;return(0,Z.jsxs)(O,{className:r?`cursor-pointer`:``,"data-testid":`location-row-${i}`,onClick:r?()=>n(e.location):void 0,children:[(0,Z.jsx)(C,{style:{width:`${e.percentage?Math.round(e.percentage*100):0}%`}}),(0,Z.jsx)(w,{className:`group-hover/data:max-w-[calc(100%-140px)]`,children:(0,Z.jsxs)(`div`,{className:`flex items-center space-x-3 overflow-hidden`,title:t||`Unknown`,children:[(0,Z.jsx)(j,{countryCode:`${Ae(e.location)}`,fallback:(0,Z.jsx)(`span`,{className:`flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white`,children:(0,Z.jsx)(V.SkullAndBones,{className:`size-3`})})}),(0,Z.jsx)(`div`,{className:`truncate font-medium`,children:t})]})}),(0,Z.jsxs)(E,{children:[(0,Z.jsx)(b,{children:m(Number(e.visits))}),(0,Z.jsx)(S,{children:h(e.percentage)})]})]},e.location||`unknown`)})})]}),je=({data:e,isLoading:t,onLocationClick:n})=>{let r=e.slice(0,10);return(0,Z.jsx)(Z.Fragment,{children:t?``:(0,Z.jsx)(Z.Fragment,{children:e&&e.length>0&&(0,Z.jsxs)(u,{className:`group/datalist`,"data-testid":`locations-card`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between p-6`,children:[(0,Z.jsxs)(s,{className:`p-0`,children:[(0,Z.jsx)(o,{children:`Locations`}),(0,Z.jsx)(c,{children:`Where are the readers of this post`})]}),(0,Z.jsx)(R,{className:`mr-2`,children:`Visitors`})]}),(0,Z.jsxs)(f,{className:`overflow-hidden`,children:[(0,Z.jsx)(H,{}),(0,Z.jsx)($,{data:r,tableHeader:!1,onLocationClick:n})]}),e.length>10&&(0,Z.jsx)(d,{children:(0,Z.jsxs)(be,{children:[(0,Z.jsx)(ve,{asChild:!0,children:(0,Z.jsxs)(_,{variant:`outline`,children:[`View all `,(0,Z.jsx)(g,{})]})}),(0,Z.jsxs)(z,{className:`overflow-y-auto pt-0 sm:max-w-[420px]`,children:[(0,Z.jsxs)(L,{className:`sticky top-0 z-40 -mx-6 bg-surface-elevated/60 p-6 backdrop-blur`,children:[(0,Z.jsx)(N,{children:`Top locations`}),(0,Z.jsx)(ye,{children:`Where are the readers of this post`})]}),(0,Z.jsx)(`div`,{className:`group/datalist`,children:(0,Z.jsx)($,{data:e,tableHeader:!0,onLocationClick:n})})]})]})})]})})})},Me=()=>{let e=te(),{postId:t}=ee(),{statsConfig:n,isLoading:r,site:i}=Se(),{range:o,setRange:s,post:c,isPostLoading:d}=Te(),{appSettings:p}=pe(),m=(0,X.useRef)(null),{filters:h,setFilters:g}=de({supportedFields:ue,trackingSource:`post-analytics`}),_=(0,X.useMemo)(()=>we(h.find(e=>e.field===`audience`)?.values),[h]);(0,X.useEffect)(()=>{!d&&c?.email_only&&e(`/posts/analytics/${t}`)},[d,c?.email_only,e,t]);let v=(0,X.useMemo)(()=>{if(!c?.published_at)return me.allTime.value;let e=he(c.published_at),{startDate:t,endDate:n}=W(o);return n.diff(t,`days`)+1>e?e:o},[c?.published_at,o]),{startDate:y,endDate:b,timezone:x}=W(v),S=(0,X.useCallback)(()=>{let e=re(m.current);e&&e.scrollTo({top:0,behavior:`smooth`})},[]),C=(0,X.useMemo)(()=>{let e={};return h.forEach(t=>{let n=t.field,r=t.values;if(n===`audience`)return;let i=r&&r.length>0&&r[0]!==null&&r[0]!==void 0,a=n===`source`&&r?.[0]===``;if(i&&(r[0]!==``||a)){let t=String(r[0]);e[n]=t}}),e},[h]),w=(0,X.useCallback)((e,t)=>{g(n=>n.find(t=>t.field===e)?n.map(n=>n.field===e?{...n,values:[t]}:n):[...n,ae(e,`is`,[t])]),S()},[g,S]),T=(0,X.useCallback)(e=>w(`location`,e),[w]),E=(0,X.useCallback)(e=>w(`source`,e),[w]),D=(0,X.useMemo)(()=>{let e={site_uuid:n?.id||``,date_from:B(y),date_to:B(b),timezone:x,member_status:Ce(_),post_uuid:``,...C};return!d&&c?.uuid?{...e,post_uuid:c.uuid}:e},[d,c,n?.id,y,b,x,_,C]),{data:O,loading:k}=a({endpoint:`api_kpis`,statsConfig:n,params:D}),{data:A,loading:j}=a({endpoint:`api_top_locations`,statsConfig:n,params:D}),{data:M,loading:N}=a({endpoint:`api_top_sources`,statsConfig:n,params:D}),P=(0,X.useMemo)(()=>A?.reduce((e,t)=>e+Number(t.visits),0)||0,[A]),F=(0,X.useMemo)(()=>M?M.reduce((e,t)=>e+Number(t.visits||0),0):0,[M]),I=i.url,L=i.icon,R=(0,X.useMemo)(()=>{let e=A?.map(e=>({location:String(e.location),visits:Number(e.visits),percentage:P>0?Number(e.visits)/P:0,isUnknown:U.includes(String(e.location))}))||[],t=e.filter(e=>!e.isUnknown),n=e.filter(e=>e.isUnknown),r=n.length>0?[{location:`Unknown`,visits:n.reduce((e,t)=>e+t.visits,0),percentage:n.reduce((e,t)=>e+t.percentage,0)}]:[];return[...t,...r]},[A,P]),z=r||d||k||j||N,V=Y(O),H=h.length>0;return p&&!p.analytics?.webAnalytics?(0,Z.jsx)(ne,{to:`/posts/analytics/${t}`,replace:!0}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(se,{currentTab:`Web`,children:[H&&(0,Z.jsx)(l,{children:(0,Z.jsx)(G,{range:o,onRangeChange:s})}),(0,Z.jsxs)(l,{className:`${H?`mt-0! [grid-area:subactions] lg:mt-[25px]!`:`[grid-area:actions]`}`,children:[(0,Z.jsx)(le,{filters:h,postUuid:c?.uuid,range:o,onChange:g}),!H&&(0,Z.jsx)(G,{range:o,onRangeChange:s})]})]}),(0,Z.jsx)(oe,{ref:m,children:z?(0,Z.jsx)(u,{className:`size-full`,variant:`plain`,children:(0,Z.jsx)(f,{className:`size-full items-center justify-center`,children:(0,Z.jsx)(fe,{})})}):O&&O.length!==0&&V.visits!==`0`?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Oe,{data:O,range:v}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-6 lg:grid lg:grid-cols-2`,children:[(0,Z.jsx)(je,{data:R,isLoading:j,onLocationClick:T}),(0,Z.jsx)(De,{data:M,range:v,siteIcon:L,siteUrl:I,totalVisitors:F,onSourceClick:E})]})]}):(0,Z.jsx)(`div`,{className:`grow`,children:(0,Z.jsx)(ce,{className:`h-full`,description:`Try adjusting filters to see more data.`,title:`No visitors ${Ee(o)}`,children:(0,Z.jsx)(ie,{strokeWidth:1.5})})})})]})};export{Me as default};
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <link rel="stylesheet" href="./assets/vendor-3bf602dfa6463c3400ffd81697767274.css">
5
5
  <link rel="stylesheet" href="./assets/ghost-978d925f8d4176d9f0c149706826cc66.css">
6
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.52%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%22d88afb2bac%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%2267732ba4da%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%22d9b9c1255f%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%22c0fb8ed587%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
6
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.52%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%22d88afb2bac%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%2267732ba4da%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%22d9b9c1255f%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
7
7
 
8
8
  <meta charset="UTF-8" />
9
9
 
@@ -20,7 +20,7 @@
20
20
 
21
21
  <link rel="shortcut icon" href="./assets/favicon-C_q1KHzv.ico" />
22
22
  <link rel="apple-touch-icon" href="./assets/apple-touch-icon-DhO18_4B.png" />
23
- <script type="module" crossorigin src="./assets/index-BMhs4O3N.js"></script>
23
+ <script type="module" crossorigin src="./assets/index-B5yxmQNp.js"></script>
24
24
  <link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-DAXXjFlN.js">
25
25
  <link rel="modulepreload" crossorigin href="./assets/react-Bb3IsNbi.js">
26
26
  <link rel="modulepreload" crossorigin href="./assets/react-dom-C6aoWSfl.js">
@@ -38,7 +38,7 @@
38
38
  <link rel="modulepreload" crossorigin href="./assets/dist-CqWm6lIL.js">
39
39
  <link rel="modulepreload" crossorigin href="./assets/chunk-KS7C4IRE-DG9HTHQ3.js">
40
40
  <link rel="modulepreload" crossorigin href="./assets/button-DiwO9Rof.js">
41
- <link rel="modulepreload" crossorigin href="./assets/router-provider-DcttGCQn.js">
41
+ <link rel="modulepreload" crossorigin href="./assets/router-provider-S8Wf6jdu.js">
42
42
  <link rel="modulepreload" crossorigin href="./assets/update-queries-C4CnvJaW.js">
43
43
  <link rel="modulepreload" crossorigin href="./assets/users-Y8qhvF1q.js">
44
44
  <link rel="stylesheet" crossorigin href="./assets/index-CeWc1b5F.css">
@@ -61,9 +61,9 @@
61
61
  <div id="ember-liquid-wormhole"></div>
62
62
  <div id="ember-notifications-wormhole"></div>
63
63
  <script src="./assets/vendor-25f0bb2b2de85265afdf33da79f14a44.js"></script>
64
- <script src="./assets/chunk.912.9d6df5a6da679d905bbf.js"></script>
65
- <script src="./assets/chunk.730.2457b7fede040aa52c88.js"></script>
66
- <script src="./assets/chunk.524.d6d399b571454ea0234d.js"></script>
64
+ <script src="./assets/chunk.251.dd82df30188bb633b4ae.js"></script>
65
+ <script src="./assets/chunk.341.20e7d2936dfa5877deea.js"></script>
66
+ <script src="./assets/chunk.524.697bf0ded48e7c994fc3.js"></script>
67
67
  <script src="./assets/ghost-6be8d01cf53ab18d25328c7424cb50d3.js"></script>
68
68
  </body>
69
69
  </html>
@@ -12,12 +12,15 @@ exports.fetchAndLockSteps = fetchAndLockSteps;
12
12
  exports.finishStepAndEnqueueNext = finishStepAndEnqueueNext;
13
13
  exports.markStepTerminal = markStepTerminal;
14
14
  exports.retryStep = retryStep;
15
+ exports.recordEmailSent = recordEmailSent;
15
16
  const errors_1 = __importDefault(require("@tryghost/errors"));
16
17
  const tpl_1 = __importDefault(require("@tryghost/tpl"));
17
18
  const bson_objectid_1 = __importDefault(require("bson-objectid"));
18
19
  const zod_1 = require("zod");
19
20
  const database_automations_repository_1 = require("./database-automations-repository");
20
21
  const fake_wait_hours_multiplier_1 = require("./fake-wait-hours-multiplier");
22
+ // @ts-expect-error Models currently lack type definitions.
23
+ const models_1 = require("../../models");
21
24
  const { knex } = require('../../data/db');
22
25
  const domainEvents = require('@tryghost/domain-events');
23
26
  const labs = require('../../../shared/labs');
@@ -299,3 +302,20 @@ async function markStepTerminal(...args) {
299
302
  async function retryStep(...args) {
300
303
  return await repository.retryStep(...args);
301
304
  }
305
+ async function recordEmailSent(options) {
306
+ await knex.transaction(async (transacting) => {
307
+ await models_1.AutomatedEmailRecipient.add({
308
+ member_id: options.memberId,
309
+ member_uuid: options.memberUuid,
310
+ member_email: options.memberEmail,
311
+ member_name: options.memberName,
312
+ automation_action_revision_id: options.automationActionRevisionId,
313
+ track_opens: options.trackOpens
314
+ }, { transacting });
315
+ await transacting('automation_action_revisions')
316
+ .where('id', options.automationActionRevisionId)
317
+ .update({
318
+ email_sent_count: transacting.raw('COALESCE(??, 0) + ?', ['email_sent_count', 1])
319
+ });
320
+ });
321
+ }
@@ -2,12 +2,15 @@ import errors from '@tryghost/errors';
2
2
  import tpl from '@tryghost/tpl';
3
3
  import ObjectId from 'bson-objectid';
4
4
  import {z} from 'zod';
5
+ import {type Knex} from 'knex';
5
6
  import {createDatabaseAutomationsRepository} from './database-automations-repository';
6
7
  import {parseFakeWaitHoursMultiplier} from './fake-wait-hours-multiplier';
7
8
  import type {
8
9
  AutomationsRepository,
9
10
  EditAutomationData
10
11
  } from './automations-repository';
12
+ // @ts-expect-error Models currently lack type definitions.
13
+ import {AutomatedEmailRecipient} from '../../models';
11
14
 
12
15
  const {knex} = require('../../data/db');
13
16
  const domainEvents = require('@tryghost/domain-events');
@@ -359,3 +362,31 @@ export async function markStepTerminal(...args: Parameters<AutomationsRepository
359
362
  export async function retryStep(...args: Parameters<AutomationsRepository['retryStep']>) {
360
363
  return await repository.retryStep(...args);
361
364
  }
365
+
366
+ export type RecordEmailSentOptions = Readonly<{
367
+ automationActionRevisionId: string;
368
+ memberEmail: string;
369
+ memberId: string;
370
+ memberName: string | null;
371
+ memberUuid: string;
372
+ trackOpens: boolean;
373
+ }>;
374
+
375
+ export async function recordEmailSent(options: RecordEmailSentOptions): Promise<void> {
376
+ await knex.transaction(async (transacting: Knex.Transaction) => {
377
+ await AutomatedEmailRecipient.add({
378
+ member_id: options.memberId,
379
+ member_uuid: options.memberUuid,
380
+ member_email: options.memberEmail,
381
+ member_name: options.memberName,
382
+ automation_action_revision_id: options.automationActionRevisionId,
383
+ track_opens: options.trackOpens
384
+ }, {transacting});
385
+
386
+ await transacting('automation_action_revisions')
387
+ .where('id', options.automationActionRevisionId)
388
+ .update({
389
+ email_sent_count: transacting.raw('COALESCE(??, 0) + ?', ['email_sent_count', 1])
390
+ });
391
+ });
392
+ }
@@ -124,14 +124,14 @@ const processStep = async ({ automationsApi, memberWelcomeEmailService, step })
124
124
  memberStatus
125
125
  });
126
126
  try {
127
- await models_1.AutomatedEmailRecipient.add({
128
- member_id: step.member_id,
129
- member_uuid: member.get('uuid'),
130
- member_email: member.get('email'),
131
- member_name: member.get('name'),
132
- automation_action_revision_id: step.automation_action_revision_id,
127
+ await automationsApi.recordEmailSent({
128
+ automationActionRevisionId: step.automation_action_revision_id,
129
+ memberEmail: member.get('email'),
130
+ memberId: step.member_id,
131
+ memberName: member.get('name'),
132
+ memberUuid: member.get('uuid'),
133
133
  // TODO(NY-1439) Don't always set this to false.
134
- track_opens: false
134
+ trackOpens: false
135
135
  });
136
136
  }
137
137
  catch (err) {
@@ -1,10 +1,11 @@
1
1
  import type {AutomationStepToRun, AutomationsRepository} from './automations-repository';
2
+ import type {RecordEmailSentOptions} from './automations-api';
2
3
  import logging from '@tryghost/logging';
3
4
  import errors from '@tryghost/errors';
4
5
  import {MEMBER_WELCOME_EMAIL_ELIGIBLE_STATUSES, MEMBER_WELCOME_EMAIL_SLUGS} from '../member-welcome-emails/constants';
5
6
  import {MAX_ATTEMPTS, MAX_STEPS_PER_BATCH, RETRY_DELAY_MS} from './constants';
6
7
  // @ts-expect-error Models currently lack type definitions.
7
- import {AutomatedEmailRecipient, Member} from '../../models';
8
+ import {Member} from '../../models';
8
9
 
9
10
  type MemberWelcomeEmailService = {
10
11
  init: () => unknown;
@@ -40,7 +41,9 @@ type PollOptions = {
40
41
  'finishStepAndEnqueueNext' |
41
42
  'markStepTerminal' |
42
43
  'retryStep'
43
- >;
44
+ > & {
45
+ recordEmailSent(options: RecordEmailSentOptions): Promise<void>;
46
+ };
44
47
  enqueueAnotherPollAt: (date: Readonly<Date>) => unknown;
45
48
  memberWelcomeEmailService: MemberWelcomeEmailService;
46
49
  };
@@ -190,14 +193,14 @@ const processStep = async ({
190
193
  memberStatus
191
194
  });
192
195
  try {
193
- await AutomatedEmailRecipient.add({
194
- member_id: step.member_id,
195
- member_uuid: member.get('uuid'),
196
- member_email: member.get('email'),
197
- member_name: member.get('name'),
198
- automation_action_revision_id: step.automation_action_revision_id,
196
+ await automationsApi.recordEmailSent({
197
+ automationActionRevisionId: step.automation_action_revision_id,
198
+ memberEmail: member.get('email'),
199
+ memberId: step.member_id,
200
+ memberName: member.get('name'),
201
+ memberUuid: member.get('uuid'),
199
202
  // TODO(NY-1439) Don't always set this to false.
200
- track_opens: false
203
+ trackOpens: false
201
204
  });
202
205
  } catch (err) {
203
206
  logging.error({
@@ -7,8 +7,8 @@ const DEFAULT_TAGS = ['bulk-email'];
7
7
  class EmailAnalyticsProviderMailgun {
8
8
  mailgunClient;
9
9
 
10
- constructor({config, settings, labs}) {
11
- this.mailgunClient = new MailgunClient({config, settings, labs});
10
+ constructor({config, settings}) {
11
+ this.mailgunClient = new MailgunClient({config, settings});
12
12
  this.tags = [...DEFAULT_TAGS];
13
13
 
14
14
  if (config.get('bulkEmail:mailgun:tag')) {
@@ -18,7 +18,6 @@ class EmailAnalyticsServiceWrapper {
18
18
  const StartEmailAnalyticsJobEvent = require('./events/start-email-analytics-job-event');
19
19
  const domainEvents = require('@tryghost/domain-events');
20
20
  const settings = require('../../../shared/settings-cache');
21
- const labs = require('../../../shared/labs');
22
21
  const db = require('../../data/db');
23
22
  const queries = require('./lib/queries');
24
23
  const membersService = require('../members');
@@ -51,9 +50,7 @@ class EmailAnalyticsServiceWrapper {
51
50
  config,
52
51
  settings,
53
52
  eventProcessor,
54
- providers: [
55
- new MailgunProvider({config, settings, labs})
56
- ],
53
+ provider: new MailgunProvider({config, settings}),
57
54
  queries,
58
55
  domainEvents,
59
56
  prometheusClient
@@ -59,7 +59,7 @@ module.exports = class EmailAnalyticsService {
59
59
  settings;
60
60
  queries;
61
61
  eventProcessor;
62
- providers;
62
+ provider;
63
63
 
64
64
  /**
65
65
  * @type {FetchData}
@@ -99,16 +99,16 @@ module.exports = class EmailAnalyticsService {
99
99
  * @param {object} dependencies.settings
100
100
  * @param {object} dependencies.queries
101
101
  * @param {EmailEventProcessor} dependencies.eventProcessor
102
- * @param {object} dependencies.providers
102
+ * @param {object} dependencies.provider
103
103
  * @param {import('@tryghost/domain-events')} dependencies.domainEvents
104
104
  * @param {import('@tryghost/prometheus-metrics')} dependencies.prometheusClient
105
105
  */
106
- constructor({config, settings, queries, eventProcessor, providers, domainEvents, prometheusClient}) {
106
+ constructor({config, settings, queries, eventProcessor, provider, domainEvents, prometheusClient}) {
107
107
  this.config = config;
108
108
  this.settings = settings;
109
109
  this.queries = queries;
110
110
  this.eventProcessor = eventProcessor;
111
- this.providers = providers;
111
+ this.provider = provider;
112
112
  this.domainEvents = domainEvents;
113
113
  this.prometheusClient = prometheusClient;
114
114
 
@@ -451,9 +451,7 @@ module.exports = class EmailAnalyticsService {
451
451
  };
452
452
 
453
453
  try {
454
- for (const provider of this.providers) {
455
- await provider.fetchLatest(processBatch, {begin, end, maxEvents, events: eventTypes});
456
- }
454
+ await this.provider.fetchLatest(processBatch, {begin, end, maxEvents, events: eventTypes});
457
455
  } catch (err) {
458
456
  if (err.message !== 'Fetching canceled') {
459
457
  logging.error('[EmailAnalytics] Error while fetching');
@@ -17,6 +17,8 @@ module.exports = async (event, model) => {
17
17
  let current = {};
18
18
  let previous = {};
19
19
 
20
+ const changed = model._changed ? Object.keys(model._changed) : [];
21
+
20
22
  if (Object.keys(model.attributes).length) {
21
23
  let frame = {options: {previous: false, context: {user: true}}};
22
24
 
@@ -45,7 +47,7 @@ module.exports = async (event, model) => {
45
47
  current = frame.response[docName][0];
46
48
  }
47
49
 
48
- if (Object.keys(model._previousAttributes).length) {
50
+ if (changed.length && Object.keys(model._previousAttributes).length) {
49
51
  const frame = {options: {previous: true, context: {user: true}}};
50
52
 
51
53
  switch (docName) {
@@ -62,15 +64,14 @@ module.exports = async (event, model) => {
62
64
  .serializers
63
65
  .handle
64
66
  .output(model, {docName: docName, method: 'read'}, api.serializers.output, frame);
65
- previous = frame.response[docName][0];
67
+ previous = _.pick(frame.response[docName][0], changed);
66
68
  }
67
69
 
68
- const changed = model._changed ? Object.keys(model._changed) : [];
69
70
 
70
71
  const payload = {
71
72
  [docName.replace(/s$/, '')]: {
72
- current: current,
73
- previous: _.pick(previous, changed)
73
+ current,
74
+ previous
74
75
  }
75
76
  };
76
77
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "6.52.0",
3
+ "version": "6.52.1",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
package/pnpm-lock.yaml CHANGED
@@ -3320,48 +3320,48 @@ packages:
3320
3320
  resolution: {integrity: sha512-Wlwr1R8oeU6HLB7RB1g6VxAH6VEZIaXTVV2GdvCbipK+TA0MIo6YOQUgrIky25RpyRqKXR0UuDIfXDB4+S+GgQ==}
3321
3321
 
3322
3322
  '@tryghost/kg-card-factory@file:components/tryghost-kg-card-factory-5.2.3.tgz':
3323
- resolution: {integrity: sha512-0jG8H8I/ffsDmGRrQA7leeLHuvj75CyEyqjeqFtWUisOaPfWD+vqWK9X7UOlZpKrpBz5Ly+CQWhyFPmv6plH3w==, tarball: file:components/tryghost-kg-card-factory-5.2.3.tgz}
3323
+ resolution: {integrity: sha512-BZ7cwHWtVWwAXN/gBHjbGn+Wh+XCoHSEZO6LQYx7OrcST8amUQ4cMjDB9jHxTWNHAmwRYr4ghcMgpKg2uaeJCA==, tarball: file:components/tryghost-kg-card-factory-5.2.3.tgz}
3324
3324
  version: 5.2.3
3325
3325
  engines: {node: ^22.13.1 || ^24.0.0}
3326
3326
 
3327
3327
  '@tryghost/kg-clean-basic-html@file:components/tryghost-kg-clean-basic-html-4.3.3.tgz':
3328
- resolution: {integrity: sha512-jy3nFhu8MbJFqxsTP/OUwjc5UjllibhYeIAs5FfsGVdAnL1jNdKrLx8ZyK4Wl9+PoCkIHm3EXHvmGnedFAYDaA==, tarball: file:components/tryghost-kg-clean-basic-html-4.3.3.tgz}
3328
+ resolution: {integrity: sha512-FdHRRcbCrTNxZiToPs3kPQv4Bh8P1VMa2S7cQ4Bdef0R03Wu5BmmUIAiSpnRB2gkqf0yp55gPApv8hgrsUBnUA==, tarball: file:components/tryghost-kg-clean-basic-html-4.3.3.tgz}
3329
3329
  version: 4.3.3
3330
3330
  engines: {node: ^22.13.1 || ^24.0.0}
3331
3331
 
3332
3332
  '@tryghost/kg-converters@file:components/tryghost-kg-converters-1.2.3.tgz':
3333
- resolution: {integrity: sha512-WLUfo9QKrD5g7bpc2x3aQHgymitEjM2idnyuETg0qV5hXzHOQZLxkydyORB8RwuokeHTQWjbMTSAPp64JkgjZg==, tarball: file:components/tryghost-kg-converters-1.2.3.tgz}
3333
+ resolution: {integrity: sha512-7nu8Aq2VP5sAuxldyLLHej3q8Ro63Si2yveS9NU+rdd6hAdUDcOL+U6VRCKLU4BwfZhAk7HTLn/ORlxCOi2+vA==, tarball: file:components/tryghost-kg-converters-1.2.3.tgz}
3334
3334
  version: 1.2.3
3335
3335
 
3336
3336
  '@tryghost/kg-default-cards@file:components/tryghost-kg-default-cards-10.3.3.tgz':
3337
- resolution: {integrity: sha512-Srr/+DRET3sTMZAT7qcPo/tI+NLH1Ont9Oi/VKQ6ouIsTBSq2hpD7kmNiEaaLzlFeivIQlrt489j0hU8DiR/EA==, tarball: file:components/tryghost-kg-default-cards-10.3.3.tgz}
3337
+ resolution: {integrity: sha512-B0L8H6Rjz6K+/VY8rgPB7rHa6QwQFdPuekgYD37BQDvuFSsp5vUyVpAO+Ooa+Bs00T/xx9ah/WL3pQ2ROZFeUg==, tarball: file:components/tryghost-kg-default-cards-10.3.3.tgz}
3338
3338
  version: 10.3.3
3339
3339
  engines: {node: ^22.13.1 || ^24.0.0}
3340
3340
 
3341
3341
  '@tryghost/kg-default-nodes@file:components/tryghost-kg-default-nodes-2.1.3.tgz':
3342
- resolution: {integrity: sha512-RU6JH4+OGvnjpzKp/i2tnULL7LI6ZM/R+TCuNa78xh7ELlKJ87d6Rki2s5zMthaePBzA8yR6HwBDMTlEijfkcg==, tarball: file:components/tryghost-kg-default-nodes-2.1.3.tgz}
3342
+ resolution: {integrity: sha512-evKUBugCtloMmpzAkks9a2eL65xuISZyx7QlIT3wKDH7+U1HnqqzKCP9jlI7Mm5Y+zi9QW1WbVpz7FWIIdL/Hw==, tarball: file:components/tryghost-kg-default-nodes-2.1.3.tgz}
3343
3343
  version: 2.1.3
3344
3344
  engines: {node: ^22.13.1 || ^24.0.0}
3345
3345
 
3346
3346
  '@tryghost/kg-default-transforms@file:components/tryghost-kg-default-transforms-1.3.3.tgz':
3347
- resolution: {integrity: sha512-imwSAzxFwy20nVPqwxqjKa2Yn4RMlV+95W9zeSwhsH/JsM48ad4AGryz3SL8HbQBh+6uzJOrnFo/z0bwve58jQ==, tarball: file:components/tryghost-kg-default-transforms-1.3.3.tgz}
3347
+ resolution: {integrity: sha512-VUwRL/5isifrE8U/kYDTal2c/FiQaUjSGD6X+XABSCqGVh6EN0EHmKDKcfMt3OaH/J26gy9swwcEpyu+3MhVqg==, tarball: file:components/tryghost-kg-default-transforms-1.3.3.tgz}
3348
3348
  version: 1.3.3
3349
3349
 
3350
3350
  '@tryghost/kg-html-to-lexical@file:components/tryghost-kg-html-to-lexical-1.3.3.tgz':
3351
- resolution: {integrity: sha512-xW5sGQMgbpMO/vt9PqAH8Dyt364prwuDgyHGLRnWbu3pJ91HrgUaDyf3R7HZYkq8wA2eBV5/tLcqIyc2vlMEqw==, tarball: file:components/tryghost-kg-html-to-lexical-1.3.3.tgz}
3351
+ resolution: {integrity: sha512-+cmSm6gHCA5wuDZEAqMMORhtYV+UJcAcWRcA+8F4PDZU9hOTDytzk2gvG95R82Nxq6Pfc15Jegu4vlqEfgwD9A==, tarball: file:components/tryghost-kg-html-to-lexical-1.3.3.tgz}
3352
3352
  version: 1.3.3
3353
3353
 
3354
3354
  '@tryghost/kg-lexical-html-renderer@file:components/tryghost-kg-lexical-html-renderer-1.4.3.tgz':
3355
- resolution: {integrity: sha512-BU6pA4mP+ld46h/KzPh5Zt937FlDlVatyWQYiXB81I3E52CJ+9HToVLKw0x66edU9en6tinSL2vK/FhuE/7DjQ==, tarball: file:components/tryghost-kg-lexical-html-renderer-1.4.3.tgz}
3355
+ resolution: {integrity: sha512-uSvf3Eu+AfNpx014SQfjtqw3wZOKaL2NyoOxHYwbWGjUE61K6vPznfls47M50D+ejmOZHIX5y9luw8gbm7SXqw==, tarball: file:components/tryghost-kg-lexical-html-renderer-1.4.3.tgz}
3356
3356
  version: 1.4.3
3357
3357
 
3358
3358
  '@tryghost/kg-markdown-html-renderer@file:components/tryghost-kg-markdown-html-renderer-7.2.3.tgz':
3359
- resolution: {integrity: sha512-93ot8mlH/N72+U5+n7IgdfoKh6UL/bDjvO5J3fvjBTPk7yQTgVLZR1mPiy2DXKqV/RtlaYe2XnAMMByBXN/pmQ==, tarball: file:components/tryghost-kg-markdown-html-renderer-7.2.3.tgz}
3359
+ resolution: {integrity: sha512-Tad0ZWSP1ytxaO6tWsl390hKAqn1YFO+yKplE95SgVN9bOClwqqwYGTeN5g1OuHNW5FiYcDnQdzqqAiIWldfiA==, tarball: file:components/tryghost-kg-markdown-html-renderer-7.2.3.tgz}
3360
3360
  version: 7.2.3
3361
3361
  engines: {node: ^22.13.1 || ^24.0.0}
3362
3362
 
3363
3363
  '@tryghost/kg-utils@file:components/tryghost-kg-utils-1.1.3.tgz':
3364
- resolution: {integrity: sha512-YxpMNs139S9kZnSH1xe8jdrAbSfYUSLy6EnQ1aUaSR+DfmoGJA0pmyEWROXa4uemHKpVe35uUVAzKWY0F/fIag==, tarball: file:components/tryghost-kg-utils-1.1.3.tgz}
3364
+ resolution: {integrity: sha512-JOxv6KgeE2xpE1FC6E0VtDQHb9KseCEbktPxo3z/wu8mG3Lrh4dmMHYQO6xajcB+i7go05IhlMubeTHxWHoU+Q==, tarball: file:components/tryghost-kg-utils-1.1.3.tgz}
3365
3365
  version: 1.1.3
3366
3366
 
3367
3367
  '@tryghost/limit-service@1.5.6':
@@ -5431,8 +5431,8 @@ packages:
5431
5431
  end-of-stream@1.4.5:
5432
5432
  resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
5433
5433
 
5434
- enhanced-resolve@5.24.0:
5435
- resolution: {integrity: sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==}
5434
+ enhanced-resolve@5.24.1:
5435
+ resolution: {integrity: sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==}
5436
5436
  engines: {node: '>=10.13.0'}
5437
5437
 
5438
5438
  entities@1.1.2:
@@ -15553,7 +15553,7 @@ snapshots:
15553
15553
  dependencies:
15554
15554
  once: 1.4.0
15555
15555
 
15556
- enhanced-resolve@5.24.0:
15556
+ enhanced-resolve@5.24.1:
15557
15557
  dependencies:
15558
15558
  graceful-fs: 4.2.11
15559
15559
  tapable: 2.3.3
@@ -15704,7 +15704,7 @@ snapshots:
15704
15704
  eslint-plugin-n@17.24.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3):
15705
15705
  dependencies:
15706
15706
  '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0))
15707
- enhanced-resolve: 5.24.0
15707
+ enhanced-resolve: 5.24.1
15708
15708
  eslint: 9.39.4(jiti@2.7.0)
15709
15709
  eslint-plugin-es-x: 7.8.0(eslint@9.39.4(jiti@2.7.0))
15710
15710
  get-tsconfig: 4.14.0
@@ -1,5 +1,6 @@
1
1
  catalog:
2
2
  '@ebay/nice-modal-react': 1.2.13
3
+ '@eslint/compat': 2.1.0
3
4
  '@eslint/js': 9.39.4
4
5
  '@faker-js/faker': 10.5.0
5
6
  '@playwright/test': 1.61.1
@@ -19,6 +20,7 @@ catalog:
19
20
  '@tailwindcss/postcss': 4.2.2
20
21
  '@tailwindcss/vite': 4.2.2
21
22
  '@tanstack/react-query': 4.44.0
23
+ '@tanstack/react-virtual': 3.14.5
22
24
  '@testing-library/jest-dom': 6.9.1
23
25
  '@testing-library/react': 14.3.1
24
26
  '@tryghost/api-framework': 3.2.4
@@ -37,6 +39,7 @@ catalog:
37
39
  '@types/express': 4.17.25
38
40
  '@types/html-minifier': ^4.0.6
39
41
  '@types/jest': 29.5.14
42
+ '@types/jsdom': 28.0.3
40
43
  '@types/node': 22.20.0
41
44
  '@types/react': 18.3.31
42
45
  '@types/react-dom': 18.3.7
@@ -55,6 +58,7 @@ catalog:
55
58
  concurrently: 10.0.3
56
59
  country-flag-icons: 1.6.20
57
60
  cross-fetch: 4.1.0
61
+ dependency-cruiser: ^18.0.0
58
62
  dequal: 2.0.3
59
63
  dompurify: 3.4.11
60
64
  dotenv: 17.4.2
@@ -87,6 +91,7 @@ catalog:
87
91
  storybook: 10.4.6
88
92
  supertest: 7.2.2
89
93
  tailwindcss: 4.2.2
94
+ temporal-polyfill: 0.3.2
90
95
  tldts: ^7.4.4
91
96
  tsx: 4.23.0
92
97
  tw-animate-css: 1.4.0