ghost 6.58.0 → 6.59.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 (453) hide show
  1. package/components/tryghost-adapter-base-scheduling-0.2.2.tgz +0 -0
  2. package/components/tryghost-adapter-base-sso-0.1.2.tgz +0 -0
  3. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  4. package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
  5. package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
  6. package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
  7. package/content/themes/casper/.github/workflows/test.yml +11 -1
  8. package/content/themes/casper/AGENTS.md +25 -0
  9. package/content/themes/casper/assets/built/screen.css +1 -1
  10. package/content/themes/casper/assets/css/screen.css +15 -1
  11. package/content/themes/casper/gulpfile.js +3 -0
  12. package/content/themes/casper/package.json +8 -8
  13. package/content/themes/source/.gitattributes +5 -0
  14. package/content/themes/source/.github/workflows/test.yml +39 -0
  15. package/content/themes/source/AGENTS.md +25 -0
  16. package/content/themes/source/README.md +33 -4
  17. package/content/themes/source/assets/built/screen.css +1 -1
  18. package/content/themes/source/assets/css/screen.css +15 -0
  19. package/content/themes/source/gulpfile.js +6 -3
  20. package/content/themes/source/package.json +13 -10
  21. package/content/themes/source/pnpm-workspace.yaml +3 -0
  22. package/core/boot.js +11 -4
  23. package/core/built/admin/assets/Combination-BCm9FL4o.js +41 -0
  24. package/core/built/admin/assets/about-BdSCpjXG.js +1 -0
  25. package/core/built/admin/assets/account-migration-BpKAqo8k.js +1 -0
  26. package/core/built/admin/assets/activitypub/{account-migration-BpDeIF3G.js → account-migration-DVnYS1XG.js} +8 -8
  27. package/core/built/admin/assets/activitypub/activitypub.js +2 -2
  28. package/core/built/admin/assets/activitypub/{bluesky-sharing-aPMtrS3L.js → bluesky-sharing-DLVeE9ii.js} +31 -31
  29. package/core/built/admin/assets/activitypub/{content-formatters-BORfuA9G.js → content-formatters-DCsVic-t.js} +2 -2
  30. package/core/built/admin/assets/activitypub/{dist-ByFmDSNP2.js → dist-ByFmDSNP.js} +1 -1
  31. package/core/built/admin/assets/activitypub/{domain-CPdiB27_.js → domain-rrvDLfnK.js} +8 -8
  32. package/core/built/admin/assets/activitypub/{edit-profile-BY2PawIe.js → edit-profile-VT-piVxq.js} +23 -23
  33. package/core/built/admin/assets/activitypub/{explore-Sp9bgAwq.js → explore-DZg3m48P.js} +14 -14
  34. package/core/built/admin/assets/activitypub/{feed-BjtF4ohL.js → feed-BJqQvDMI.js} +41 -41
  35. package/core/built/admin/assets/activitypub/{field-BDOYVTg6.js → field-BezS4-1J.js} +2 -2
  36. package/core/built/admin/assets/activitypub/inbox-Uf0GVrI_.js +1284 -0
  37. package/core/built/admin/assets/activitypub/{label-1jhN-qhD.js → label-CZ6if4zK.js} +2 -2
  38. package/core/built/admin/assets/activitypub/layout-DNuYT4Gu.js +1 -0
  39. package/core/built/admin/assets/activitypub/moderation-CP6mDVky.js +340 -0
  40. package/core/built/admin/assets/activitypub/{note-nr_m_5yb.js → note-BlFkye2g.js} +16 -16
  41. package/core/built/admin/assets/activitypub/{notifications-BdcyivbT.js → notifications-GGTrGEdu.js} +163 -126
  42. package/core/built/admin/assets/activitypub/{preferences-CNqy1x9C.js → preferences-CjZXrZqr.js} +1550 -1551
  43. package/core/built/admin/assets/activitypub/{profile-DlY4rhbO.js → profile-CcXYxydm.js} +248 -248
  44. package/core/built/admin/assets/activitypub/{routes-CEHdEZzS.js → routes-nHCKlZl-.js} +1971 -1747
  45. package/core/built/admin/assets/activitypub/settings-pDzybcb3.js +315 -0
  46. package/core/built/admin/assets/activitypub/{site-CtBUCPBz.js → site-BZF0F8LN.js} +101 -101
  47. package/core/built/admin/assets/activitypub/{step-1-D9jGWyAy.js → step-1-C-Ns1Tfg.js} +3 -3
  48. package/core/built/admin/assets/activitypub/{step-3-KpUqpGWi.js → step-3-rDMNGmLg.js} +8 -8
  49. package/core/built/admin/assets/activitypub/{tabs-DvlsxTCI.js → tabs-CDjh3_Jp.js} +198 -198
  50. package/core/built/admin/assets/activitypub/{topic-filter-CIN1E2jg.js → topic-filter-CmTc8hpN.js} +2 -2
  51. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CATFd6YV.js → use-activity-pub-queries-DUDEdSdR.js} +286 -243
  52. package/core/built/admin/assets/activitypub/{use-reply-chain-data-DJ0vhA8V.js → use-reply-chain-data-TunGtmJl.js} +14 -14
  53. package/core/built/admin/assets/add-integration-modal-CXRQi1x0.js +1 -0
  54. package/core/built/admin/assets/add-newsletter-modal-t447KRYz.js +1 -0
  55. package/core/built/admin/assets/add-recommendation-modal-D882MdnR.js +1 -0
  56. package/core/built/admin/assets/{analytics-BC2oR8ay.js → analytics-Dj-WlzPf.js} +1 -1
  57. package/core/built/admin/assets/announcement-bar-modal-CwHKKw-a.js +1 -0
  58. package/core/built/admin/assets/api-keys-Boy5pLbD.js +1 -0
  59. package/core/built/admin/assets/audience-Cc40y7zQ.js +1 -0
  60. package/core/built/admin/assets/automations-DNLK5Udr.js +1 -0
  61. package/core/built/admin/assets/bluesky-sharing-Cm4aFaOl.js +1 -0
  62. package/core/built/admin/assets/breadcrumb-CcFr_ltt.js +1 -0
  63. package/core/built/admin/assets/button-BshWPHvn.js +1 -0
  64. package/core/built/admin/assets/chart-helpers-BsbzoWhK.js +1 -0
  65. package/core/built/admin/assets/{checkbox-LmClhqcS.js → checkbox-1G6KfK2q.js} +1 -1
  66. package/core/built/admin/assets/chunk-KS7C4IRE-DCsL4i4D.js +4 -0
  67. package/core/built/admin/assets/{chunk.408.1a258af360eb8d905508.js → chunk.301.5673a0caf7c49bb00212.js} +3 -3
  68. package/core/built/admin/assets/{chunk.524.4c693c3a00ac91df34fa.js → chunk.524.86db0d945468c852374b.js} +4 -4
  69. package/core/built/admin/assets/{chunk.582.20b600e329e58d12d7c2.js → chunk.582.c2f6216d3c4af303e236.js} +6 -6
  70. package/core/built/admin/assets/{code-editor-view-DqTOUnbM.js → code-editor-view-BVjtWyst.js} +1 -1
  71. package/core/built/admin/assets/{code-editor-view-bA0lfxUL.js → code-editor-view-y_zVfmCa.js} +1 -1
  72. package/core/built/admin/assets/color-picker-XEMPgNJE.js +3 -0
  73. package/core/built/admin/assets/{color-picker-field-Cv9GOJQZ.js → color-picker-field-BhplXcy5.js} +1 -1
  74. package/core/built/admin/assets/combobox-CRMJrvcQ.js +1 -0
  75. package/core/built/admin/assets/command-151T2eRx.js +1 -0
  76. package/core/built/admin/assets/comments-Bjbl9toF.js +1 -0
  77. package/core/built/admin/assets/confirmation-context-QmFxSjWy.js +1 -0
  78. package/core/built/admin/assets/{content-api-modal-BOFWRUkC.js → content-api-modal-CpeABXne.js} +1 -1
  79. package/core/built/admin/assets/{copy-field-8biQvNMD.js → copy-field-CglgRZyG.js} +1 -1
  80. package/core/built/admin/assets/custom-field-type-option-DSyJw4T4.js +1 -0
  81. package/core/built/admin/assets/custom-integration-modal-DWB9bRVp.js +1 -0
  82. package/core/built/admin/assets/date-range-select-kaKtab5O.js +1 -0
  83. package/core/built/admin/assets/design-and-theme-modal-86s2AaZ-.js +23 -0
  84. package/core/built/admin/assets/dirty-confirm-dialog-CTFdXXy7.js +1 -0
  85. package/core/built/admin/assets/disabled-sources-indicator-BFyCxUOx.js +1 -0
  86. package/core/built/admin/assets/dist-C1-Oy3Db.js +1 -0
  87. package/core/built/admin/assets/dist-CJJqYPep.js +1 -0
  88. package/core/built/admin/assets/dist-CNlMj7ML.js +1 -0
  89. package/core/built/admin/assets/dist-Kll2twSG.js +1 -0
  90. package/core/built/admin/assets/domain-BOoMvBG3.js +1 -0
  91. package/core/built/admin/assets/{dropzone-B21Entqz.js → dropzone-B6KWzsrb.js} +2 -2
  92. package/core/built/admin/assets/edit-profile-BagrYOrN.js +1 -0
  93. package/core/built/admin/assets/editor-AaJjqbpk.js +8 -0
  94. package/core/built/admin/assets/embed-signup-form-modal-B8L95KwR.js +8 -0
  95. package/core/built/admin/assets/explore-xbykZTlO.js +1 -0
  96. package/core/built/admin/assets/feed-BAHSipWv.js +1 -0
  97. package/core/built/admin/assets/{field-BQqLTgHM.js → field-kJYZ2T3C.js} +1 -1
  98. package/core/built/admin/assets/{filter-sources-FgqoUIL7.js → filter-sources-QeqFGNRB.js} +1 -1
  99. package/core/built/admin/assets/{filters-D0uIMD8n.js → filters-By5KQeV6.js} +1 -1
  100. package/core/built/admin/assets/filters-DtYpAkDd.js +1 -0
  101. package/core/built/admin/assets/first-promoter-modal-8A02oyjA.js +1 -0
  102. package/core/built/admin/assets/{ghost-ba408063a5922b458b4a8f216cf23251.js → ghost-f110822e67868c9fdf9a6c23754b2559.js} +9 -8
  103. package/core/built/admin/assets/gift-link-modal-DbYCyuhF.js +1 -0
  104. package/core/built/admin/assets/global-data-context-gAMDH9u1.js +1 -0
  105. package/core/built/admin/assets/growth-BSOxJGey.js +3 -0
  106. package/core/built/admin/assets/growth-BZTjURq5.js +1 -0
  107. package/core/built/admin/assets/history-modal-CCgWtlZE.js +1 -0
  108. package/core/built/admin/assets/html-field-BQC7XyLA.js +1 -0
  109. package/core/built/admin/assets/iframe-buffering-DnOlWTD4.js +1 -0
  110. package/core/built/admin/assets/{images-3cQgwfTD.js → images-D5UKr2SG.js} +1 -1
  111. package/core/built/admin/assets/{inbox-Dz_JblyJ.js → inbox-DvN15_YH.js} +45 -39
  112. package/core/built/admin/assets/index-BJz9Zlsc.js +67 -0
  113. package/core/built/admin/assets/index-Dg8cdR8E.css +1 -0
  114. package/core/built/admin/assets/{input-group-DpogNUIt.js → input-group-BPAxETpQ.js} +1 -1
  115. package/core/built/admin/assets/invite-user-modal-jcUaaNkW.js +1 -0
  116. package/core/built/admin/assets/{koenig-lexical-2KuqRwZI.js → koenig-lexical-CfXTYeli.js} +1 -1
  117. package/core/built/admin/assets/koenig-loader-DktFM3Uh.js +1 -0
  118. package/core/built/admin/assets/{kpi-card-Ck3tT2Wg.js → kpi-card-fUHZlzBX.js} +1 -1
  119. package/core/built/admin/assets/{kpi-card-DDIxptaS.js → kpi-card-o0urVtNL.js} +1 -1
  120. package/core/built/admin/assets/kpi-helpers-2FTF4a3-.js +1 -0
  121. package/core/built/admin/assets/kpi-tabs-B8-_k2dQ.js +1 -0
  122. package/core/built/admin/assets/{label-DodDsMzn.js → label-CiRS3i_f.js} +1 -1
  123. package/core/built/admin/assets/label-picker-ao7tuPaK.js +1 -0
  124. package/core/built/admin/assets/layout-DC6QGDaw.js +1 -0
  125. package/core/built/admin/assets/member-custom-fields-BW756-EV.js +1 -0
  126. package/core/built/admin/assets/member-detail-CGGgUTSl.js +1 -0
  127. package/core/built/admin/assets/members-ZcPthwG0.js +11 -0
  128. package/core/built/admin/assets/moderation-24bElWs3.js +1 -0
  129. package/core/built/admin/assets/multi-select-combobox-CZPrgz-Z.js +1 -0
  130. package/core/built/admin/assets/navigation-modal-BiTP4U_J.js +1 -0
  131. package/core/built/admin/assets/newsletter-B3Ihwizp.js +1 -0
  132. package/core/built/admin/assets/newsletter-detail-modal-CYsu4qhl.js +1 -0
  133. package/core/built/admin/assets/newsletter-emails-CDPR4-SP.js +1 -0
  134. package/core/built/admin/assets/newsletters-bJiYLJWl.js +1 -0
  135. package/core/built/admin/assets/note-7f6urVVA.js +1 -0
  136. package/core/built/admin/assets/notifications-rosQCyXH.js +1 -0
  137. package/core/built/admin/assets/offers-container-modal-J2j6NpDL.js +1 -0
  138. package/core/built/admin/assets/onboarding-route-DTjcThKl.js +1 -0
  139. package/core/built/admin/assets/overview-BxvWzGaf.js +1 -0
  140. package/core/built/admin/assets/overview-D6JG0hkZ.js +1 -0
  141. package/core/built/admin/assets/{page-header-VLPJfj_d.js → page-header-l7vXmLIw.js} +1 -1
  142. package/core/built/admin/assets/pintura-modal-BGHmudVB.js +1 -0
  143. package/core/built/admin/assets/portal-frame-DVc4VHX_.js +1 -0
  144. package/core/built/admin/assets/portal-modal-BCOcdiRi.js +1 -0
  145. package/core/built/admin/assets/{post-analytics-Gv81eN_g.js → post-analytics-CTSZMK6I.js} +1 -1
  146. package/core/built/admin/assets/post-analytics-header-Dt4RQGq0.js +1 -0
  147. package/core/built/admin/assets/{post-analytics-provider-O2YjZMhN.js → post-analytics-provider-C4ydiboO.js} +1 -1
  148. package/core/built/admin/assets/post-share-modal-DjH_a_1L.js +1 -0
  149. package/core/built/admin/assets/preferences-BLo6VJUS.js +5 -0
  150. package/core/built/admin/assets/preview-modal-BOgjgsJL.js +1 -0
  151. package/core/built/admin/assets/profile-DG6iCdRH.js +1 -0
  152. package/core/built/admin/assets/radio-group-ChHD4EQJ.js +1 -0
  153. package/core/built/admin/assets/router-provider-Bexg1t-V.js +1 -0
  154. package/core/built/admin/assets/select-ChxknEcT.js +1 -0
  155. package/core/built/admin/assets/settings-B0VDAhgV.js +1 -0
  156. package/core/built/admin/assets/settings-Dwo3CeAD.js +4 -0
  157. package/core/built/admin/assets/settings-breadcrumbs-sLDNedBW.js +1 -0
  158. package/core/built/admin/assets/share-modal-BDb2nacg.js +1 -0
  159. package/core/built/admin/assets/skeleton-D7hwjdry.js +1 -0
  160. package/core/built/admin/assets/slack-modal-CwNAD69x.js +1 -0
  161. package/core/built/admin/assets/sort-button-DhqpxkrO.js +1 -0
  162. package/core/built/admin/assets/source-icon-BPsD5ees.js +1 -0
  163. package/core/built/admin/assets/stats-WdDJ8c_1.js +1 -0
  164. package/core/built/admin/assets/stats-view-J3PI2eT_.js +1 -0
  165. package/core/built/admin/assets/step-1-2q1SjerQ.js +1 -0
  166. package/core/built/admin/assets/step-2-D5mJB3Uu.js +1 -0
  167. package/core/built/admin/assets/step-3-BpAuYTGZ.js +2 -0
  168. package/core/built/admin/assets/{stripe-button-Bh4p6Wud.js → stripe-button-DDoUKN5a.js} +1 -1
  169. package/core/built/admin/assets/stripe-connect-modal-pMdF3t4S.js +1 -0
  170. package/core/built/admin/assets/switch-B_1yU3Aw.js +1 -0
  171. package/core/built/admin/assets/{table-DghJxZMH.js → table-CrqQtkR2.js} +1 -1
  172. package/core/built/admin/assets/tabs-BhzVdh5p.js +1 -0
  173. package/core/built/admin/assets/tag-detail-CwJhI4qg.js +2 -0
  174. package/core/built/admin/assets/tags-CvJ0PgrB.js +1 -0
  175. package/core/built/admin/assets/testimonials-modal-CV82IAnI.js +1 -0
  176. package/core/built/admin/assets/tier-detail-modal-pLzCOfeg.js +1 -0
  177. package/core/built/admin/assets/toggle-group-BW_T4yn6.js +1 -0
  178. package/core/built/admin/assets/topic-filter-DkXjDejV.js +1 -0
  179. package/core/built/admin/assets/transistor-modal-TMRvHZ6B.js +1 -0
  180. package/core/built/admin/assets/unsplash-modal-CV92RdPw.js +1 -0
  181. package/core/built/admin/assets/{use-analytics-data-IxJcSjc9.js → use-analytics-data-BM_uV9SU.js} +1 -1
  182. package/core/built/admin/assets/use-check-theme-limit-error-DkBnXMSY.js +1 -0
  183. package/core/built/admin/assets/use-confirm-unload-SzlkOIpm.js +1 -0
  184. package/core/built/admin/assets/use-feature-flag-cahOlMva.js +1 -0
  185. package/core/built/admin/assets/use-filter-params-BX5qf0Cg.js +1 -0
  186. package/core/built/admin/assets/{use-growth-stats-1NW-8eEZ.js → use-growth-stats-D0LlWBe6.js} +1 -1
  187. package/core/built/admin/assets/{use-hash-link-navigation-guard-B9j6HIrV.js → use-hash-link-navigation-guard-B_Y3FhYH.js} +1 -1
  188. package/core/built/admin/assets/use-limiter-D3DHSoAj.js +2 -0
  189. package/core/built/admin/assets/{use-pintura-config-BjFChXV1.js → use-pintura-config-D63Xu0SG.js} +1 -1
  190. package/core/built/admin/assets/use-pintura-editor-Z51aFnC8.js +1 -0
  191. package/core/built/admin/assets/{use-post-referrers-Dp1BnTAK.js → use-post-referrers-Cvymr3gt.js} +1 -1
  192. package/core/built/admin/assets/use-query-params-BfzuqbcD.js +1 -0
  193. package/core/built/admin/assets/use-reply-chain-data-Dc18Ujqo.js +1 -0
  194. package/core/built/admin/assets/use-setting-group-DYRIzqC0.js +1 -0
  195. package/core/built/admin/assets/use-settings-navigation-aDSLtmEl.js +1 -0
  196. package/core/built/admin/assets/{use-simple-pagination-DsEGSJhe.js → use-simple-pagination-B2TdNX67.js} +1 -1
  197. package/core/built/admin/assets/{use-tinybird-query-Ci_DiPkX.js → use-tinybird-query-BvQIVuRc.js} +1 -1
  198. package/core/built/admin/assets/{use-tinybird-token-CsUwc722.js → use-tinybird-token-COQTPIwL.js} +1 -1
  199. package/core/built/admin/assets/use-upgrade-route-BZf1g59m.js +1 -0
  200. package/core/built/admin/assets/{use-url-input-BEZJpVgN.js → use-url-input-PcqZadXa.js} +1 -1
  201. package/core/built/admin/assets/user-detail-modal-DeO3SAZq.js +1 -0
  202. package/core/built/admin/assets/{virtual-list-D5ugXyZY.js → virtual-list-D3MfPNOh.js} +1 -1
  203. package/core/built/admin/assets/web-CDdyG7z1.js +2 -0
  204. package/core/built/admin/assets/web-CwQ8_QUc.js +1 -0
  205. package/core/built/admin/assets/zapier-modal-a7t75iNI.js +1 -0
  206. package/core/built/admin/index.html +15 -12
  207. package/core/frontend/apps/private-blogging/lib/helpers/input_password.js +2 -1
  208. package/core/frontend/helpers/body_class.js +2 -1
  209. package/core/frontend/helpers/cancel_link.js +2 -1
  210. package/core/frontend/helpers/color_to_rgba.js +2 -1
  211. package/core/frontend/helpers/content_api_key.js +2 -1
  212. package/core/frontend/helpers/content_api_url.js +2 -1
  213. package/core/frontend/helpers/contrast_text_color.js +2 -1
  214. package/core/frontend/helpers/facebook_url.js +2 -1
  215. package/core/frontend/helpers/ghost_foot.js +2 -1
  216. package/core/frontend/helpers/ghost_head.js +2 -1
  217. package/core/frontend/helpers/has.js +4 -2
  218. package/core/frontend/helpers/link_class.js +2 -1
  219. package/core/frontend/helpers/meta_description.js +2 -1
  220. package/core/frontend/helpers/meta_title.js +2 -1
  221. package/core/frontend/helpers/navigation.js +113 -22
  222. package/core/frontend/helpers/page_url.js +2 -1
  223. package/core/frontend/helpers/post_class.js +2 -1
  224. package/core/frontend/helpers/reading_time.js +2 -1
  225. package/core/frontend/helpers/social_accounts.js +2 -1
  226. package/core/frontend/helpers/social_url.js +2 -1
  227. package/core/frontend/helpers/total_members.js +2 -1
  228. package/core/frontend/helpers/total_paid_members.js +2 -1
  229. package/core/frontend/helpers/tpl/navigation.hbs +1 -1
  230. package/core/frontend/helpers/twitter_url.js +2 -1
  231. package/core/frontend/public/cards.manifest.json +1 -1
  232. package/core/server/api/endpoints/posts.js +7 -4
  233. package/core/server/api/endpoints/utils/permissions.js +2 -1
  234. package/core/server/api/endpoints/utils/validators/input/settings.js +83 -1
  235. package/core/server/data/exporter/table-lists.js +1 -0
  236. package/core/server/data/importer/handlers/json.js +2 -1
  237. package/core/server/data/migrations/versions/5.19/2022-09-02-20-52-backfill-new-product-columns.js +2 -1
  238. package/core/server/data/migrations/versions/5.21/2022-10-26-04-50-member-subscription-created-batch-id.js +4 -2
  239. package/core/server/data/migrations/versions/5.22/2022-10-31-12-03-backfill-new-product-columns.js +2 -1
  240. package/core/server/data/migrations/versions/6.58/2026-08-11-21-22-48-rename-email-batches-provider-id.js +1 -1
  241. package/core/server/data/migrations/versions/6.59/2026-08-18-17-06-46-add-gift-delivery-fields-to-gifts.js +26 -0
  242. package/core/server/data/migrations/versions/6.59/2026-08-18-17-07-01-add-gift-deliveries.js +20 -0
  243. package/core/server/data/schema/commands.js +48 -24
  244. package/core/server/data/schema/schema.js +28 -7
  245. package/core/server/data/seeders/importers/automation-action-revisions-importer.js +3 -36
  246. package/core/server/data/seeders/importers/automation-actions-importer.js +5 -41
  247. package/core/server/data/seeders/importers/automation-run-steps-importer.js +3 -36
  248. package/core/server/data/seeders/importers/automation-runs-importer.js +7 -42
  249. package/core/server/data/seeders/importers/automations-importer.js +3 -36
  250. package/core/server/data/seeders/importers/comment-reports-importer.js +5 -5
  251. package/core/server/data/seeders/importers/comments-importer.js +5 -5
  252. package/core/server/data/seeders/importers/email-batches-importer.js +5 -4
  253. package/core/server/data/seeders/importers/email-recipients-importer.js +12 -20
  254. package/core/server/data/seeders/importers/emails-importer.js +6 -6
  255. package/core/server/data/seeders/importers/labels-importer.js +3 -3
  256. package/core/server/data/seeders/importers/members-click-events-importer.js +5 -5
  257. package/core/server/data/seeders/importers/members-created-events-importer.js +13 -12
  258. package/core/server/data/seeders/importers/members-feedback-importer.js +7 -7
  259. package/core/server/data/seeders/importers/members-importer.js +4 -4
  260. package/core/server/data/seeders/importers/members-login-events-importer.js +3 -3
  261. package/core/server/data/seeders/importers/members-products-importer.js +2 -2
  262. package/core/server/data/seeders/importers/members-status-events-importer.js +4 -3
  263. package/core/server/data/seeders/importers/members-stripe-customers-importer.js +2 -2
  264. package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +7 -7
  265. package/core/server/data/seeders/importers/members-subscribe-events-importer.js +3 -3
  266. package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +3 -3
  267. package/core/server/data/seeders/importers/offer-redemptions-importer.js +7 -7
  268. package/core/server/data/seeders/importers/offers-importer.js +3 -3
  269. package/core/server/data/seeders/importers/posts-importer.js +4 -4
  270. package/core/server/data/seeders/importers/table-importer.js +2 -35
  271. package/core/server/data/seeders/importers/tags-importer.js +2 -2
  272. package/core/server/data/seeders/importers/users-importer.js +2 -2
  273. package/core/server/data/seeders/importers/web-mentions-importer.js +2 -2
  274. package/core/server/data/seeders/utils/random.js +7 -0
  275. package/core/server/ghost-server.js +19 -5
  276. package/core/server/lib/db-date.js +72 -3
  277. package/core/server/models/gift-delivery.js +23 -0
  278. package/core/server/models/gift.js +9 -0
  279. package/core/server/models/index.js +3 -2
  280. package/core/server/models/settings.js +43 -4
  281. package/core/server/services/automations/database-automations-repository.js +38 -31
  282. package/core/server/services/automations/poll.js +1 -1
  283. package/core/server/services/content-import/csv/index.js +8 -0
  284. package/core/server/services/content-import/csv/parse.js +60 -0
  285. package/core/server/services/content-import/import/importer.js +222 -0
  286. package/core/server/services/content-import/import/post-data.js +52 -0
  287. package/core/server/services/content-import/import/reader.js +15 -0
  288. package/core/server/services/content-import/import/row.js +50 -0
  289. package/core/server/services/content-import/import/store.js +71 -0
  290. package/core/server/services/content-import/index.js +67 -0
  291. package/core/server/services/email-analytics/automation-email-analytics-batch-processor.js +1 -1
  292. package/core/server/services/email-analytics/index.js +3 -1
  293. package/core/server/services/email-analytics/jobs/index.js +2 -2
  294. package/core/server/services/email-service/email-service-wrapper.js +1 -1
  295. package/core/server/services/email-suppression-list/email-suppression-list.js +4 -2
  296. package/core/server/services/gifts/CONTEXT.md +27 -3
  297. package/core/server/services/gifts/README.md +8 -4
  298. package/core/server/services/gifts/constants.js +2 -1
  299. package/core/server/services/gifts/email-templates/gift-delivery.hbs +20 -0
  300. package/core/server/services/gifts/email-templates/gift-delivery.js +39 -0
  301. package/core/server/services/gifts/email-templates/gift-purchase-confirmation.hbs +2 -2
  302. package/core/server/services/gifts/email-templates/gift-purchase-confirmation.js +19 -4
  303. package/core/server/services/gifts/events/send-gift-delivery-event.js +15 -0
  304. package/core/server/services/gifts/gift-bookshelf-repository.js +23 -3
  305. package/core/server/services/gifts/gift-checkout-adapter.js +5 -3
  306. package/core/server/services/gifts/gift-codec.js +8 -0
  307. package/core/server/services/gifts/gift-delivery-bookshelf-repository.js +107 -0
  308. package/core/server/services/gifts/gift-delivery-codec.js +12 -0
  309. package/core/server/services/gifts/gift-delivery-schema.js +15 -0
  310. package/core/server/services/gifts/gift-delivery-service.js +209 -0
  311. package/core/server/services/gifts/gift-email-renderer.js +13 -1
  312. package/core/server/services/gifts/gift-email-service.js +97 -17
  313. package/core/server/services/gifts/gift-schema.js +10 -6
  314. package/core/server/services/gifts/gift-service.js +259 -34
  315. package/core/server/services/gifts/gift.js +59 -5
  316. package/core/server/services/gifts/index.js +69 -3
  317. package/core/server/services/lib/mailgun-client.js +5 -2
  318. package/core/server/services/mail/ghost-mailer.js +9 -1
  319. package/core/server/services/member-welcome-emails/service.js +6 -1
  320. package/core/server/services/members/members-api/controllers/router-controller.js +26 -8
  321. package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +100 -12
  322. package/core/server/services/stripe/stripe-api.js +3 -2
  323. package/core/server/services/stripe/webhook-controller.js +6 -3
  324. package/core/server/services/stripe/webhook-manager.js +2 -0
  325. package/core/shared/labs.js +1 -0
  326. package/package.json +9 -8
  327. package/pnpm-lock.yaml +26 -11
  328. package/pnpm-workspace.yaml +5 -6
  329. package/content/themes/source/yarn.lock +0 -6232
  330. package/core/built/admin/assets/Combination-BDvCdg1t.js +0 -41
  331. package/core/built/admin/assets/about-B_BvSyLF.js +0 -1
  332. package/core/built/admin/assets/account-migration-oJUGxnzT.js +0 -1
  333. package/core/built/admin/assets/activitypub/dist-Dqggkccr.js +0 -215
  334. package/core/built/admin/assets/activitypub/inbox-z1o2j1Tb.js +0 -1221
  335. package/core/built/admin/assets/activitypub/layout-BRMezuty.js +0 -1
  336. package/core/built/admin/assets/activitypub/moderation-CZudJi8N.js +0 -160
  337. package/core/built/admin/assets/activitypub/settings-CrSV1cux.js +0 -107
  338. package/core/built/admin/assets/add-integration-modal-BW23PDYs.js +0 -1
  339. package/core/built/admin/assets/add-newsletter-modal-M0ls8BKO.js +0 -1
  340. package/core/built/admin/assets/add-recommendation-modal-B0NeBMzl.js +0 -1
  341. package/core/built/admin/assets/announcement-bar-modal-pXBqjQE_.js +0 -1
  342. package/core/built/admin/assets/api-keys-Df6uv1dT.js +0 -1
  343. package/core/built/admin/assets/audience-BY8od8If.js +0 -1
  344. package/core/built/admin/assets/automations-DCs6Wady.js +0 -1
  345. package/core/built/admin/assets/bluesky-sharing-D0P42Cws.js +0 -1
  346. package/core/built/admin/assets/breadcrumb-MTj_cKLb.js +0 -1
  347. package/core/built/admin/assets/chart-helpers-DcO3k_vA.js +0 -1
  348. package/core/built/admin/assets/chunk-KS7C4IRE-DG9HTHQ3.js +0 -4
  349. package/core/built/admin/assets/color-picker-CBlJMv3y.js +0 -3
  350. package/core/built/admin/assets/combobox-BbPJzjCp.js +0 -1
  351. package/core/built/admin/assets/command-BrhXIlDr.js +0 -1
  352. package/core/built/admin/assets/comments-Cu4rD1aJ.js +0 -1
  353. package/core/built/admin/assets/confirmation-provider-BEdrnHns.js +0 -1
  354. package/core/built/admin/assets/custom-field-type-option-CNhAgHbJ.js +0 -1
  355. package/core/built/admin/assets/custom-integration-modal-CrGOI8IB.js +0 -1
  356. package/core/built/admin/assets/date-range-select-Bsh4gIek.js +0 -1
  357. package/core/built/admin/assets/design-and-theme-modal-DWZguwWX.js +0 -23
  358. package/core/built/admin/assets/dirty-confirm-dialog-DmdMpgyN.js +0 -1
  359. package/core/built/admin/assets/disabled-sources-indicator-BLnmyWgt.js +0 -1
  360. package/core/built/admin/assets/dist-DMFGvqqU.js +0 -1
  361. package/core/built/admin/assets/dist-DlCyLrOC.js +0 -1
  362. package/core/built/admin/assets/dist-j1xxxnY8.js +0 -1
  363. package/core/built/admin/assets/domain-Dp9TRrFp.js +0 -1
  364. package/core/built/admin/assets/edit-profile-DG6lpMsr.js +0 -1
  365. package/core/built/admin/assets/editor-CPQOrhrn.js +0 -8
  366. package/core/built/admin/assets/embed-signup-form-modal-CgWniDha.js +0 -9
  367. package/core/built/admin/assets/explore-C3rzONJv.js +0 -1
  368. package/core/built/admin/assets/feed-DpUwS1cU.js +0 -1
  369. package/core/built/admin/assets/filters-DZJT29GW.js +0 -1
  370. package/core/built/admin/assets/first-promoter-modal-DJhQQheG.js +0 -1
  371. package/core/built/admin/assets/gift-link-modal-sdFLjND9.js +0 -1
  372. package/core/built/admin/assets/global-data-provider-CixmTX00.js +0 -1
  373. package/core/built/admin/assets/growth-0YYkBEeS.js +0 -1
  374. package/core/built/admin/assets/growth-DpjAPeQT.js +0 -3
  375. package/core/built/admin/assets/history-modal-BWJ4-cJ0.js +0 -1
  376. package/core/built/admin/assets/html-field-C-oa5DEl.js +0 -1
  377. package/core/built/admin/assets/iframe-buffering-Ba9sDpi2.js +0 -1
  378. package/core/built/admin/assets/index-BOJzlYiz.js +0 -67
  379. package/core/built/admin/assets/index-Bid6LAyc.css +0 -1
  380. package/core/built/admin/assets/invite-user-modal-DCiQSiuD.js +0 -1
  381. package/core/built/admin/assets/koenig-editor-base-BApy8Q7C.js +0 -1
  382. package/core/built/admin/assets/kpi-helpers-ssbuy-hD.js +0 -1
  383. package/core/built/admin/assets/kpi-tabs-BqoIM6bI.js +0 -1
  384. package/core/built/admin/assets/label-picker-Cvvbmzb5.js +0 -1
  385. package/core/built/admin/assets/layout-DkkGyev2.js +0 -1
  386. package/core/built/admin/assets/member-custom-fields-CvGcpaiW.js +0 -1
  387. package/core/built/admin/assets/member-detail-CMCMZ47_.js +0 -1
  388. package/core/built/admin/assets/members-sRl6fNfq.js +0 -11
  389. package/core/built/admin/assets/moderation-KhKwGqI1.js +0 -1
  390. package/core/built/admin/assets/multi-select-combobox-nhCff0_K.js +0 -1
  391. package/core/built/admin/assets/navigation-modal-MDJExWDJ.js +0 -1
  392. package/core/built/admin/assets/newsletter-BIBHumfV.js +0 -1
  393. package/core/built/admin/assets/newsletter-detail-modal-CfjBMH3v.js +0 -1
  394. package/core/built/admin/assets/newsletter-emails-ClDL-7dA.js +0 -1
  395. package/core/built/admin/assets/newsletters-CBe-IPzK.js +0 -1
  396. package/core/built/admin/assets/note-HnNUOt4d.js +0 -1
  397. package/core/built/admin/assets/notifications-Cj5e-258.js +0 -1
  398. package/core/built/admin/assets/offers-container-modal-BHwHtixC.js +0 -1
  399. package/core/built/admin/assets/onboarding-route-D_4jp7Nq.js +0 -1
  400. package/core/built/admin/assets/overview-CezDdg-F.js +0 -1
  401. package/core/built/admin/assets/overview-D5mM51Lj.js +0 -1
  402. package/core/built/admin/assets/pintura-modal-BXXJ8Iaa.js +0 -1
  403. package/core/built/admin/assets/portal-frame-BLCvF8f-.js +0 -1
  404. package/core/built/admin/assets/portal-modal-DN80tAcy.js +0 -1
  405. package/core/built/admin/assets/post-analytics-header-_ydSY8qO.js +0 -1
  406. package/core/built/admin/assets/post-share-modal-CzYak_a5.js +0 -1
  407. package/core/built/admin/assets/preferences-gneLb6LV.js +0 -5
  408. package/core/built/admin/assets/preview-modal-Bkq-tgVm.js +0 -1
  409. package/core/built/admin/assets/profile-CzXmCNTC.js +0 -1
  410. package/core/built/admin/assets/radio-group-Dsq5ZEbV.js +0 -1
  411. package/core/built/admin/assets/router-provider-CkB_ArLF.js +0 -1
  412. package/core/built/admin/assets/select-xuZAuDyS.js +0 -1
  413. package/core/built/admin/assets/settings-Ct8pabhr.js +0 -1
  414. package/core/built/admin/assets/settings-KSWWQanQ.js +0 -4
  415. package/core/built/admin/assets/settings-breadcrumbs-DbPGu-Tu.js +0 -1
  416. package/core/built/admin/assets/share-modal-CdiUx9WM.js +0 -1
  417. package/core/built/admin/assets/slack-modal-BP--Z3jE.js +0 -1
  418. package/core/built/admin/assets/sort-button-CjfKdlsL.js +0 -1
  419. package/core/built/admin/assets/source-icon-DHj1h6Ts.js +0 -1
  420. package/core/built/admin/assets/stats-C615kulJ.js +0 -1
  421. package/core/built/admin/assets/stats-view-BSMRdYiN.js +0 -1
  422. package/core/built/admin/assets/step-1-pSdGYtIF.js +0 -1
  423. package/core/built/admin/assets/step-2-T9Uy4eBD.js +0 -1
  424. package/core/built/admin/assets/step-3-D4uXe_XG.js +0 -2
  425. package/core/built/admin/assets/stripe-connect-modal-C2vTvepi.js +0 -1
  426. package/core/built/admin/assets/switch-CE2NuMn-.js +0 -1
  427. package/core/built/admin/assets/tabs-l9c7FjzI.js +0 -1
  428. package/core/built/admin/assets/tag-detail-DBw_M2-p.js +0 -2
  429. package/core/built/admin/assets/tags-DoWsAG6l.js +0 -1
  430. package/core/built/admin/assets/testimonials-modal-BZKePE2T.js +0 -1
  431. package/core/built/admin/assets/tier-detail-modal-D65pVWsN.js +0 -1
  432. package/core/built/admin/assets/toggle-group-uJnl42w3.js +0 -1
  433. package/core/built/admin/assets/topic-filter-BM7hz0kW.js +0 -1
  434. package/core/built/admin/assets/transistor-modal-VZOGN3od.js +0 -1
  435. package/core/built/admin/assets/unsplash-modal-CKGfACxF.js +0 -1
  436. package/core/built/admin/assets/use-check-theme-limit-error-CGp3CGT5.js +0 -1
  437. package/core/built/admin/assets/use-feature-flag-CSq2Lwzt.js +0 -1
  438. package/core/built/admin/assets/use-filter-params-0hcJJuEJ.js +0 -1
  439. package/core/built/admin/assets/use-limiter-ffwpsZPp.js +0 -2
  440. package/core/built/admin/assets/use-pintura-editor-Cb41oJyL.js +0 -1
  441. package/core/built/admin/assets/use-query-params-DHhhu8wi.js +0 -1
  442. package/core/built/admin/assets/use-reply-chain-data-C0ZUTkfk.js +0 -1
  443. package/core/built/admin/assets/use-setting-group-Bx8M6FL2.js +0 -1
  444. package/core/built/admin/assets/use-settings-navigation-BOZcat_V.js +0 -1
  445. package/core/built/admin/assets/use-upgrade-route-B3_DUiuT.js +0 -1
  446. package/core/built/admin/assets/user-detail-modal-595z1N5r.js +0 -1
  447. package/core/built/admin/assets/web-CAta3lRE.js +0 -1
  448. package/core/built/admin/assets/web-Ds9_wWJK.js +0 -2
  449. package/core/built/admin/assets/zapier-modal-CcfDZY53.js +0 -1
  450. package/core/server/data/seeders/utils/database-date.js +0 -28
  451. package/core/server/services/automations/database-date.js +0 -59
  452. /package/core/built/admin/assets/{dist-CqO2lWS02.js → dist-CqO2lWS0.js} +0 -0
  453. /package/core/server/services/{automations → lib}/mailgun-message-id.js +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"./jsx-runtime-DX3WBWVO.js";import{t as r}from"./use-tinybird-query-BvQIVuRc.js";import{g as i}from"./stats-WdDJ8c_1.js";import{_ as a,h as o}from"./chunk-KS7C4IRE-DCsL4i4D.js";import{a as ee,t as s}from"./router-provider-Bexg1t-V.js";import{f as c,h as te,p as l}from"./dist-Cb5RSHSg.js";import{a as u}from"./shade-app-B3heOAfz-BhQXxNkT.js";import{L as d,mn as ne,t as f}from"./button-BshWPHvn.js";import{a as p,i as m,n as re,t as h}from"./chart-helpers-BsbzoWhK.js";import{r as g,t as _}from"./tabs-BhzVdh5p.js";import{a as ie}from"./filters-DtYpAkDd.js";import{a as v,i as y,n as b,o as x,r as S,t as C}from"./card-CiiE7QfM.js";import{a as w,c as T,i as E,l as D,n as O,o as k,r as A,s as j,t as M,u as N}from"./data-list-CupF7bjM.js";import{t as ae}from"./empty-indicator-WB1WgT9h.js";import{a as P,i as oe,n as se,o as F,r as ce,s as I}from"./use-filter-params-BX5qf0Cg.js";import{$r as L,Ai as R,Gn as z,I as le,Jn as B,Kn as V,Kr as H,N as U,P as ue,Wr as W,Xn as G,Yn as de,Yr as fe,Zr as pe,ai as me,fr as he,ir as ge,qn as _e,qr as ve,zi as ye}from"./index-BJz9Zlsc.js";import{t as K}from"./date-range-select-kaKtab5O.js";import{n as q,r as J,t as be}from"./kpi-tabs-B8-_k2dQ.js";import{t as xe}from"./use-analytics-data-BM_uV9SU.js";import{n as Se,t as Ce}from"./audience-Cc40y7zQ.js";import{r as we,t as Te}from"./post-analytics-header-Dt4RQGq0.js";import{n as Ee}from"./post-analytics-context-D0Mw-Pmv.js";import{n as Y,r as De,t as X}from"./kpi-helpers-2FTF4a3-.js";var Z=e(t(),1),Q=n(),Oe=({data:e,range:t})=>{let[n]=a(),[r,i]=(0,Z.useState)(n.get(`tab`)||`visits`),o=Y[r],ee=m(e||[],t,o.dataKey,`sum`)?.map(e=>{let t=Number(e[o.dataKey]);return{date:String(e.date),value:t,formattedValue:o.formatter(t),label:o.label}}),s=X(e),c=h(t,e||[],{fieldName:o.dataKey});return(0,Q.jsx)(C,{children:(0,Q.jsx)(b,{children:(0,Q.jsxs)(_,{defaultValue:r,variant:`kpis`,children:[(0,Q.jsxs)(g,{className:`-mx-6 hidden grid-cols-2 md:visible! md:grid!`,children:[(0,Q.jsx)(q,{value:`visits`,onClick:()=>{i(`visits`)},children:(0,Q.jsx)(J,{color:Y.visits.color,label:`Unique visitors`,value:s.visits})}),(0,Q.jsx)(q,{value:`views`,onClick:()=>{i(`views`)},children:(0,Q.jsx)(J,{color:Y.views.color,label:`Total views`,value:s.views})})]}),(0,Q.jsxs)(fe,{children:[(0,Q.jsx)(me,{className:`md:hidden`,asChild:!0,children:(0,Q.jsxs)(be,{children:[r===`visits`&&(0,Q.jsx)(J,{color:`var(--chart-blue)`,label:`Unique visitors`,value:s.visits}),r===`views`&&(0,Q.jsx)(J,{color:`var(--chart-teal)`,label:`Total views`,value:s.views})]})}),(0,Q.jsxs)(pe,{align:`end`,className:`w-56`,children:[(0,Q.jsx)(L,{onClick:()=>i(`visits`),children:`Unique visitors`}),(0,Q.jsx)(L,{onClick:()=>i(`views`),children:`Total views`})]})]}),(0,Q.jsx)(`div`,{className:`my-4 [&_.recharts-cartesian-axis-tick-value]:fill-gray-500`,children:(0,Q.jsx)(p,{className:`-mb-3 aspect-auto h-[16vw] max-h-[320px] min-h-[180px] w-full`,color:o.color,data:ee,id:o.dataKey,range:c,showHours:!0,syncId:`overview-charts`})})]})})})},ke=e(F(),1);ke.registerLocale(P);var Ae=e=>U[e]||ke.getName(e,`en`,{select:`alias`})||`Unknown`,je=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,Q.jsxs)(M,{children:[e&&(0,Q.jsxs)(w,{children:[(0,Q.jsx)(E,{children:`Country`}),(0,Q.jsx)(E,{children:`Visitors`})]}),(0,Q.jsx)(A,{children:t.map(e=>{let t=Ae(`${e.location}`)||`Unknown`,r=n&&e.location!==`Unknown`,i=e.location?e.location.toLowerCase():`unknown`;return(0,Q.jsxs)(N,{className:r?`cursor-pointer`:``,"data-testid":`location-row-${i}`,onClick:r?()=>n(e.location):void 0,children:[(0,Q.jsx)(O,{style:{width:`${e.percentage?Math.round(e.percentage*100):0}%`}}),(0,Q.jsx)(k,{className:`group-hover/data:max-w-[calc(100%-140px)]`,children:(0,Q.jsxs)(`div`,{className:`flex items-center space-x-3 overflow-hidden`,title:t||`Unknown`,children:[(0,Q.jsx)(I,{countryCode:`${je(e.location)}`,fallback:(0,Q.jsx)(`span`,{className:`flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white`,children:(0,Q.jsx)(u.SkullAndBones,{className:`size-3`})})}),(0,Q.jsx)(`div`,{className:`truncate font-medium`,children:t})]})}),(0,Q.jsxs)(j,{children:[(0,Q.jsx)(T,{children:c(Number(e.visits))}),(0,Q.jsx)(D,{children:l(e.percentage)})]})]},e.location||`unknown`)})})]}),Me=({data:e,isLoading:t,onLocationClick:n})=>{let r=e.slice(0,10);return(0,Q.jsx)(Q.Fragment,{children:t?``:(0,Q.jsx)(Q.Fragment,{children:e&&e.length>0&&(0,Q.jsxs)(C,{className:`group/datalist`,"data-testid":`locations-card`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between p-6`,children:[(0,Q.jsxs)(v,{className:`p-0`,children:[(0,Q.jsx)(x,{children:`Locations`}),(0,Q.jsx)(S,{children:`Where are the readers of this post`})]}),(0,Q.jsx)(R,{className:`mr-2`,children:`Visitors`})]}),(0,Q.jsxs)(b,{className:`overflow-hidden`,children:[(0,Q.jsx)(ge,{}),(0,Q.jsx)($,{data:r,tableHeader:!1,onLocationClick:n})]}),e.length>10&&(0,Q.jsx)(y,{children:(0,Q.jsxs)(z,{children:[(0,Q.jsx)(G,{asChild:!0,children:(0,Q.jsxs)(f,{variant:`outline`,children:[`View all `,(0,Q.jsx)(d,{})]})}),(0,Q.jsxs)(V,{className:`overflow-y-auto pt-0 sm:max-w-[420px]`,children:[(0,Q.jsxs)(B,{className:`sticky top-0 z-40 -mx-6 bg-surface-elevated/60 p-6 backdrop-blur`,children:[(0,Q.jsx)(de,{children:`Top locations`}),(0,Q.jsx)(_e,{children:`Where are the readers of this post`})]}),(0,Q.jsx)(`div`,{className:`group/datalist`,children:(0,Q.jsx)($,{data:e,tableHeader:!0,onLocationClick:n})})]})]})})]})})})},Ne=()=>{let e=ee(),{postId:t}=o(),{statsConfig:n,isLoading:a,site:c}=xe(),{range:l,setRange:u,post:d,isPostLoading:f}=Ee(),{appSettings:p}=ye(),m=(0,Z.useRef)(null),{filters:h,setFilters:g}=ce({supportedFields:se,trackingSource:`post-analytics`}),_=(0,Z.useMemo)(()=>Ce(h.find(e=>e.field===`audience`)?.values),[h]);(0,Z.useEffect)(()=>{!f&&d?.email_only&&e(`/posts/analytics/${t}`)},[f,d?.email_only,e,t]);let v=(0,Z.useMemo)(()=>{if(!d?.published_at)return ue.allTime.value;let e=ve(d.published_at),{startDate:t,endDate:n}=H(l);return n.diff(t,`days`)+1>e?e:l},[d?.published_at,l]),{startDate:y,endDate:x,timezone:S}=H(v),w=(0,Z.useCallback)(()=>{let e=te(m.current);e&&e.scrollTo({top:0,behavior:`smooth`})},[]),T=(0,Z.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]),E=(0,Z.useCallback)((e,t)=>{g(n=>n.find(t=>t.field===e)?n.map(n=>n.field===e?{...n,values:[t]}:n):[...n,ie(e,`is`,[t])]),w()},[g,w]),D=(0,Z.useCallback)(e=>E(`location`,e),[E]),O=(0,Z.useCallback)(e=>E(`source`,e),[E]),k=(0,Z.useMemo)(()=>{let e={site_uuid:n?.id||``,date_from:W(y),date_to:W(x),timezone:S,member_status:Se(_),post_uuid:``,...T};return!f&&d?.uuid?{...e,post_uuid:d.uuid}:e},[f,d,n?.id,y,x,S,_,T]),{data:A,loading:j}=r({endpoint:`api_kpis`,statsConfig:n,params:k}),{data:M,loading:N}=r({endpoint:`api_top_locations`,statsConfig:n,params:k}),{data:P,loading:F}=r({endpoint:`api_top_sources`,statsConfig:n,params:k}),I=(0,Z.useMemo)(()=>M?.reduce((e,t)=>e+Number(t.visits),0)||0,[M]),L=(0,Z.useMemo)(()=>P?P.reduce((e,t)=>e+Number(t.visits||0),0):0,[P]),R=c.url,z=c.icon,B=(0,Z.useMemo)(()=>{let e=M?.map(e=>({location:String(e.location),visits:Number(e.visits),percentage:I>0?Number(e.visits)/I:0,isUnknown:le.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]},[M,I]),V=a||f||j||N||F,U=X(A),G=h.length>0;return p&&!p.analytics?.webAnalytics?(0,Q.jsx)(s,{to:`/posts/analytics/${t}`,replace:!0}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(Te,{currentTab:`Web`,children:[G&&(0,Q.jsx)(i,{children:(0,Q.jsx)(K,{range:l,onRangeChange:u})}),(0,Q.jsxs)(i,{className:`${G?`mt-0! [grid-area:subactions] lg:mt-[25px]!`:`[grid-area:actions]`}`,children:[(0,Q.jsx)(oe,{filters:h,postUuid:d?.uuid,range:l,onChange:g}),!G&&(0,Q.jsx)(K,{range:l,onRangeChange:u})]})]}),(0,Q.jsx)(we,{ref:m,children:V?(0,Q.jsx)(C,{className:`size-full`,variant:`plain`,children:(0,Q.jsx)(b,{className:`size-full items-center justify-center`,children:(0,Q.jsx)(he,{})})}):A&&A.length!==0&&U.visits!==`0`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Oe,{data:A,range:v}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6 lg:grid lg:grid-cols-2`,children:[(0,Q.jsx)(Me,{data:B,isLoading:N,onLocationClick:D}),(0,Q.jsx)(De,{data:P,range:v,siteIcon:z,siteUrl:R,totalVisitors:L,onSourceClick:O})]})]}):(0,Q.jsx)(`div`,{className:`grow`,children:(0,Q.jsx)(ae,{className:`h-full`,description:`Try adjusting filters to see more data.`,title:`No visitors ${re(l)}`,children:(0,Q.jsx)(ne,{strokeWidth:1.5})})})})]})};export{Ne as default};
@@ -0,0 +1 @@
1
+ import{o as e,r as t}from"./rolldown-runtime-DAXXjFlN.js";import{t as n}from"./react-Bb3IsNbi.js";import{t as r}from"./jsx-runtime-DX3WBWVO.js";import{m as i,p as a}from"./hooks-CJepWnbB.js";import{t as o,xr as s}from"./button-BshWPHvn.js";import{o as c,t as l}from"./use-settings-navigation-aDSLtmEl.js";import{i as u,n as d,r as f,t as ee}from"./action-list-lGzZLHc8.js";import{n as p}from"./global-data-context-gAMDH9u1.js";import{n as m}from"./confirmation-context-QmFxSjWy.js";import{n as h}from"./integrations-B9yYgci5.js";import{t as g}from"./api-keys-Boy5pLbD.js";import{t as te}from"./integration-header-B4DyXV06.js";import{t as ne}from"./api-keys-BgKr003d.js";import{t as re}from"./brand-icon-09YqFZjV.js";var ie=``+new URL(`zapier-logo-D8a11oW_.svg`,import.meta.url).href,_=e(n(),1),v=r(),y=(e,t)=>`${e}-${t}`,b=()=>{let[e,t]=(0,_.useState)(``),[n,r]=(0,_.useState)(!1),i=(0,_.useRef)(new Map),[a,o]=(0,_.useState)(new Set),s=t=>t.length?t.some(t=>t.toLowerCase().includes(e.toLowerCase())):!0,c=(0,_.useCallback)((t,n)=>{i.current.set(t,n),(!e||n.some(t=>t.toLowerCase().includes(e.toLowerCase())))&&o(e=>new Set(e).add(t))},[e]),l=(0,_.useCallback)(e=>{i.current.delete(e),o(t=>{let n=new Set(t);return n.delete(e),n})},[]);(0,_.useEffect)(()=>{let t=new Set;i.current.forEach((n,r)=>{(!e||n.some(t=>t.toLowerCase().includes(e.toLowerCase())))&&t.add(r)}),o(t)},[e]);let u=(0,_.useCallback)(e=>a.size===1&&a.has(e),[a]),d=(0,_.useCallback)(()=>a,[a]),f=t=>{if(!e)return t;if(typeof t==`string`){let n=e.split(/\s+/).map(e=>e.toLowerCase()),r=n.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`),i=t.split(RegExp(`(${r})`,`gi`)),a=new Map;return i.map(e=>{if(!n.includes(e.toLowerCase()))return e;let t=(a.get(e)??0)+1;return a.set(e,t),(0,v.jsx)(`span`,{className:`bg-yellow-500/40`,children:e},`${e}-${t}`)})}else if(Array.isArray(t))return t.map(e=>f(e));else if(t&&typeof t==`object`&&t)return _.Children.map(t,e=>e&&typeof e==`object`&&`props`in e?f(e.props.children):e);else return t};return{filter:e,setFilter:t,checkVisible:s,highlightKeywords:f,noResult:n,setNoResult:r,registerComponent:c,unregisterComponent:l,getVisibleComponents:d,isOnlyVisibleComponent:u}},x=``+new URL(`Alto-DoS3yH_j.png`,import.meta.url).href,S=``+new URL(`Bulletin-BUpcurG5.png`,import.meta.url).href,C=``+new URL(`Casper-ASA9Ix4v.png`,import.meta.url).href,w=``+new URL(`Dawn-aeEVEPie.png`,import.meta.url).href,T=``+new URL(`Digest-DJl0U_FG.png`,import.meta.url).href,E=``+new URL(`Dope-D_CgP0p0.png`,import.meta.url).href,D=``+new URL(`Ease-B4NuA7sj.png`,import.meta.url).href,O=``+new URL(`Edge-BPZxvKka.png`,import.meta.url).href,k=``+new URL(`Edition-cIDLjlhj.png`,import.meta.url).href,A=``+new URL(`Episode-D7bgV2bY.png`,import.meta.url).href,j=``+new URL(`Headline-BFXOunIb.png`,import.meta.url).href,M=``+new URL(`Journal-D3UW9T2b.png`,import.meta.url).href,N=``+new URL(`London-CSCVHwS0.png`,import.meta.url).href,P=``+new URL(`Ruby-DVEXVMTx.png`,import.meta.url).href,F=``+new URL(`Solo-c-yPo0gw.png`,import.meta.url).href,I=``+new URL(`Source-V-WXZXnS.png`,import.meta.url).href,L=``+new URL(`Source-Magazine-Czq1p0a_.png`,import.meta.url).href,R=``+new URL(`Source-Newsletter-CwTcfhJ-.png`,import.meta.url).href,z=``+new URL(`Taste-U2cRR2yO.png`,import.meta.url).href,B=``+new URL(`Wave-DE2aI-FM.png`,import.meta.url).href,V=[{name:`Source`,category:`News`,previewUrl:`https://source.ghost.io/`,ref:`default`,image:I,variants:[{category:`Magazine`,previewUrl:`https://source-magazine.ghost.io/`,image:L},{category:`Newsletter`,previewUrl:`https://source-newsletter.ghost.io/`,image:R}]},{name:`Casper`,category:`Blog`,previewUrl:`https://demo.ghost.io/`,ref:`TryGhost/Casper`,image:C},{name:`Edition`,category:`Newsletter`,url:`https://github.com/TryGhost/Edition`,previewUrl:`https://edition.ghost.io/`,ref:`TryGhost/Edition`,image:k},{name:`Solo`,category:`Blog`,url:`https://github.com/TryGhost/Solo`,previewUrl:`https://solo.ghost.io`,ref:`TryGhost/Solo`,image:F},{name:`Taste`,category:`Blog`,url:`https://github.com/TryGhost/Taste`,previewUrl:`https://taste.ghost.io`,ref:`TryGhost/Taste`,image:z},{name:`Episode`,category:`Podcast`,url:`https://github.com/TryGhost/Episode`,previewUrl:`https://episode.ghost.io`,ref:`TryGhost/Episode`,image:A},{name:`Digest`,category:`Newsletter`,url:`https://github.com/TryGhost/Digest`,previewUrl:`https://digest.ghost.io/`,ref:`TryGhost/Digest`,image:T},{name:`Bulletin`,category:`Newsletter`,url:`https://github.com/TryGhost/Bulletin`,previewUrl:`https://bulletin.ghost.io/`,ref:`TryGhost/Bulletin`,image:S},{name:`Alto`,category:`Blog`,url:`https://github.com/TryGhost/Alto`,previewUrl:`https://alto.ghost.io`,ref:`TryGhost/Alto`,image:x},{name:`Dope`,category:`Magazine`,url:`https://github.com/TryGhost/Dope`,previewUrl:`https://dope.ghost.io`,ref:`TryGhost/Dope`,image:E},{name:`Wave`,category:`Podcast`,url:`https://github.com/TryGhost/Wave`,previewUrl:`https://wave.ghost.io`,ref:`TryGhost/Wave`,image:B},{name:`Edge`,category:`Photography`,url:`https://github.com/TryGhost/Edge`,previewUrl:`https://edge.ghost.io`,ref:`TryGhost/Edge`,image:O},{name:`Dawn`,category:`Newsletter`,url:`https://github.com/TryGhost/Dawn`,previewUrl:`https://dawn.ghost.io/`,ref:`TryGhost/Dawn`,image:w},{name:`Ease`,category:`Documentation`,url:`https://github.com/TryGhost/Ease`,previewUrl:`https://ease.ghost.io`,ref:`TryGhost/Ease`,image:D},{name:`Headline`,category:`News`,url:`https://github.com/TryGhost/Headline`,previewUrl:`https://headline.ghost.io`,ref:`TryGhost/Headline`,image:j},{name:`Ruby`,category:`Magazine`,url:`https://github.com/TryGhost/Ruby`,previewUrl:`https://ruby.ghost.io`,ref:`TryGhost/Ruby`,image:P},{name:`London`,category:`Photography`,url:`https://github.com/TryGhost/London`,previewUrl:`https://london.ghost.io`,ref:`TryGhost/London`,image:N},{name:`Journal`,category:`Newsletter`,url:`https://github.com/TryGhost/Journal`,previewUrl:`https://journal.ghost.io/`,ref:`TryGhost/Journal`,image:M}],H=``+new URL(`orb-black-1-bYPPSSAp.png`,import.meta.url).href,ae=``+new URL(`orb-black-2-C-rcujeh.png`,import.meta.url).href,U=``+new URL(`orb-black-3-DTkwRv_1.png`,import.meta.url).href,W=``+new URL(`orb-black-4-BXF3fMuE.png`,import.meta.url).href,G=``+new URL(`orb-black-5-94Eda1ek.png`,import.meta.url).href,K=`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201818.2%202500'%20style='enable-background:new%200%200%201818.2%202500'%20xml:space='preserve'%3e%3ctitle%3egoogle-docs%3c/title%3e%3cpath%20d='M1136.4%200h-966C79.6%200%200%2079.5%200%20170.5v2159.1c0%2090.9%2079.5%20170.5%20170.5%20170.5h1477.3c90.9%200%20170.5-79.5%20170.5-170.5V681.8l-397.7-284.1L1136.4%200z'%20style='fill:%234285f4'/%3e%3cpath%20d='M454.5%201818.2h909.1v-113.6h-909l-.1%20113.6zm0%20227.3h681.8v-113.6H454.5v113.6zm0-795.5v113.6h909.1V1250H454.5zm0%20340.9h909.1v-113.6h-909l-.1%20113.6z'%20style='fill:%23f1f1f1'/%3e%3cpath%20d='M1136.4%200v511.4c0%2090.9%2079.5%20170.4%20170.4%20170.4h511.4L1136.4%200z'%20style='fill:%23a1c2fa'/%3e%3c/svg%3e`,q=``+new URL(`mailchimp-DwTEN-tS.svg`,import.meta.url).href,J=`data:image/svg+xml,%3csvg%20height='546'%20viewBox='0%200%20569%20546'%20width='569'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3epatreon%3c/title%3e%3cg%20fill='%23FF424D'%3e%3ccircle%20cx='362.59'%20cy='204.59'%20data-fill='1'%20r='204.59'/%3e%3cpath%20data-fill='1'%20d='M0%200h100v545.8H0z'/%3e%3c/g%3e%3c/svg%3e`,Y=`data:image/svg+xml,%3csvg%20width='152'%20height='179'%20viewBox='0%200%20152%20179'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3epaypal%3c/title%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M136.492%2045.453c2.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27l-2.365%2015a4.168%204.168%200%200%200%204.118%204.818H69.76a6.948%206.948%200%200%200%206.863-5.865l.283-1.468%205.442-34.507.351-1.907a6.947%206.947%200%200%201%206.862-5.865h4.322c27.984%200%2049.896-11.37%2056.299-44.25%202.675-13.74%201.292-25.208-5.783-33.27-2.14-2.439-4.802-4.455-7.907-6.1'%20fill='%23238EC2'/%3e%3cpath%20d='M136.492%2045.453c2.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27l8.609-54.588-.267%201.711c.609-3.86%203.909-6.704%207.817-6.704h16.288c31.989%200%2057.037-12.996%2064.356-50.582.217-1.113.402-2.191.568-3.251'%20fill='%2320274F'/%3e%3cpath%20d='M56.978%2045.638a6.945%206.945%200%200%201%206.863-5.866h43.514c5.155%200%209.961.337%2014.356%201.045%201.256.202%202.478.435%203.665.698a53.92%2053.92%200%200%201%203.455.885c.558.162%201.106.333%201.646.512%202.157.717%204.166%201.562%206.015%202.541%202.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27L56.978%2045.638'%20fill='%23253667'/%3e%3c/g%3e%3c/svg%3e`,oe=``+new URL(`slackicon-37ETtpm7.png`,import.meta.url).href,se=`data:image/svg+xml,%3csvg%20width='86'%20height='89'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3etypeform%3c/title%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M40.28%2087.561c12.464.154%2021.16-3.994%2030.135-12.175%208.975-8.18%2014.306-16.867%2014.741-28.73.436-11.862-3.412-21.43-12.564-30.581C63.441%206.923%2051.64.9%2039.4.899%2027.158.898%2018.967%206.252%2011.385%2016.07c-7.581%209.818-9.237%2022.212-9.894%2033.921-.657%2011.71-1.15%2017.111%206.608%2024.625%207.758%207.514%2019.718%2012.791%2032.182%2012.945z'%20stroke='%23262627'/%3e%3cpath%20d='M29.136%2037.976v-4.885h25.918v4.885H44.679v27.998H39.51V37.976z'%20fill='%23262627'%20fill-rule='nonzero'/%3e%3c/g%3e%3c/svg%3e`,ce=``+new URL(`zero-bounce-lzY95s9E.png`,import.meta.url).href,X=[{ghostImage:ae,appImage:oe,title:`Share scheduled posts with your team in Slack`,url:`https://zapier.com/webintent/create-zap?template=359499`},{ghostImage:U,appImage:J,title:`Connect Patreon to your Ghost membership site`,url:`https://zapier.com/webintent/create-zap?template=75801`},{ghostImage:W,appImage:ce,title:`Protect email delivery with email verification`,url:`https://zapier.com/webintent/create-zap?template=359415`},{ghostImage:G,appImage:Y,title:`Add members for successful sales in PayPal`,url:`https://zapier.com/webintent/create-zap?template=184423`},{ghostImage:U,appImage:Y,title:`Unsubscribe members who cancel a subscription in PayPal`,url:`https://zapier.com/webintent/create-zap?template=359348`},{ghostImage:H,appImage:K,title:`Send new post drafts from Google Docs to Ghost`,url:`https://zapier.com/webintent/create-zap?template=50924`},{ghostImage:W,appImage:se,title:`Survey new members using Typeform`,url:`https://zapier.com/webintent/create-zap?template=359407`},{ghostImage:H,appImage:q,title:`Sync email subscribers in Ghost + Mailchimp`,url:`https://zapier.com/webintent/create-zap?template=359342`}],Z=(0,_.createContext)({officialThemes:V,zapierTemplates:X,search:{filter:``,setFilter:()=>{},checkVisible:()=>!0,highlightKeywords:()=>``,noResult:!1,setNoResult:()=>{},registerComponent:()=>{},unregisterComponent:()=>{},getVisibleComponents:()=>new Set,isOnlyVisibleComponent:()=>!1},sortingState:[],offersShowArchived:!1,setOffersShowArchived:()=>{}}),Q=()=>(0,_.useContext)(Z),le=()=>Q().officialThemes,$=()=>Q().search,ue=()=>Q().upgradeStatus,de=()=>{let{sortingState:e,setSortingState:t}=Q();return{sortingState:e,setSortingState:t}},fe=()=>{let{offersShowArchived:e,setOffersShowArchived:t}=Q();return{offersShowArchived:e,setOffersShowArchived:t}},pe=t({default:()=>me});function me(){let{updateRoute:e}=l(),{zapierTemplates:t}=Q(),{data:{integrations:n}={integrations:[]}}=h(),{config:r}=p(),{mutateAsync:y}=ne(),b=i(),{confirm:x}=m(),[S,C]=(0,_.useState)(!1),w=r.hostSettings?.limits?.customIntegrations?.disabled,T=n.find(({slug:e})=>e===`zapier`),E=T?.api_keys?.find(e=>e.type===`admin`);return(0,_.useEffect)(()=>{w&&e(`integrations`)},[w,e]),(0,v.jsxs)(c,{cancelLabel:``,footer:(0,v.jsxs)(`div`,{className:`mx-8 flex w-full items-center justify-between`,children:[(0,v.jsxs)(`a`,{className:`mt-1 self-baseline font-bold`,href:`https://zapier.com/apps/ghost/integrations?utm_medium=partner_api&utm_source=widget&utm_campaign=Widget`,rel:`noopener noreferrer`,target:`_blank`,children:[`View more Ghost integrations powered by `,(0,v.jsx)(`span`,{children:(0,v.jsx)(`img`,{alt:`Zapier`,className:`relative top-[-2px] inline-block`,src:ie})})]}),(0,v.jsx)(o,{type:`button`,onClick:()=>{e(`integrations`)},children:`Close`})]}),okLabel:`Close`,okVariant:`default`,testId:`zapier-modal`,title:``,stickyFooter:!0,onClose:()=>{e(`integrations`)},onOk:()=>{e(`integrations`)},children:[(0,v.jsx)(te,{detail:`Automation for your favorite apps`,extra:(0,v.jsx)(`div`,{className:`mt-1 -mb-4`,children:(0,v.jsx)(g,{keys:[{id:`admin-api-key`,label:`Admin API key`,text:E?.secret,hint:S?(0,v.jsx)(`div`,{className:`text-green`,children:`Admin API Key was successfully regenerated`}):void 0,onRegenerate:()=>{!T||!E||(C(!1),x({title:`Regenerate Admin API Key`,prompt:`You will need to locate the Ghost App within your Zapier account and click on "Reconnect" to enter the new Admin API Key.`,okLabel:`Regenerate Admin API Key`,onOk:async e=>{try{await y({integrationId:T.id,apiKeyId:E.id}),C(!0),e?.remove()}catch(e){b(e)}}}))}},{id:`api-url`,label:`API URL`,text:window.location.origin+a().subdir}]})}),icon:(0,v.jsx)(re,{name:`zapier`,size:56}),title:`Zapier`}),(0,v.jsx)(ee,{children:t.map(e=>(0,v.jsxs)(d,{hover:!1,children:[(0,v.jsx)(u,{className:`flex items-center gap-3 py-2 pl-3`,children:(0,v.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center`,children:[(0,v.jsxs)(`div`,{className:`flex shrink-0 flex-nowrap items-center gap-2`,children:[(0,v.jsx)(`img`,{className:`size-8 object-contain dark:invert`,role:`presentation`,src:e.ghostImage}),(0,v.jsx)(s,{className:`size-3`}),(0,v.jsx)(`img`,{className:`size-8 object-contain`,role:`presentation`,src:e.appImage})]}),(0,v.jsx)(`span`,{children:e.title})]})}),(0,v.jsx)(f,{visibility:`hover`,children:(0,v.jsx)(o,{className:`h-auto p-0 font-semibold whitespace-nowrap text-[#FF4A00] hover:text-[#FF4A00]`,variant:`link`,asChild:!0,children:(0,v.jsx)(`a`,{href:e.url,rel:`noopener noreferrer`,target:`_blank`,children:`Use this Zap`})})})]},e.url))})]})}export{$ as a,X as c,b as d,le as i,V as l,Z as n,de as o,fe as r,ue as s,pe as t,y as u};
@@ -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-68f447a1796b93a1f128b649bac8506d.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.58%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%22206c3000ea%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%223f75a13bc5%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.59%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%22206c3000ea%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%229587f53e3a%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-BOJzlYiz.js"></script>
23
+ <script type="module" crossorigin src="./assets/index-BJz9Zlsc.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/jsx-runtime-DX3WBWVO.js">
@@ -29,21 +29,24 @@
29
29
  <link rel="modulepreload" crossorigin href="./assets/hooks-CJepWnbB.js">
30
30
  <link rel="modulepreload" crossorigin href="./assets/dist-Cb5RSHSg.js">
31
31
  <link rel="modulepreload" crossorigin href="./assets/dist-CQJY6SVY.js">
32
- <link rel="modulepreload" crossorigin href="./assets/dist-CqO2lWS02.js">
33
- <link rel="modulepreload" crossorigin href="./assets/Combination-BDvCdg1t.js">
32
+ <link rel="modulepreload" crossorigin href="./assets/dist-CqO2lWS0.js">
33
+ <link rel="modulepreload" crossorigin href="./assets/Combination-BCm9FL4o.js">
34
34
  <link rel="modulepreload" crossorigin href="./assets/preload-helper-DYl5dUZ5.js">
35
- <link rel="modulepreload" crossorigin href="./assets/chunk-KS7C4IRE-DG9HTHQ3.js">
36
- <link rel="modulepreload" crossorigin href="./assets/router-provider-CkB_ArLF.js">
35
+ <link rel="modulepreload" crossorigin href="./assets/chunk-KS7C4IRE-DCsL4i4D.js">
36
+ <link rel="modulepreload" crossorigin href="./assets/router-provider-Bexg1t-V.js">
37
37
  <link rel="modulepreload" crossorigin href="./assets/text-DU9Hv33_.js">
38
38
  <link rel="modulepreload" crossorigin href="./assets/shade-app-B3heOAfz-BhQXxNkT.js">
39
39
  <link rel="modulepreload" crossorigin href="./assets/dist-myQaY0ka.js">
40
- <link rel="modulepreload" crossorigin href="./assets/dist-j1xxxnY8.js">
40
+ <link rel="modulepreload" crossorigin href="./assets/dist-CJJqYPep.js">
41
+ <link rel="modulepreload" crossorigin href="./assets/button-BshWPHvn.js">
41
42
  <link rel="modulepreload" crossorigin href="./assets/dist-B2PvRwLn.js">
42
- <link rel="modulepreload" crossorigin href="./assets/dist-DlCyLrOC.js">
43
+ <link rel="modulepreload" crossorigin href="./assets/dist-CNlMj7ML.js">
44
+ <link rel="modulepreload" crossorigin href="./assets/dist-C1-Oy3Db.js">
43
45
  <link rel="modulepreload" crossorigin href="./assets/input-surface-BdOe4KzO.js">
46
+ <link rel="modulepreload" crossorigin href="./assets/skeleton-D7hwjdry.js">
44
47
  <link rel="modulepreload" crossorigin href="./assets/update-queries-C4CnvJaW.js">
45
48
  <link rel="modulepreload" crossorigin href="./assets/users-DmGMPfw7.js">
46
- <link rel="stylesheet" crossorigin href="./assets/index-Bid6LAyc.css">
49
+ <link rel="stylesheet" crossorigin href="./assets/index-Dg8cdR8E.css">
47
50
  </head>
48
51
  <body class="react-admin">
49
52
  <div id="ember-alerts-wormhole"></div>
@@ -64,8 +67,8 @@
64
67
  <div id="ember-notifications-wormhole"></div>
65
68
  <script src="./assets/vendor-25f0bb2b2de85265afdf33da79f14a44.js"></script>
66
69
  <script src="./assets/chunk.492.a9da46ca956b10116774.js"></script>
67
- <script src="./assets/chunk.408.1a258af360eb8d905508.js"></script>
68
- <script src="./assets/chunk.524.4c693c3a00ac91df34fa.js"></script>
69
- <script src="./assets/ghost-ba408063a5922b458b4a8f216cf23251.js"></script>
70
+ <script src="./assets/chunk.301.5673a0caf7c49bb00212.js"></script>
71
+ <script src="./assets/chunk.524.86db0d945468c852374b.js"></script>
72
+ <script src="./assets/ghost-f110822e67868c9fdf9a6c23754b2559.js"></script>
70
73
  </body>
71
74
  </html>
@@ -7,7 +7,8 @@
7
7
  const {SafeString, templates} = require('../../../../services/handlebars');
8
8
 
9
9
  // We use the name input_password to match the helper for consistency:
10
- module.exports = function input_password(options) { // eslint-disable-line camelcase
10
+ // eslint-disable-next-line camelcase
11
+ module.exports = function input_password(options) {
11
12
  options = options || {};
12
13
  options.hash = options.hash || {};
13
14
 
@@ -11,7 +11,8 @@ const {SafeString} = require('../services/handlebars');
11
11
  */
12
12
 
13
13
  // We use the name body_class to match the helper for consistency
14
- module.exports = function body_class(options) { // eslint-disable-line camelcase
14
+ // eslint-disable-next-line camelcase
15
+ module.exports = function body_class(options) {
15
16
  let classes = [];
16
17
  const context = options.data.root.context || [];
17
18
  const obj = this.post || this.page;
@@ -15,7 +15,8 @@ const messages = {
15
15
  invalidData: 'The {{cancel_link}} helper was used outside of a subscription context. See https://ghost.org/docs/themes/members/#cancel-links.'
16
16
  };
17
17
 
18
- function cancel_link(options) { // eslint-disable-line camelcase
18
+ // eslint-disable-next-line camelcase
19
+ function cancel_link(options) {
19
20
  let truncateOptions = (options || {}).hash || {};
20
21
 
21
22
  if (this.id === undefined || this.cancel_at_period_end === undefined) {
@@ -1,6 +1,7 @@
1
1
  const {Color} = require('@tryghost/color-utils');
2
2
 
3
- module.exports = function color_to_rgba(color, alpha) { // eslint-disable-line camelcase
3
+ // eslint-disable-next-line camelcase
4
+ module.exports = function color_to_rgba(color, alpha) {
4
5
  const backgroundColor = (typeof color === 'string' && color.trim()) ? color.trim() : '#15171A';
5
6
  const opacity = Number.isFinite(alpha) ? alpha : Number.parseFloat(alpha);
6
7
  const normalizedOpacity = Number.isFinite(opacity) ? Math.max(0, Math.min(1, opacity)) : 0.25;
@@ -2,7 +2,8 @@ const {SafeString} = require('../services/handlebars');
2
2
  const logging = require('@tryghost/logging');
3
3
  const {getFrontendKey} = require('../services/proxy');
4
4
 
5
- module.exports = async function content_api_key() { // eslint-disable-line camelcase
5
+ // eslint-disable-next-line camelcase
6
+ module.exports = async function content_api_key() {
6
7
  try {
7
8
  const frontendKey = await getFrontendKey();
8
9
 
@@ -2,7 +2,8 @@ const {SafeString} = require('../services/handlebars');
2
2
  const logging = require('@tryghost/logging');
3
3
  const {urlUtils} = require('../services/proxy');
4
4
 
5
- module.exports = function content_api_url(options) { // eslint-disable-line camelcase
5
+ // eslint-disable-next-line camelcase
6
+ module.exports = function content_api_url(options) {
6
7
  let result;
7
8
  const absoluteUrlRequested = getAbsoluteOption(options);
8
9
 
@@ -1,6 +1,7 @@
1
1
  const {textColorForBackgroundColor} = require('@tryghost/color-utils');
2
2
 
3
- module.exports = function contrast_text_color(color) { // eslint-disable-line camelcase
3
+ // eslint-disable-next-line camelcase
4
+ module.exports = function contrast_text_color(color) {
4
5
  const backgroundColor = (typeof color === 'string' && color.trim()) ? color.trim() : '#15171A';
5
6
 
6
7
  try {
@@ -9,7 +9,8 @@ const {localUtils} = require('../services/handlebars');
9
9
  /**
10
10
  * @deprecated Use {{social_url type="facebook"}} instead.
11
11
  */
12
- module.exports = function facebook_url(username, options) { // eslint-disable-line camelcase
12
+ // eslint-disable-next-line camelcase
13
+ module.exports = function facebook_url(username, options) {
13
14
  if (!options) {
14
15
  options = username;
15
16
  username = localUtils.findKey('facebook', this, options.data.site);
@@ -9,7 +9,8 @@ const _ = require('lodash');
9
9
  const createFrame = hbs.handlebars.createFrame;
10
10
 
11
11
  // We use the name ghost_foot to match the helper for consistency:
12
- module.exports = function ghost_foot(options) { // eslint-disable-line camelcase
12
+ // eslint-disable-next-line camelcase
13
+ module.exports = function ghost_foot(options) {
13
14
  const foot = [];
14
15
 
15
16
  const globalCodeinjection = settingsCache.get('codeinjection_foot');
@@ -320,7 +320,8 @@ function getTinybirdTrackerScript(dataRoot) {
320
320
  * Also see how the root object gets created, https://github.com/wycats/handlebars.js/blob/v4.0.6/lib/handlebars/runtime.js#L259
321
321
  */
322
322
  // We use the name ghost_head to match the helper for consistency:
323
- module.exports = async function ghost_head(options) { // eslint-disable-line camelcase
323
+ // eslint-disable-next-line camelcase
324
+ module.exports = async function ghost_head(options) {
324
325
  debug('begin');
325
326
  // if server error page do nothing
326
327
  if (options.data.root.statusCode >= 500) {
@@ -107,9 +107,11 @@ function evaluateStringMatch(expr, str, ci) {
107
107
  * @param {Object} data - global params
108
108
  */
109
109
  function evaluateList(type, expr, obj, data) {
110
- return expr.split(',').map(function (prop) {
110
+ const props = expr.split(',').map(function (prop) {
111
111
  return prop.trim().toLocaleLowerCase();
112
- })[type](function (prop) {
112
+ });
113
+
114
+ return props[type](function (prop) {
113
115
  if (prop.match(/^@/)) {
114
116
  return _.has(data, prop.replace(/@/, '')) && !_.isEmpty(_.get(data, prop.replace(/@/, '')));
115
117
  } else {
@@ -12,7 +12,8 @@ const messages = {
12
12
  forIsRequired: 'The {{link_class}} helper requires a for="" attribute.'
13
13
  };
14
14
 
15
- module.exports = function link_class(options) { // eslint-disable-line camelcase
15
+ // eslint-disable-next-line camelcase
16
+ module.exports = function link_class(options) {
16
17
  options = options || {};
17
18
  options.hash = options.hash || {};
18
19
  options.data = options.data || {};
@@ -6,7 +6,8 @@ const metaData = require('../meta');
6
6
  const {getMetaDataDescription} = metaData;
7
7
 
8
8
  // We use the name meta_description to match the helper for consistency:
9
- module.exports = function meta_description(options) { // eslint-disable-line camelcase
9
+ // eslint-disable-next-line camelcase
10
+ module.exports = function meta_description(options) {
10
11
  options = options || {};
11
12
 
12
13
  return getMetaDataDescription(this, options.data.root) || '';
@@ -6,6 +6,7 @@ const metaData = require('../meta');
6
6
  const {getMetaDataTitle} = metaData;
7
7
 
8
8
  // We use the name meta_title to match the helper for consistency:
9
- module.exports = function meta_title(options) { // eslint-disable-line camelcase
9
+ // eslint-disable-next-line camelcase
10
+ module.exports = function meta_title(options) {
10
11
  return getMetaDataTitle(this, options.data.root, options);
11
12
  };
@@ -7,6 +7,7 @@ const errors = require('@tryghost/errors');
7
7
  const tpl = require('@tryghost/tpl');
8
8
  const {slugify} = require('@tryghost/string');
9
9
  const _ = require('lodash');
10
+ const labs = require('../../shared/labs');
10
11
 
11
12
  const messages = {
12
13
  invalidData: 'navigation data is not an object or is a function',
@@ -16,6 +17,84 @@ const messages = {
16
17
 
17
18
  const createFrame = hbs.handlebars.createFrame;
18
19
 
20
+ /**
21
+ * @typedef {Object} NavigationItem
22
+ * @property {string} url
23
+ * @property {string} [label]
24
+ * @property {string} [icon]
25
+ * @property {string} [visibility]
26
+ */
27
+
28
+ /**
29
+ * @typedef {Object} NavigationMember
30
+ * @property {'free' | 'paid' | string} status
31
+ */
32
+
33
+ /**
34
+ * @param {string | null | undefined} icon
35
+ * @returns {string}
36
+ */
37
+ function getNavigationIconName(icon) {
38
+ if (!icon) {
39
+ return '';
40
+ }
41
+
42
+ const filename = icon.split(/[?#]/)[0].split('/').filter(Boolean).pop() || '';
43
+ const name = filename.replace(/\.[^.]+$/, '');
44
+
45
+ try {
46
+ return decodeURIComponent(name);
47
+ } catch (e) {
48
+ return name;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * @param {string} href
54
+ * @param {string | undefined} url
55
+ * @returns {boolean}
56
+ */
57
+ function isCurrentNavigationUrl(href, url) {
58
+ if (!url) {
59
+ return false;
60
+ }
61
+
62
+ const strippedHref = href.replace(/\/+$/, '');
63
+ const strippedCurrentUrl = url.replace(/\/+$/, '');
64
+ return strippedHref === strippedCurrentUrl;
65
+ }
66
+
67
+ /**
68
+ * @param {NavigationItem} item
69
+ * @param {NavigationMember | null | undefined} member
70
+ * @returns {boolean}
71
+ */
72
+ function isNavigationItemVisible(item, member) {
73
+ const visibility = item.visibility || 'public';
74
+ const isMember = !!member;
75
+ const isFreeMember = isMember && member.status === 'free';
76
+ const isPaidMember = isMember && member.status !== 'free';
77
+
78
+ switch (visibility) {
79
+ case 'members':
80
+ return isMember;
81
+ case 'paid':
82
+ return isPaidMember;
83
+ case 'public_free':
84
+ return !isMember || isFreeMember;
85
+ case 'public_paid':
86
+ return !isMember || isPaidMember;
87
+ case 'public_only':
88
+ return !isMember;
89
+ case 'free_members':
90
+ return isFreeMember;
91
+ case 'none':
92
+ return false;
93
+ default:
94
+ return true;
95
+ }
96
+ }
97
+
19
98
  module.exports = function navigation(options) {
20
99
  options = options || {};
21
100
  options.hash = options.hash || {};
@@ -29,16 +108,17 @@ module.exports = function navigation(options) {
29
108
 
30
109
  const navigationData = options.data.site[key];
31
110
  const currentUrl = options.data.root.relativeUrl;
111
+ const member = options.data.member || options.data.root.member;
32
112
  let output;
33
113
 
34
- if (!_.isObject(navigationData) || _.isFunction(navigationData)) {
114
+ if (!Array.isArray(navigationData)) {
35
115
  throw new errors.IncorrectUsageError({
36
116
  message: tpl(messages.invalidData)
37
117
  });
38
118
  }
39
119
 
40
120
  if (navigationData.filter(function (e) {
41
- return (_.isUndefined(e.label) || _.isUndefined(e.url));
121
+ return (_.isUndefined(e.url) || (_.isUndefined(e.label) && _.isUndefined(e.icon)));
42
122
  }).length > 0) {
43
123
  throw new errors.IncorrectUsageError({
44
124
  message: tpl(messages.valuesMustBeDefined)
@@ -47,44 +127,55 @@ module.exports = function navigation(options) {
47
127
 
48
128
  // check for non-null string values
49
129
  if (navigationData.filter(function (e) {
50
- return ((!_.isNull(e.label) && !_.isString(e.label)) ||
51
- (!_.isNull(e.url) && !_.isString(e.url)));
130
+ return ((!_.isUndefined(e.label) && !_.isNull(e.label) && !_.isString(e.label)) ||
131
+ (_.isNull(e.url) || !_.isString(e.url)));
52
132
  }).length > 0) {
53
133
  throw new errors.IncorrectUsageError({
54
134
  message: tpl(messages.valuesMustBeString)
55
135
  });
56
136
  }
57
137
 
58
- // strips trailing slashes and compares urls
59
- function _isCurrentUrl(href, url) {
60
- if (!url) {
61
- return false;
62
- }
63
-
64
- const strippedHref = href.replace(/\/+$/, '');
65
- const strippedCurrentUrl = url.replace(/\/+$/, '');
66
- return strippedHref === strippedCurrentUrl;
67
- }
138
+ // Icon and visibility are coerced rather than thrown on (see map below):
139
+ // a bad icon is dropped and an unrecognised visibility falls back to public,
140
+ // so malformed data can never 500 a whole site's front end.
68
141
 
69
142
  // {{navigation}} should no-op if no data passed in
70
143
  if (navigationData.length === 0) {
71
144
  return new SafeString('');
72
145
  }
73
146
 
74
- output = navigationData.map(function (e) {
75
- const out = {};
76
- out.current = _isCurrentUrl(e.url, currentUrl);
77
- out.label = e.label;
78
- out.slug = slugify(e.label);
79
- out.url = e.url;
80
- return out;
81
- });
147
+ const navigationIconsEnabled = labs.isSet('navigationIcons');
148
+
149
+ output = navigationData
150
+ .filter(item => navigationIconsEnabled ? isNavigationItemVisible(item, member) : true)
151
+ .map(function (e) {
152
+ const out = {};
153
+ const icon = navigationIconsEnabled && _.isString(e.icon) ? e.icon : null;
154
+ const iconName = getNavigationIconName(icon);
155
+ const hasLabel = _.isString(e.label) && e.label.trim().length > 0;
156
+
157
+ out.current = isCurrentNavigationUrl(e.url, currentUrl);
158
+ out.icon = icon || null;
159
+ out.iconAlt = hasLabel ? '' : iconName;
160
+ out.label = hasLabel ? e.label : null;
161
+ out.slug = slugify(hasLabel ? e.label : iconName);
162
+ out.url = e.url;
163
+ return out;
164
+ })
165
+ // Nothing to render: an icon-only item with the icons flag off would be an empty link
166
+ .filter(item => item.icon || item.label);
167
+
168
+ if (output.length === 0) {
169
+ return new SafeString('');
170
+ }
82
171
 
83
172
  // CASE: The navigation helper should have access to the navigation items at the top level.
84
173
  this.navigation = output;
85
174
  // CASE: The navigation helper will forward attributes passed to it.
86
175
  _.merge(this, options.hash);
87
176
  const data = createFrame(options.data);
177
+ // The template only wraps labels/renders icons when the flag is on, so pre-flag markup is unchanged
178
+ data.navigationIcons = navigationIconsEnabled;
88
179
 
89
180
  return templates.execute('navigation', this, {data});
90
181
  };
@@ -8,7 +8,8 @@ const metaData = require('../meta');
8
8
  const getPaginatedUrl = metaData.getPaginatedUrl;
9
9
 
10
10
  // We use the name page_url to match the helper for consistency:
11
- module.exports = function page_url(page, options) { // eslint-disable-line camelcase
11
+ // eslint-disable-next-line camelcase
12
+ module.exports = function page_url(page, options) {
12
13
  if (!options) {
13
14
  options = page;
14
15
  page = 1;
@@ -5,7 +5,8 @@
5
5
  const {SafeString} = require('../services/handlebars');
6
6
 
7
7
  // We use the name post_class to match the helper for consistency:
8
- module.exports = function post_class() { // eslint-disable-line camelcase
8
+ // eslint-disable-next-line camelcase
9
+ module.exports = function post_class() {
9
10
  let classes = ['post'];
10
11
 
11
12
  const tags = this.post && this.post.tags ? this.post.tags : this.tags || [];
@@ -15,7 +15,8 @@ const {SafeString} = require('../services/handlebars');
15
15
 
16
16
  const {readingTime: calculateAndFormatReadingTime} = require('@tryghost/helpers');
17
17
 
18
- module.exports = function reading_time(options) {// eslint-disable-line camelcase
18
+ // eslint-disable-next-line camelcase
19
+ module.exports = function reading_time(options) {
19
20
  options = options || {};
20
21
  options.hash = options.hash || {};
21
22
  const possiblyPost = this;
@@ -45,7 +45,8 @@ const SOCIAL_PLATFORMS = [
45
45
  {type: 'instagram', name: 'Instagram'}
46
46
  ];
47
47
 
48
- module.exports = function social_accounts(source, options) { // eslint-disable-line camelcase
48
+ // eslint-disable-next-line camelcase
49
+ module.exports = function social_accounts(source, options) {
49
50
  // {{#social_accounts}} with no positional arg: handlebars passes only options.
50
51
  if (arguments.length < 2) {
51
52
  throw new errors.IncorrectUsageError({
@@ -6,7 +6,8 @@ const {socialUrls} = require('../services/proxy');
6
6
  const {localUtils} = require('../services/handlebars');
7
7
 
8
8
  // We use the name social_url to match the helper for consistency:
9
- module.exports = function social_url(options) { // eslint-disable-line camelcase
9
+ // eslint-disable-next-line camelcase
10
+ module.exports = function social_url(options) {
10
11
  // Check for required hash option 'type'
11
12
  if (!options || !options.hash || !options.hash.type) {
12
13
  return null;
@@ -4,7 +4,8 @@
4
4
  const {SafeString} = require('../services/handlebars');
5
5
  const {memberCountRounding, getMemberStats} = require('../utils/member-count');
6
6
 
7
- module.exports = async function total_members () { //eslint-disable-line
7
+ // eslint-disable-next-line
8
+ module.exports = async function total_members () {
8
9
  if (this.total) {
9
10
  return new SafeString(memberCountRounding(this.total));
10
11
  } else {
@@ -3,7 +3,8 @@
3
3
  const {SafeString} = require('../services/handlebars');
4
4
  const {memberCountRounding, getMemberStats} = require('../utils/member-count');
5
5
 
6
- module.exports = async function total_paid_members () { //eslint-disable-line
6
+ // eslint-disable-next-line
7
+ module.exports = async function total_paid_members () {
7
8
  if (this.paid) {
8
9
  return new SafeString(memberCountRounding(this.paid));
9
10
  } else {
@@ -1,5 +1,5 @@
1
1
  <ul class="nav">
2
2
  {{#foreach navigation}}
3
- <li class="{{link_class for=(url) class=(concat "nav-" slug)}}"><a href="{{url absolute="true"}}">{{label}}</a></li>
3
+ <li class="{{link_class for=(url) class=(concat "nav-" slug)}}"><a href="{{url absolute="true"}}">{{#if @navigationIcons}}{{#if icon}}<img class="nav-icon" src="{{icon}}" alt="{{iconAlt}}">{{/if}}{{#if label}}<span class="nav-label">{{label}}</span>{{/if}}{{else}}{{label}}{{/if}}</a></li>
4
4
  {{/foreach}}
5
5
  </ul>
@@ -9,7 +9,8 @@ const {localUtils} = require('../services/handlebars');
9
9
  /**
10
10
  * @deprecated Use {{social_url type="twitter"}} instead.
11
11
  */
12
- module.exports = function twitter_url(username, options) { // eslint-disable-line camelcase
12
+ // eslint-disable-next-line camelcase
13
+ module.exports = function twitter_url(username, options) {
13
14
  if (!options) {
14
15
  options = username;
15
16
  username = localUtils.findKey('twitter', this, options.data.site);