ghost 6.62.0 → 6.64.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 (766) hide show
  1. package/bin/lib/duplicate-deps.js +204 -0
  2. package/bin/validate-adapters.js +50 -6
  3. package/components/tryghost-adapter-base-jobs-0.0.0.tgz +0 -0
  4. package/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
  5. package/components/tryghost-adapter-base-sso-0.1.3.tgz +0 -0
  6. package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
  7. package/components/tryghost-api-framework-0.0.0.tgz +0 -0
  8. package/components/tryghost-checkout-0.0.0.tgz +0 -0
  9. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  10. package/components/tryghost-kg-card-factory-5.2.4.tgz +0 -0
  11. package/components/tryghost-kg-clean-basic-html-4.3.4.tgz +0 -0
  12. package/components/tryghost-kg-converters-1.2.5.tgz +0 -0
  13. package/components/tryghost-kg-default-cards-10.3.6.tgz +0 -0
  14. package/components/tryghost-kg-default-nodes-2.2.1.tgz +0 -0
  15. package/components/tryghost-kg-default-transforms-1.3.4.tgz +0 -0
  16. package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
  17. package/components/tryghost-kg-lexical-html-renderer-1.5.1.tgz +0 -0
  18. package/components/tryghost-kg-markdown-html-renderer-7.2.4.tgz +0 -0
  19. package/components/tryghost-kg-utils-1.1.4.tgz +0 -0
  20. package/components/tryghost-limit-service-0.0.0.tgz +0 -0
  21. package/components/tryghost-metafield-types-0.0.0.tgz +0 -0
  22. package/content/themes/source/assets/built/screen.css +1 -1
  23. package/content/themes/source/assets/css/screen.css +1 -1
  24. package/content/themes/source/package.json +7 -7
  25. package/content/themes/source/partials/post-card.hbs +1 -1
  26. package/core/boot.js +17 -9
  27. package/core/built/admin/assets/Combination-DWfJPcz9.js +41 -0
  28. package/core/built/admin/assets/{PolarAngleAxis-pkMyqz8g.js → PolarAngleAxis-a81ieQUO.js} +2 -2
  29. package/core/built/admin/assets/RadialBarChart-CHRBhiBN.js +1 -0
  30. package/core/built/admin/assets/_baseAssignValue-DcPokYW8.js +1 -0
  31. package/core/built/admin/assets/about-39CAfroa.js +1 -0
  32. package/core/built/admin/assets/accordion-CJmRaqK7.js +1 -0
  33. package/core/built/admin/assets/account-migration-DYf7skbb.js +1 -0
  34. package/core/built/admin/assets/action-list-Crnh-_UI.js +1 -0
  35. package/core/built/admin/assets/activitypub/{account-migration-By69CgCp.js → account-migration-KA6Jjf9L.js} +7 -7
  36. package/core/built/admin/assets/activitypub/activitypub.js +3 -3
  37. package/core/built/admin/assets/activitypub/{avatar-DLPL3Abs.js → avatar-DVJF5bxP.js} +2 -2
  38. package/core/built/admin/assets/activitypub/{avatar-flipboard-C9iDY-QV.js → avatar-flipboard-csQaNeYK.js} +2 -2
  39. package/core/built/admin/assets/activitypub/{bluesky-sharing-BJcPMrDd.js → bluesky-sharing-C7nTDMvw.js} +9 -9
  40. package/core/built/admin/assets/activitypub/{content-formatters-3rTHg3mp.js → content-formatters-CLcjaBwV.js} +4 -4
  41. package/core/built/admin/assets/activitypub/{copy-DIAOQoCZ.js → copy-DcOh8kXw.js} +2 -2
  42. package/core/built/admin/assets/activitypub/{domain-DUR4xSkV.js → domain-fZ-X8i4-.js} +9 -9
  43. package/core/built/admin/assets/activitypub/{edit-profile-BqtfzxCp.js → edit-profile-BqMLQV88.js} +6 -6
  44. package/core/built/admin/assets/activitypub/{explore-BxuJd-J4.js → explore-B4yPoP8E.js} +10 -10
  45. package/core/built/admin/assets/activitypub/{feed-BM1TcksA.js → feed-BRC_mvAe.js} +9 -9
  46. package/core/built/admin/assets/activitypub/{field-Dn7HHx2-.js → field-COacNgOt.js} +3 -3
  47. package/core/built/admin/assets/activitypub/{hash-Bm3WxYN4.js → hash-C7u-irQQ.js} +2 -2
  48. package/core/built/admin/assets/activitypub/{inbox-CCjkuow2.js → inbox-BW-yvUoN.js} +10 -10
  49. package/core/built/admin/assets/activitypub/{inbox-d8oJRTf4.js → inbox-CbTTdDQ3.js} +2 -2
  50. package/core/built/admin/assets/activitypub/{label-1AA_s9Fa.js → label-kPMmYI7l.js} +3 -3
  51. package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +1 -0
  52. package/core/built/admin/assets/activitypub/{moderation-CnmxEB8w.js → moderation-CuidJzc0.js} +10 -10
  53. package/core/built/admin/assets/activitypub/{note-ZKc_Bnba.js → note-CAMRRSqD.js} +7 -7
  54. package/core/built/admin/assets/activitypub/{notifications-CB2tJZau.js → notifications-BmNlXGgp.js} +9 -9
  55. package/core/built/admin/assets/activitypub/{onboarding-BsJ9E5qf.js → onboarding-Bqg7fh_L.js} +2 -2
  56. package/core/built/admin/assets/activitypub/{onboarding-CSUJJIlh.js → onboarding-Dmun9jr_.js} +2 -2
  57. package/core/built/admin/assets/activitypub/{preferences-0-JZnUkI.js → preferences--oH19wf9.js} +11 -11
  58. package/core/built/admin/assets/activitypub/{profile-C35cFIhM.js → profile-DH_tQx2D.js} +14 -14
  59. package/core/built/admin/assets/activitypub/{reply-DYK5vVqb.js → reply-Cap9PxSH.js} +2 -2
  60. package/core/built/admin/assets/activitypub/{routes-BD4vscyc.js → routes-DdyY9uFF.js} +30 -30
  61. package/core/built/admin/assets/activitypub/{separator-BbQqTm-p.js → separator-CAxxu8VV.js} +3 -3
  62. package/core/built/admin/assets/activitypub/{settings-BsMROdqh.js → settings-B6EEcVkW.js} +6 -6
  63. package/core/built/admin/assets/activitypub/{site-O0RL9YCN.js → site-BYps63oh.js} +2 -2
  64. package/core/built/admin/assets/activitypub/{step-1-BMSx7c_X.js → step-1-CKjR2KAm.js} +6 -6
  65. package/core/built/admin/assets/activitypub/{step-2-DtPQzlTH.js → step-2-B6PKfOUQ.js} +6 -6
  66. package/core/built/admin/assets/activitypub/{step-3-CLlOZTyt.js → step-3-C-qBbcUo.js} +11 -11
  67. package/core/built/admin/assets/activitypub/{tabs-Dxk-b9M-.js → tabs-DLhZtVde.js} +6 -6
  68. package/core/built/admin/assets/activitypub/{topic-filter-5yZH6tId.js → topic-filter-DsUOuu0k.js} +3 -3
  69. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CV50qe03.js → use-activity-pub-queries-CX9snsLs.js} +3 -3
  70. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-Bmk5h4lW.js → use-navigate-with-base-path-DsJTGDSS.js} +988 -959
  71. package/core/built/admin/assets/activitypub/{use-reply-chain-data-Cbvzgjzd.js → use-reply-chain-data-AJi9zkzm.js} +5 -5
  72. package/core/built/admin/assets/activitypub/{users-BjcoP_HC.js → users-inweyKL5.js} +186 -160
  73. package/core/built/admin/assets/activitypub/{x-DbQZOLiI.js → x-DR8AT3-4.js} +2 -2
  74. package/core/built/admin/assets/add-integration-modal-B12oRifD.js +1 -0
  75. package/core/built/admin/assets/add-newsletter-modal-CTvXiIqY.js +1 -0
  76. package/core/built/admin/assets/add-recommendation-modal-CJf92edY.js +1 -0
  77. package/core/built/admin/assets/analytics-PHR1Fggi.js +1 -0
  78. package/core/built/admin/assets/announcement-bar-modal-Bql0CXdp.js +1 -0
  79. package/core/built/admin/assets/api-keys-CubH-7_H.js +1 -0
  80. package/core/built/admin/assets/{api-keys-3-0vJC3Y.js → api-keys-omLA6iYn.js} +1 -1
  81. package/core/built/admin/assets/{audience-CtbA54Sn.js → audience-6GXevic-.js} +1 -1
  82. package/core/built/admin/assets/automated-emails-DJQ4uNZo.js +1 -0
  83. package/core/built/admin/assets/automations-DcZSLFDU.js +1 -0
  84. package/core/built/admin/assets/automations-hDVcRPjh.js +1 -0
  85. package/core/built/admin/assets/avatar-flipboard-DiAGgshK.js +1 -0
  86. package/core/built/admin/assets/badge-qP06OT7C.js +1 -0
  87. package/core/built/admin/assets/bluesky-sharing-CJw4d4Mf.js +1 -0
  88. package/core/built/admin/assets/box-CZ_LSVSy.js +1 -0
  89. package/core/built/admin/assets/brand-icon-D3ffDYaC.js +1 -0
  90. package/core/built/admin/assets/breadcrumb-Chn1Ip_q.js +1 -0
  91. package/core/built/admin/assets/button-DvIh2Bq-.js +1 -0
  92. package/core/built/admin/assets/calendar-1QGoStFM.js +1 -0
  93. package/core/built/admin/assets/card-FHQ4D10L.js +1 -0
  94. package/core/built/admin/assets/chart-helpers-CNpA7re_.js +1 -0
  95. package/core/built/admin/assets/{chart-BrhA41Zi.js → chart-jVz9Nf9t.js} +9 -9
  96. package/core/built/admin/assets/checkbox-DKht9xMl.js +1 -0
  97. package/core/built/admin/assets/{chunk-KS7C4IRE-DCsL4i4D.js → chunk-KS7C4IRE-DhOcHQOU.js} +1 -1
  98. package/core/built/admin/assets/chunk.368.22ce1b732c0b40abd3f1.js +479 -0
  99. package/core/built/admin/assets/chunk.524.cc9be98e44890cedc8c8.js +25 -0
  100. package/core/built/admin/assets/{chunk.582.5ed5d124cfca9c259b9c.js → chunk.582.e6fe742b3217207b11a6.js} +23 -30
  101. package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js → chunk.972.4b8c97f93d66db15e751.js} +13582 -11017
  102. package/core/built/admin/assets/clean-tracked-url-dkN05vOf.js +1 -0
  103. package/core/built/admin/assets/code-editor-view-BLQIV85-.js +1 -0
  104. package/core/built/admin/assets/code-editor-view-Cg5eJxcr.js +1 -0
  105. package/core/built/admin/assets/color-picker-DQoghc0t.js +3 -0
  106. package/core/built/admin/assets/color-picker-field-BbeK5RRs.js +1 -0
  107. package/core/built/admin/assets/combobox-weO4FBbv.js +1 -0
  108. package/core/built/admin/assets/command-DlLrCm9V.js +1 -0
  109. package/core/built/admin/assets/comments-BjTitLmP.js +1 -0
  110. package/core/built/admin/assets/components-CwL6a6As-CCRaoCeP.js +1 -0
  111. package/core/built/admin/assets/{config-DOMQDZGZ.js → config-BPljH6wF.js} +1 -1
  112. package/core/built/admin/assets/confirmation-context-IyqoXVk-.js +1 -0
  113. package/core/built/admin/assets/container-DAimjOF_.js +1 -0
  114. package/core/built/admin/assets/content-api-modal-0ZjuLcQ8.js +1 -0
  115. package/core/built/admin/assets/context-menu-BtioYFrg.js +1 -0
  116. package/core/built/admin/assets/copy-field-C6ujqJlP.js +1 -0
  117. package/core/built/admin/assets/create-ghost-browse-value-source-DAZMWZNq.js +1 -0
  118. package/core/built/admin/assets/custom-integration-modal-Dm8QI_J4.js +1 -0
  119. package/core/built/admin/assets/data-list-C0CKkeWW.js +1 -0
  120. package/core/built/admin/assets/date-range-select-DrjHQdgz.js +1 -0
  121. package/core/built/admin/assets/design-and-theme-modal-CXVOzBWu.js +2 -0
  122. package/core/built/admin/assets/detail-page-QpLIL-EO.js +1 -0
  123. package/core/built/admin/assets/dirty-confirm-dialog-DWwxREGh.js +1 -0
  124. package/core/built/admin/assets/disabled-sources-indicator-CLZhMv8J.js +1 -0
  125. package/core/built/admin/assets/dist-BRQkNYN1.js +11 -0
  126. package/core/built/admin/assets/{dist-B3keLvjj.js → dist-BXHrDV19.js} +2 -2
  127. package/core/built/admin/assets/dist-Bf-HQtVL.js +1 -0
  128. package/core/built/admin/assets/dist-Bm-PB47a.js +6 -0
  129. package/core/built/admin/assets/{dist-B6bJuxL3.js → dist-C2lYC76d.js} +1 -1
  130. package/core/built/admin/assets/dist-CUwte9v_.js +1 -0
  131. package/core/built/admin/assets/dist-Cm2qbZKL.js +1 -0
  132. package/core/built/admin/assets/{dist-BtaTA7Ii.js → dist-D7yMk931.js} +1 -1
  133. package/core/built/admin/assets/{dist-zwwGt8Yf.js → dist-DNAdeRyr.js} +1 -1
  134. package/core/built/admin/assets/dist-DS6zpxid.js +1 -0
  135. package/core/built/admin/assets/dist-DVVKsyPh.js +23 -0
  136. package/core/built/admin/assets/dist-DxfQlAmn.js +1 -0
  137. package/core/built/admin/assets/dist-DziNzWI2.js +1 -0
  138. package/core/built/admin/assets/dist-FEQQAwTe.js +1 -0
  139. package/core/built/admin/assets/dist-nmRzULcD.js +1 -0
  140. package/core/built/admin/assets/domain-DBrBic6q.js +1 -0
  141. package/core/built/admin/assets/dropzone-D61QVcEY.js +5 -0
  142. package/core/built/admin/assets/edit-profile-jCqJBxqw.js +1 -0
  143. package/core/built/admin/assets/editor-8Fm4UBEd.js +8 -0
  144. package/core/built/admin/assets/editor-screen-BSX_uC2B.js +27 -0
  145. package/core/built/admin/assets/email-previews-Bs-JDhIw.js +1 -0
  146. package/core/built/admin/assets/email-sending-status-context-C76KYL1V.js +1 -0
  147. package/core/built/admin/assets/email-sending-status-provider-DnNhlIvt.js +1 -0
  148. package/core/built/admin/assets/emails-CgvIIz3q.js +1 -0
  149. package/core/built/admin/assets/{embed-signup-form-modal-Ds6mPEi5.js → embed-signup-form-modal-DqtBs1WE.js} +1 -1
  150. package/core/built/admin/assets/empty-indicator-L4Ql5Db7.js +1 -0
  151. package/core/built/admin/assets/en-Cx75dJv5.js +1 -0
  152. package/core/built/admin/assets/esm--rhhUGIG.js +2 -0
  153. package/core/built/admin/assets/explore-DXhDCtKw.js +1 -0
  154. package/core/built/admin/assets/feature-flag-overrides-context-CrcQKm9Z.js +1 -0
  155. package/core/built/admin/assets/feature-image-placeholder-e2q6TcH6.js +1 -0
  156. package/core/built/admin/assets/feed-mmt4noNL.js +1 -0
  157. package/core/built/admin/assets/feedback-BTPBQLT5.js +1 -0
  158. package/core/built/admin/assets/field-p7KnP98B.js +1 -0
  159. package/core/built/admin/assets/filter-bar-CiIKBg3D.js +1 -0
  160. package/core/built/admin/assets/filter-sources-I-dRaQxl.js +1 -0
  161. package/core/built/admin/assets/filters-1injvyxJ.js +1 -0
  162. package/core/built/admin/assets/filters-DnpO6GWX.js +1 -0
  163. package/core/built/admin/assets/first-promoter-modal-wr73Dldc.js +1 -0
  164. package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-CkFA8EkI.js +1 -0
  165. package/core/built/admin/assets/framework-provider-DB-svAju.js +4 -0
  166. package/core/built/admin/assets/{ghost-8eabfc1ece81b03cf7b90780d31487e8.css → ghost-8fd5bb799356bbefb254210ba7e1236d.css} +1 -1
  167. package/core/built/admin/assets/{ghost-c2848508292937415f20f5a830eea59e.js → ghost-a1e6e172c6917e8ef8fa6b0007756d9b.js} +71 -46
  168. package/core/built/admin/assets/{ghost-dark-a7bebe2c561f55369dcf29f4c820f7ff.css → ghost-dark-cac0cb2d5bb78e9bd14d8d1c2768ed45.css} +1 -1
  169. package/core/built/admin/assets/gift-link-modal-C3H7YFXO.js +1 -0
  170. package/core/built/admin/assets/{gift-links-DLDS7ljO.js → gift-links-D8gl_yJS.js} +1 -1
  171. package/core/built/admin/assets/global-data-context-3MItMry2.js +1 -0
  172. package/core/built/admin/assets/grid-5vplBYri.js +1 -0
  173. package/core/built/admin/assets/growth-B1og1kQp.js +1 -0
  174. package/core/built/admin/assets/growth-Bf6OHZlK.js +3 -0
  175. package/core/built/admin/assets/heading-BB21QAbb.js +1 -0
  176. package/core/built/admin/assets/history-modal-t_qEnxPx.js +1 -0
  177. package/core/built/admin/assets/hooks-DYfTEQLk.js +2 -0
  178. package/core/built/admin/assets/html-field-COLQbV4r.js +1 -0
  179. package/core/built/admin/assets/iframe-buffering-Bq1el-gw.js +1 -0
  180. package/core/built/admin/assets/images-4mvoc3lB.js +1 -0
  181. package/core/built/admin/assets/{inbox-Mcp4DXZN.js → inbox-DgSZ6w2p.js} +34 -34
  182. package/core/built/admin/assets/index-B3HZU2i8.css +2 -0
  183. package/core/built/admin/assets/index-DDd-zhNL.js +4 -0
  184. package/core/built/admin/assets/index.es-Ct5XQNSj.js +1 -0
  185. package/core/built/admin/assets/inline-B8H6NzIw.js +1 -0
  186. package/core/built/admin/assets/input-group-CLIN2ykI.js +1 -0
  187. package/core/built/admin/assets/{input-surface-BsrIZeSF.js → input-surface-wSO5CRy5.js} +1 -1
  188. package/core/built/admin/assets/integration-header-CKGrXNVP.js +1 -0
  189. package/core/built/admin/assets/{integrations-Bjbu86Z0.js → integrations-DnJrZnHv.js} +1 -1
  190. package/core/built/admin/assets/invite-user-modal-BaN2mdhI.js +1 -0
  191. package/core/built/admin/assets/jsx-runtime-BlNNh7jY.js +1 -0
  192. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +4 -4
  193. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +2 -2
  194. package/core/built/admin/assets/{koenig-lexical-DBSqAuiI.js → koenig-lexical-CXVgQFUk.js} +2 -2
  195. package/core/built/admin/assets/koenig-loader-B1XPPY5C.js +2 -0
  196. package/core/built/admin/assets/kpi-card-CRLPVlFW.js +1 -0
  197. package/core/built/admin/assets/kpi-card-CRPbW8NZ.js +1 -0
  198. package/core/built/admin/assets/kpi-helpers-D7zT96bp.js +1 -0
  199. package/core/built/admin/assets/kpi-tabs-DE_yh9Go.js +1 -0
  200. package/core/built/admin/assets/label-CgeBxy4o.js +1 -0
  201. package/core/built/admin/assets/label-picker-DGDp4Vwr.js +1 -0
  202. package/core/built/admin/assets/labels-KMkFoRG6.js +1 -0
  203. package/core/built/admin/assets/layout-DWnOMly4.js +1 -0
  204. package/core/built/admin/assets/lib-_QYaUU89.js +2 -0
  205. package/core/built/admin/assets/link-helpers-8J7ixADV.js +1 -0
  206. package/core/built/admin/assets/links-FwNCVyVe.js +1 -0
  207. package/core/built/admin/assets/list-page-DLMP0PxC.js +1 -0
  208. package/core/built/admin/assets/luxon-BXCsmep3.js +1 -0
  209. package/core/built/admin/assets/member-activity-ClMWFyvN.js +1 -0
  210. package/core/built/admin/assets/member-activity-feed-BQY5Rwaj.js +1 -0
  211. package/core/built/admin/assets/member-custom-fields-Dd_ie1zG.js +1 -0
  212. package/core/built/admin/assets/member-detail-DjwkGVne.js +1 -0
  213. package/core/built/admin/assets/members--N9lhk1N.js +4 -0
  214. package/core/built/admin/assets/modal-page-Dz-9TP4E.js +1 -0
  215. package/core/built/admin/assets/moderation-DfYBKq9s.js +1 -0
  216. package/core/built/admin/assets/multi-select-combobox-BcBEzUW_.js +1 -0
  217. package/core/built/admin/assets/navigation-modal-Cd-scywg.js +1 -0
  218. package/core/built/admin/assets/newsletter-detail-modal-CFRY6vg_.js +1 -0
  219. package/core/built/admin/assets/newsletter-emails-4ntck1AC.js +1 -0
  220. package/core/built/admin/assets/newsletter-o6eCJtab.js +1 -0
  221. package/core/built/admin/assets/newsletters-Bmlv0edG.js +1 -0
  222. package/core/built/admin/assets/newsletters-Dz77m__5.js +1 -0
  223. package/core/built/admin/assets/note-CWs3LF-0.js +1 -0
  224. package/core/built/admin/assets/notifications-BjSvTJqh.js +1 -0
  225. package/core/built/admin/assets/{nql-BLpCn7qX.js → nql-DnDc7UuU.js} +1 -1
  226. package/core/built/admin/assets/nql-lang-CeTB_Bhv.js +19 -0
  227. package/core/built/admin/assets/{offers-9J1CSiLy.js → offers-ByWSK0rR.js} +1 -1
  228. package/core/built/admin/assets/offers-container-modal-Bc9A196w.js +1 -0
  229. package/core/built/admin/assets/onboarding-B4hfBi9a.js +1 -0
  230. package/core/built/admin/assets/onboarding-DV_XbHts.js +1 -0
  231. package/core/built/admin/assets/onboarding-route-Di1LJYEE.js +1 -0
  232. package/core/built/admin/assets/overview-DE7NHZQN.js +1 -0
  233. package/core/built/admin/assets/overview-DEF-ZY6x.js +1 -0
  234. package/core/built/admin/assets/page-header-B-G_g42C.js +1 -0
  235. package/core/built/admin/assets/pagemenu-CnkTDO71.js +1 -0
  236. package/core/built/admin/assets/pages-DZ_YGB1D.js +1 -0
  237. package/core/built/admin/assets/pages-route-VT7r7YhG.js +1 -0
  238. package/core/built/admin/assets/papaparse.min-BlhnCUXn.js +10 -0
  239. package/core/built/admin/assets/pintura-modal-BljM7hf8.js +1 -0
  240. package/core/built/admin/assets/portal-frame-D9V8iq5x.js +1 -0
  241. package/core/built/admin/assets/portal-modal-B5OOR9ZD.js +1 -0
  242. package/core/built/admin/assets/post-analytics-context-bt2YTBAC.js +1 -0
  243. package/core/built/admin/assets/post-analytics-header-J0WciLx6.js +1 -0
  244. package/core/built/admin/assets/post-analytics-provider-CgreZDjS.js +1 -0
  245. package/core/built/admin/assets/post-analytics-rGb-PgD-.js +1 -0
  246. package/core/built/admin/assets/post-helpers-C88JBa4D.js +1 -0
  247. package/core/built/admin/assets/post-share-modal-D0BbTo4W.js +1 -0
  248. package/core/built/admin/assets/post-utils-DKF4mfuo.js +1 -0
  249. package/core/built/admin/assets/posts-list-screen-CO5jAWoU.js +2 -0
  250. package/core/built/admin/assets/posts-route-DV-CXWK9.js +1 -0
  251. package/core/built/admin/assets/posts-tcoO3iRG.js +1 -0
  252. package/core/built/admin/assets/preferences-Tac29oG6.js +5 -0
  253. package/core/built/admin/assets/preview-chrome-C2lQgZBZ.js +1 -0
  254. package/core/built/admin/assets/preview-modal-CjRbBr8U.js +1 -0
  255. package/core/built/admin/assets/profile-yiM1f_Og.js +1 -0
  256. package/core/built/admin/assets/prop-types-6lTeqvom.js +1 -0
  257. package/core/built/admin/assets/radio-group-CKROWsw4.js +1 -0
  258. package/core/built/admin/assets/react-BXwhMTuc.js +1 -0
  259. package/core/built/admin/assets/{jsx-runtime-DX3WBWVO.js → react-dom-CMOtJ5MH.js} +2 -2
  260. package/core/built/admin/assets/{referrers-CnhCMWCs.js → referrers-1R8bPpoV.js} +1 -1
  261. package/core/built/admin/assets/router-provider-CU87qxXw.js +1 -0
  262. package/core/built/admin/assets/schemas-BoYdB6YU.js +64 -0
  263. package/core/built/admin/assets/select-CKaC4ggu.js +1 -0
  264. package/core/built/admin/assets/settings-81kxUa28.js +1 -0
  265. package/core/built/admin/assets/settings-BVXFqBVK.js +4 -0
  266. package/core/built/admin/assets/settings-breadcrumbs-czGRx-iu.js +1 -0
  267. package/core/built/admin/assets/{shade-app-CcS3f8MZ-vwURazk8.js → shade-app-CcS3f8MZ-D5BnfHck.js} +1 -1
  268. package/core/built/admin/assets/share-modal-BL-16PiB.js +1 -0
  269. package/core/built/admin/assets/skeleton-DwCva0-b.js +1 -0
  270. package/core/built/admin/assets/slack-modal-D7W_fNON.js +1 -0
  271. package/core/built/admin/assets/sort-button-Dquc83jY.js +1 -0
  272. package/core/built/admin/assets/source-icon-CQboPZQ3.js +1 -0
  273. package/core/built/admin/assets/stack-BURz77VS.js +1 -0
  274. package/core/built/admin/assets/stats-Cvp8Ep5m.js +1 -0
  275. package/core/built/admin/assets/stats-view-NDja_g96.js +1 -0
  276. package/core/built/admin/assets/step-1-BKhjy0PV.js +1 -0
  277. package/core/built/admin/assets/step-2-PxA1OM7R.js +1 -0
  278. package/core/built/admin/assets/step-3-BJbAiq16.js +2 -0
  279. package/core/built/admin/assets/stripe-button-C3cfCAou.js +1 -0
  280. package/core/built/admin/assets/stripe-connect-modal-FyE3Ey2c.js +1 -0
  281. package/core/built/admin/assets/style-Wd9nQubI.css +1 -0
  282. package/core/built/admin/assets/switch-zfUUy9Jh.js +1 -0
  283. package/core/built/admin/assets/table-dE4GTIRT.js +1 -0
  284. package/core/built/admin/assets/tabs-B3XK93sR.js +1 -0
  285. package/core/built/admin/assets/tag-detail-D4P-tZdM.js +2 -0
  286. package/core/built/admin/assets/tag-picker-BNSZ6Qxw.js +1 -0
  287. package/core/built/admin/assets/tags-BsZcaJ6h.js +1 -0
  288. package/core/built/admin/assets/{tags-zTFiKRpb.js → tags-NwZ7BPK6.js} +1 -1
  289. package/core/built/admin/assets/testimonials-modal-Dkt6ODLW.js +1 -0
  290. package/core/built/admin/assets/text-DC-ot6u2.js +1 -0
  291. package/core/built/admin/assets/textarea-B4FffFmE.js +1 -0
  292. package/core/built/admin/assets/themes-DtcEFQWm.js +1 -0
  293. package/core/built/admin/assets/tier-detail-modal-a77Z2VMH.js +1 -0
  294. package/core/built/admin/assets/tiers-6mPzCXlM.js +1 -0
  295. package/core/built/admin/assets/toggle-group-D2p4okmJ.js +1 -0
  296. package/core/built/admin/assets/topic-filter-DVOe3D-b.js +1 -0
  297. package/core/built/admin/assets/transistor-modal-C8RMkhOD.js +1 -0
  298. package/core/built/admin/assets/trend-badge-B9v7kMF8.js +1 -0
  299. package/core/built/admin/assets/unsplash-modal-DXt7Brum.js +1 -0
  300. package/core/built/admin/assets/use-analytics-data-ChHqiZXv.js +1 -0
  301. package/core/built/admin/assets/use-availability-hPdeG76y.js +1 -0
  302. package/core/built/admin/assets/{use-check-theme-limit-error-Cw3WQHy8.js → use-check-theme-limit-error-JD-J5aaZ.js} +2 -2
  303. package/core/built/admin/assets/use-email-sending-status-DNMtL5B9.js +1 -0
  304. package/core/built/admin/assets/use-filter-params-BSFigDIn.js +1 -0
  305. package/core/built/admin/assets/use-filterable-api-CEMSAYPg.js +1 -0
  306. package/core/built/admin/assets/use-form-DJKZJhQh.js +1 -0
  307. package/core/built/admin/assets/use-growth-stats-CqqdnESN.js +1 -0
  308. package/core/built/admin/assets/use-host-limits-mpTkZIq8.js +1 -0
  309. package/core/built/admin/assets/use-limiter-DBGjYqu7.js +19 -0
  310. package/core/built/admin/assets/use-navigate-with-base-path-88EQpw2k.js +1 -0
  311. package/core/built/admin/assets/use-pintura-config-BmU45Ruy.js +1 -0
  312. package/core/built/admin/assets/use-pintura-editor-Bz2bZ4iT.js +1 -0
  313. package/core/built/admin/assets/use-post-referrers-DyPjyBSN.js +1 -0
  314. package/core/built/admin/assets/use-query-params-DlOHCo-R.js +1 -0
  315. package/core/built/admin/assets/use-reply-chain-data-DmD2yX5D.js +1 -0
  316. package/core/built/admin/assets/use-router-history-entry-CKx9LhqD.js +1 -0
  317. package/core/built/admin/assets/use-sending-eta-CQeG6OP_.js +1 -0
  318. package/core/built/admin/assets/use-setting-group-Dza6bQ7W.js +1 -0
  319. package/core/built/admin/assets/use-settings-navigation-BIjI5mL3.js +1 -0
  320. package/core/built/admin/assets/use-simple-pagination-DwVxe-Lo.js +1 -0
  321. package/core/built/admin/assets/use-staff-users-i_Mq9OGR.js +1 -0
  322. package/core/built/admin/assets/{use-tinybird-query-CSnGXzZh.js → use-tinybird-query-DXoF74NM.js} +1 -1
  323. package/core/built/admin/assets/use-tinybird-token-Lk1RSn0t.js +1 -0
  324. package/core/built/admin/assets/use-unsaved-changes-guard-CKVPWz_F.js +1 -0
  325. package/core/built/admin/assets/use-upgrade-route-CVjDlNSs.js +1 -0
  326. package/core/built/admin/assets/{use-url-input-DFr8lCbS.js → use-url-input-DpmbDppC.js} +1 -1
  327. package/core/built/admin/assets/user-detail-modal-BU4QCHE7.js +1 -0
  328. package/core/built/admin/assets/{users-Cg-OeGzC.js → users-C60_hpn6.js} +1 -1
  329. package/core/built/admin/assets/{validator-Cr0sMKuW.js → validator-DlFQP70j.js} +1 -1
  330. package/core/built/admin/assets/{vendor-5753232c7d6ffb3c44e1eb0a02133953.js → vendor-2dd263291938d407802568d3357ec69e.js} +19 -17
  331. package/core/built/admin/assets/virtual-list-DScLNuU8.js +1 -0
  332. package/core/built/admin/assets/web-BZS-t4H0.js +1 -0
  333. package/core/built/admin/assets/web-DxAUxnK3.js +2 -0
  334. package/core/built/admin/assets/zapier-modal-BafLUO4R.js +1 -0
  335. package/core/built/admin/index.html +38 -34
  336. package/core/cli/command.js +17 -2
  337. package/core/frontend/meta/asset-url.js +1 -16
  338. package/core/frontend/services/asset-hash/index.js +32 -2
  339. package/core/frontend/services/routing/controllers/unsubscribe.js +2 -1
  340. package/core/frontend/services/rss/generate-feed.js +1 -1
  341. package/core/frontend/services/theme-engine/active.js +2 -4
  342. package/core/frontend/services/theme-engine/i18n/i18n.js +11 -1
  343. package/core/frontend/services/theme-engine/i18next/theme-i18n.js +1 -1
  344. package/core/frontend/web/middleware/llms-discovery.js +34 -43
  345. package/core/server/adapters/jobs/InMemoryJobsBackend.js +74 -29
  346. package/core/server/adapters/route-settings/S3RouteSettingsStore.js +1 -1
  347. package/core/server/adapters/storage/LocalFilesStorage.js +12 -2
  348. package/core/server/adapters/storage/LocalStorageBase.js +13 -0
  349. package/core/server/api/endpoints/actions.js +2 -1
  350. package/core/server/api/endpoints/authentication.js +1 -2
  351. package/core/server/api/endpoints/authors-public.js +15 -5
  352. package/core/server/api/endpoints/automated-emails.js +3 -2
  353. package/core/server/api/endpoints/automations.js +77 -49
  354. package/core/server/api/endpoints/emails.js +21 -3
  355. package/core/server/api/endpoints/index.js +9 -1
  356. package/core/server/api/endpoints/invites.js +2 -1
  357. package/core/server/api/endpoints/labels.js +6 -2
  358. package/core/server/api/endpoints/member-metafields-members.js +23 -0
  359. package/core/server/api/endpoints/member-metafields.js +34 -21
  360. package/core/server/api/endpoints/members-account.js +42 -0
  361. package/core/server/api/endpoints/members.js +22 -6
  362. package/core/server/api/endpoints/newsletters-public.js +10 -1
  363. package/core/server/api/endpoints/pages-public.js +15 -5
  364. package/core/server/api/endpoints/pages.js +2 -6
  365. package/core/server/api/endpoints/posts-public.js +15 -5
  366. package/core/server/api/endpoints/posts.js +3 -11
  367. package/core/server/api/endpoints/snippets.js +2 -1
  368. package/core/server/api/endpoints/tags-public.js +22 -3
  369. package/core/server/api/endpoints/tags.js +6 -2
  370. package/core/server/api/endpoints/tiers-checkout-config.js +2 -2
  371. package/core/server/api/endpoints/tiers-public.js +38 -1
  372. package/core/server/api/endpoints/users.js +4 -8
  373. package/core/server/api/endpoints/utils/api-filter-utils.js +232 -6
  374. package/core/server/api/endpoints/utils/public-cache-keys.js +3 -0
  375. package/core/server/api/endpoints/utils/serializers/input/authors.js +2 -0
  376. package/core/server/api/endpoints/utils/serializers/input/members.js +16 -2
  377. package/core/server/api/endpoints/utils/serializers/input/pages.js +2 -0
  378. package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -0
  379. package/core/server/api/endpoints/utils/serializers/input/tags.js +2 -0
  380. package/core/server/api/endpoints/utils/serializers/output/emails.js +7 -0
  381. package/core/server/api/endpoints/utils/serializers/output/index.js +4 -0
  382. package/core/server/api/endpoints/utils/serializers/output/member-metafields.js +3 -3
  383. package/core/server/api/endpoints/utils/serializers/output/members-account.js +19 -0
  384. package/core/server/api/endpoints/utils/serializers/output/members-csv-transform.js +1 -1
  385. package/core/server/api/endpoints/utils/serializers/output/tiers.js +10 -2
  386. package/core/server/api/endpoints/utils/serializers/output/users.js +0 -10
  387. package/core/server/api/endpoints/utils/serializers/output/utils/clean.js +2 -0
  388. package/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js +3 -0
  389. package/core/server/api/endpoints/utils/validators/input/settings.js +15 -1
  390. package/core/server/data/exporter/exporter.js +2 -1
  391. package/core/server/data/exporter/table-lists.js +6 -8
  392. package/core/server/data/importer/importers/data/settings-importer.js +8 -2
  393. package/core/server/data/migrations/versions/6.53/2026-07-15-20-22-53-add-members-custom-field-values.js +1 -1
  394. package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +10 -1
  395. package/core/server/data/migrations/versions/6.63/2026-09-03-10-07-03-rename-custom-field-tables-to-metafields.js +169 -0
  396. package/core/server/data/migrations/versions/6.63/2026-09-03-11-03-31-remove-member-custom-field-read-permissions.js +30 -0
  397. package/core/server/data/migrations/versions/6.64/2026-09-03-15-40-25-add-member-access-to-members-metafields.js +12 -0
  398. package/core/server/data/migrations/versions/6.64/2026-09-08-11-01-12-add-posts-auto-excerpt-and-reading-time-columns.js +17 -0
  399. package/core/server/data/migrations/versions/6.64/2026-09-09-13-56-18-add-automation-run-updated-at-indexes.js +6 -0
  400. package/core/server/data/migrations/versions/6.64/2026-09-09-13-56-18-add-tinybird-syncs-table.js +10 -0
  401. package/core/server/data/schema/fixtures/fixtures.json +0 -11
  402. package/core/server/data/schema/lib/default-index-name.js +8 -11
  403. package/core/server/data/schema/schema.js +46 -20
  404. package/core/server/data/seeders/README.md +48 -0
  405. package/core/server/data/seeders/importers/automations-importer.js +0 -1
  406. package/core/server/data/seeders/importers/comments-importer.js +1 -1
  407. package/core/server/data/seeders/importers/email-recipients-importer.js +1 -1
  408. package/core/server/data/seeders/importers/emails-importer.js +1 -1
  409. package/core/server/data/seeders/importers/members-importer.js +1 -1
  410. package/core/server/data/seeders/importers/members-login-events-importer.js +1 -1
  411. package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +1 -1
  412. package/core/server/data/seeders/utils/blog-info.js +4 -3
  413. package/core/server/data/seeders/utils/event-generator.js +72 -46
  414. package/core/server/data/tinybird/datasources/_mv_automation_run_steps.datasource +10 -0
  415. package/core/server/data/tinybird/datasources/_mv_automation_runs.datasource +10 -0
  416. package/core/server/data/tinybird/datasources/_mv_pending_automation_runs.datasource +10 -0
  417. package/core/server/data/tinybird/datasources/automation_run_events.datasource +12 -0
  418. package/core/server/data/tinybird/datasources/automation_run_step_events.datasource +12 -0
  419. package/core/server/data/tinybird/endpoints/api_automation_browse_stats.pipe +43 -0
  420. package/core/server/data/tinybird/fixtures/automation_run_events.ndjson +7 -0
  421. package/core/server/data/tinybird/fixtures/automation_run_step_events.ndjson +8 -0
  422. package/core/server/data/tinybird/pipes/mv_automation_run_steps.pipe +13 -0
  423. package/core/server/data/tinybird/pipes/mv_automation_runs.pipe +15 -0
  424. package/core/server/data/tinybird/pipes/mv_hits.pipe +86 -50
  425. package/core/server/data/tinybird/pipes/mv_pending_automation_runs.pipe +7 -0
  426. package/core/server/data/tinybird/tests/api_automation_browse_stats.yaml +18 -0
  427. package/core/server/ghost-server.js +3 -3
  428. package/core/server/lib/db-types/count.js +16 -0
  429. package/core/server/lib/generate-password.js +54 -0
  430. package/core/server/lib/public-jwk.js +77 -0
  431. package/core/server/lib/validate-password.js +81 -120
  432. package/core/server/models/action.js +4 -4
  433. package/core/server/models/base/plugins/filtered-collection.js +16 -0
  434. package/core/server/models/member.js +6 -6
  435. package/core/server/models/user.js +12 -10
  436. package/core/server/services/adapter-manager/base-classes.js +21 -3
  437. package/core/server/services/automations/automations-api.js +46 -1
  438. package/core/server/services/automations/database-automations-repository.js +11 -4
  439. package/core/server/services/automations/tinybird-automation-stats.js +56 -0
  440. package/core/server/services/content-import/import/media.js +1 -1
  441. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +15 -29
  442. package/core/server/services/email-analytics/email-analytics-service.js +19 -3
  443. package/core/server/services/email-analytics/index.js +9 -4
  444. package/core/server/services/email-rendering/finalize.js +7 -2
  445. package/core/server/services/email-service/CONTEXT.md +37 -0
  446. package/core/server/services/email-service/README.md +45 -0
  447. package/core/server/services/email-service/batch-sending-service.js +2 -0
  448. package/core/server/services/email-service/email-controller.js +18 -2
  449. package/core/server/services/email-service/email-renderer.js +7 -2
  450. package/core/server/services/email-service/email-service-wrapper.js +4 -1
  451. package/core/server/services/email-service/email-service.js +43 -34
  452. package/core/server/services/email-service/sending-status-schema.js +21 -0
  453. package/core/server/services/email-service/sending-status-serializers.js +33 -0
  454. package/core/server/services/email-service/sending-status-service.js +47 -0
  455. package/core/server/services/email-service/sending-status.js +117 -0
  456. package/core/server/services/email-suppression-list/email-suppression-list.js +0 -33
  457. package/core/server/services/email-suppression-list/mailgun-email-suppression-list.js +6 -7
  458. package/core/server/services/gifts/README.md +2 -2
  459. package/core/server/services/gifts/constants.js +1 -1
  460. package/core/server/services/gifts/gift-email-service.js +10 -3
  461. package/core/server/services/gifts/gift-service.js +19 -57
  462. package/core/server/services/gifts/index.js +1 -2
  463. package/core/server/services/i18n.js +1 -1
  464. package/core/server/services/identity-tokens/identity-token-service-wrapper.js +3 -4
  465. package/core/server/services/jobs-service/index.js +8 -0
  466. package/core/server/services/jobs-service/jobs-service.js +52 -3
  467. package/core/server/services/jobs-service/register-job-handlers.js +13 -2
  468. package/core/server/services/limits.js +17 -1
  469. package/core/server/services/member-welcome-emails/service.js +1 -1
  470. package/core/server/services/members/account-service.js +98 -0
  471. package/core/server/services/members/api.js +4 -4
  472. package/core/server/services/members/import-export/export/exporter.js +20 -20
  473. package/core/server/services/members/import-export/import/completion-email.js +6 -6
  474. package/core/server/services/members/import-export/import/importer.js +13 -13
  475. package/core/server/services/members/import-export/index.js +10 -9
  476. package/core/server/services/members/members-api/controllers/router-controller.js +7 -2
  477. package/core/server/services/members/members-api/controllers/well-known-controller.js +2 -1
  478. package/core/server/services/members/members-api/members-api.js +26 -6
  479. package/core/server/services/members/members-api/repositories/event-repository.js +4 -0
  480. package/core/server/services/members/members-api/repositories/member-repository.js +4 -4
  481. package/core/server/services/members/members-api/services/member-bread-service.js +57 -48
  482. package/core/server/services/members/members-api/services/token-service.js +11 -12
  483. package/core/server/services/members/members-ssr.js +18 -0
  484. package/core/server/services/members/middleware.js +104 -83
  485. package/core/server/services/members/request-integrity-token-provider.js +2 -1
  486. package/core/server/services/members/service.js +70 -42
  487. package/core/server/services/members/utils.js +9 -0
  488. package/core/server/services/members-metafields/access.js +39 -0
  489. package/core/server/services/{members-custom-fields → members-metafields}/actions.js +6 -5
  490. package/core/server/services/members-metafields/bindings-service.js +147 -0
  491. package/core/server/services/members-metafields/codec.js +21 -0
  492. package/core/server/services/{members-custom-fields → members-metafields}/config.js +1 -1
  493. package/core/server/services/{members-custom-fields → members-metafields}/definitions-service.js +71 -67
  494. package/core/server/services/{members-custom-fields → members-metafields}/filter.js +9 -9
  495. package/core/server/services/{members-custom-fields → members-metafields}/index.js +16 -7
  496. package/core/server/services/{members-custom-fields → members-metafields}/key.js +1 -1
  497. package/core/server/services/{members-custom-fields → members-metafields}/models.js +6 -4
  498. package/core/server/services/members-metafields/namespaces.js +34 -0
  499. package/core/server/services/members-metafields/queries.js +60 -0
  500. package/core/server/services/{members-custom-fields → members-metafields}/schema.js +18 -12
  501. package/core/server/services/{members-custom-fields → members-metafields}/serializers.js +7 -6
  502. package/core/server/services/{members-custom-fields → members-metafields}/values-service.js +46 -27
  503. package/core/server/services/mentions/mention-discovery-service.js +1 -1
  504. package/core/server/services/mentions/mention-sending-service.js +27 -10
  505. package/core/server/services/mentions/mention.js +1 -1
  506. package/core/server/services/mentions/send-webmentions-job.js +18 -0
  507. package/core/server/services/mentions/service.js +1 -31
  508. package/core/server/services/oembed/oembed-service.js +36 -11
  509. package/core/server/services/posts/post-scheduling.js +20 -0
  510. package/core/server/services/staff/staff-service-emails.js +5 -1
  511. package/core/server/services/stats/stats-service.js +12 -3
  512. package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +2 -2
  513. package/core/server/services/stripe/stripe-service.js +4 -4
  514. package/core/server/services/tier-checkout-config/codec.js +2 -2
  515. package/core/server/services/tier-checkout-config/index.js +2 -1
  516. package/core/server/services/tier-checkout-config/models.js +2 -2
  517. package/core/server/services/tier-checkout-config/queries.js +8 -8
  518. package/core/server/services/tier-checkout-config/serializers.js +57 -0
  519. package/core/server/services/tier-checkout-config/service.js +18 -2
  520. package/core/server/services/tiers/service.js +3 -3
  521. package/core/server/services/tinybird/tinybird-service.js +1 -0
  522. package/core/server/services/tinybird-sync/get-ingest-config.js +39 -0
  523. package/core/server/services/tinybird-sync/index.js +28 -0
  524. package/core/server/services/tinybird-sync/sync-table-to-tinybird.js +149 -0
  525. package/core/server/services/tinybird-sync/tinybird-sync-service.js +62 -0
  526. package/core/server/services/url/router-filter.js +8 -10
  527. package/core/server/services/users.js +1 -19
  528. package/core/server/web/api/endpoints/admin/routes.js +34 -34
  529. package/core/server/web/members/account/index.js +2 -0
  530. package/core/server/web/members/account/routes.js +46 -0
  531. package/core/server/web/members/app.js +4 -18
  532. package/core/server/web/well-known.js +12 -16
  533. package/core/shared/config/defaults.json +2 -3
  534. package/core/shared/{flush-logs.js → flush.js} +7 -3
  535. package/core/shared/labs.js +6 -2
  536. package/core/shared/timing-safe-string-equal.js +26 -0
  537. package/package.json +46 -46
  538. package/patches/@elastic__elasticsearch@8.19.2.patch +67 -0
  539. package/patches/juice@11.1.1.patch +46 -0
  540. package/pnpm-lock.yaml +750 -1742
  541. package/pnpm-workspace.yaml +37 -24
  542. package/scripts/prune.mts +70 -3
  543. package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
  544. package/components/tryghost-kg-default-cards-10.3.5.tgz +0 -0
  545. package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
  546. package/core/built/admin/assets/Combination-B0l4MKVh.js +0 -41
  547. package/core/built/admin/assets/RadialBarChart-JAKoS4KT.js +0 -1
  548. package/core/built/admin/assets/_baseAssignValue-C_vooEQc.js +0 -1
  549. package/core/built/admin/assets/about-Dyae_UT6.js +0 -1
  550. package/core/built/admin/assets/account-migration-CESa0mnX.js +0 -1
  551. package/core/built/admin/assets/action-list-C4v0-du8.js +0 -1
  552. package/core/built/admin/assets/activitypub/layout-2-0bw6HN.js +0 -1
  553. package/core/built/admin/assets/add-integration-modal-BlF6rs_f.js +0 -1
  554. package/core/built/admin/assets/add-newsletter-modal-CglVQqah.js +0 -1
  555. package/core/built/admin/assets/add-recommendation-modal-wz7BsuaG.js +0 -1
  556. package/core/built/admin/assets/analytics-C4HE1gBg.js +0 -1
  557. package/core/built/admin/assets/announcement-bar-modal-Ci4zz8jO.js +0 -1
  558. package/core/built/admin/assets/api-keys-Ck-Yteiv.js +0 -1
  559. package/core/built/admin/assets/automated-emails-D5VVMND9.js +0 -1
  560. package/core/built/admin/assets/automations-CzKt5fb8.js +0 -1
  561. package/core/built/admin/assets/automations-sAcJ1334.js +0 -1
  562. package/core/built/admin/assets/avatar-flipboard-C6Kj3Awu.js +0 -1
  563. package/core/built/admin/assets/bluesky-sharing-BEtJ_gL_.js +0 -1
  564. package/core/built/admin/assets/box-CdfQAP_F.js +0 -1
  565. package/core/built/admin/assets/brand-icon-CrIGOA3Z.js +0 -1
  566. package/core/built/admin/assets/breadcrumb-zUrZrBtW.js +0 -1
  567. package/core/built/admin/assets/build-CsiH26uS.js +0 -1
  568. package/core/built/admin/assets/button-eNMKQWXr.js +0 -1
  569. package/core/built/admin/assets/card--VNbfgo3.js +0 -1
  570. package/core/built/admin/assets/chart-helpers-CfBKt0vT.js +0 -1
  571. package/core/built/admin/assets/checkbox-CgOn_tKW.js +0 -1
  572. package/core/built/admin/assets/chunk.524.a697dee88db67fdf6021.js +0 -32
  573. package/core/built/admin/assets/chunk.598.7e056fabb47ce7dbd73f.js +0 -366
  574. package/core/built/admin/assets/code-editor-view-BYNoAoNV.js +0 -1
  575. package/core/built/admin/assets/code-editor-view-K2wI-I5f.js +0 -1
  576. package/core/built/admin/assets/color-picker-Ddw80xX6.js +0 -3
  577. package/core/built/admin/assets/color-picker-field-D9nUhvA7.js +0 -1
  578. package/core/built/admin/assets/combobox-w9j8PPQT.js +0 -1
  579. package/core/built/admin/assets/command-BfpHORBv.js +0 -1
  580. package/core/built/admin/assets/comments-BLmCmyCs.js +0 -1
  581. package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +0 -1
  582. package/core/built/admin/assets/confirmation-context-CBM8G0Vj.js +0 -1
  583. package/core/built/admin/assets/container-BuQG1wuP.js +0 -1
  584. package/core/built/admin/assets/content-api-modal-TXRz3U7S.js +0 -1
  585. package/core/built/admin/assets/context-menu-_QMdd3kp.js +0 -1
  586. package/core/built/admin/assets/copy-field-6N01S07E.js +0 -1
  587. package/core/built/admin/assets/create-ghost-browse-value-source-qIBymvvf.js +0 -1
  588. package/core/built/admin/assets/custom-field-type-option-BddFlJFa.js +0 -1
  589. package/core/built/admin/assets/custom-integration-modal-DmNquxUV.js +0 -1
  590. package/core/built/admin/assets/data-list-CA2jYGPq.js +0 -1
  591. package/core/built/admin/assets/date-range-select-uvz_DtPh.js +0 -1
  592. package/core/built/admin/assets/design-and-theme-modal-BSmo12Op.js +0 -2
  593. package/core/built/admin/assets/detail-page-Dnv-CdR1.js +0 -1
  594. package/core/built/admin/assets/dirty-confirm-dialog-BZ1iytEd.js +0 -1
  595. package/core/built/admin/assets/disabled-sources-indicator-DMRrxsiJ.js +0 -1
  596. package/core/built/admin/assets/dist-4m6pHdc0.js +0 -23
  597. package/core/built/admin/assets/dist-8YJUlf3B.js +0 -1
  598. package/core/built/admin/assets/dist-CZgIBXQN.js +0 -1
  599. package/core/built/admin/assets/dist-CiHx7vA5.js +0 -6
  600. package/core/built/admin/assets/dist-DIC8yz5C.js +0 -1
  601. package/core/built/admin/assets/dist-Dcsslyo72.js +0 -1
  602. package/core/built/admin/assets/dist-Dgt2cr6a.js +0 -1
  603. package/core/built/admin/assets/dist-ECAUrdGc.js +0 -1
  604. package/core/built/admin/assets/dist-JLOy8o0Q.js +0 -1
  605. package/core/built/admin/assets/dist-Ndy-PuGN.js +0 -1
  606. package/core/built/admin/assets/dist-Z97pCNqS.js +0 -11
  607. package/core/built/admin/assets/domain-BNYrt0aD.js +0 -1
  608. package/core/built/admin/assets/dropzone-D7nFdAe5.js +0 -5
  609. package/core/built/admin/assets/edit-profile-C5Asm4LA.js +0 -1
  610. package/core/built/admin/assets/editor-REokrzci.js +0 -8
  611. package/core/built/admin/assets/empty-indicator-D9QdpuNX.js +0 -1
  612. package/core/built/admin/assets/en-B1jX3WMs.js +0 -1
  613. package/core/built/admin/assets/esm-CXo5SEPy.js +0 -2
  614. package/core/built/admin/assets/explore-UY10Egsp.js +0 -1
  615. package/core/built/admin/assets/feature-image-placeholder-D1iF_8bc.js +0 -1
  616. package/core/built/admin/assets/feed-81C8mJWR.js +0 -1
  617. package/core/built/admin/assets/field-Dihp5p18.js +0 -1
  618. package/core/built/admin/assets/filter-bar-Da1qxybu.js +0 -1
  619. package/core/built/admin/assets/filter-sources-BO9xUPj7.js +0 -1
  620. package/core/built/admin/assets/filters-CRUWecfY.js +0 -1
  621. package/core/built/admin/assets/filters-DirqNXjH.js +0 -1
  622. package/core/built/admin/assets/first-promoter-modal-CT6MxYZb.js +0 -1
  623. package/core/built/admin/assets/framework-provider-DqI25epG.js +0 -4
  624. package/core/built/admin/assets/gift-link-modal-CQVAye17.js +0 -1
  625. package/core/built/admin/assets/global-data-context-gAMDH9u1.js +0 -1
  626. package/core/built/admin/assets/grid-Dj29PY05.js +0 -1
  627. package/core/built/admin/assets/growth-BWIu-6xj.js +0 -3
  628. package/core/built/admin/assets/growth-DU29oxeA.js +0 -1
  629. package/core/built/admin/assets/heading-Dh5SFVjL.js +0 -1
  630. package/core/built/admin/assets/history-modal-CFd1Hvx6.js +0 -1
  631. package/core/built/admin/assets/hooks-CuEZV2-q.js +0 -2
  632. package/core/built/admin/assets/html-field-CJBCLTvv.js +0 -1
  633. package/core/built/admin/assets/iframe-buffering-B2OKJzbz.js +0 -1
  634. package/core/built/admin/assets/images-scfkWZiK.js +0 -1
  635. package/core/built/admin/assets/index-6MkPdCtr.js +0 -4
  636. package/core/built/admin/assets/index-Bn7QhcZu.css +0 -2
  637. package/core/built/admin/assets/index.es-CNnuNH0d.js +0 -1
  638. package/core/built/admin/assets/inline-BWSs_VzR.js +0 -1
  639. package/core/built/admin/assets/input-group-CMhe2DvY.js +0 -1
  640. package/core/built/admin/assets/integration-header-Bm6IDb1A.js +0 -1
  641. package/core/built/admin/assets/invite-user-modal-DfheMXs0.js +0 -1
  642. package/core/built/admin/assets/koenig-loader-aFQNlJlD.js +0 -2
  643. package/core/built/admin/assets/kpi-card-DBRMfGOW.js +0 -1
  644. package/core/built/admin/assets/kpi-card-DFafD1qq.js +0 -1
  645. package/core/built/admin/assets/kpi-helpers-Cv8i8hns.js +0 -1
  646. package/core/built/admin/assets/kpi-tabs-BJItvLYm.js +0 -1
  647. package/core/built/admin/assets/label-BnSCvffu.js +0 -1
  648. package/core/built/admin/assets/label-picker-KVoo91sh.js +0 -1
  649. package/core/built/admin/assets/labels-CH3Kn8RV.js +0 -1
  650. package/core/built/admin/assets/layout-Bjv2Ll-5.js +0 -1
  651. package/core/built/admin/assets/limit-service-BhiEvqcP.js +0 -20
  652. package/core/built/admin/assets/link-helpers-MVDdnFCY.js +0 -1
  653. package/core/built/admin/assets/list-page-BucXJ0hi.js +0 -1
  654. package/core/built/admin/assets/luxon-D1RVjjpq.js +0 -1
  655. package/core/built/admin/assets/member-custom-fields-DDQV6QeG.js +0 -1
  656. package/core/built/admin/assets/member-detail-CdJF6Agw.js +0 -1
  657. package/core/built/admin/assets/members-DjQbq9Z2.js +0 -4
  658. package/core/built/admin/assets/modal-page-xCivTMvI.js +0 -1
  659. package/core/built/admin/assets/moderation-AgCIEso4.js +0 -1
  660. package/core/built/admin/assets/multi-select-combobox-BcITkUVr.js +0 -1
  661. package/core/built/admin/assets/navigation-modal-BkT7b1M2.js +0 -1
  662. package/core/built/admin/assets/newsletter-BMMAuvgq.js +0 -1
  663. package/core/built/admin/assets/newsletter-detail-modal-0SCJ7Zpm.js +0 -1
  664. package/core/built/admin/assets/newsletter-emails-DKzwafuh.js +0 -1
  665. package/core/built/admin/assets/newsletters-BRBb_uQC.js +0 -1
  666. package/core/built/admin/assets/newsletters-DhNigJUh.js +0 -1
  667. package/core/built/admin/assets/note-DyGHtS9a.js +0 -1
  668. package/core/built/admin/assets/notifications-ZgWniKna.js +0 -1
  669. package/core/built/admin/assets/nql-lang-CaWrLesS.js +0 -19
  670. package/core/built/admin/assets/offers-container-modal-B-E8TIWr.js +0 -1
  671. package/core/built/admin/assets/onboarding-CzIsre-d.js +0 -1
  672. package/core/built/admin/assets/onboarding-qg8Akovm.js +0 -1
  673. package/core/built/admin/assets/onboarding-route-CaavZulg.js +0 -1
  674. package/core/built/admin/assets/overview-BW8GLeYi.js +0 -1
  675. package/core/built/admin/assets/overview-BkXZNzaZ.js +0 -1
  676. package/core/built/admin/assets/page-header-De0VzKBi.js +0 -1
  677. package/core/built/admin/assets/pagemenu-B5KKCpbA.js +0 -1
  678. package/core/built/admin/assets/pages-jgaFm69d.js +0 -1
  679. package/core/built/admin/assets/pages-route-CIUAQxtY.js +0 -1
  680. package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +0 -10
  681. package/core/built/admin/assets/pintura-modal-BZ2J9w3n.js +0 -1
  682. package/core/built/admin/assets/portal-frame-B6Hr9wHc.js +0 -1
  683. package/core/built/admin/assets/portal-modal-D4ceei3t.js +0 -1
  684. package/core/built/admin/assets/post-analytics-context-D0Mw-Pmv.js +0 -1
  685. package/core/built/admin/assets/post-analytics-header-BYCsT0GP.js +0 -1
  686. package/core/built/admin/assets/post-analytics-ot7f6pih.js +0 -1
  687. package/core/built/admin/assets/post-analytics-provider-Bo1gmYaP.js +0 -1
  688. package/core/built/admin/assets/post-helpers-C5OQMBoi.js +0 -1
  689. package/core/built/admin/assets/post-share-modal-C-PaYZ_e.js +0 -1
  690. package/core/built/admin/assets/posts-DuGazgTb.js +0 -1
  691. package/core/built/admin/assets/posts-list-screen-CBGGgjjj.js +0 -2
  692. package/core/built/admin/assets/posts-route-D6xmS7Vf.js +0 -1
  693. package/core/built/admin/assets/preferences-C5YJLp74.js +0 -5
  694. package/core/built/admin/assets/preview-chrome-BljUBlOk.js +0 -1
  695. package/core/built/admin/assets/preview-modal-BfeFqi5y.js +0 -1
  696. package/core/built/admin/assets/profile-B8mx2yAu.js +0 -1
  697. package/core/built/admin/assets/prop-types-DeUPn3oD.js +0 -1
  698. package/core/built/admin/assets/radio-group-DczlLKOn.js +0 -1
  699. package/core/built/admin/assets/react-Bb3IsNbi.js +0 -1
  700. package/core/built/admin/assets/rolldown-runtime-DAXXjFlN.js +0 -1
  701. package/core/built/admin/assets/router-provider-B0gZyiGJ.js +0 -1
  702. package/core/built/admin/assets/schemas-DppqmpeJ.js +0 -64
  703. package/core/built/admin/assets/select-cb0t_TAJ.js +0 -1
  704. package/core/built/admin/assets/settings-DZqxR0Da.js +0 -1
  705. package/core/built/admin/assets/settings-DvfTNdHQ.js +0 -4
  706. package/core/built/admin/assets/settings-breadcrumbs-DLzbRRSt.js +0 -1
  707. package/core/built/admin/assets/share-modal-D2-Bz1_I.js +0 -1
  708. package/core/built/admin/assets/skeleton-Ce9GgUpf.js +0 -1
  709. package/core/built/admin/assets/slack-modal-DYDTUria.js +0 -1
  710. package/core/built/admin/assets/sort-button-VVeQjjbu.js +0 -1
  711. package/core/built/admin/assets/source-icon-Ck5_5Kgq.js +0 -1
  712. package/core/built/admin/assets/stack-B2eszIiq.js +0 -1
  713. package/core/built/admin/assets/stats-Rjmk5owg.js +0 -1
  714. package/core/built/admin/assets/stats-view-BGGmkmgv.js +0 -1
  715. package/core/built/admin/assets/step-1-CsaBjeN4.js +0 -1
  716. package/core/built/admin/assets/step-2-D2vnxOOM.js +0 -1
  717. package/core/built/admin/assets/step-3-wBoLdGEb.js +0 -2
  718. package/core/built/admin/assets/stripe-button-CDgLz0S0.js +0 -1
  719. package/core/built/admin/assets/stripe-connect-modal-CSjMJetP.js +0 -1
  720. package/core/built/admin/assets/switch-CI4gLWqb.js +0 -1
  721. package/core/built/admin/assets/table-Do6iQ83Q.js +0 -1
  722. package/core/built/admin/assets/tabs-D2yWLMp_.js +0 -1
  723. package/core/built/admin/assets/tag-detail-BhXlOsCa.js +0 -2
  724. package/core/built/admin/assets/tags-ldukRApe.js +0 -1
  725. package/core/built/admin/assets/testimonials-modal-CtnZBJKl.js +0 -1
  726. package/core/built/admin/assets/text-BQDSDsKs.js +0 -1
  727. package/core/built/admin/assets/textarea-DJ1Q5V39.js +0 -1
  728. package/core/built/admin/assets/tier-detail-modal-BOs8e_G8.js +0 -1
  729. package/core/built/admin/assets/tiers-Nd_z4BZY.js +0 -1
  730. package/core/built/admin/assets/toggle-group-ByUJsxwD.js +0 -1
  731. package/core/built/admin/assets/topic-filter-BgC3g5_v.js +0 -1
  732. package/core/built/admin/assets/transistor-modal-Drr0SNfo.js +0 -1
  733. package/core/built/admin/assets/trend-badge-6ye93YAW.js +0 -1
  734. package/core/built/admin/assets/unsplash-modal-p6AoQoWp.js +0 -1
  735. package/core/built/admin/assets/use-analytics-data-CWCMAESo.js +0 -1
  736. package/core/built/admin/assets/use-filter-params-BIni9taJ.js +0 -1
  737. package/core/built/admin/assets/use-filterable-api-CzXcpUh8.js +0 -1
  738. package/core/built/admin/assets/use-form-vRjI0Kwk.js +0 -1
  739. package/core/built/admin/assets/use-growth-stats-DCVG3s9w.js +0 -1
  740. package/core/built/admin/assets/use-host-limits-DZtR08oa.js +0 -1
  741. package/core/built/admin/assets/use-limiter-D2WRRx0H.js +0 -2
  742. package/core/built/admin/assets/use-navigate-with-base-path-BHPA228f.js +0 -1
  743. package/core/built/admin/assets/use-pintura-config-h-J0Lvta.js +0 -1
  744. package/core/built/admin/assets/use-pintura-editor-BfN1UwzH.js +0 -1
  745. package/core/built/admin/assets/use-post-referrers-Czg47m8s.js +0 -1
  746. package/core/built/admin/assets/use-query-params-BfzuqbcD.js +0 -1
  747. package/core/built/admin/assets/use-reply-chain-data-ns0caK8k.js +0 -1
  748. package/core/built/admin/assets/use-router-history-entry-uldn7zJO.js +0 -1
  749. package/core/built/admin/assets/use-setting-group-DpcuCUDg.js +0 -1
  750. package/core/built/admin/assets/use-settings-navigation-CZjGrhsp.js +0 -1
  751. package/core/built/admin/assets/use-simple-pagination-DzJWobPR.js +0 -1
  752. package/core/built/admin/assets/use-staff-users-Csipb-O0.js +0 -1
  753. package/core/built/admin/assets/use-tinybird-token-DTOKRR7e.js +0 -1
  754. package/core/built/admin/assets/use-unsaved-changes-guard-CBzs-KPi.js +0 -1
  755. package/core/built/admin/assets/use-upgrade-route-DhRSo7at.js +0 -1
  756. package/core/built/admin/assets/user-detail-modal-B_iUClI6.js +0 -1
  757. package/core/built/admin/assets/virtual-list-BW-padMe.js +0 -1
  758. package/core/built/admin/assets/web-C1v33ehA.js +0 -2
  759. package/core/built/admin/assets/web-C4BKzn2T.js +0 -1
  760. package/core/built/admin/assets/zapier-modal-BBFfI6Ml.js +0 -1
  761. package/core/server/services/email-suppression-list/in-memory-email-suppression-list.js +0 -39
  762. package/core/server/services/members-custom-fields/bindings-service.js +0 -120
  763. package/core/server/services/members-custom-fields/codec.js +0 -14
  764. package/core/server/services/members-custom-fields/queries.js +0 -32
  765. /package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js.LICENSE.txt → chunk.972.4b8c97f93d66db15e751.js.LICENSE.txt} +0 -0
  766. /package/core/server/services/{members-custom-fields → members-metafields}/storage.js +0 -0
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ // Finds packages loaded twice in one process: once from a custom adapter's own
3
+ // `node_modules` and once from Ghost's.
4
+ //
5
+ // An adapter is installed as a self-contained directory with its own dependency
6
+ // tree (Ghost Pro deploys them to `/home/ghost/adapters/<type>/<Name>`). Whatever
7
+ // it doesn't install itself resolves by walking up to Ghost's `node_modules`, so
8
+ // a package it *does* install becomes a second module instance - which breaks
9
+ // `instanceof` against a base class (hence the name-based fallbacks in
10
+ // `adapter-manager.ts` and `bin/validate-adapters.ts`) and splits module-level
11
+ // state, as `@tryghost/metrics` would with no `globalThis` guard to save it.
12
+ //
13
+ // @NOTE: `collectLoadedFiles` unions two sources because neither contains the
14
+ // other. `require.cache` holds no ESM file, neither an ESM adapter's entry point
15
+ // nor anything it `import`s - though a CommonJS dependency of one does still go
16
+ // through the cache, so the gap is ESM files specifically. The inspector reports
17
+ // every script V8 parsed, ESM included, but `.json` and native `.node` modules
18
+ // aren't scripts and only the cache lists them. The cache is also the fallback
19
+ // when the inspector is unavailable.
20
+ //
21
+ // @NOTE: this is for the installed tree built into an image, not a local
22
+ // checkout. Ghost's copy of a `workspace:*` dependency - every adapter base class
23
+ // among them - resolves through a symlink to `packages/<name>`, outside any
24
+ // `node_modules`, leaving an adapter's copy with nothing to be compared against.
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.collectLoadedFiles = collectLoadedFiles;
30
+ exports.parsePackageFromPath = parsePackageFromPath;
31
+ exports.checkDuplicateDependencies = checkDuplicateDependencies;
32
+ exports.formatDuplicateReport = formatDuplicateReport;
33
+ const node_fs_1 = __importDefault(require("node:fs"));
34
+ const node_inspector_1 = __importDefault(require("node:inspector"));
35
+ const node_path_1 = __importDefault(require("node:path"));
36
+ const node_url_1 = require("node:url");
37
+ const NODE_MODULES = 'node_modules';
38
+ /**
39
+ * The files V8 has parsed in this process, whatever their module format.
40
+ *
41
+ * Enabling the `Debugger` domain replays a `scriptParsed` event for every script
42
+ * already parsed, synchronously, so this can run after the adapters have and
43
+ * there is nothing to await. Empty when the inspector is unavailable, e.g. a Node
44
+ * built `--without-inspector`.
45
+ */
46
+ function parsedScriptFiles() {
47
+ let session;
48
+ try {
49
+ session = new node_inspector_1.default.Session();
50
+ session.connect();
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ const files = [];
56
+ session.on('Debugger.scriptParsed', ({ params }) => {
57
+ // Nothing with no file behind it - `node:` internals, `eval`, `data:` URLs -
58
+ // can belong to a package.
59
+ if (!params.url.startsWith('file://')) {
60
+ return;
61
+ }
62
+ try {
63
+ files.push((0, node_url_1.fileURLToPath)(params.url));
64
+ }
65
+ catch {
66
+ // Nor anything Node won't convert back to a path.
67
+ }
68
+ });
69
+ session.post('Debugger.enable');
70
+ session.post('Debugger.disable');
71
+ session.disconnect();
72
+ return files;
73
+ }
74
+ /** Every file this process has loaded, from both of the sources above. */
75
+ function collectLoadedFiles(cjsCachedFiles) {
76
+ return [...new Set([...cjsCachedFiles, ...parsedScriptFiles()])];
77
+ }
78
+ function realpathOrNull(target) {
79
+ try {
80
+ return node_fs_1.default.realpathSync(target);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ /** Whether `filePath` sits inside `directory`. Both are expected to be realpaths. */
87
+ function isInside(filePath, directory) {
88
+ const relative = node_path_1.default.relative(directory, filePath);
89
+ // Match the first segment exactly, so a name that merely begins with dots
90
+ // isn't taken for traversal the way startsWith('..') would take it.
91
+ const [firstSegment] = relative.split(node_path_1.default.sep);
92
+ return relative !== '' && firstSegment !== '..' && !node_path_1.default.isAbsolute(relative);
93
+ }
94
+ /** The version a package declares, or `unknown` - better reported than dropped. */
95
+ function readVersion(packagePath) {
96
+ try {
97
+ const { version } = JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(packagePath, 'package.json'), 'utf8'));
98
+ return typeof version === 'string' ? version : 'unknown';
99
+ }
100
+ catch {
101
+ return 'unknown';
102
+ }
103
+ }
104
+ /**
105
+ * Attribute a loaded file to the package that physically contains it: whatever
106
+ * the *last* `node_modules` segment of its path names. That holds for any
107
+ * installer's layout, npm's flat `node_modules/<name>` and pnpm's
108
+ * `.pnpm/<name>@<version>/node_modules/<name>` alike. `null` when the file is in
109
+ * no package: Ghost's own source, or an adapter's own `index.js`.
110
+ */
111
+ function parsePackageFromPath(filePath) {
112
+ const segments = filePath.split(node_path_1.default.sep);
113
+ const start = segments.lastIndexOf(NODE_MODULES) + 1;
114
+ const first = segments[start];
115
+ // A dot-prefixed entry is an installer's own directory - pnpm's store, `.bin`,
116
+ // a cache - and npm forbids a package name from looking like one.
117
+ if (start === 0 || !first || first.startsWith('.')) {
118
+ return null;
119
+ }
120
+ // Scoped packages take two segments: `@tryghost/logging`.
121
+ const end = start + (first.startsWith('@') ? 2 : 1);
122
+ if (!segments[end - 1]) {
123
+ return null;
124
+ }
125
+ return {
126
+ name: segments.slice(start, end).join('/'),
127
+ path: segments.slice(0, end).join(node_path_1.default.sep),
128
+ };
129
+ }
130
+ /**
131
+ * Find packages loaded from both an adapter's dependency tree and Ghost's own.
132
+ *
133
+ * Adapters are checked first: `content/adapters` lives inside the Ghost
134
+ * installation, so the two sides are not mutually exclusive.
135
+ */
136
+ function checkDuplicateDependencies({ cachedFiles, adapterRoots, ghostNodeModulesRoots, mustBeSingleCopy, }) {
137
+ // Compare resolved paths on both sides, never specifiers: `require.cache`
138
+ // reports realpaths, and pnpm reaches these roots through symlinks.
139
+ const realAdapterRoots = adapterRoots.map(realpathOrNull).filter((root) => root !== null);
140
+ const realGhostRoots = ghostNodeModulesRoots.map(realpathOrNull).filter((root) => root !== null);
141
+ const adapterPackages = new Map();
142
+ const ghostPackages = new Map();
143
+ for (const cachedFile of cachedFiles) {
144
+ const realFile = realpathOrNull(cachedFile) ?? cachedFile;
145
+ const inAdapter = realAdapterRoots.some((root) => isInside(realFile, root));
146
+ if (!inAdapter && !realGhostRoots.some((root) => isInside(realFile, root))) {
147
+ continue;
148
+ }
149
+ const location = parsePackageFromPath(realFile);
150
+ if (!location) {
151
+ continue;
152
+ }
153
+ if (!inAdapter) {
154
+ // Ghost's tree can hold more than one copy of a name, and any of them is
155
+ // the other half of the comparison, so the first one seen will do.
156
+ if (!ghostPackages.has(location.name)) {
157
+ ghostPackages.set(location.name, location.path);
158
+ }
159
+ continue;
160
+ }
161
+ // Two adapters can each bundle their own copy, so keep every location.
162
+ const packagePaths = adapterPackages.get(location.name) ?? new Set();
163
+ adapterPackages.set(location.name, packagePaths.add(location.path));
164
+ }
165
+ // Reading versions only once both sides are known costs one manifest read per
166
+ // reported copy, rather than one per cached file.
167
+ const duplicates = [];
168
+ for (const [name, packagePaths] of [...adapterPackages].sort(([a], [b]) => a.localeCompare(b))) {
169
+ const ghostPath = ghostPackages.get(name);
170
+ if (!ghostPath) {
171
+ continue;
172
+ }
173
+ const ghost = { version: readVersion(ghostPath), path: ghostPath };
174
+ for (const packagePath of packagePaths) {
175
+ duplicates.push({
176
+ name,
177
+ adapter: { version: readVersion(packagePath), path: packagePath },
178
+ ghost,
179
+ });
180
+ }
181
+ }
182
+ const singleCopy = new Set(mustBeSingleCopy);
183
+ return { duplicates, blocking: duplicates.filter(({ name }) => singleCopy.has(name)) };
184
+ }
185
+ /** Render a report in the same indented style as the adapter results. */
186
+ function formatDuplicateReport({ duplicates, blocking }) {
187
+ if (!duplicates.length) {
188
+ return ' ok no duplicate dependencies\n';
189
+ }
190
+ return [
191
+ `\n${duplicates.length} package(s) loaded from both an adapter and Ghost:\n`,
192
+ ...duplicates.map(({ name, adapter, ghost }) => `- ${name}\n` +
193
+ ` adapter ${adapter.version} ${adapter.path}\n` +
194
+ ` ghost ${ghost.version} ${ghost.path}\n`),
195
+ '\nEach duplicate is loaded into memory twice. Have the adapter declare the\n' +
196
+ 'package as a peer dependency of Ghost, or match the version Ghost ships,\n' +
197
+ 'so the install can be deduplicated.\n\n',
198
+ blocking.length
199
+ ? ` FAIL duplicate dependencies: ${blocking.map(({ name }) => name).join(', ')}\n` +
200
+ ' A second copy of these breaks `instanceof` against the base class\n' +
201
+ ' Ghost checks adapters with - they must resolve to a single copy.\n'
202
+ : ' ok duplicate dependencies (none of them must be a single copy)\n',
203
+ ].join('');
204
+ }
@@ -2,15 +2,17 @@
2
2
  "use strict";
3
3
  // Checks that custom adapters load and implement everything their base class
4
4
  // requires. Ghost only verifies an adapter fully on first use (`getAdapter`), so a
5
- // missing method on a storage adapter otherwise surfaces at first upload; run this
6
- // at image build time to fail the build instead.
5
+ // missing method on a storage adapter otherwise surfaces at first upload - run
6
+ // this at image build time to fail the build instead.
7
7
  //
8
- // Usage: bin/validate-adapters.js <type>:<AdapterClassName> ...
8
+ // Usage: bin/validate-adapters.js [--check-duplicate-deps] <type>:<AdapterClassName> ...
9
9
  // e.g. bin/validate-adapters.js cache:Redis sso:ProSSO storage:S3Storage
10
10
  //
11
11
  // Adapters are named explicitly rather than read from config, which may not be
12
12
  // present at build time
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ const node_util_1 = require("node:util");
15
+ const duplicate_deps_1 = require("./lib/duplicate-deps");
14
16
  const adapter_paths_1 = require("../core/server/services/adapter-manager/adapter-paths");
15
17
  const base_classes_1 = require("../core/server/services/adapter-manager/base-classes");
16
18
  const utils_1 = require("../core/server/services/adapter-manager/utils");
@@ -43,11 +45,47 @@ function validate(spec) {
43
45
  throw new Error(`missing method(s): ${missing.join(', ')}`);
44
46
  }
45
47
  }
46
- function main(specs) {
47
- if (!specs.length) {
48
- process.stderr.write('Usage: bin/validate-adapters.js <type>:<AdapterClassName> ...\n');
48
+ /**
49
+ * Report the packages the loaded adapters brought a second copy of. Reads what the
50
+ * process has already loaded, so it has to run after the adapters have. In a Ghost
51
+ * Pro image `module.paths` reaches the `/home/ghost/node_modules` that an adapter's
52
+ * unbundled dependencies fall back to, which is the other side of the comparison.
53
+ */
54
+ function reportDuplicateDeps() {
55
+ const report = (0, duplicate_deps_1.checkDuplicateDependencies)({
56
+ cachedFiles: (0, duplicate_deps_1.collectLoadedFiles)(Object.keys(require.cache)),
57
+ // The blank entry means "Ghost's own node_modules", which is the other side
58
+ // of the comparison rather than an adapter tree.
59
+ adapterRoots: adapter_paths_1.adapterPaths.filter((adapterPath) => adapterPath !== ''),
60
+ ghostNodeModulesRoots: module.paths,
61
+ mustBeSingleCopy: Object.values(base_classes_1.baseClassPackages),
62
+ });
63
+ process.stdout.write((0, duplicate_deps_1.formatDuplicateReport)(report));
64
+ return report.blocking.length > 0;
65
+ }
66
+ /** `parseArgs` is strict, so a bad option throws instead of passing for a name. */
67
+ function parseCliArgs(argv) {
68
+ try {
69
+ return (0, node_util_1.parseArgs)({
70
+ args: argv,
71
+ allowPositionals: true,
72
+ options: {
73
+ 'check-duplicate-deps': { type: 'boolean', default: false },
74
+ },
75
+ });
76
+ }
77
+ catch (err) {
78
+ process.stderr.write(`${err.message}\n`);
79
+ return null;
80
+ }
81
+ }
82
+ function main(argv) {
83
+ const parsed = parseCliArgs(argv);
84
+ if (!parsed?.positionals.length) {
85
+ process.stderr.write('Usage: bin/validate-adapters.js [--check-duplicate-deps] <type>:<AdapterClassName> ...\n');
49
86
  process.exit(1);
50
87
  }
88
+ const { values, positionals: specs } = parsed;
51
89
  const failures = [];
52
90
  for (const spec of specs) {
53
91
  try {
@@ -59,11 +97,17 @@ function main(specs) {
59
97
  process.stdout.write(` FAIL ${spec}\n`);
60
98
  }
61
99
  }
100
+ // Off unless asked for: a self-hosted adapter in content/adapters may
101
+ // legitimately bundle its own dependencies, and that must not fail anyone's
102
+ // build. Only the image build installing adapters itself opts in.
103
+ const duplicatesBlocked = values['check-duplicate-deps'] && reportDuplicateDeps();
62
104
  if (failures.length) {
63
105
  process.stderr.write(`\n${failures.length} of ${specs.length} adapter(s) failed validation:\n`);
64
106
  for (const { spec, message } of failures) {
65
107
  process.stderr.write(`- ${spec}: ${message}\n`);
66
108
  }
109
+ }
110
+ if (failures.length || duplicatesBlocked) {
67
111
  process.exit(1);
68
112
  }
69
113
  process.stdout.write(`Validated ${specs.length} adapter(s).\n`);
Binary file
@@ -1 +1 @@
1
- :root{--color-white:#fff;--color-lighter-gray:rgba(0,0,0,.05);--color-light-gray:#e6e6e6;--color-mid-gray:#ccc;--color-dark-gray:#444;--color-darker-gray:#15171a;--color-black:#000;--color-primary-text:var(--color-darker-gray);--color-secondary-text:rgba(0,0,0,.55);--color-border:rgba(0,0,0,.08);--color-dark-border:rgba(0,0,0,.55);--font-sans:Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-serif:"EB Garamond", Georgia, Times, serif;--font-serif-alt:Georgia, Times, serif;--font-mono:"JetBrains Mono", Menlo, Consolas, Monaco, "Liberation Mono", "Lucida Console", monospace;--container-width:1320px;--container-gap:clamp(24px, 1.7032rem + 1.9355vw, 48px);--grid-gap:42px}:is(.gh-navigation,.gh-footer).has-accent-color,:root.has-light-text{--color-lighter-gray:hsla(0,0%,100%,.1);--color-darker-gray:#fff;--color-secondary-text:hsla(0,0%,100%,.64);--color-border:hsla(0,0%,100%,.15);--color-dark-border:hsla(0,0%,100%,.5)}*,:after,:before{box-sizing:border-box}*{margin:0}html{font-size:62.5%}body{line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}canvas,img,picture,svg,video{display:block;height:auto;max-width:100%}iframe{display:block}button,input,select,textarea{font:inherit}h1,h2,h3,h4,h5,h6,p{overflow-wrap:break-word}h1,h2,h3,h4,h5,h6{line-height:1.2}sub,sup{line-height:1}body{font-family:var(--gh-font-body,var(--font-sans));font-size:1.6rem;background-color:var(--background-color);color:var(--color-primary-text)}h1,h2,h3,h4,h5,h6{font-family:var(--gh-font-heading,var(--font-sans))}a{color:var(--color-darker-gray);text-decoration:none}a:hover{opacity:.8}.gh-button{display:inline-flex;gap:.4em;align-items:center;justify-content:center;padding:.8em 1.4em;font-size:1.5rem;font-weight:600;letter-spacing:-.004em;line-height:1;color:var(--color-white);cursor:pointer;background-color:var(--ghost-accent-color);border:0;border-radius:100px}.gh-button:hover{opacity:.95}.gh-icon-button{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;color:var(--color-darker-gray);cursor:pointer;background-color:transparent;border:0;outline:none}.gh-icon-button:hover :is(svg,span){opacity:.8}.gh-icon-button svg{width:20px;height:20px}.gh-form{display:flex;align-items:center;position:relative;max-width:560px;width:100%;height:56px;font-size:1.7rem;font-weight:450;letter-spacing:-.008em;border-radius:40px;background-color:var(--color-lighter-gray);transition:background-color .2s ease}.gh-form.success{pointer-events:none}.gh-form.error{box-shadow:0 0 0 1px red}.gh-form:hover{background-color:rgba(0,0,0,.065)}.gh-footer.has-accent-color .gh-form:hover,.has-light-text .gh-form:hover{background-color:hsla(0,0%,100%,.15)}.gh-form-input{position:absolute;inset:0;padding-inline:26px;width:100%;height:100%;font-size:inherit;letter-spacing:inherit;line-height:1.1;border:0;border-radius:40px;background-color:transparent;outline:none;transition:.3s ease-in-out}.gh-form-input::-moz-placeholder{color:rgba(0,0,0,.3)}.gh-form-input::placeholder,button.gh-form-input{color:rgba(0,0,0,.3)}:is(.has-serif-title,.has-mono-title):not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-form-input,body[class*=" gh-font-heading"]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) .gh-form-input,body[class^=gh-font-heading]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) .gh-form-input{padding-inline:20px}.gh-form.gh-form.success .gh-form-input{opacity:.5}.gh-footer.has-accent-color .gh-form-input,.has-light-text .gh-form-input{color:#fff}.gh-footer.has-accent-color .gh-form-input::-moz-placeholder,.has-light-text .gh-form-input::-moz-placeholder{color:hsla(0,0%,100%,.55)}.gh-footer.has-accent-color .gh-form-input::placeholder,.has-light-text .gh-form-input::placeholder,.has-light-text button.gh-form-input{color:hsla(0,0%,100%,.55)}.gh-header.is-classic.has-image .gh-form-input{color:#15171a}.gh-header.is-classic.has-image .gh-form-input::-moz-placeholder{color:rgba(0,0,0,.5)}.gh-header.is-classic.has-image .gh-form-input::placeholder,.gh-header.is-classic.has-image .gh-form>svg,.gh-header.is-classic.has-image button.gh-form-input{color:rgba(0,0,0,.5)}button.gh-form-input{padding-inline-start:56px;text-align:left;color:var(--color-secondary-text);cursor:pointer}:is(.has-serif-title,.has-mono-title):not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) button.gh-form-input,body[class*=" gh-font-heading"]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) button.gh-form-input,body[class^=gh-font-heading]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) button.gh-form-input{padding-inline-start:50px}.gh-form .gh-button{position:absolute;right:6px;min-width:132px;padding-inline:24px;height:44px;font-size:inherit}.gh-form>svg{position:relative;left:22px;width:20px;height:20px;color:var(--color-secondary-text)}:is(.has-serif-title,.has-mono-title):not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-form>svg{left:16px}.gh-form .gh-button svg{display:none;position:absolute;margin-top:1px}.gh-form .gh-button>span:last-child{display:none}.gh-form:is(.loading,.success) .gh-button>span:first-child{visibility:hidden}.gh-form.loading .gh-button svg:first-of-type{display:block}.gh-form.success .gh-button>span:first-child{display:none}.gh-form.success .gh-button>span:last-child{display:inline}.gh-form [data-members-error]{position:absolute;top:100%;margin-top:10px;width:100%;font-size:1.4rem;line-height:1.4}@media (max-width:576px){.gh-form{font-size:1.6rem}.gh-form .gh-button{min-width:104px;padding-inline:12px}}.gh-viewport{position:relative;display:flex;flex-direction:column;min-height:100vh}.gh-outer{padding:0 max(4vmin,20px)}.gh-outer .gh-outer{padding:0}.gh-inner{margin:0 auto;max-width:var(--container-width);width:100%}.gh-main{flex-grow:1}.gh-canvas,.kg-width-full.kg-content-wide{--main:min(var(--content-width, 720px), 100% - 2 * var(--container-gap));--wide:minmax(0, calc(.5 * (var(--container-width, 1200px) - var(--content-width, 720px))));--full:minmax(var(--container-gap), 1fr);display:grid;grid-template-columns:[full-start] var(--full) [wide-start] var(--wide) [main-start] var(--main) [main-end] var(--wide) [wide-end] var(--full) [full-end]}.gh-canvas>*{grid-column:main}.kg-content-wide>div,.kg-width-wide{grid-column:wide}.kg-width-full{grid-column:full}.gh-navigation{height:100px;font-size:1.5rem;font-weight:550;background-color:var(--background-color);color:var(--color-darker-gray)}.gh-navigation :is(.gh-navigation-logo,a:not(.gh-button),.gh-icon-button){color:inherit}.gh-navigation-inner{display:grid;grid-auto-flow:row dense;-moz-column-gap:24px;column-gap:24px;align-items:center;height:100%}.gh-navigation-brand{line-height:1}.gh-navigation-logo{position:relative;font-family:var(--gh-font-heading,var(--font-sans));font-size:calc(2.4rem * var(--factor, 1));font-weight:725;letter-spacing:-.015em;white-space:nowrap}.gh-navigation-logo img{max-height:40px}.gh-navigation-menu{display:flex;gap:24px;align-items:center}.gh-navigation .nav{gap:28px;padding:0;margin:0;white-space:nowrap;list-style:none}.gh-navigation .nav,.nav a{display:inline-flex;align-items:center}.nav a{gap:.35em;vertical-align:middle}.nav-icon{display:block;width:1em;height:1em;flex:0 0 auto;-o-object-fit:contain;object-fit:contain}.gh-navigation .gh-more-toggle{position:relative;margin:0 -6px;font-size:inherit;text-transform:inherit}.gh-navigation .gh-more-toggle svg{width:24px;height:24px}.gh-navigation-actions{display:flex;gap:24px;align-items:center;justify-content:flex-end;background-color:var(--background-color)}.gh-navigation.has-accent-color .gh-navigation-actions{background-color:var(--ghost-accent-color)}.gh-navigation-members{display:flex;gap:20px;align-items:center;white-space:nowrap}.gh-navigation-members .gh-button{font-size:inherit;font-weight:600}.gh-search{margin-right:-2px;margin-left:-2px}@media (max-width:767px){.gh-navigation-logo{white-space:normal}.gh-navigation-members{flex-direction:column-reverse;gap:16px;width:100%}.gh-navigation-actions .gh-search{display:none}}@media (min-width:768px){.gh-navigation-brand .gh-search{display:none}.gh-navigation:not(.is-dropdown-loaded) .gh-navigation-menu .nav>li{opacity:0}}.gh-navigation.has-accent-color{background-color:var(--ghost-accent-color)}.gh-navigation.has-accent-color .gh-button{background-color:#fff;color:#15171a}.gh-navigation.is-left-logo .gh-navigation-inner{grid-template-columns:auto 1fr auto}@media (min-width:768px){.gh-navigation.is-left-logo .gh-navigation-logo:not(:has(img)){top:-2px}}@media (min-width:992px){.gh-navigation.is-left-logo .gh-navigation-menu{margin-right:100px;margin-left:16px}}.gh-navigation.is-middle-logo .gh-navigation-inner{grid-template-columns:1fr auto 1fr}.gh-navigation.is-middle-logo .gh-navigation-brand{grid-column-start:2}.gh-navigation.is-middle-logo .gh-navigation-actions{gap:28px}@media (min-width:992px){.gh-navigation.is-middle-logo .gh-navigation-menu{margin-right:64px}}.gh-navigation.is-stacked{position:relative;height:auto}.gh-navigation.is-stacked .gh-navigation-inner{grid-template-columns:1fr auto 1fr}.gh-navigation.is-stacked .gh-navigation-brand{display:flex;align-items:center;grid-row-start:1;grid-column-start:2;min-height:80px}@media (max-width:767px){.gh-navigation.is-stacked .gh-navigation-brand{min-height:unset}}@media (min-width:992px){.gh-navigation.is-stacked .gh-navigation-inner{padding:0}.gh-navigation.is-stacked .gh-navigation-brand{display:flex;align-items:center;height:80px}.gh-navigation.is-stacked .gh-navigation-menu{grid-row-start:2;grid-column:1/4;justify-content:center;height:60px;margin:0 48px}.gh-navigation.is-stacked .gh-navigation-menu:after,.gh-navigation.is-stacked .gh-navigation-menu:before{position:absolute;top:80px;left:0;width:100%;height:1px;content:"";background-color:var(--color-border)}.gh-navigation.is-stacked .gh-navigation-menu:after{top:140px}.gh-navigation.is-stacked .gh-navigation-actions{grid-row-start:1;grid-column:1/4;justify-content:space-between}.gh-navigation.is-stacked .gh-navigation-actions .gh-search{display:flex;gap:10px;width:auto}}.gh-dropdown{position:absolute;top:100%;right:-16px;z-index:90;width:200px;padding:12px 0;margin-top:24px;text-align:left;visibility:hidden;background-color:#fff;border-radius:5px;box-shadow:0 0 0 1px rgba(0,0,0,.04),0 7px 20px -5px rgba(0,0,0,.15);opacity:0;transition:opacity .3s,transform .2s;transform:translate3d(0,6px,0)}.gh-dropdown.is-left{right:auto;left:-16px}.is-dropdown-mega .gh-dropdown{display:grid;grid-template-columns:1fr 1fr;grid-auto-flow:column;-moz-column-gap:40px;column-gap:40px;width:auto;padding:20px 32px}.is-dropdown-open .gh-dropdown{visibility:visible;opacity:1;transform:translateY(0)}.gh-dropdown li a{display:block;padding:7px 20px;line-height:1.5;white-space:normal;color:#15171a!important}.is-dropdown-mega .gh-dropdown li a{padding:8px 0}.gh-burger{display:flex;justify-content:center;align-items:center;position:relative;display:none;margin-right:-7px;margin-left:4px}.gh-burger svg{width:24px;height:24px}.gh-burger svg:last-child,.is-open .gh-burger svg:first-child{display:none}.is-open .gh-burger svg:last-child{display:block}@media (max-width:767px){.gh-burger{display:flex}#gh-navigation{height:64px}#gh-navigation .gh-navigation-inner{grid-template-rows:auto 1fr auto;grid-template-columns:1fr;gap:48px}#gh-navigation .gh-navigation-brand{display:grid;grid-template-columns:1fr auto auto;grid-column-start:1;align-items:center;height:64px}#gh-navigation .gh-navigation-logo{font-size:2.2rem}#gh-navigation .gh-navigation-actions,#gh-navigation .gh-navigation-menu{position:fixed;justify-content:center;visibility:hidden;opacity:0}#gh-navigation .gh-navigation-menu{transition:none;transform:translateY(0)}#gh-navigation .nav{gap:20px;align-items:center;line-height:1.4}#gh-navigation .nav a{font-size:1.75rem;font-weight:600;text-transform:none}#gh-navigation .nav li{opacity:0;transform:translateY(-4px)}#gh-navigation .gh-navigation-actions{text-align:center}#gh-navigation :is(.gh-button,a[data-portal=signin]){opacity:0;transform:translateY(8px)}#gh-navigation .gh-button{width:100%;font-size:1.75rem;text-transform:none}#gh-navigation a[data-portal=signin]{font-size:1.75rem}#gh-main{transition:opacity .4s}.is-open#gh-navigation{position:fixed;inset:0;z-index:3999999;height:100%;overflow-y:scroll;-webkit-overflow-scrolling:touch}.is-open#gh-navigation .gh-navigation-actions,.is-open#gh-navigation .gh-navigation-menu{position:static;visibility:visible;opacity:1}.is-open#gh-navigation .nav{display:flex;flex-direction:column}.is-open#gh-navigation .nav li{opacity:1;transition:transform .2s,opacity .2s;transform:translateY(0)}.is-open#gh-navigation .gh-navigation-actions{position:sticky;right:0;bottom:0;left:0;display:inline-flex;flex-direction:column;gap:12px;align-items:center;padding:var(--container-gap) 0}.is-open#gh-navigation :is(.gh-button,a[data-portal=signin]){opacity:1;transition:transform .4s,opacity .4s;transition-delay:.2s;transform:translateY(0)}.is-open#gh-navigation a[data-portal=signin]{transition-delay:.4s}.is-open#gh-main{opacity:0}}.gh-card{position:relative}.gh-card-link{display:flex;flex-direction:column;gap:20px}.gh-card-link:hover{opacity:1}.gh-card-image{position:relative;flex-shrink:0;aspect-ratio:16/9}.gh-card-image img{position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.gh-card-wrapper{flex-grow:1}.gh-card-tag{display:none;margin-bottom:4px;font-size:1.2rem;font-weight:500;letter-spacing:.01em;text-transform:uppercase}.gh-card-title{font-size:calc(1.9rem * var(--factor, 1));font-weight:725;letter-spacing:-.014em;line-height:1.3}.gh-card-link:hover .gh-card-title{opacity:.8}.gh-card-excerpt{display:-webkit-box;overflow-y:hidden;margin-top:8px;font-size:1.45rem;line-height:1.4;-webkit-line-clamp:2;-webkit-box-orient:vertical}.gh-card-meta{align-items:center;padding-bottom:1px;font-size:1.25rem;font-weight:500;line-height:1.4;letter-spacing:-.004em;color:var(--color-secondary-text)}.gh-card-meta svg{position:relative;top:1px;display:inline-block;width:12px;height:12px;margin-right:2px}.gh-card-meta:not(:empty){margin-top:8px}.gh-card-author+.gh-card-date:before{content:"—";margin-right:4px}.gh-header{position:relative;margin-top:40px}.gh-header-inner{position:relative;overflow:hidden}.gh-header.is-magazine .gh-header-inner{display:grid;grid-template-columns:repeat(16,1fr);gap:var(--grid-gap)}.gh-header.is-magazine .gh-header-inner>div{display:flex;flex-direction:column;gap:var(--grid-gap);grid-row:1}.gh-header.is-magazine .gh-header-left{grid-column:1/span 4}.gh-header.is-magazine .gh-header-inner>.gh-card{position:relative;grid-column:5/span 8}.gh-header.is-magazine .gh-header-right{grid-column:13/-1}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-link{gap:28px}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-image{aspect-ratio:1.618033}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-tag{display:block;margin-bottom:12px}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-title{font-size:clamp(2.8rem,1.36vw + 2.25rem,4rem);font-weight:700;line-height:1.1;letter-spacing:-.022em}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-excerpt{margin-top:clamp(12px,.45vw + 10.18px,16px);font-size:1.8rem;letter-spacing:-.02em;max-width:90%}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-meta:not(:empty){margin-top:14px}.gh-header.is-magazine :is(.gh-header-left,.gh-header-right) .gh-card:last-child .gh-card-image{display:none}.gh-header.is-magazine .gh-header-inner>div .gh-card-excerpt{display:none}.gh-header.is-magazine .gh-header-inner>.gh-card:after,.gh-header.is-magazine .gh-header-inner>.gh-card:before{position:absolute;top:0;left:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}.gh-header.is-magazine .gh-header-inner>.gh-card:after{right:calc(-.5 * var(--grid-gap));left:auto}.gh-header.is-magazine .gh-header-inner>div .gh-card+.gh-card:before{position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}@media (max-width:1199px){.gh-header.is-magazine .gh-header-inner{grid-template-columns:repeat(12,1fr)}.gh-header.is-magazine .gh-header-inner>.gh-card{grid-column:1/span 8}.gh-header.is-magazine .gh-header-left{grid-column:9/-1}.gh-header.is-magazine .gh-header-inner>div.gh-header-right{grid-column:1/-1;grid-row:2;flex-direction:row}.gh-header.is-magazine .gh-header-right .gh-card{flex:1}.gh-header.is-magazine .gh-header-right .gh-card:last-child .gh-card-image{display:block}.gh-header.is-magazine .gh-header-right{position:relative}.gh-header.is-magazine .gh-header-right:before{position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}.gh-header.is-magazine .gh-header-right .gh-card:before{display:none}.gh-header.is-magazine .gh-header-right .gh-card:after{position:absolute;top:0;right:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}}@media (max-width:991px){.gh-header.is-magazine .gh-header-left .gh-card:nth-child(2) .gh-card-image{display:none}}@media (max-width:767px){.gh-header.is-magazine .gh-header-inner{display:flex;flex-direction:column;gap:var(--grid-gap)}.gh-header.is-magazine .gh-header-inner>div.gh-header-right{flex-direction:column}.gh-header.is-magazine .gh-card-image{display:block!important}.gh-header.is-magazine .gh-card:before{display:block!important;position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}}.gh-header.is-highlight .gh-header-inner{display:grid;grid-template-columns:repeat(16,1fr);gap:var(--grid-gap)}.gh-header.is-highlight .gh-header-left{position:relative;grid-column:span 8}.gh-header.is-highlight .gh-header-left .gh-card{grid-column:span 8;grid-row:span 3}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-link{gap:28px}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-image{aspect-ratio:3/2}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-tag{display:block;margin-bottom:12px}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-title{font-size:clamp(2.8rem,1.36vw + 2.25rem,4rem);font-weight:700;line-height:1.1;letter-spacing:-.022em}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-excerpt{margin-top:clamp(12px,.45vw + 10.18px,16px);font-size:1.8rem}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-meta:not(:empty){margin-top:12px}.gh-header.is-highlight .gh-header-middle{position:relative;display:flex;flex-direction:column;gap:var(--grid-gap);grid-column:9/span 4}.gh-header.is-highlight .gh-header-middle .gh-card .gh-card-excerpt,.gh-header.is-highlight .gh-header-middle .gh-card:last-child .gh-card-image{display:none}.gh-header.is-highlight .gh-header-right{grid-column:13/-1}.gh-header.is-highlight .gh-featured{margin-top:0;padding:0}.gh-header.is-highlight .gh-featured-feed{display:flex;flex-direction:column}.gh-header.is-highlight .gh-featured-feed .gh-card-title{font-size:clamp(1.4rem,.23vw + 1.31rem,1.6rem)}.gh-header.is-highlight .gh-header-left:after,.gh-header.is-highlight .gh-header-middle:after{position:absolute;top:0;right:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}.gh-header.is-highlight .gh-card:before{position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}.gh-header.is-highlight .gh-featured .gh-card:first-child:before{display:none}@media (max-width:1199px){.gh-header.is-highlight .gh-header-inner{grid-template-columns:repeat(9,1fr)}.gh-header.is-highlight .gh-header-left{grid-column:span 6}.gh-header.is-highlight .gh-header-middle{grid-column:7/-1}.gh-header.is-highlight .gh-header-right{grid-column:1/-1}.gh-header.is-highlight .gh-featured-feed{display:grid;grid-template-columns:repeat(3,1fr)}.gh-header.is-highlight .gh-featured-feed .gh-card:before{width:calc(100% + var(--grid-gap))}.gh-header.is-highlight .gh-featured-feed .gh-card:after{position:absolute;top:0;left:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}}@media (max-width:991px){.gh-header.is-highlight .gh-header-middle .gh-card:nth-child(2) .gh-card-image{display:none}}@media (max-width:767px){.gh-header.is-highlight .gh-header-inner{display:flex;flex-direction:column}.gh-header.is-highlight .gh-featured-feed{display:flex}.gh-header.is-highlight .gh-card-image{display:block!important}.gh-header.is-highlight .gh-header-middle .gh-card .gh-card-excerpt{display:-webkit-box}}.gh-header.is-classic{display:flex;margin-top:0;padding-block:160px}.gh-header.is-classic .gh-header-inner{display:flex;flex-direction:column;align-items:center;gap:48px;overflow:unset;margin:auto;max-width:1020px;text-align:center}.gh-header.is-classic .gh-header-title{font-size:calc(clamp(3rem, 1.82vw + 2.27rem, 4.6rem) * var(--factor, 1));line-height:1.1;letter-spacing:-.028em}.gh-header.is-classic.has-image{margin-top:0}.gh-header.is-classic.has-image:before{position:absolute;inset:0;content:"";opacity:.3;background-color:var(--color-black);transition:opacity 1.5s ease}.gh-header.is-classic.has-image .gh-header-inner{color:#fff}.gh-header.is-classic.has-image .gh-header-image{position:absolute;inset:0;z-index:-1;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.gh-header.is-classic.has-image .gh-form{background-color:#fff}.gh-cta{display:none;margin-top:max(4vw,40px)}.gh-header:is(.is-highlight,.is-magazine)+.gh-cta{display:block}.gh-cta-inner{position:relative;overflow:hidden;display:flex;flex-direction:column;align-items:center;gap:36px;padding:clamp(48px,3.64vw + 33.45px,80px) clamp(40px,2.73vw + 29.09px,64px);text-align:center;background-color:var(--color-lighter-gray)}.gh-cta-content{max-width:640px}.gh-cta-title{font-size:clamp(2.8rem,1.36vw + 2.25rem,4rem);font-weight:700;line-height:1.1;letter-spacing:-.021em}.gh-cta-description{margin-top:12px;font-size:1.8rem;line-height:1.4;letter-spacing:-.015em}.gh-featured{margin-top:100px}.gh-navigation+.gh-featured{margin-top:64px}.gh-header.is-classic:not(.has-image)+.gh-featured{margin-top:0}.gh-featured-inner{overflow:hidden}.gh-featured-title{margin-bottom:20px;padding-bottom:12px;font-size:1.2rem;font-weight:550;letter-spacing:.025em;text-transform:uppercase;border-bottom:1px solid var(--color-border)}.gh-featured-feed{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--grid-gap)}.gh-featured-feed .gh-card{container-type:inline-size;container-name:featured-card}.gh-featured-feed .gh-card-link{display:flex;flex-direction:row-reverse;align-items:flex-start}.gh-featured-feed .gh-card-image{width:72px;aspect-ratio:1}@container featured-card (width < 240px){.gh-featured-feed .gh-card-image{display:none}}@container featured-card (240px <= width <= 270px){.gh-featured-feed .gh-card-image{width:64px}}.gh-featured-feed .gh-card-wrapper{container-type:inline-size;container-name:featured-card-wrapper}.gh-featured-feed .gh-card-title{font-size:1.6rem;font-weight:650;letter-spacing:-.011em}@container featured-card-wrapper (width < 170px){.gh-featured-feed .gh-card-title{font-size:1.6rem}}.gh-featured-feed .gh-card-excerpt{display:none}.gh-featured-feed .gh-card-meta:not(:empty){margin-top:8px}.gh-featured-feed .gh-card:before{position:absolute;top:0;left:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}@media (max-width:1199px){.gh-viewport>.gh-featured .gh-featured-feed{grid-template-columns:repeat(3,1fr)}.gh-viewport>.gh-featured .gh-featured-feed .gh-card:nth-child(4){display:none}}@media (max-width:767px){.gh-viewport>.gh-featured .gh-featured-feed{display:flex;flex-direction:column}}.gh-container{flex-grow:1;margin-top:64px}.gh-container-inner{display:grid;grid-template-columns:repeat(16,1fr);-moz-column-gap:var(--grid-gap);column-gap:var(--grid-gap)}:is(.gh-featured,.gh-cta)+.gh-container{margin-top:max(4vw,40px)}.gh-header.is-classic:not(.has-image)+.gh-container{margin-top:0}.gh-navigation+.gh-container .gh-container-title,:is(.paged,.tag-template,.author-template) .gh-container:not(.has-sidebar) .gh-container-title{display:none}.gh-more{display:none;grid-column:1/-1;margin-top:48px;font-size:calc(1.9rem * var(--factor, 1));font-weight:725;letter-spacing:-.014em}.gh-container.has-sidebar .gh-more{grid-column:span 12}.home-template .gh-feed:has(>:nth-child(12):last-child)~.gh-more{display:block}.gh-more a{display:flex;align-items:center;gap:4px}.gh-more svg{margin-top:-1px;width:18px;height:18px}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-more svg{margin-top:0}.gh-container.has-sidebar .gh-main{grid-column:1/span 12;position:relative}.gh-container.has-sidebar .gh-sidebar{grid-column:13/-1}.gh-container.has-sidebar .gh-main:after{position:absolute;top:0;right:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}.gh-container:not(.has-sidebar) :is(.gh-container-title,.gh-main,.gh-more){grid-column:3/span 12}.gh-container.is-list.no-image:not(.has-sidebar) :is(.gh-container-title,.gh-main,.gh-more){grid-column:4/span 10}.gh-header:is(.is-highlight,.is-magazine)~.gh-container.is-grid:not(.has-sidebar) :is(.gh-container-title,.gh-main,.gh-more){grid-column:1/-1}@media (max-width:1199px){.gh-container-inner{display:block;overflow:hidden}.gh-container.has-sidebar .gh-sidebar{display:none}}.gh-container-title{grid-column:1/-1;margin-bottom:calc(.5 * var(--grid-gap));padding-bottom:12px;font-size:1.2rem;font-weight:550;letter-spacing:.025em;text-transform:uppercase;border-bottom:1px solid var(--color-border)}.gh-container:not(:has(.gh-card)) .gh-container-title{display:none}.gh-container .gh-feed{gap:var(--grid-gap)}.gh-container .gh-card-meta:not(:empty){margin-top:12px}.gh-container.is-list .gh-feed{display:flex;flex-direction:column;container-type:inline-size;container-name:list-feed}.gh-container.is-list .gh-card-link{flex-direction:row;align-items:center;gap:24px}.gh-container.is-list .no-image .gh-card-link{padding-block:20px}.gh-container.is-list .gh-card-image{flex-shrink:0;width:220px;aspect-ratio:1.618033}@container list-feed (width < 600px){.gh-container.is-list .gh-card-image{width:160px}}.gh-container.is-list .gh-card:not(.no-image) .gh-card-wrapper{max-width:600px}.gh-container.is-list .gh-card-title{--factor:1.05}.gh-container.is-list .no-image .gh-card-title{--factor:1.2}.gh-container.is-list .gh-card-excerpt{margin-top:6px}.gh-container.is-list .gh-card+.gh-card:before{position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}.home-template .gh-container.is-list .gh-card:first-child:before{display:none}@media (max-width:767px){.gh-container.is-list .gh-card-link{flex-direction:column;align-items:flex-start}.gh-container.is-list .gh-card-image{width:100%}}.gh-container.is-grid .gh-feed{display:grid;grid-template-columns:repeat(auto-fit,minmax(248px,1fr));row-gap:calc(1.5 * var(--grid-gap));overflow:hidden}.gh-container.is-grid .gh-card:before{top:calc(-.5 * var(--grid-gap));right:calc(-.5 * var(--grid-gap));height:1px}.gh-container.is-grid .gh-card:after,.gh-container.is-grid .gh-card:before{position:absolute;left:calc(-.5 * var(--grid-gap));content:"";background-color:var(--color-border)}.gh-container.is-grid .gh-card:after{top:0;width:1px;height:100%}@media (max-width:767px){.gh-container.is-grid .gh-feed{grid-template-columns:repeat(2,1fr)}}@media (max-width:576px){.gh-container.is-grid .gh-feed{display:flex;flex-direction:column}}.gh-container.is-list.no-image .gh-card-image{display:none}.gh-sidebar-inner{position:sticky;top:calc(.5 * var(--grid-gap))}.gh-sidebar-title{grid-column:1/-1;margin-bottom:calc(.5 * var(--grid-gap));padding-bottom:12px;font-size:1.2rem;font-weight:550;letter-spacing:.025em;text-transform:uppercase;border-bottom:1px solid var(--color-border)}.gh-about{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:48px 24px;min-height:380px;text-align:center;background-color:var(--color-lighter-gray)}.gh-about-icon{margin-bottom:24px;width:60px;height:60px;border-radius:50%}.gh-about-title{font-size:calc(2.4rem * var(--factor, 1));font-weight:700;letter-spacing:-.019em}.gh-about-description{margin-top:12px;font-size:1.45rem;line-height:1.4}.gh-about .gh-button{margin-top:32px}.gh-recommendations{margin-top:48px}.gh-recommendations .recommendations{display:flex;flex-direction:column;gap:26px;margin:0;padding:0;list-style-type:none}.gh-recommendations .recommendation:first-child{margin-top:4px}.gh-recommendations .recommendation a{display:grid;grid-template-columns:24px auto;gap:4px 12px}.gh-recommendations .recommendation a:hover{opacity:1}.gh-recommendations .recommendation-favicon{grid-row:span 2;width:100%;border-radius:4px}.gh-recommendations .recommendation-title{margin-top:-2px;font-size:1.5rem;font-weight:650;letter-spacing:-.009em}.gh-recommendations .recommendation a:hover .recommendation-title{opacity:.8}.gh-recommendations .recommendation-url{order:1;overflow:hidden;font-size:1.4rem;line-height:1.25;color:var(--color-secondary-text);text-overflow:ellipsis}.gh-recommendations .recommendation-description{display:-webkit-box;display:none;overflow-y:hidden;grid-column:2;font-size:1.4rem;line-height:1.4;color:var(--color-secondary-text);-webkit-line-clamp:2;-webkit-box-orient:vertical}.gh-recommendations button{display:inline-flex;align-items:center;gap:2px;margin-top:24px;padding:0;cursor:pointer;font-size:1.2rem;font-weight:550;letter-spacing:.025em;text-transform:uppercase;background-color:transparent;border:0;color:var(--color-darker-gray)}.gh-recommendations button svg{margin-top:-1px;width:12px}.gh-recommendations button:hover{opacity:.8}.gh-article{--container-width:1120px;word-break:break-word}.gh-article-header{margin:clamp(40px,3.64vw + 25.45px,72px) 0 40px}.gh-article-tag{margin-bottom:12px;font-size:1.3rem;font-weight:500;letter-spacing:.01em;text-transform:uppercase;color:var(--ghost-accent-color)}.gh-article-title{font-size:calc(clamp(3.4rem, 1.36vw + 2.85rem, 4.6rem) * var(--factor, 1));line-height:1.1;letter-spacing:-.022em}.gh-article-excerpt{margin-top:clamp(12px,.45vw + 10.18px,16px);max-width:720px;font-size:clamp(1.7rem,.23vw + 1.61rem,1.9rem);line-height:1.45;letter-spacing:-.018em}.gh-article-meta{display:flex;align-items:center;gap:8px;margin-left:6px}.gh-article-author-image{display:flex;margin-right:8px}.gh-article-author-image a{position:relative;margin:0 -8px;width:56px;height:56px;overflow:hidden;background-color:var(--color-light-gray);border-radius:50%;border:3px solid var(--background-color)}.gh-article-author-image a:first-child{z-index:10}.gh-article-author-image a:nth-child(2){z-index:9}.gh-article-author-image a:nth-child(3){z-index:8}.gh-article-author-image :is(img,svg){position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.gh-article-meta-wrapper{display:flex;flex-direction:column;gap:4px}.gh-article-author-name{font-size:1.6rem;font-weight:650;letter-spacing:-.013em}.gh-article-meta-content{font-size:1.35rem;font-weight:500;line-height:1.2;letter-spacing:-.006em;color:var(--color-secondary-text)}.gh-article-image{grid-column:wide;margin-top:40px}.gh-article-image img{width:100%}.page-template .gh-article-header{margin-block:72px 32px}.page-template .gh-content:only-child>:first-child:not(.kg-width-full){margin-top:64px}.page-template .gh-content>:last-child:not(.kg-width-full){margin-bottom:6vw}.page-template .gh-footer{margin-top:0}.gh-content{font-size:var(--content-font-size,1.7rem);letter-spacing:-.01em}.gh-content>*+*{margin-top:calc(28px * var(--content-spacing-factor, 1));margin-bottom:0}.gh-content>.kg-width-full+.kg-width-full:not(.kg-width-full.kg-card-hascaption+.kg-width-full){margin-top:0}.gh-content>[id]:not(:first-child){margin-top:calc(56px * var(--content-spacing-factor, 1))}.post-template .gh-content.drop-cap>p:first-of-type:first-letter{font-size:3.1em;float:left;line-height:1;margin:0 .2em 0 -1px;font-weight:700}.has-serif-body.post-template:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content.drop-cap>p:first-of-type:first-letter{font-size:3.2em}.gh-content>[id]+p{margin-top:calc(12px * var(--content-spacing-factor, 1))}.gh-content>:is(hr,blockquote,iframe){position:relative;margin-top:calc(48px * var(--content-spacing-factor, 1))!important}.gh-content>:is(hr,blockquote,iframe)+*{margin-top:calc(48px * var(--content-spacing-factor, 1))!important}.gh-content h1{font-size:calc(2.2em * var(--factor, 1));letter-spacing:-.02em}.gh-content h2{font-size:calc(1.6em * var(--factor, 1));letter-spacing:-.02em}.gh-content h3{font-size:calc(1.3em * var(--factor, 1));letter-spacing:-.017em}.gh-content a{color:var(--ghost-accent-color);text-decoration:underline}.gh-content .kg-callout-card .kg-callout-text,.gh-content .kg-toggle-card .kg-toggle-content>:is(ul,ol,p){font-size:.95em}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content .kg-callout-text,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content .kg-toggle-content>ol,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content .kg-toggle-content>p,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content .kg-toggle-content>ul,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>blockquote,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>dl,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>ol,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>p,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>ul{font-family:var(--font-serif-alt)}.gh-content :is(ul,ol){padding-left:28px}.gh-content :is(li+li,li :is(ul,ol)){margin-top:8px}.gh-content ol ol li{list-style-type:lower-alpha}.gh-content ol ol ol li{list-style-type:lower-roman}.gh-content hr{width:100%;height:1px;background-color:var(--color-border);border:0}.gh-content .gh-table{overflow-x:scroll;-webkit-overflow-scrolling:touch}.gh-content .gh-table table{width:100%;font-family:var(--font-sans);font-size:1.5rem;white-space:nowrap;vertical-align:top;border-spacing:0;border-collapse:collapse}.gh-content .gh-table table th{font-size:1.2rem;font-weight:700;color:var(--color-darkgrey);text-align:left;text-transform:uppercase;letter-spacing:.2px}.gh-content .gh-table table :is(th,td),.gh-content .gh-table table td{padding:6px 12px;border-bottom:1px solid var(--color-border)}.gh-content .gh-table table :is(th,td):first-child{padding-left:0}.gh-content .gh-table table :is(th,td):last-child{padding-right:0}.gh-content pre{overflow:auto;padding:16px;font-size:1.5rem;line-height:1.5em;border-radius:6px}.gh-content :not(pre)>code,.gh-content pre{background:var(--color-lighter-gray);font-family:var(--font-mono)}.gh-content :not(pre)>code{vertical-align:baseline;padding:.15em .4em;font-weight:400;font-size:.95em;line-height:1em;border-radius:.25em}.gh-content :not(.kg-card):not(table):not([id])+:is(.kg-card,table){margin-top:calc(48px * var(--content-spacing-factor, 1))}.gh-content :is(.kg-card,table)+:not(.kg-card):not(table):not([id]){margin-top:calc(48px * var(--content-spacing-factor, 1))}.gh-content .kg-card.kg-width-full+:not(.kg-card):not([id]),.gh-content :not(.kg-card):not([id])+.kg-card.kg-width-full{margin-top:calc(68px * var(--content-spacing-factor, 1))}.kg-image{margin-right:auto;margin-left:auto}.kg-embed-card{display:flex;flex-direction:column;align-items:center;width:100%}.gh-feature-image,.kg-gallery-image,.kg-image[width][height]{cursor:pointer}.kg-gallery-image a:hover,.kg-image-card a:hover{opacity:1!important}.kg-card.kg-toggle-card .kg-toggle-heading-text{font-size:2rem;font-weight:700}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-toggle-card .kg-toggle-heading-text{font-family:var(--font-serif)}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-toggle-card .kg-toggle-heading-text{font-family:var(--font-mono)}.kg-callout-card.kg-card{border-radius:.25em}.kg-callout-card-accent a{text-decoration:underline}blockquote:not([class]){padding-left:2rem;border-left:4px solid var(--ghost-accent-color)}blockquote.kg-blockquote-alt{font-style:normal;font-weight:400;color:var(--color-secondary-text)}.kg-card.kg-button-card .kg-btn{height:unset;padding:.6em 1.2em;text-align:center;font-size:1em;line-height:1.2em}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-card.kg-header-card h2.kg-header-card-header{font-family:var(--font-serif)}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-card.kg-header-card h2.kg-header-card-header{font-family:var(--font-mono)}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .kg-header-card h3.kg-header-card-subheader{font-family:var(--font-serif)}.kg-bookmark-card .kg-bookmark-container{border-radius:.25em!important}.kg-bookmark-card .kg-bookmark-container:hover{opacity:1}.kg-bookmark-card a.kg-bookmark-container,.kg-bookmark-card a.kg-bookmark-container:hover{background:var(--background-color)!important;color:var(--color-darker-gray)!important}.kg-bookmark-card .kg-bookmark-content{padding:1.15em}.kg-bookmark-card .kg-bookmark-title{font-size:.9em}.kg-bookmark-card .kg-bookmark-description{max-height:none;margin-top:.3em;font-size:.8em}.kg-bookmark-card .kg-bookmark-metadata{font-size:.8em}.kg-bookmark-card .kg-bookmark-thumbnail img{border-radius:0 .2em .2em 0}.kg-product-card.kg-card .kg-product-card-image{margin-bottom:12px}.kg-product-card.kg-card a.kg-product-card-button{height:2.8em;margin-top:12px}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-product-card.kg-card .kg-product-card-title{font-family:var(--font-serif)}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-product-card.kg-card .kg-product-card-title{font-family:var(--font-mono)}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .kg-product-card-description :is(p,ul,ol){font-family:var(--font-serif-alt)}.kg-file-card.kg-card .kg-file-card-container{padding:.6em}.kg-file-card.kg-card .kg-file-card-contents{margin:4px 8px 6px}.kg-file-card.kg-card .kg-file-card-metadata{font-size:.9em}.kg-file-card.kg-card .kg-file-card-filesize:before{margin-right:6px;margin-left:6px}figcaption{margin-top:12px;font-size:1.4rem;text-align:center}.kg-card.kg-width-full figcaption{padding:0 16px}figcaption a{color:var(--ghost-accent-color);text-decoration:underline}.gh-comments{margin-top:48px}.post-template .gh-container{margin-top:120px}.post-template .gh-container-inner{display:block}.post-template .gh-container.is-grid .gh-feed{grid-template-columns:repeat(4,1fr)}.post-template .gh-container .gh-container-title{display:block}.gh-archive{display:grid;grid-template-columns:repeat(16,1fr);gap:var(--grid-gap);margin-block:80px 24px}.gh-archive.has-image{margin-top:48px}.gh-archive-inner{display:grid;grid-template-columns:1fr 1fr;gap:var(--grid-gap);grid-column:1/-1;padding-bottom:clamp(40px,2.73vw + 29.09px,64px);border-bottom:1px solid var(--color-border)}.gh-archive.has-image .gh-archive-inner{align-items:center;grid-column:1/-1}.gh-archive:not(.has-sidebar):not(.has-image) .gh-archive-inner{grid-column:3/span 12}.gh-archive .gh-article-image{grid-column:auto;margin-top:0}:is(.tag-template,.author-template) .gh-container{margin-top:0}.author-template .gh-archive-inner{display:flex;flex-direction:row-reverse;justify-content:flex-end;gap:24px}.author-template .gh-article-image{margin-top:0;width:120px;height:120px;border-radius:50%;-o-object-fit:cover;object-fit:cover}.author-template .gh-article-title{font-size:3.6rem}.gh-author-meta{display:flex;gap:10px;margin-top:14px;font-size:1.5rem;font-weight:550;color:var(--color-secondary-text)}.gh-author-meta a{color:inherit}.gh-author-social{display:flex;gap:16px;align-items:center;padding-left:3px}.gh-author-social svg{width:20px;height:20px}@media (max-width:1199px){.gh-archive{display:block}}@media (max-width:767px){.gh-archive-inner{display:flex;align-items:flex-start}.author-template .gh-archive-inner,.gh-archive-inner{flex-direction:column-reverse}}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]){--factor:1.15}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]){--factor:1.1}.has-sans-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) :is(.is-title,.gh-content :is(h2,h3)){font-family:var(--gh-font-heading,var(--font-sans))}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) :is(.is-title,.gh-content :is(h2,h3)){font-family:var(--gh-font-heading,var(--font-serif));font-weight:550}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) :is(.is-title,.gh-content :is(h2,h3)){font-family:var(--gh-font-heading,var(--font-mono))}.has-sans-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .is-body{font-family:var(--gh-font-body,var(--font-sans))}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .is-body{font-family:var(--gh-font-body,var(--font-serif-alt))}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-classic .gh-header-title{font-weight:550;letter-spacing:-.015em}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-classic .gh-header-title{letter-spacing:-.01em}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-form{border-radius:0}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-card-title{line-height:1.15;letter-spacing:-.006em;font-size:calc(2rem * var(--factor, 1))}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-featured-feed .gh-card-title{font-size:calc(1.6rem * var(--factor, 1))}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-featured-feed .gh-card-title{font-size:calc(1.5rem * var(--factor, 1));letter-spacing:0}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-highlight .gh-featured-feed .gh-card-title{font-size:clamp(1.6rem,.23vw + 1.51rem,1.8rem)}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-card-title{font-size:calc(1.8rem * var(--factor, 1));line-height:1.2}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-about-title{letter-spacing:-.009em}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-article-title,.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-footer-signup-header{letter-spacing:-.019em}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]){--content-font-size:1.9rem}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-card-excerpt{font-size:1.65rem;line-height:1.4;letter-spacing:.0005em}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-header.is-highlight .gh-card:first-child .gh-card-excerpt,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-excerpt{font-size:1.8rem;letter-spacing:-.001em}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-highlight .gh-header-left .gh-card-title,.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-title{font-weight:550;font-size:clamp(3.2rem,1.82vw + 2.47rem,4.9rem)}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-about-description{font-size:1.6rem}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-article-excerpt,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-footer-signup-subhead{letter-spacing:0}:is(.has-serif-title,.has-mono-title):not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) :is(.gh-button,.gh-form,.gh-form-input),body[class*=" gh-font-heading"]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) :is(.gh-button,.gh-form,.gh-form-input),body[class^=gh-font-heading]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) :is(.gh-button,.gh-form,.gh-form-input){border-radius:0}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-cta-title{font-size:4.8rem}.gh-footer{margin-top:120px;font-size:1.5rem;color:var(--color-darker-gray)}.gh-footer a:not(.gh-button){color:inherit}.gh-footer.has-accent-color{background-color:var(--ghost-accent-color)}.gh-footer.has-accent-color .gh-footer-bar{border-top:0}.gh-footer.has-accent-color .gh-button{background-color:#fff;color:#15171a}.gh-footer-bar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;-moz-column-gap:32px;column-gap:32px;margin-bottom:120px;padding-block:28px;font-weight:550;border-block:1px solid var(--color-border)}.gh-footer-logo{position:relative;font-family:var(--gh-font-heading,var(--font-sans));font-size:calc(2.4rem * var(--factor, 1));font-weight:725;letter-spacing:-.015em;white-space:nowrap}.gh-footer-logo img{max-height:40px}.gh-footer-menu .nav{display:flex;justify-content:center;gap:8px 28px;flex-wrap:wrap;margin:0;padding:0;list-style-type:none}.gh-footer-copyright{text-align:right;white-space:nowrap}.gh-footer-copyright a{text-decoration:underline}.gh-footer-signup{display:flex;flex-direction:column;align-items:center;margin-bottom:120px;text-align:center}.gh-footer-signup-header{font-size:calc(clamp(2.8rem, 1.36vw + 2.25rem, 4rem) * var(--factor, 1));font-weight:700;letter-spacing:-.03em}.gh-footer-signup-subhead{margin-top:12px;max-width:640px;font-size:1.8rem;font-weight:450;line-height:1.4;letter-spacing:-.014em;opacity:.75}.gh-footer-signup .gh-form{margin-top:40px}@media (max-width:991px){.gh-footer-bar{display:flex;flex-direction:column;gap:20px}}.gh-social-links{display:flex;justify-content:center;gap:20px;margin-bottom:32px}.gh-social-links a{will-change:opacity}.gh-social-links svg{width:20px;height:20px}.pswp{position:absolute;top:0;left:0;z-index:3999999;display:none;width:100%;height:100%;overflow:hidden;touch-action:none;outline:none;backface-visibility:hidden;-webkit-text-size-adjust:100%}.pswp img{max-width:none}.pswp--animate_opacity{opacity:.001;transition:opacity 333ms cubic-bezier(.4,0,.22,1);will-change:opacity}.pswp--open{display:block}.pswp--zoom-allowed .pswp__img{cursor:zoom-in}.pswp--zoomed-in .pswp__img{cursor:grab}.pswp--dragging .pswp__img{cursor:grabbing}.pswp__bg{background-color:rgba(0,0,0,.85);opacity:0;transition:opacity 333ms cubic-bezier(.4,0,.22,1);transform:translateZ(0);backface-visibility:hidden;will-change:opacity}.pswp__bg,.pswp__scroll-wrap{position:absolute;top:0;left:0;width:100%;height:100%}.pswp__scroll-wrap{overflow:hidden}.pswp__container,.pswp__zoom-wrap{position:absolute;top:0;right:0;bottom:0;left:0;touch-action:none;backface-visibility:hidden}.pswp__container,.pswp__img{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.pswp__zoom-wrap{position:absolute;width:100%;transition:transform 333ms cubic-bezier(.4,0,.22,1);transform-origin:left top}.pswp--animated-in .pswp__bg,.pswp--animated-in .pswp__zoom-wrap{transition:none}.pswp__item{right:0;bottom:0;overflow:hidden}.pswp__img,.pswp__item{position:absolute;top:0;left:0}.pswp__img{width:auto;height:auto}.pswp__img--placeholder{backface-visibility:hidden}.pswp__img--placeholder--blank{background:var(--color-black)}.pswp--ie .pswp__img{top:0;left:0;width:100%!important;height:auto!important}.pswp__error-msg{position:absolute;top:50%;left:0;width:100%;margin-top:-8px;font-size:14px;line-height:16px;color:var(--color-secondary-text);text-align:center}.pswp__error-msg a{color:var(--color-secondary-text);text-decoration:underline}.pswp__button{position:relative;display:block;float:right;width:44px;height:44px;padding:0;margin:0;overflow:visible;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;background:none;border:0;box-shadow:none;transition:opacity .2s}.pswp__button:focus,.pswp__button:hover{opacity:1}.pswp__button:active{outline:none;opacity:.9}.pswp__button::-moz-focus-inner{padding:0;border:0}.pswp__ui--over-close .pswp__button--close{opacity:1}.pswp__button,.pswp__button--arrow--left:before,.pswp__button--arrow--right:before{width:44px;height:44px;background:url(../images/default-skin.png) 0 0 no-repeat;background-size:264px 88px}@media (min-resolution:1.1dppx),(min-resolution:105dpi){.pswp--svg .pswp__button,.pswp--svg .pswp__button--arrow--left:before,.pswp--svg .pswp__button--arrow--right:before{background-image:url(../images/default-skin.svg)}.pswp--svg .pswp__button--arrow--left,.pswp--svg .pswp__button--arrow--right{background:none}}.pswp__button--close{background-position:0 -44px}.pswp__button--share{background-position:-44px -44px}.pswp__button--fs{display:none}.pswp--supports-fs .pswp__button--fs{display:block}.pswp--fs .pswp__button--fs{background-position:-44px 0}.pswp__button--zoom{display:none;background-position:-88px 0}.pswp--zoom-allowed .pswp__button--zoom{display:block}.pswp--zoomed-in .pswp__button--zoom{background-position:-132px 0}.pswp--touch .pswp__button--arrow--left,.pswp--touch .pswp__button--arrow--right{visibility:hidden}.pswp__button--arrow--left,.pswp__button--arrow--right{position:absolute;top:50%;width:70px;height:100px;margin-top:-50px;background:none}.pswp__button--arrow--left{left:0}.pswp__button--arrow--right{right:0}.pswp__button--arrow--left:before,.pswp__button--arrow--right:before{position:absolute;top:35px;width:32px;height:30px;content:""}.pswp__button--arrow--left:before{left:6px;background-position:-138px -44px}.pswp__button--arrow--right:before{right:6px;background-position:-94px -44px}.pswp__counter{position:absolute;top:0;left:0;height:44px;padding:0 15px;font-size:11px;font-weight:700;line-height:44px;color:var(--color-white);-webkit-user-select:none;-moz-user-select:none;user-select:none}.pswp__caption{position:absolute;bottom:0;left:0;width:100%;min-height:44px}.pswp__caption__center{max-width:420px;padding:25px 15px 30px;margin:0 auto;font-size:11px;line-height:1.6;color:var(--color-white);text-align:center}.pswp__caption__center .post-caption-title{margin-bottom:7px;font-size:15px;font-weight:500;text-transform:uppercase}.pswp__caption__center .post-caption-meta-item+.post-caption-meta-item:before{padding:0 4px;content:"\02022"}.pswp__caption--empty{display:none}.pswp__caption--fake{visibility:hidden}.pswp__preloader{position:absolute;top:0;left:50%;width:44px;height:44px;margin-left:-22px;opacity:0;transition:opacity .25s ease-out;direction:ltr;will-change:opacity}.pswp__preloader__icn{width:20px;height:20px;margin:12px}.pswp__preloader--active{opacity:1}.pswp__preloader--active .pswp__preloader__icn{background:url(../images/preloader.gif) 0 0 no-repeat}.pswp--css_animation .pswp__preloader--active{opacity:1}.pswp--css_animation .pswp__preloader--active .pswp__preloader__icn{animation:clockwise .5s linear infinite}.pswp--css_animation .pswp__preloader--active .pswp__preloader__donut{animation:donut-rotate 1s cubic-bezier(.4,0,.22,1) infinite}.pswp--css_animation .pswp__preloader__icn{position:absolute;top:15px;left:15px;width:14px;height:14px;margin:0;background:none;opacity:.75}.pswp--css_animation .pswp__preloader__cut{position:relative;width:7px;height:14px;overflow:hidden}.pswp--css_animation .pswp__preloader__donut{position:absolute;top:0;left:0;box-sizing:border-box;width:14px;height:14px;margin:0;background:none;border:2px solid var(--color-white);border-bottom-color:transparent;border-left-color:transparent;border-radius:50%}@media screen and (max-width:1024px){.pswp__preloader{position:relative;top:auto;left:auto;float:right;margin:0}}@keyframes clockwise{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes donut-rotate{0%{transform:rotate(0)}50%{transform:rotate(-140deg)}to{transform:rotate(0)}}.pswp__ui{z-index:1550;visibility:visible;opacity:1;-webkit-font-smoothing:auto}.pswp__top-bar{position:absolute;top:0;left:0;width:100%;height:44px}.pswp--has_mouse .pswp__button--arrow--left,.pswp--has_mouse .pswp__button--arrow--right,.pswp__caption,.pswp__top-bar{backface-visibility:hidden;transition:opacity 333ms cubic-bezier(.4,0,.22,1);will-change:opacity}.pswp--has_mouse .pswp__button--arrow--left,.pswp--has_mouse .pswp__button--arrow--right{visibility:visible}.pswp__ui--idle .pswp__button--arrow--left,.pswp__ui--idle .pswp__button--arrow--right,.pswp__ui--idle .pswp__top-bar{opacity:0}.pswp__ui--hidden .pswp__button--arrow--left,.pswp__ui--hidden .pswp__button--arrow--right,.pswp__ui--hidden .pswp__caption,.pswp__ui--hidden .pswp__top-bar{opacity:.001}.pswp__ui--one-slide .pswp__button--arrow--left,.pswp__ui--one-slide .pswp__button--arrow--right,.pswp__ui--one-slide .pswp__counter{display:none}.pswp__element--disabled{display:none!important}.pswp--minimal--dark .pswp__top-bar{background:none}.gh-meta-share{display:flex;align-items:center;justify-content:space-between;margin-top:20px}.has-light-text .gh-button-share{border-color:hsla(0,0%,100%,.25);color:hsla(0,0%,100%,.85)}.has-light-text .gh-button-share:hover{border-color:hsla(0,0%,100%,.85)}.gh-button-share{display:inline-flex;align-items:center;border:1px solid rgba(0,0,0,.15);border-radius:999px;color:rgba(0,0,0,.85);background:transparent;cursor:pointer;transition:all .4s ease}.gh-button-share:hover{border-color:rgba(0,0,0,.5)}/*# sourceMappingURL=screen.css.map */
1
+ :root{--color-white:#fff;--color-lighter-gray:rgba(0,0,0,.05);--color-light-gray:#e6e6e6;--color-mid-gray:#ccc;--color-dark-gray:#444;--color-darker-gray:#15171a;--color-black:#000;--color-primary-text:var(--color-darker-gray);--color-secondary-text:rgba(0,0,0,.55);--color-border:rgba(0,0,0,.08);--color-dark-border:rgba(0,0,0,.55);--font-sans:Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-serif:"EB Garamond", Georgia, Times, serif;--font-serif-alt:Georgia, Times, serif;--font-mono:"JetBrains Mono", Menlo, Consolas, Monaco, "Liberation Mono", "Lucida Console", monospace;--container-width:1320px;--container-gap:clamp(24px, 1.7032rem + 1.9355vw, 48px);--grid-gap:42px}:is(.gh-navigation,.gh-footer).has-accent-color,:root.has-light-text{--color-lighter-gray:hsla(0,0%,100%,.1);--color-darker-gray:#fff;--color-secondary-text:hsla(0,0%,100%,.64);--color-border:hsla(0,0%,100%,.15);--color-dark-border:hsla(0,0%,100%,.5)}*,:after,:before{box-sizing:border-box}*{margin:0}html{font-size:62.5%}body{line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}canvas,img,picture,svg,video{display:block;height:auto;max-width:100%}iframe{display:block}button,input,select,textarea{font:inherit}h1,h2,h3,h4,h5,h6,p{overflow-wrap:break-word}h1,h2,h3,h4,h5,h6{line-height:1.2}sub,sup{line-height:1}body{font-family:var(--gh-font-body,var(--font-sans));font-size:1.6rem;background-color:var(--background-color);color:var(--color-primary-text)}h1,h2,h3,h4,h5,h6{font-family:var(--gh-font-heading,var(--font-sans))}a{color:var(--color-darker-gray);text-decoration:none}a:hover{opacity:.8}.gh-button{display:inline-flex;gap:.4em;align-items:center;justify-content:center;padding:.8em 1.4em;font-size:1.5rem;font-weight:600;letter-spacing:-.004em;line-height:1;color:var(--color-white);cursor:pointer;background-color:var(--ghost-accent-color);border:0;border-radius:100px}.gh-button:hover{opacity:.95}.gh-icon-button{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;color:var(--color-darker-gray);cursor:pointer;background-color:transparent;border:0;outline:none}.gh-icon-button:hover :is(svg,span){opacity:.8}.gh-icon-button svg{width:20px;height:20px}.gh-form{display:flex;align-items:center;position:relative;max-width:560px;width:100%;height:56px;font-size:1.7rem;font-weight:450;letter-spacing:-.008em;border-radius:40px;background-color:var(--color-lighter-gray);transition:background-color .2s ease}.gh-form.success{pointer-events:none}.gh-form.error{box-shadow:0 0 0 1px red}.gh-form:hover{background-color:rgba(0,0,0,.065)}.gh-footer.has-accent-color .gh-form:hover,.has-light-text .gh-form:hover{background-color:hsla(0,0%,100%,.15)}.gh-form-input{position:absolute;inset:0;padding-inline:26px;width:100%;height:100%;font-size:inherit;letter-spacing:inherit;line-height:1.1;border:0;border-radius:40px;background-color:transparent;outline:none;transition:.3s ease-in-out}.gh-form-input::-moz-placeholder{color:rgba(0,0,0,.3)}.gh-form-input::placeholder,button.gh-form-input{color:rgba(0,0,0,.3)}:is(.has-serif-title,.has-mono-title):not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-form-input,body[class*=" gh-font-heading"]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) .gh-form-input,body[class^=gh-font-heading]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) .gh-form-input{padding-inline:20px}.gh-form.gh-form.success .gh-form-input{opacity:.5}.gh-footer.has-accent-color .gh-form-input,.has-light-text .gh-form-input{color:#fff}.gh-footer.has-accent-color .gh-form-input::-moz-placeholder,.has-light-text .gh-form-input::-moz-placeholder{color:hsla(0,0%,100%,.55)}.gh-footer.has-accent-color .gh-form-input::placeholder,.has-light-text .gh-form-input::placeholder,.has-light-text button.gh-form-input{color:hsla(0,0%,100%,.55)}.gh-header.is-classic.has-image .gh-form-input{color:#15171a}.gh-header.is-classic.has-image .gh-form-input::-moz-placeholder{color:rgba(0,0,0,.5)}.gh-header.is-classic.has-image .gh-form-input::placeholder,.gh-header.is-classic.has-image .gh-form>svg,.gh-header.is-classic.has-image button.gh-form-input{color:rgba(0,0,0,.5)}button.gh-form-input{padding-inline-start:56px;text-align:left;color:var(--color-secondary-text);cursor:pointer}:is(.has-serif-title,.has-mono-title):not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) button.gh-form-input,body[class*=" gh-font-heading"]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) button.gh-form-input,body[class^=gh-font-heading]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) button.gh-form-input{padding-inline-start:50px}.gh-form .gh-button{position:absolute;right:6px;min-width:132px;padding-inline:24px;height:44px;font-size:inherit}.gh-form>svg{position:relative;left:22px;width:20px;height:20px;color:var(--color-secondary-text)}:is(.has-serif-title,.has-mono-title):not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-form>svg{left:16px}.gh-form .gh-button svg{display:none;position:absolute;margin-top:1px}.gh-form .gh-button>span:last-child{display:none}.gh-form:is(.loading,.success) .gh-button>span:first-child{visibility:hidden}.gh-form.loading .gh-button svg:first-of-type{display:block}.gh-form.success .gh-button>span:first-child{display:none}.gh-form.success .gh-button>span:last-child{display:inline}.gh-form [data-members-error]{position:absolute;top:100%;margin-top:10px;width:100%;font-size:1.4rem;line-height:1.4}@media (max-width:576px){.gh-form{font-size:1.6rem}.gh-form .gh-button{min-width:104px;padding-inline:12px}}.gh-viewport{position:relative;display:flex;flex-direction:column;min-height:100vh}.gh-outer{padding:0 max(4vmin,20px)}.gh-outer .gh-outer{padding:0}.gh-inner{margin:0 auto;max-width:var(--container-width);width:100%}.gh-main{flex-grow:1}.gh-canvas,.kg-width-full.kg-content-wide{--main:min(var(--content-width, 720px), 100% - 2 * var(--container-gap));--wide:minmax(0, calc(.5 * (var(--container-width, 1200px) - var(--content-width, 720px))));--full:minmax(var(--container-gap), 1fr);display:grid;grid-template-columns:[full-start] var(--full) [wide-start] var(--wide) [main-start] var(--main) [main-end] var(--wide) [wide-end] var(--full) [full-end]}.gh-canvas>*{grid-column:main}.kg-content-wide>div,.kg-width-wide{grid-column:wide}.kg-width-full{grid-column:full}.gh-navigation{height:100px;font-size:1.5rem;font-weight:550;background-color:var(--background-color);color:var(--color-darker-gray)}.gh-navigation :is(.gh-navigation-logo,a:not(.gh-button),.gh-icon-button){color:inherit}.gh-navigation-inner{display:grid;grid-auto-flow:row dense;-moz-column-gap:24px;column-gap:24px;align-items:center;height:100%}.gh-navigation-brand{line-height:1}.gh-navigation-logo{position:relative;font-family:var(--gh-font-heading,var(--font-sans));font-size:calc(2.4rem * var(--factor, 1));font-weight:725;letter-spacing:-.015em;white-space:nowrap}.gh-navigation-logo img{max-height:40px}.gh-navigation-menu{display:flex;gap:24px;align-items:center}.gh-navigation .nav{gap:28px;padding:0;margin:0;white-space:nowrap;list-style:none}.gh-navigation .nav,.nav a{display:inline-flex;align-items:center}.nav a{gap:.35em;vertical-align:middle}.nav-icon{display:block;width:1em;height:1em;flex:0 0 auto;-o-object-fit:contain;object-fit:contain}.gh-navigation .gh-more-toggle{position:relative;margin:0 -6px;font-size:inherit;text-transform:inherit}.gh-navigation .gh-more-toggle svg{width:24px;height:24px}.gh-navigation-actions{display:flex;gap:24px;align-items:center;justify-content:flex-end;background-color:var(--background-color)}.gh-navigation.has-accent-color .gh-navigation-actions{background-color:var(--ghost-accent-color)}.gh-navigation-members{display:flex;gap:20px;align-items:center;white-space:nowrap}.gh-navigation-members .gh-button{font-size:inherit;font-weight:600}.gh-search{margin-right:-2px;margin-left:-2px}@media (max-width:767px){.gh-navigation-logo{white-space:normal}.gh-navigation-members{flex-direction:column-reverse;gap:16px;width:100%}.gh-navigation-actions .gh-search{display:none}}@media (min-width:768px){.gh-navigation-brand .gh-search{display:none}.gh-navigation:not(.is-dropdown-loaded) .gh-navigation-menu .nav>li{opacity:0}}.gh-navigation.has-accent-color{background-color:var(--ghost-accent-color)}.gh-navigation.has-accent-color .gh-button{background-color:#fff;color:#15171a}.gh-navigation.is-left-logo .gh-navigation-inner{grid-template-columns:auto 1fr auto}@media (min-width:768px){.gh-navigation.is-left-logo .gh-navigation-logo:not(:has(img)){top:-2px}}@media (min-width:992px){.gh-navigation.is-left-logo .gh-navigation-menu{margin-right:100px;margin-left:16px}}.gh-navigation.is-middle-logo .gh-navigation-inner{grid-template-columns:1fr auto 1fr}.gh-navigation.is-middle-logo .gh-navigation-brand{grid-column-start:2}.gh-navigation.is-middle-logo .gh-navigation-actions{gap:28px}@media (min-width:992px){.gh-navigation.is-middle-logo .gh-navigation-menu{margin-right:64px}}.gh-navigation.is-stacked{position:relative;height:auto}.gh-navigation.is-stacked .gh-navigation-inner{grid-template-columns:1fr auto 1fr}.gh-navigation.is-stacked .gh-navigation-brand{display:flex;align-items:center;grid-row-start:1;grid-column-start:2;min-height:80px}@media (max-width:767px){.gh-navigation.is-stacked .gh-navigation-brand{min-height:unset}}@media (min-width:768px){.gh-navigation.is-stacked .gh-navigation-inner{padding:0}.gh-navigation.is-stacked .gh-navigation-brand{display:flex;align-items:center;height:80px}.gh-navigation.is-stacked .gh-navigation-menu{grid-row-start:2;grid-column:1/4;justify-content:center;height:60px;margin:0 48px}.gh-navigation.is-stacked .gh-navigation-menu:after,.gh-navigation.is-stacked .gh-navigation-menu:before{position:absolute;top:80px;left:0;width:100%;height:1px;content:"";background-color:var(--color-border)}.gh-navigation.is-stacked .gh-navigation-menu:after{top:140px}.gh-navigation.is-stacked .gh-navigation-actions{grid-row-start:1;grid-column:1/4;justify-content:space-between}.gh-navigation.is-stacked .gh-navigation-actions .gh-search{display:flex;gap:10px;width:auto}}.gh-dropdown{position:absolute;top:100%;right:-16px;z-index:90;width:200px;padding:12px 0;margin-top:24px;text-align:left;visibility:hidden;background-color:#fff;border-radius:5px;box-shadow:0 0 0 1px rgba(0,0,0,.04),0 7px 20px -5px rgba(0,0,0,.15);opacity:0;transition:opacity .3s,transform .2s;transform:translate3d(0,6px,0)}.gh-dropdown.is-left{right:auto;left:-16px}.is-dropdown-mega .gh-dropdown{display:grid;grid-template-columns:1fr 1fr;grid-auto-flow:column;-moz-column-gap:40px;column-gap:40px;width:auto;padding:20px 32px}.is-dropdown-open .gh-dropdown{visibility:visible;opacity:1;transform:translateY(0)}.gh-dropdown li a{display:block;padding:7px 20px;line-height:1.5;white-space:normal;color:#15171a!important}.is-dropdown-mega .gh-dropdown li a{padding:8px 0}.gh-burger{display:flex;justify-content:center;align-items:center;position:relative;display:none;margin-right:-7px;margin-left:4px}.gh-burger svg{width:24px;height:24px}.gh-burger svg:last-child,.is-open .gh-burger svg:first-child{display:none}.is-open .gh-burger svg:last-child{display:block}@media (max-width:767px){.gh-burger{display:flex}#gh-navigation{height:64px}#gh-navigation .gh-navigation-inner{grid-template-rows:auto 1fr auto;grid-template-columns:1fr;gap:48px}#gh-navigation .gh-navigation-brand{display:grid;grid-template-columns:1fr auto auto;grid-column-start:1;align-items:center;height:64px}#gh-navigation .gh-navigation-logo{font-size:2.2rem}#gh-navigation .gh-navigation-actions,#gh-navigation .gh-navigation-menu{position:fixed;justify-content:center;visibility:hidden;opacity:0}#gh-navigation .gh-navigation-menu{transition:none;transform:translateY(0)}#gh-navigation .nav{gap:20px;align-items:center;line-height:1.4}#gh-navigation .nav a{font-size:1.75rem;font-weight:600;text-transform:none}#gh-navigation .nav li{opacity:0;transform:translateY(-4px)}#gh-navigation .gh-navigation-actions{text-align:center}#gh-navigation :is(.gh-button,a[data-portal=signin]){opacity:0;transform:translateY(8px)}#gh-navigation .gh-button{width:100%;font-size:1.75rem;text-transform:none}#gh-navigation a[data-portal=signin]{font-size:1.75rem}#gh-main{transition:opacity .4s}.is-open#gh-navigation{position:fixed;inset:0;z-index:3999999;height:100%;overflow-y:scroll;-webkit-overflow-scrolling:touch}.is-open#gh-navigation .gh-navigation-actions,.is-open#gh-navigation .gh-navigation-menu{position:static;visibility:visible;opacity:1}.is-open#gh-navigation .nav{display:flex;flex-direction:column}.is-open#gh-navigation .nav li{opacity:1;transition:transform .2s,opacity .2s;transform:translateY(0)}.is-open#gh-navigation .gh-navigation-actions{position:sticky;right:0;bottom:0;left:0;display:inline-flex;flex-direction:column;gap:12px;align-items:center;padding:var(--container-gap) 0}.is-open#gh-navigation :is(.gh-button,a[data-portal=signin]){opacity:1;transition:transform .4s,opacity .4s;transition-delay:.2s;transform:translateY(0)}.is-open#gh-navigation a[data-portal=signin]{transition-delay:.4s}.is-open#gh-main{opacity:0}}.gh-card{position:relative}.gh-card-link{display:flex;flex-direction:column;gap:20px}.gh-card-link:hover{opacity:1}.gh-card-image{position:relative;flex-shrink:0;aspect-ratio:16/9}.gh-card-image img{position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.gh-card-wrapper{flex-grow:1}.gh-card-tag{display:none;margin-bottom:4px;font-size:1.2rem;font-weight:500;letter-spacing:.01em;text-transform:uppercase}.gh-card-title{font-size:calc(1.9rem * var(--factor, 1));font-weight:725;letter-spacing:-.014em;line-height:1.3}.gh-card-link:hover .gh-card-title{opacity:.8}.gh-card-excerpt{display:-webkit-box;overflow-y:hidden;margin-top:8px;font-size:1.45rem;line-height:1.4;-webkit-line-clamp:2;-webkit-box-orient:vertical}.gh-card-meta{align-items:center;padding-bottom:1px;font-size:1.25rem;font-weight:500;line-height:1.4;letter-spacing:-.004em;color:var(--color-secondary-text)}.gh-card-meta svg{position:relative;top:1px;display:inline-block;width:12px;height:12px;margin-right:2px}.gh-card-meta:not(:empty){margin-top:8px}.gh-card-author+.gh-card-date:before{content:"—";margin-right:4px}.gh-header{position:relative;margin-top:40px}.gh-header-inner{position:relative;overflow:hidden}.gh-header.is-magazine .gh-header-inner{display:grid;grid-template-columns:repeat(16,1fr);gap:var(--grid-gap)}.gh-header.is-magazine .gh-header-inner>div{display:flex;flex-direction:column;gap:var(--grid-gap);grid-row:1}.gh-header.is-magazine .gh-header-left{grid-column:1/span 4}.gh-header.is-magazine .gh-header-inner>.gh-card{position:relative;grid-column:5/span 8}.gh-header.is-magazine .gh-header-right{grid-column:13/-1}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-link{gap:28px}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-image{aspect-ratio:1.618033}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-tag{display:block;margin-bottom:12px}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-title{font-size:clamp(2.8rem,1.36vw + 2.25rem,4rem);font-weight:700;line-height:1.1;letter-spacing:-.022em}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-excerpt{margin-top:clamp(12px,.45vw + 10.18px,16px);font-size:1.8rem;letter-spacing:-.02em;max-width:90%}.gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-meta:not(:empty){margin-top:14px}.gh-header.is-magazine :is(.gh-header-left,.gh-header-right) .gh-card:last-child .gh-card-image{display:none}.gh-header.is-magazine .gh-header-inner>div .gh-card-excerpt{display:none}.gh-header.is-magazine .gh-header-inner>.gh-card:after,.gh-header.is-magazine .gh-header-inner>.gh-card:before{position:absolute;top:0;left:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}.gh-header.is-magazine .gh-header-inner>.gh-card:after{right:calc(-.5 * var(--grid-gap));left:auto}.gh-header.is-magazine .gh-header-inner>div .gh-card+.gh-card:before{position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}@media (max-width:1199px){.gh-header.is-magazine .gh-header-inner{grid-template-columns:repeat(12,1fr)}.gh-header.is-magazine .gh-header-inner>.gh-card{grid-column:1/span 8}.gh-header.is-magazine .gh-header-left{grid-column:9/-1}.gh-header.is-magazine .gh-header-inner>div.gh-header-right{grid-column:1/-1;grid-row:2;flex-direction:row}.gh-header.is-magazine .gh-header-right .gh-card{flex:1}.gh-header.is-magazine .gh-header-right .gh-card:last-child .gh-card-image{display:block}.gh-header.is-magazine .gh-header-right{position:relative}.gh-header.is-magazine .gh-header-right:before{position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}.gh-header.is-magazine .gh-header-right .gh-card:before{display:none}.gh-header.is-magazine .gh-header-right .gh-card:after{position:absolute;top:0;right:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}}@media (max-width:991px){.gh-header.is-magazine .gh-header-left .gh-card:nth-child(2) .gh-card-image{display:none}}@media (max-width:767px){.gh-header.is-magazine .gh-header-inner{display:flex;flex-direction:column;gap:var(--grid-gap)}.gh-header.is-magazine .gh-header-inner>div.gh-header-right{flex-direction:column}.gh-header.is-magazine .gh-card-image{display:block!important}.gh-header.is-magazine .gh-card:before{display:block!important;position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}}.gh-header.is-highlight .gh-header-inner{display:grid;grid-template-columns:repeat(16,1fr);gap:var(--grid-gap)}.gh-header.is-highlight .gh-header-left{position:relative;grid-column:span 8}.gh-header.is-highlight .gh-header-left .gh-card{grid-column:span 8;grid-row:span 3}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-link{gap:28px}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-image{aspect-ratio:3/2}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-tag{display:block;margin-bottom:12px}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-title{font-size:clamp(2.8rem,1.36vw + 2.25rem,4rem);font-weight:700;line-height:1.1;letter-spacing:-.022em}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-excerpt{margin-top:clamp(12px,.45vw + 10.18px,16px);font-size:1.8rem}.gh-header.is-highlight .gh-header-left .gh-card .gh-card-meta:not(:empty){margin-top:12px}.gh-header.is-highlight .gh-header-middle{position:relative;display:flex;flex-direction:column;gap:var(--grid-gap);grid-column:9/span 4}.gh-header.is-highlight .gh-header-middle .gh-card .gh-card-excerpt,.gh-header.is-highlight .gh-header-middle .gh-card:last-child .gh-card-image{display:none}.gh-header.is-highlight .gh-header-right{grid-column:13/-1}.gh-header.is-highlight .gh-featured{margin-top:0;padding:0}.gh-header.is-highlight .gh-featured-feed{display:flex;flex-direction:column}.gh-header.is-highlight .gh-featured-feed .gh-card-title{font-size:clamp(1.4rem,.23vw + 1.31rem,1.6rem)}.gh-header.is-highlight .gh-header-left:after,.gh-header.is-highlight .gh-header-middle:after{position:absolute;top:0;right:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}.gh-header.is-highlight .gh-card:before{position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}.gh-header.is-highlight .gh-featured .gh-card:first-child:before{display:none}@media (max-width:1199px){.gh-header.is-highlight .gh-header-inner{grid-template-columns:repeat(9,1fr)}.gh-header.is-highlight .gh-header-left{grid-column:span 6}.gh-header.is-highlight .gh-header-middle{grid-column:7/-1}.gh-header.is-highlight .gh-header-right{grid-column:1/-1}.gh-header.is-highlight .gh-featured-feed{display:grid;grid-template-columns:repeat(3,1fr)}.gh-header.is-highlight .gh-featured-feed .gh-card:before{width:calc(100% + var(--grid-gap))}.gh-header.is-highlight .gh-featured-feed .gh-card:after{position:absolute;top:0;left:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}}@media (max-width:991px){.gh-header.is-highlight .gh-header-middle .gh-card:nth-child(2) .gh-card-image{display:none}}@media (max-width:767px){.gh-header.is-highlight .gh-header-inner{display:flex;flex-direction:column}.gh-header.is-highlight .gh-featured-feed{display:flex}.gh-header.is-highlight .gh-card-image{display:block!important}.gh-header.is-highlight .gh-header-middle .gh-card .gh-card-excerpt{display:-webkit-box}}.gh-header.is-classic{display:flex;margin-top:0;padding-block:160px}.gh-header.is-classic .gh-header-inner{display:flex;flex-direction:column;align-items:center;gap:48px;overflow:unset;margin:auto;max-width:1020px;text-align:center}.gh-header.is-classic .gh-header-title{font-size:calc(clamp(3rem, 1.82vw + 2.27rem, 4.6rem) * var(--factor, 1));line-height:1.1;letter-spacing:-.028em}.gh-header.is-classic.has-image{margin-top:0}.gh-header.is-classic.has-image:before{position:absolute;inset:0;content:"";opacity:.3;background-color:var(--color-black);transition:opacity 1.5s ease}.gh-header.is-classic.has-image .gh-header-inner{color:#fff}.gh-header.is-classic.has-image .gh-header-image{position:absolute;inset:0;z-index:-1;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.gh-header.is-classic.has-image .gh-form{background-color:#fff}.gh-cta{display:none;margin-top:max(4vw,40px)}.gh-header:is(.is-highlight,.is-magazine)+.gh-cta{display:block}.gh-cta-inner{position:relative;overflow:hidden;display:flex;flex-direction:column;align-items:center;gap:36px;padding:clamp(48px,3.64vw + 33.45px,80px) clamp(40px,2.73vw + 29.09px,64px);text-align:center;background-color:var(--color-lighter-gray)}.gh-cta-content{max-width:640px}.gh-cta-title{font-size:clamp(2.8rem,1.36vw + 2.25rem,4rem);font-weight:700;line-height:1.1;letter-spacing:-.021em}.gh-cta-description{margin-top:12px;font-size:1.8rem;line-height:1.4;letter-spacing:-.015em}.gh-featured{margin-top:100px}.gh-navigation+.gh-featured{margin-top:64px}.gh-header.is-classic:not(.has-image)+.gh-featured{margin-top:0}.gh-featured-inner{overflow:hidden}.gh-featured-title{margin-bottom:20px;padding-bottom:12px;font-size:1.2rem;font-weight:550;letter-spacing:.025em;text-transform:uppercase;border-bottom:1px solid var(--color-border)}.gh-featured-feed{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--grid-gap)}.gh-featured-feed .gh-card{container-type:inline-size;container-name:featured-card}.gh-featured-feed .gh-card-link{display:flex;flex-direction:row-reverse;align-items:flex-start}.gh-featured-feed .gh-card-image{width:72px;aspect-ratio:1}@container featured-card (width < 240px){.gh-featured-feed .gh-card-image{display:none}}@container featured-card (240px <= width <= 270px){.gh-featured-feed .gh-card-image{width:64px}}.gh-featured-feed .gh-card-wrapper{container-type:inline-size;container-name:featured-card-wrapper}.gh-featured-feed .gh-card-title{font-size:1.6rem;font-weight:650;letter-spacing:-.011em}@container featured-card-wrapper (width < 170px){.gh-featured-feed .gh-card-title{font-size:1.6rem}}.gh-featured-feed .gh-card-excerpt{display:none}.gh-featured-feed .gh-card-meta:not(:empty){margin-top:8px}.gh-featured-feed .gh-card:before{position:absolute;top:0;left:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}@media (max-width:1199px){.gh-viewport>.gh-featured .gh-featured-feed{grid-template-columns:repeat(3,1fr)}.gh-viewport>.gh-featured .gh-featured-feed .gh-card:nth-child(4){display:none}}@media (max-width:767px){.gh-viewport>.gh-featured .gh-featured-feed{display:flex;flex-direction:column}}.gh-container{flex-grow:1;margin-top:64px}.gh-container-inner{display:grid;grid-template-columns:repeat(16,1fr);-moz-column-gap:var(--grid-gap);column-gap:var(--grid-gap)}:is(.gh-featured,.gh-cta)+.gh-container{margin-top:max(4vw,40px)}.gh-header.is-classic:not(.has-image)+.gh-container{margin-top:0}.gh-navigation+.gh-container .gh-container-title,:is(.paged,.tag-template,.author-template) .gh-container:not(.has-sidebar) .gh-container-title{display:none}.gh-more{display:none;grid-column:1/-1;margin-top:48px;font-size:calc(1.9rem * var(--factor, 1));font-weight:725;letter-spacing:-.014em}.gh-container.has-sidebar .gh-more{grid-column:span 12}.home-template .gh-feed:has(>:nth-child(12):last-child)~.gh-more{display:block}.gh-more a{display:flex;align-items:center;gap:4px}.gh-more svg{margin-top:-1px;width:18px;height:18px}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-more svg{margin-top:0}.gh-container.has-sidebar .gh-main{grid-column:1/span 12;position:relative}.gh-container.has-sidebar .gh-sidebar{grid-column:13/-1}.gh-container.has-sidebar .gh-main:after{position:absolute;top:0;right:calc(-.5 * var(--grid-gap));content:"";width:1px;height:100%;background-color:var(--color-border)}.gh-container:not(.has-sidebar) :is(.gh-container-title,.gh-main,.gh-more){grid-column:3/span 12}.gh-container.is-list.no-image:not(.has-sidebar) :is(.gh-container-title,.gh-main,.gh-more){grid-column:4/span 10}.gh-header:is(.is-highlight,.is-magazine)~.gh-container.is-grid:not(.has-sidebar) :is(.gh-container-title,.gh-main,.gh-more){grid-column:1/-1}@media (max-width:1199px){.gh-container-inner{display:block;overflow:hidden}.gh-container.has-sidebar .gh-sidebar{display:none}}.gh-container-title{grid-column:1/-1;margin-bottom:calc(.5 * var(--grid-gap));padding-bottom:12px;font-size:1.2rem;font-weight:550;letter-spacing:.025em;text-transform:uppercase;border-bottom:1px solid var(--color-border)}.gh-container:not(:has(.gh-card)) .gh-container-title{display:none}.gh-container .gh-feed{gap:var(--grid-gap)}.gh-container .gh-card-meta:not(:empty){margin-top:12px}.gh-container.is-list .gh-feed{display:flex;flex-direction:column;container-type:inline-size;container-name:list-feed}.gh-container.is-list .gh-card-link{flex-direction:row;align-items:center;gap:24px}.gh-container.is-list .no-image .gh-card-link{padding-block:20px}.gh-container.is-list .gh-card-image{flex-shrink:0;width:220px;aspect-ratio:1.618033}@container list-feed (width < 600px){.gh-container.is-list .gh-card-image{width:160px}}.gh-container.is-list .gh-card:not(.no-image) .gh-card-wrapper{max-width:600px}.gh-container.is-list .gh-card-title{--factor:1.05}.gh-container.is-list .no-image .gh-card-title{--factor:1.2}.gh-container.is-list .gh-card-excerpt{margin-top:6px}.gh-container.is-list .gh-card+.gh-card:before{position:absolute;top:calc(-.5 * var(--grid-gap));left:0;content:"";width:100%;height:1px;background-color:var(--color-border)}.home-template .gh-container.is-list .gh-card:first-child:before{display:none}@media (max-width:767px){.gh-container.is-list .gh-card-link{flex-direction:column;align-items:flex-start}.gh-container.is-list .gh-card-image{width:100%}}.gh-container.is-grid .gh-feed{display:grid;grid-template-columns:repeat(auto-fit,minmax(248px,1fr));row-gap:calc(1.5 * var(--grid-gap));overflow:hidden}.gh-container.is-grid .gh-card:before{top:calc(-.5 * var(--grid-gap));right:calc(-.5 * var(--grid-gap));height:1px}.gh-container.is-grid .gh-card:after,.gh-container.is-grid .gh-card:before{position:absolute;left:calc(-.5 * var(--grid-gap));content:"";background-color:var(--color-border)}.gh-container.is-grid .gh-card:after{top:0;width:1px;height:100%}@media (max-width:767px){.gh-container.is-grid .gh-feed{grid-template-columns:repeat(2,1fr)}}@media (max-width:576px){.gh-container.is-grid .gh-feed{display:flex;flex-direction:column}}.gh-container.is-list.no-image .gh-card-image{display:none}.gh-sidebar-inner{position:sticky;top:calc(.5 * var(--grid-gap))}.gh-sidebar-title{grid-column:1/-1;margin-bottom:calc(.5 * var(--grid-gap));padding-bottom:12px;font-size:1.2rem;font-weight:550;letter-spacing:.025em;text-transform:uppercase;border-bottom:1px solid var(--color-border)}.gh-about{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:48px 24px;min-height:380px;text-align:center;background-color:var(--color-lighter-gray)}.gh-about-icon{margin-bottom:24px;width:60px;height:60px;border-radius:50%}.gh-about-title{font-size:calc(2.4rem * var(--factor, 1));font-weight:700;letter-spacing:-.019em}.gh-about-description{margin-top:12px;font-size:1.45rem;line-height:1.4}.gh-about .gh-button{margin-top:32px}.gh-recommendations{margin-top:48px}.gh-recommendations .recommendations{display:flex;flex-direction:column;gap:26px;margin:0;padding:0;list-style-type:none}.gh-recommendations .recommendation:first-child{margin-top:4px}.gh-recommendations .recommendation a{display:grid;grid-template-columns:24px auto;gap:4px 12px}.gh-recommendations .recommendation a:hover{opacity:1}.gh-recommendations .recommendation-favicon{grid-row:span 2;width:100%;border-radius:4px}.gh-recommendations .recommendation-title{margin-top:-2px;font-size:1.5rem;font-weight:650;letter-spacing:-.009em}.gh-recommendations .recommendation a:hover .recommendation-title{opacity:.8}.gh-recommendations .recommendation-url{order:1;overflow:hidden;font-size:1.4rem;line-height:1.25;color:var(--color-secondary-text);text-overflow:ellipsis}.gh-recommendations .recommendation-description{display:-webkit-box;display:none;overflow-y:hidden;grid-column:2;font-size:1.4rem;line-height:1.4;color:var(--color-secondary-text);-webkit-line-clamp:2;-webkit-box-orient:vertical}.gh-recommendations button{display:inline-flex;align-items:center;gap:2px;margin-top:24px;padding:0;cursor:pointer;font-size:1.2rem;font-weight:550;letter-spacing:.025em;text-transform:uppercase;background-color:transparent;border:0;color:var(--color-darker-gray)}.gh-recommendations button svg{margin-top:-1px;width:12px}.gh-recommendations button:hover{opacity:.8}.gh-article{--container-width:1120px;word-break:break-word}.gh-article-header{margin:clamp(40px,3.64vw + 25.45px,72px) 0 40px}.gh-article-tag{margin-bottom:12px;font-size:1.3rem;font-weight:500;letter-spacing:.01em;text-transform:uppercase;color:var(--ghost-accent-color)}.gh-article-title{font-size:calc(clamp(3.4rem, 1.36vw + 2.85rem, 4.6rem) * var(--factor, 1));line-height:1.1;letter-spacing:-.022em}.gh-article-excerpt{margin-top:clamp(12px,.45vw + 10.18px,16px);max-width:720px;font-size:clamp(1.7rem,.23vw + 1.61rem,1.9rem);line-height:1.45;letter-spacing:-.018em}.gh-article-meta{display:flex;align-items:center;gap:8px;margin-left:6px}.gh-article-author-image{display:flex;margin-right:8px}.gh-article-author-image a{position:relative;margin:0 -8px;width:56px;height:56px;overflow:hidden;background-color:var(--color-light-gray);border-radius:50%;border:3px solid var(--background-color)}.gh-article-author-image a:first-child{z-index:10}.gh-article-author-image a:nth-child(2){z-index:9}.gh-article-author-image a:nth-child(3){z-index:8}.gh-article-author-image :is(img,svg){position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.gh-article-meta-wrapper{display:flex;flex-direction:column;gap:4px}.gh-article-author-name{font-size:1.6rem;font-weight:650;letter-spacing:-.013em}.gh-article-meta-content{font-size:1.35rem;font-weight:500;line-height:1.2;letter-spacing:-.006em;color:var(--color-secondary-text)}.gh-article-image{grid-column:wide;margin-top:40px}.gh-article-image img{width:100%}.page-template .gh-article-header{margin-block:72px 32px}.page-template .gh-content:only-child>:first-child:not(.kg-width-full){margin-top:64px}.page-template .gh-content>:last-child:not(.kg-width-full){margin-bottom:6vw}.page-template .gh-footer{margin-top:0}.gh-content{font-size:var(--content-font-size,1.7rem);letter-spacing:-.01em}.gh-content>*+*{margin-top:calc(28px * var(--content-spacing-factor, 1));margin-bottom:0}.gh-content>.kg-width-full+.kg-width-full:not(.kg-width-full.kg-card-hascaption+.kg-width-full){margin-top:0}.gh-content>[id]:not(:first-child){margin-top:calc(56px * var(--content-spacing-factor, 1))}.post-template .gh-content.drop-cap>p:first-of-type:first-letter{font-size:3.1em;float:left;line-height:1;margin:0 .2em 0 -1px;font-weight:700}.has-serif-body.post-template:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content.drop-cap>p:first-of-type:first-letter{font-size:3.2em}.gh-content>[id]+p{margin-top:calc(12px * var(--content-spacing-factor, 1))}.gh-content>:is(hr,blockquote,iframe){position:relative;margin-top:calc(48px * var(--content-spacing-factor, 1))!important}.gh-content>:is(hr,blockquote,iframe)+*{margin-top:calc(48px * var(--content-spacing-factor, 1))!important}.gh-content h1{font-size:calc(2.2em * var(--factor, 1));letter-spacing:-.02em}.gh-content h2{font-size:calc(1.6em * var(--factor, 1));letter-spacing:-.02em}.gh-content h3{font-size:calc(1.3em * var(--factor, 1));letter-spacing:-.017em}.gh-content a{color:var(--ghost-accent-color);text-decoration:underline}.gh-content .kg-callout-card .kg-callout-text,.gh-content .kg-toggle-card .kg-toggle-content>:is(ul,ol,p){font-size:.95em}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content .kg-callout-text,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content .kg-toggle-content>ol,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content .kg-toggle-content>p,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content .kg-toggle-content>ul,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>blockquote,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>dl,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>ol,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>p,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-content>ul{font-family:var(--font-serif-alt)}.gh-content :is(ul,ol){padding-left:28px}.gh-content :is(li+li,li :is(ul,ol)){margin-top:8px}.gh-content ol ol li{list-style-type:lower-alpha}.gh-content ol ol ol li{list-style-type:lower-roman}.gh-content hr{width:100%;height:1px;background-color:var(--color-border);border:0}.gh-content .gh-table{overflow-x:scroll;-webkit-overflow-scrolling:touch}.gh-content .gh-table table{width:100%;font-family:var(--font-sans);font-size:1.5rem;white-space:nowrap;vertical-align:top;border-spacing:0;border-collapse:collapse}.gh-content .gh-table table th{font-size:1.2rem;font-weight:700;color:var(--color-darkgrey);text-align:left;text-transform:uppercase;letter-spacing:.2px}.gh-content .gh-table table :is(th,td),.gh-content .gh-table table td{padding:6px 12px;border-bottom:1px solid var(--color-border)}.gh-content .gh-table table :is(th,td):first-child{padding-left:0}.gh-content .gh-table table :is(th,td):last-child{padding-right:0}.gh-content pre{overflow:auto;padding:16px;font-size:1.5rem;line-height:1.5em;border-radius:6px}.gh-content :not(pre)>code,.gh-content pre{background:var(--color-lighter-gray);font-family:var(--font-mono)}.gh-content :not(pre)>code{vertical-align:baseline;padding:.15em .4em;font-weight:400;font-size:.95em;line-height:1em;border-radius:.25em}.gh-content :not(.kg-card):not(table):not([id])+:is(.kg-card,table){margin-top:calc(48px * var(--content-spacing-factor, 1))}.gh-content :is(.kg-card,table)+:not(.kg-card):not(table):not([id]){margin-top:calc(48px * var(--content-spacing-factor, 1))}.gh-content .kg-card.kg-width-full+:not(.kg-card):not([id]),.gh-content :not(.kg-card):not([id])+.kg-card.kg-width-full{margin-top:calc(68px * var(--content-spacing-factor, 1))}.kg-image{margin-right:auto;margin-left:auto}.kg-embed-card{display:flex;flex-direction:column;align-items:center;width:100%}.gh-feature-image,.kg-gallery-image,.kg-image[width][height]{cursor:pointer}.kg-gallery-image a:hover,.kg-image-card a:hover{opacity:1!important}.kg-card.kg-toggle-card .kg-toggle-heading-text{font-size:2rem;font-weight:700}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-toggle-card .kg-toggle-heading-text{font-family:var(--font-serif)}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-toggle-card .kg-toggle-heading-text{font-family:var(--font-mono)}.kg-callout-card.kg-card{border-radius:.25em}.kg-callout-card-accent a{text-decoration:underline}blockquote:not([class]){padding-left:2rem;border-left:4px solid var(--ghost-accent-color)}blockquote.kg-blockquote-alt{font-style:normal;font-weight:400;color:var(--color-secondary-text)}.kg-card.kg-button-card .kg-btn{height:unset;padding:.6em 1.2em;text-align:center;font-size:1em;line-height:1.2em}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-card.kg-header-card h2.kg-header-card-header{font-family:var(--font-serif)}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-card.kg-header-card h2.kg-header-card-header{font-family:var(--font-mono)}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .kg-header-card h3.kg-header-card-subheader{font-family:var(--font-serif)}.kg-bookmark-card .kg-bookmark-container{border-radius:.25em!important}.kg-bookmark-card .kg-bookmark-container:hover{opacity:1}.kg-bookmark-card a.kg-bookmark-container,.kg-bookmark-card a.kg-bookmark-container:hover{background:var(--background-color)!important;color:var(--color-darker-gray)!important}.kg-bookmark-card .kg-bookmark-content{padding:1.15em}.kg-bookmark-card .kg-bookmark-title{font-size:.9em}.kg-bookmark-card .kg-bookmark-description{max-height:none;margin-top:.3em;font-size:.8em}.kg-bookmark-card .kg-bookmark-metadata{font-size:.8em}.kg-bookmark-card .kg-bookmark-thumbnail img{border-radius:0 .2em .2em 0}.kg-product-card.kg-card .kg-product-card-image{margin-bottom:12px}.kg-product-card.kg-card a.kg-product-card-button{height:2.8em;margin-top:12px}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-product-card.kg-card .kg-product-card-title{font-family:var(--font-serif)}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .kg-product-card.kg-card .kg-product-card-title{font-family:var(--font-mono)}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .kg-product-card-description :is(p,ul,ol){font-family:var(--font-serif-alt)}.kg-file-card.kg-card .kg-file-card-container{padding:.6em}.kg-file-card.kg-card .kg-file-card-contents{margin:4px 8px 6px}.kg-file-card.kg-card .kg-file-card-metadata{font-size:.9em}.kg-file-card.kg-card .kg-file-card-filesize:before{margin-right:6px;margin-left:6px}figcaption{margin-top:12px;font-size:1.4rem;text-align:center}.kg-card.kg-width-full figcaption{padding:0 16px}figcaption a{color:var(--ghost-accent-color);text-decoration:underline}.gh-comments{margin-top:48px}.post-template .gh-container{margin-top:120px}.post-template .gh-container-inner{display:block}.post-template .gh-container.is-grid .gh-feed{grid-template-columns:repeat(4,1fr)}.post-template .gh-container .gh-container-title{display:block}.gh-archive{display:grid;grid-template-columns:repeat(16,1fr);gap:var(--grid-gap);margin-block:80px 24px}.gh-archive.has-image{margin-top:48px}.gh-archive-inner{display:grid;grid-template-columns:1fr 1fr;gap:var(--grid-gap);grid-column:1/-1;padding-bottom:clamp(40px,2.73vw + 29.09px,64px);border-bottom:1px solid var(--color-border)}.gh-archive.has-image .gh-archive-inner{align-items:center;grid-column:1/-1}.gh-archive:not(.has-sidebar):not(.has-image) .gh-archive-inner{grid-column:3/span 12}.gh-archive .gh-article-image{grid-column:auto;margin-top:0}:is(.tag-template,.author-template) .gh-container{margin-top:0}.author-template .gh-archive-inner{display:flex;flex-direction:row-reverse;justify-content:flex-end;gap:24px}.author-template .gh-article-image{margin-top:0;width:120px;height:120px;border-radius:50%;-o-object-fit:cover;object-fit:cover}.author-template .gh-article-title{font-size:3.6rem}.gh-author-meta{display:flex;gap:10px;margin-top:14px;font-size:1.5rem;font-weight:550;color:var(--color-secondary-text)}.gh-author-meta a{color:inherit}.gh-author-social{display:flex;gap:16px;align-items:center;padding-left:3px}.gh-author-social svg{width:20px;height:20px}@media (max-width:1199px){.gh-archive{display:block}}@media (max-width:767px){.gh-archive-inner{display:flex;align-items:flex-start}.author-template .gh-archive-inner,.gh-archive-inner{flex-direction:column-reverse}}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]){--factor:1.15}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]){--factor:1.1}.has-sans-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) :is(.is-title,.gh-content :is(h2,h3)){font-family:var(--gh-font-heading,var(--font-sans))}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) :is(.is-title,.gh-content :is(h2,h3)){font-family:var(--gh-font-heading,var(--font-serif));font-weight:550}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) :is(.is-title,.gh-content :is(h2,h3)){font-family:var(--gh-font-heading,var(--font-mono))}.has-sans-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .is-body{font-family:var(--gh-font-body,var(--font-sans))}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .is-body{font-family:var(--gh-font-body,var(--font-serif-alt))}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-classic .gh-header-title{font-weight:550;letter-spacing:-.015em}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-classic .gh-header-title{letter-spacing:-.01em}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-form{border-radius:0}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-card-title{line-height:1.15;letter-spacing:-.006em;font-size:calc(2rem * var(--factor, 1))}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-featured-feed .gh-card-title{font-size:calc(1.6rem * var(--factor, 1))}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-featured-feed .gh-card-title{font-size:calc(1.5rem * var(--factor, 1));letter-spacing:0}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-highlight .gh-featured-feed .gh-card-title{font-size:clamp(1.6rem,.23vw + 1.51rem,1.8rem)}.has-mono-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-card-title{font-size:calc(1.8rem * var(--factor, 1));line-height:1.2}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-about-title{letter-spacing:-.009em}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-article-title,.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-footer-signup-header{letter-spacing:-.019em}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]){--content-font-size:1.9rem}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-card-excerpt{font-size:1.65rem;line-height:1.4;letter-spacing:.0005em}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-header.is-highlight .gh-card:first-child .gh-card-excerpt,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-excerpt{font-size:1.8rem;letter-spacing:-.001em}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-highlight .gh-header-left .gh-card-title,.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-header.is-magazine .gh-header-inner>.gh-card .gh-card-title{font-weight:550;font-size:clamp(3.2rem,1.82vw + 2.47rem,4.9rem)}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-about-description{font-size:1.6rem}.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-article-excerpt,.has-serif-body:not([class*=" gh-font-body"]):not([class^=gh-font-body]) .gh-footer-signup-subhead{letter-spacing:0}:is(.has-serif-title,.has-mono-title):not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) :is(.gh-button,.gh-form,.gh-form-input),body[class*=" gh-font-heading"]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) :is(.gh-button,.gh-form,.gh-form-input),body[class^=gh-font-heading]:not(.gh-font-heading-fira-sans):not(.gh-font-heading-inter):not(.gh-font-heading-manrope):not(.gh-font-heading-noto-sans):not(.gh-font-heading-nunito):not(.gh-font-heading-poppins):not(.gh-font-heading-roboto):not(.gh-font-heading-space-grotesk) :is(.gh-button,.gh-form,.gh-form-input){border-radius:0}.has-serif-title:not([class*=" gh-font-heading"]):not([class^=gh-font-heading]) .gh-cta-title{font-size:4.8rem}.gh-footer{margin-top:120px;font-size:1.5rem;color:var(--color-darker-gray)}.gh-footer a:not(.gh-button){color:inherit}.gh-footer.has-accent-color{background-color:var(--ghost-accent-color)}.gh-footer.has-accent-color .gh-footer-bar{border-top:0}.gh-footer.has-accent-color .gh-button{background-color:#fff;color:#15171a}.gh-footer-bar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;-moz-column-gap:32px;column-gap:32px;margin-bottom:120px;padding-block:28px;font-weight:550;border-block:1px solid var(--color-border)}.gh-footer-logo{position:relative;font-family:var(--gh-font-heading,var(--font-sans));font-size:calc(2.4rem * var(--factor, 1));font-weight:725;letter-spacing:-.015em;white-space:nowrap}.gh-footer-logo img{max-height:40px}.gh-footer-menu .nav{display:flex;justify-content:center;gap:8px 28px;flex-wrap:wrap;margin:0;padding:0;list-style-type:none}.gh-footer-copyright{text-align:right;white-space:nowrap}.gh-footer-copyright a{text-decoration:underline}.gh-footer-signup{display:flex;flex-direction:column;align-items:center;margin-bottom:120px;text-align:center}.gh-footer-signup-header{font-size:calc(clamp(2.8rem, 1.36vw + 2.25rem, 4rem) * var(--factor, 1));font-weight:700;letter-spacing:-.03em}.gh-footer-signup-subhead{margin-top:12px;max-width:640px;font-size:1.8rem;font-weight:450;line-height:1.4;letter-spacing:-.014em;opacity:.75}.gh-footer-signup .gh-form{margin-top:40px}@media (max-width:991px){.gh-footer-bar{display:flex;flex-direction:column;gap:20px}}.gh-social-links{display:flex;justify-content:center;gap:20px;margin-bottom:32px}.gh-social-links a{will-change:opacity}.gh-social-links svg{width:20px;height:20px}.pswp{position:absolute;top:0;left:0;z-index:3999999;display:none;width:100%;height:100%;overflow:hidden;touch-action:none;outline:none;backface-visibility:hidden;-webkit-text-size-adjust:100%}.pswp img{max-width:none}.pswp--animate_opacity{opacity:.001;transition:opacity 333ms cubic-bezier(.4,0,.22,1);will-change:opacity}.pswp--open{display:block}.pswp--zoom-allowed .pswp__img{cursor:zoom-in}.pswp--zoomed-in .pswp__img{cursor:grab}.pswp--dragging .pswp__img{cursor:grabbing}.pswp__bg{background-color:rgba(0,0,0,.85);opacity:0;transition:opacity 333ms cubic-bezier(.4,0,.22,1);transform:translateZ(0);backface-visibility:hidden;will-change:opacity}.pswp__bg,.pswp__scroll-wrap{position:absolute;top:0;left:0;width:100%;height:100%}.pswp__scroll-wrap{overflow:hidden}.pswp__container,.pswp__zoom-wrap{position:absolute;top:0;right:0;bottom:0;left:0;touch-action:none;backface-visibility:hidden}.pswp__container,.pswp__img{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.pswp__zoom-wrap{position:absolute;width:100%;transition:transform 333ms cubic-bezier(.4,0,.22,1);transform-origin:left top}.pswp--animated-in .pswp__bg,.pswp--animated-in .pswp__zoom-wrap{transition:none}.pswp__item{right:0;bottom:0;overflow:hidden}.pswp__img,.pswp__item{position:absolute;top:0;left:0}.pswp__img{width:auto;height:auto}.pswp__img--placeholder{backface-visibility:hidden}.pswp__img--placeholder--blank{background:var(--color-black)}.pswp--ie .pswp__img{top:0;left:0;width:100%!important;height:auto!important}.pswp__error-msg{position:absolute;top:50%;left:0;width:100%;margin-top:-8px;font-size:14px;line-height:16px;color:var(--color-secondary-text);text-align:center}.pswp__error-msg a{color:var(--color-secondary-text);text-decoration:underline}.pswp__button{position:relative;display:block;float:right;width:44px;height:44px;padding:0;margin:0;overflow:visible;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;background:none;border:0;box-shadow:none;transition:opacity .2s}.pswp__button:focus,.pswp__button:hover{opacity:1}.pswp__button:active{outline:none;opacity:.9}.pswp__button::-moz-focus-inner{padding:0;border:0}.pswp__ui--over-close .pswp__button--close{opacity:1}.pswp__button,.pswp__button--arrow--left:before,.pswp__button--arrow--right:before{width:44px;height:44px;background:url(../images/default-skin.png) 0 0 no-repeat;background-size:264px 88px}@media (min-resolution:1.1dppx),(min-resolution:105dpi){.pswp--svg .pswp__button,.pswp--svg .pswp__button--arrow--left:before,.pswp--svg .pswp__button--arrow--right:before{background-image:url(../images/default-skin.svg)}.pswp--svg .pswp__button--arrow--left,.pswp--svg .pswp__button--arrow--right{background:none}}.pswp__button--close{background-position:0 -44px}.pswp__button--share{background-position:-44px -44px}.pswp__button--fs{display:none}.pswp--supports-fs .pswp__button--fs{display:block}.pswp--fs .pswp__button--fs{background-position:-44px 0}.pswp__button--zoom{display:none;background-position:-88px 0}.pswp--zoom-allowed .pswp__button--zoom{display:block}.pswp--zoomed-in .pswp__button--zoom{background-position:-132px 0}.pswp--touch .pswp__button--arrow--left,.pswp--touch .pswp__button--arrow--right{visibility:hidden}.pswp__button--arrow--left,.pswp__button--arrow--right{position:absolute;top:50%;width:70px;height:100px;margin-top:-50px;background:none}.pswp__button--arrow--left{left:0}.pswp__button--arrow--right{right:0}.pswp__button--arrow--left:before,.pswp__button--arrow--right:before{position:absolute;top:35px;width:32px;height:30px;content:""}.pswp__button--arrow--left:before{left:6px;background-position:-138px -44px}.pswp__button--arrow--right:before{right:6px;background-position:-94px -44px}.pswp__counter{position:absolute;top:0;left:0;height:44px;padding:0 15px;font-size:11px;font-weight:700;line-height:44px;color:var(--color-white);-webkit-user-select:none;-moz-user-select:none;user-select:none}.pswp__caption{position:absolute;bottom:0;left:0;width:100%;min-height:44px}.pswp__caption__center{max-width:420px;padding:25px 15px 30px;margin:0 auto;font-size:11px;line-height:1.6;color:var(--color-white);text-align:center}.pswp__caption__center .post-caption-title{margin-bottom:7px;font-size:15px;font-weight:500;text-transform:uppercase}.pswp__caption__center .post-caption-meta-item+.post-caption-meta-item:before{padding:0 4px;content:"\02022"}.pswp__caption--empty{display:none}.pswp__caption--fake{visibility:hidden}.pswp__preloader{position:absolute;top:0;left:50%;width:44px;height:44px;margin-left:-22px;opacity:0;transition:opacity .25s ease-out;direction:ltr;will-change:opacity}.pswp__preloader__icn{width:20px;height:20px;margin:12px}.pswp__preloader--active{opacity:1}.pswp__preloader--active .pswp__preloader__icn{background:url(../images/preloader.gif) 0 0 no-repeat}.pswp--css_animation .pswp__preloader--active{opacity:1}.pswp--css_animation .pswp__preloader--active .pswp__preloader__icn{animation:clockwise .5s linear infinite}.pswp--css_animation .pswp__preloader--active .pswp__preloader__donut{animation:donut-rotate 1s cubic-bezier(.4,0,.22,1) infinite}.pswp--css_animation .pswp__preloader__icn{position:absolute;top:15px;left:15px;width:14px;height:14px;margin:0;background:none;opacity:.75}.pswp--css_animation .pswp__preloader__cut{position:relative;width:7px;height:14px;overflow:hidden}.pswp--css_animation .pswp__preloader__donut{position:absolute;top:0;left:0;box-sizing:border-box;width:14px;height:14px;margin:0;background:none;border:2px solid var(--color-white);border-bottom-color:transparent;border-left-color:transparent;border-radius:50%}@media screen and (max-width:1024px){.pswp__preloader{position:relative;top:auto;left:auto;float:right;margin:0}}@keyframes clockwise{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes donut-rotate{0%{transform:rotate(0)}50%{transform:rotate(-140deg)}to{transform:rotate(0)}}.pswp__ui{z-index:1550;visibility:visible;opacity:1;-webkit-font-smoothing:auto}.pswp__top-bar{position:absolute;top:0;left:0;width:100%;height:44px}.pswp--has_mouse .pswp__button--arrow--left,.pswp--has_mouse .pswp__button--arrow--right,.pswp__caption,.pswp__top-bar{backface-visibility:hidden;transition:opacity 333ms cubic-bezier(.4,0,.22,1);will-change:opacity}.pswp--has_mouse .pswp__button--arrow--left,.pswp--has_mouse .pswp__button--arrow--right{visibility:visible}.pswp__ui--idle .pswp__button--arrow--left,.pswp__ui--idle .pswp__button--arrow--right,.pswp__ui--idle .pswp__top-bar{opacity:0}.pswp__ui--hidden .pswp__button--arrow--left,.pswp__ui--hidden .pswp__button--arrow--right,.pswp__ui--hidden .pswp__caption,.pswp__ui--hidden .pswp__top-bar{opacity:.001}.pswp__ui--one-slide .pswp__button--arrow--left,.pswp__ui--one-slide .pswp__button--arrow--right,.pswp__ui--one-slide .pswp__counter{display:none}.pswp__element--disabled{display:none!important}.pswp--minimal--dark .pswp__top-bar{background:none}.gh-meta-share{display:flex;align-items:center;justify-content:space-between;margin-top:20px}.has-light-text .gh-button-share{border-color:hsla(0,0%,100%,.25);color:hsla(0,0%,100%,.85)}.has-light-text .gh-button-share:hover{border-color:hsla(0,0%,100%,.85)}.gh-button-share{display:inline-flex;align-items:center;border:1px solid rgba(0,0,0,.15);border-radius:999px;color:rgba(0,0,0,.85);background:transparent;cursor:pointer;transition:all .4s ease}.gh-button-share:hover{border-color:rgba(0,0,0,.5)}/*# sourceMappingURL=screen.css.map */
@@ -648,7 +648,7 @@ Search LOGO Login Subscribe
648
648
  }
649
649
  }
650
650
 
651
- @media (min-width: 992px) {
651
+ @media (min-width: 768px) {
652
652
  .gh-navigation.is-stacked .gh-navigation-inner {
653
653
  padding: 0;
654
654
  }