@automattic/newspack-blocks 1.0.0-hotfix-cap-count-user-posts-dedup.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/.eslintrc.js +3 -0
  2. package/.hooks/pre-push +8 -0
  3. package/.nvmrc +1 -0
  4. package/.prettierignore +4 -0
  5. package/.prettierrc.js +5 -0
  6. package/.stylelintrc.js +3 -0
  7. package/AGENTS.md +275 -0
  8. package/CHANGELOG.md +3971 -0
  9. package/CLAUDE.md +1 -0
  10. package/README.md +43 -0
  11. package/babel.config.js +6 -0
  12. package/bin/install-wp-tests.sh +155 -0
  13. package/bin/update-translations.sh +13 -0
  14. package/block-list.json +12 -0
  15. package/composer.json +46 -0
  16. package/composer.lock +3632 -0
  17. package/dist/author-list/view-rtl.css +1 -0
  18. package/dist/author-list/view.asset.php +1 -0
  19. package/dist/author-list/view.css +1 -0
  20. package/dist/author-list/view.js +0 -0
  21. package/dist/author-profile/view-rtl.css +1 -0
  22. package/dist/author-profile/view.asset.php +1 -0
  23. package/dist/author-profile/view.css +1 -0
  24. package/dist/author-profile/view.js +0 -0
  25. package/dist/block_styles-rtl.css +2 -0
  26. package/dist/block_styles.asset.php +1 -0
  27. package/dist/block_styles.css +2 -0
  28. package/dist/block_styles.js +0 -0
  29. package/dist/blocks/author-list/block.json +89 -0
  30. package/dist/blocks/author-profile/block.json +80 -0
  31. package/dist/blocks/carousel/block.json +125 -0
  32. package/dist/blocks/checkout-button/block.json +117 -0
  33. package/dist/blocks/donate/block.json +103 -0
  34. package/dist/blocks/homepage-articles/block.json +260 -0
  35. package/dist/blocks/iframe/block.json +36 -0
  36. package/dist/carousel/view-rtl.css +2 -0
  37. package/dist/carousel/view.asset.php +1 -0
  38. package/dist/carousel/view.css +2 -0
  39. package/dist/carousel/view.js +3 -0
  40. package/dist/checkout-button/view-rtl.css +1 -0
  41. package/dist/checkout-button/view.asset.php +1 -0
  42. package/dist/checkout-button/view.css +1 -0
  43. package/dist/checkout-button/view.js +0 -0
  44. package/dist/donate/view-rtl.css +1 -0
  45. package/dist/donate/view.asset.php +1 -0
  46. package/dist/donate/view.css +1 -0
  47. package/dist/donate/view.js +1 -0
  48. package/dist/editor-rtl.css +66 -0
  49. package/dist/editor.asset.php +1 -0
  50. package/dist/editor.css +66 -0
  51. package/dist/editor.js +57 -0
  52. package/dist/frequencyBased-rtl.css +1 -0
  53. package/dist/frequencyBased.asset.php +1 -0
  54. package/dist/frequencyBased.css +1 -0
  55. package/dist/frequencyBased.js +1 -0
  56. package/dist/homepage-articles/view-rtl.css +1 -0
  57. package/dist/homepage-articles/view.asset.php +1 -0
  58. package/dist/homepage-articles/view.css +1 -0
  59. package/dist/homepage-articles/view.js +1 -0
  60. package/dist/iframe/view-rtl.css +1 -0
  61. package/dist/iframe/view.asset.php +1 -0
  62. package/dist/iframe/view.css +1 -0
  63. package/dist/iframe/view.js +1 -0
  64. package/dist/modal-rtl.css +1 -0
  65. package/dist/modal.asset.php +1 -0
  66. package/dist/modal.css +1 -0
  67. package/dist/modal.js +1 -0
  68. package/dist/modalCheckout-rtl.css +1 -0
  69. package/dist/modalCheckout.asset.php +1 -0
  70. package/dist/modalCheckout.css +1 -0
  71. package/dist/modalCheckout.js +1 -0
  72. package/dist/placeholder_blocks.asset.php +1 -0
  73. package/dist/placeholder_blocks.js +4 -0
  74. package/dist/tiersBased-rtl.css +1 -0
  75. package/dist/tiersBased.asset.php +1 -0
  76. package/dist/tiersBased.css +1 -0
  77. package/dist/tiersBased.js +1 -0
  78. package/includes/class-modal-checkout.php +2324 -0
  79. package/includes/class-newspack-blocks-api.php +347 -0
  80. package/includes/class-newspack-blocks-caching.php +291 -0
  81. package/includes/class-newspack-blocks-patterns.php +167 -0
  82. package/includes/class-newspack-blocks.php +1581 -0
  83. package/includes/modal-checkout/class-change-payment-gateway.php +86 -0
  84. package/includes/modal-checkout/class-checkout-data.php +406 -0
  85. package/includes/plugins/class-the-events-calendar.php +84 -0
  86. package/includes/tracking/class-data-events.php +83 -0
  87. package/languages/newspack-blocks-de_DE-01a5b44b8bc8d20f62541de420aa61ab.json +1 -0
  88. package/languages/newspack-blocks-de_DE-0662222bf15e7a1a7b74db2dabb48d6c.json +1 -0
  89. package/languages/newspack-blocks-de_DE-0c8dad524e2a57cee4f8efb6e35387c1.json +1 -0
  90. package/languages/newspack-blocks-de_DE-10754bc02d28d4301c103f26dbf519ce.json +1 -0
  91. package/languages/newspack-blocks-de_DE-2d52b39fdbc5d6c94b3514803f3720b8.json +1 -0
  92. package/languages/newspack-blocks-de_DE-34e5c64f90b1444f3fc735376442eada.json +1 -0
  93. package/languages/newspack-blocks-de_DE-351fd022e077061b5796bf7042446bfc.json +1 -0
  94. package/languages/newspack-blocks-de_DE-37552bb09e2a9fceec1970e3c6d46557.json +1 -0
  95. package/languages/newspack-blocks-de_DE-4b2ccb4e4dc8b3491228b2feb54872f2.json +1 -0
  96. package/languages/newspack-blocks-de_DE-4cecf783e091d36284a3e0cdafcd0fd5.json +1 -0
  97. package/languages/newspack-blocks-de_DE-4f16e21047908d19937bc10ced63acd1.json +1 -0
  98. package/languages/newspack-blocks-de_DE-4fdea541976076f02d56139fb35e5b42.json +1 -0
  99. package/languages/newspack-blocks-de_DE-501b38ac90d35730a620fb0d483702fa.json +1 -0
  100. package/languages/newspack-blocks-de_DE-53e2a1d5945b8d2b1c35e81ae1e532f3.json +1 -0
  101. package/languages/newspack-blocks-de_DE-5d4055f484eeb00e3ea0f9d8aace0897.json +1 -0
  102. package/languages/newspack-blocks-de_DE-5f70538e0223bc8a05b922cba67da6fb.json +1 -0
  103. package/languages/newspack-blocks-de_DE-6c2e53bab28419c30e1eaee70ba599cf.json +1 -0
  104. package/languages/newspack-blocks-de_DE-6ed95fb4873e6e2b81351177a44995f6.json +1 -0
  105. package/languages/newspack-blocks-de_DE-727631509ad8eec8e2cbe740c6dad199.json +1 -0
  106. package/languages/newspack-blocks-de_DE-73c6d3bde805172d1993f75397e9832d.json +1 -0
  107. package/languages/newspack-blocks-de_DE-78456b164809d080adecb4d2b3895802.json +1 -0
  108. package/languages/newspack-blocks-de_DE-7b1aa64ce2d962decc04666ab86c53de.json +1 -0
  109. package/languages/newspack-blocks-de_DE-7c29764d5ef91723f5ce454f66431b9e.json +1 -0
  110. package/languages/newspack-blocks-de_DE-912a2876091ef0dca9b26f3cfc01fc9c.json +1 -0
  111. package/languages/newspack-blocks-de_DE-91a7ac8017d6e2159be1c5a3c1e372e4.json +1 -0
  112. package/languages/newspack-blocks-de_DE-969286d51bb0afe10983b9aec317b5ee.json +1 -0
  113. package/languages/newspack-blocks-de_DE-9ef9b2c60c897ad79f92951e6e9949a1.json +1 -0
  114. package/languages/newspack-blocks-de_DE-a822c3d210c89af3cb7da28eaaef929c.json +1 -0
  115. package/languages/newspack-blocks-de_DE-aa9f9057c77a46b31d7e325a4322f2da.json +1 -0
  116. package/languages/newspack-blocks-de_DE-b6d3cfc30bb16d88d7bc5384bc775543.json +1 -0
  117. package/languages/newspack-blocks-de_DE-b712270cd4eb3cae7899b50b57bdd576.json +1 -0
  118. package/languages/newspack-blocks-de_DE-babcc0ca24e7f0145b1c8f647049f085.json +1 -0
  119. package/languages/newspack-blocks-de_DE-bb66d96d450663284550bed5a3e9113e.json +1 -0
  120. package/languages/newspack-blocks-de_DE-c810378e74f20906b8193ea76adb6bc0.json +1 -0
  121. package/languages/newspack-blocks-de_DE-d3a1c55a07efd1a65e227bf120840752.json +1 -0
  122. package/languages/newspack-blocks-de_DE-d5f23a52ecbfd492ebf819c14206a9e2.json +1 -0
  123. package/languages/newspack-blocks-de_DE-d684e5c5ac51934ba20811c2f588e1d5.json +1 -0
  124. package/languages/newspack-blocks-de_DE-dd56360b115d1b39c48033c1e0749a11.json +1 -0
  125. package/languages/newspack-blocks-de_DE-e0e4434aee4db01e71268ce3edf1dd97.json +1 -0
  126. package/languages/newspack-blocks-de_DE-e58126c278611ed6c17684ba8e7459b4.json +1 -0
  127. package/languages/newspack-blocks-de_DE-ea3e2a660753c7bfa13b5bbd8a46bdd0.json +1 -0
  128. package/languages/newspack-blocks-de_DE-eccbc51a43c04f59165364eda71e0be7.json +1 -0
  129. package/languages/newspack-blocks-de_DE-eeb28f99adedd5fad3081d2756d6f4a4.json +1 -0
  130. package/languages/newspack-blocks-de_DE-f03802d9ac1ae8f3b85caee4347b93a7.json +1 -0
  131. package/languages/newspack-blocks-de_DE-f32a4d8bd8f1f1e03b6523dfaa4c9f73.json +1 -0
  132. package/languages/newspack-blocks-de_DE-f5f8db76788e4079ddfa743333708b88.json +1 -0
  133. package/languages/newspack-blocks-de_DE-f8b1589c450689398f90b179f47e74ee.json +1 -0
  134. package/languages/newspack-blocks-de_DE-f9d0b05d4d6ddd3273f1f3fb2eb2ca50.json +1 -0
  135. package/languages/newspack-blocks-de_DE-fbe7f8c598cf05d4603ba49fec909ded.json +1 -0
  136. package/languages/newspack-blocks-de_DE-fcc93143c1f2b74671f595454b971f44.json +1 -0
  137. package/languages/newspack-blocks-de_DE.mo +0 -0
  138. package/languages/newspack-blocks-de_DE.po +2088 -0
  139. package/languages/newspack-blocks-es_ES-01a5b44b8bc8d20f62541de420aa61ab.json +1 -0
  140. package/languages/newspack-blocks-es_ES-0662222bf15e7a1a7b74db2dabb48d6c.json +1 -0
  141. package/languages/newspack-blocks-es_ES-0c8dad524e2a57cee4f8efb6e35387c1.json +1 -0
  142. package/languages/newspack-blocks-es_ES-10754bc02d28d4301c103f26dbf519ce.json +1 -0
  143. package/languages/newspack-blocks-es_ES-2d52b39fdbc5d6c94b3514803f3720b8.json +1 -0
  144. package/languages/newspack-blocks-es_ES-34e5c64f90b1444f3fc735376442eada.json +1 -0
  145. package/languages/newspack-blocks-es_ES-351fd022e077061b5796bf7042446bfc.json +1 -0
  146. package/languages/newspack-blocks-es_ES-37552bb09e2a9fceec1970e3c6d46557.json +1 -0
  147. package/languages/newspack-blocks-es_ES-4b2ccb4e4dc8b3491228b2feb54872f2.json +1 -0
  148. package/languages/newspack-blocks-es_ES-4cecf783e091d36284a3e0cdafcd0fd5.json +1 -0
  149. package/languages/newspack-blocks-es_ES-4f16e21047908d19937bc10ced63acd1.json +1 -0
  150. package/languages/newspack-blocks-es_ES-4fdea541976076f02d56139fb35e5b42.json +1 -0
  151. package/languages/newspack-blocks-es_ES-501b38ac90d35730a620fb0d483702fa.json +1 -0
  152. package/languages/newspack-blocks-es_ES-53e2a1d5945b8d2b1c35e81ae1e532f3.json +1 -0
  153. package/languages/newspack-blocks-es_ES-5d4055f484eeb00e3ea0f9d8aace0897.json +1 -0
  154. package/languages/newspack-blocks-es_ES-5f70538e0223bc8a05b922cba67da6fb.json +1 -0
  155. package/languages/newspack-blocks-es_ES-6c2e53bab28419c30e1eaee70ba599cf.json +1 -0
  156. package/languages/newspack-blocks-es_ES-6ed95fb4873e6e2b81351177a44995f6.json +1 -0
  157. package/languages/newspack-blocks-es_ES-727631509ad8eec8e2cbe740c6dad199.json +1 -0
  158. package/languages/newspack-blocks-es_ES-73c6d3bde805172d1993f75397e9832d.json +1 -0
  159. package/languages/newspack-blocks-es_ES-78456b164809d080adecb4d2b3895802.json +1 -0
  160. package/languages/newspack-blocks-es_ES-7b1aa64ce2d962decc04666ab86c53de.json +1 -0
  161. package/languages/newspack-blocks-es_ES-7c29764d5ef91723f5ce454f66431b9e.json +1 -0
  162. package/languages/newspack-blocks-es_ES-912a2876091ef0dca9b26f3cfc01fc9c.json +1 -0
  163. package/languages/newspack-blocks-es_ES-91a7ac8017d6e2159be1c5a3c1e372e4.json +1 -0
  164. package/languages/newspack-blocks-es_ES-969286d51bb0afe10983b9aec317b5ee.json +1 -0
  165. package/languages/newspack-blocks-es_ES-9ef9b2c60c897ad79f92951e6e9949a1.json +1 -0
  166. package/languages/newspack-blocks-es_ES-a822c3d210c89af3cb7da28eaaef929c.json +1 -0
  167. package/languages/newspack-blocks-es_ES-aa9f9057c77a46b31d7e325a4322f2da.json +1 -0
  168. package/languages/newspack-blocks-es_ES-b6d3cfc30bb16d88d7bc5384bc775543.json +1 -0
  169. package/languages/newspack-blocks-es_ES-b712270cd4eb3cae7899b50b57bdd576.json +1 -0
  170. package/languages/newspack-blocks-es_ES-babcc0ca24e7f0145b1c8f647049f085.json +1 -0
  171. package/languages/newspack-blocks-es_ES-bb66d96d450663284550bed5a3e9113e.json +1 -0
  172. package/languages/newspack-blocks-es_ES-c810378e74f20906b8193ea76adb6bc0.json +1 -0
  173. package/languages/newspack-blocks-es_ES-d3a1c55a07efd1a65e227bf120840752.json +1 -0
  174. package/languages/newspack-blocks-es_ES-d5f23a52ecbfd492ebf819c14206a9e2.json +1 -0
  175. package/languages/newspack-blocks-es_ES-d684e5c5ac51934ba20811c2f588e1d5.json +1 -0
  176. package/languages/newspack-blocks-es_ES-dd56360b115d1b39c48033c1e0749a11.json +1 -0
  177. package/languages/newspack-blocks-es_ES-e0e4434aee4db01e71268ce3edf1dd97.json +1 -0
  178. package/languages/newspack-blocks-es_ES-e58126c278611ed6c17684ba8e7459b4.json +1 -0
  179. package/languages/newspack-blocks-es_ES-ea3e2a660753c7bfa13b5bbd8a46bdd0.json +1 -0
  180. package/languages/newspack-blocks-es_ES-eccbc51a43c04f59165364eda71e0be7.json +1 -0
  181. package/languages/newspack-blocks-es_ES-eeb28f99adedd5fad3081d2756d6f4a4.json +1 -0
  182. package/languages/newspack-blocks-es_ES-f03802d9ac1ae8f3b85caee4347b93a7.json +1 -0
  183. package/languages/newspack-blocks-es_ES-f32a4d8bd8f1f1e03b6523dfaa4c9f73.json +1 -0
  184. package/languages/newspack-blocks-es_ES-f5f8db76788e4079ddfa743333708b88.json +1 -0
  185. package/languages/newspack-blocks-es_ES-f8b1589c450689398f90b179f47e74ee.json +1 -0
  186. package/languages/newspack-blocks-es_ES-f9d0b05d4d6ddd3273f1f3fb2eb2ca50.json +1 -0
  187. package/languages/newspack-blocks-es_ES-fbe7f8c598cf05d4603ba49fec909ded.json +1 -0
  188. package/languages/newspack-blocks-es_ES-fcc93143c1f2b74671f595454b971f44.json +1 -0
  189. package/languages/newspack-blocks-es_ES.mo +0 -0
  190. package/languages/newspack-blocks-es_ES.po +2080 -0
  191. package/languages/newspack-blocks-fr_BE-01a5b44b8bc8d20f62541de420aa61ab.json +1 -0
  192. package/languages/newspack-blocks-fr_BE-0662222bf15e7a1a7b74db2dabb48d6c.json +1 -0
  193. package/languages/newspack-blocks-fr_BE-0c8dad524e2a57cee4f8efb6e35387c1.json +1 -0
  194. package/languages/newspack-blocks-fr_BE-10754bc02d28d4301c103f26dbf519ce.json +1 -0
  195. package/languages/newspack-blocks-fr_BE-2d52b39fdbc5d6c94b3514803f3720b8.json +1 -0
  196. package/languages/newspack-blocks-fr_BE-34e5c64f90b1444f3fc735376442eada.json +1 -0
  197. package/languages/newspack-blocks-fr_BE-351fd022e077061b5796bf7042446bfc.json +1 -0
  198. package/languages/newspack-blocks-fr_BE-37552bb09e2a9fceec1970e3c6d46557.json +1 -0
  199. package/languages/newspack-blocks-fr_BE-4b2ccb4e4dc8b3491228b2feb54872f2.json +1 -0
  200. package/languages/newspack-blocks-fr_BE-4cecf783e091d36284a3e0cdafcd0fd5.json +1 -0
  201. package/languages/newspack-blocks-fr_BE-4f16e21047908d19937bc10ced63acd1.json +1 -0
  202. package/languages/newspack-blocks-fr_BE-4fdea541976076f02d56139fb35e5b42.json +1 -0
  203. package/languages/newspack-blocks-fr_BE-501b38ac90d35730a620fb0d483702fa.json +1 -0
  204. package/languages/newspack-blocks-fr_BE-53e2a1d5945b8d2b1c35e81ae1e532f3.json +1 -0
  205. package/languages/newspack-blocks-fr_BE-5d4055f484eeb00e3ea0f9d8aace0897.json +1 -0
  206. package/languages/newspack-blocks-fr_BE-5f70538e0223bc8a05b922cba67da6fb.json +1 -0
  207. package/languages/newspack-blocks-fr_BE-6c2e53bab28419c30e1eaee70ba599cf.json +1 -0
  208. package/languages/newspack-blocks-fr_BE-6ed95fb4873e6e2b81351177a44995f6.json +1 -0
  209. package/languages/newspack-blocks-fr_BE-727631509ad8eec8e2cbe740c6dad199.json +1 -0
  210. package/languages/newspack-blocks-fr_BE-73c6d3bde805172d1993f75397e9832d.json +1 -0
  211. package/languages/newspack-blocks-fr_BE-78456b164809d080adecb4d2b3895802.json +1 -0
  212. package/languages/newspack-blocks-fr_BE-7b1aa64ce2d962decc04666ab86c53de.json +1 -0
  213. package/languages/newspack-blocks-fr_BE-7c29764d5ef91723f5ce454f66431b9e.json +1 -0
  214. package/languages/newspack-blocks-fr_BE-912a2876091ef0dca9b26f3cfc01fc9c.json +1 -0
  215. package/languages/newspack-blocks-fr_BE-91a7ac8017d6e2159be1c5a3c1e372e4.json +1 -0
  216. package/languages/newspack-blocks-fr_BE-969286d51bb0afe10983b9aec317b5ee.json +1 -0
  217. package/languages/newspack-blocks-fr_BE-9ef9b2c60c897ad79f92951e6e9949a1.json +1 -0
  218. package/languages/newspack-blocks-fr_BE-a822c3d210c89af3cb7da28eaaef929c.json +1 -0
  219. package/languages/newspack-blocks-fr_BE-aa9f9057c77a46b31d7e325a4322f2da.json +1 -0
  220. package/languages/newspack-blocks-fr_BE-b6d3cfc30bb16d88d7bc5384bc775543.json +1 -0
  221. package/languages/newspack-blocks-fr_BE-b712270cd4eb3cae7899b50b57bdd576.json +1 -0
  222. package/languages/newspack-blocks-fr_BE-babcc0ca24e7f0145b1c8f647049f085.json +1 -0
  223. package/languages/newspack-blocks-fr_BE-bb66d96d450663284550bed5a3e9113e.json +1 -0
  224. package/languages/newspack-blocks-fr_BE-c810378e74f20906b8193ea76adb6bc0.json +1 -0
  225. package/languages/newspack-blocks-fr_BE-d3a1c55a07efd1a65e227bf120840752.json +1 -0
  226. package/languages/newspack-blocks-fr_BE-d5f23a52ecbfd492ebf819c14206a9e2.json +1 -0
  227. package/languages/newspack-blocks-fr_BE-d684e5c5ac51934ba20811c2f588e1d5.json +1 -0
  228. package/languages/newspack-blocks-fr_BE-dd56360b115d1b39c48033c1e0749a11.json +1 -0
  229. package/languages/newspack-blocks-fr_BE-e0e4434aee4db01e71268ce3edf1dd97.json +1 -0
  230. package/languages/newspack-blocks-fr_BE-e58126c278611ed6c17684ba8e7459b4.json +1 -0
  231. package/languages/newspack-blocks-fr_BE-ea3e2a660753c7bfa13b5bbd8a46bdd0.json +1 -0
  232. package/languages/newspack-blocks-fr_BE-eccbc51a43c04f59165364eda71e0be7.json +1 -0
  233. package/languages/newspack-blocks-fr_BE-eeb28f99adedd5fad3081d2756d6f4a4.json +1 -0
  234. package/languages/newspack-blocks-fr_BE-f03802d9ac1ae8f3b85caee4347b93a7.json +1 -0
  235. package/languages/newspack-blocks-fr_BE-f32a4d8bd8f1f1e03b6523dfaa4c9f73.json +1 -0
  236. package/languages/newspack-blocks-fr_BE-f5f8db76788e4079ddfa743333708b88.json +1 -0
  237. package/languages/newspack-blocks-fr_BE-f8b1589c450689398f90b179f47e74ee.json +1 -0
  238. package/languages/newspack-blocks-fr_BE-f9d0b05d4d6ddd3273f1f3fb2eb2ca50.json +1 -0
  239. package/languages/newspack-blocks-fr_BE-fbe7f8c598cf05d4603ba49fec909ded.json +1 -0
  240. package/languages/newspack-blocks-fr_BE-fcc93143c1f2b74671f595454b971f44.json +1 -0
  241. package/languages/newspack-blocks-fr_BE.mo +0 -0
  242. package/languages/newspack-blocks-fr_BE.po +2079 -0
  243. package/languages/newspack-blocks-nb_NO-01a5b44b8bc8d20f62541de420aa61ab.json +1 -0
  244. package/languages/newspack-blocks-nb_NO-0662222bf15e7a1a7b74db2dabb48d6c.json +1 -0
  245. package/languages/newspack-blocks-nb_NO-0c8dad524e2a57cee4f8efb6e35387c1.json +1 -0
  246. package/languages/newspack-blocks-nb_NO-10754bc02d28d4301c103f26dbf519ce.json +1 -0
  247. package/languages/newspack-blocks-nb_NO-2d52b39fdbc5d6c94b3514803f3720b8.json +1 -0
  248. package/languages/newspack-blocks-nb_NO-34e5c64f90b1444f3fc735376442eada.json +1 -0
  249. package/languages/newspack-blocks-nb_NO-351fd022e077061b5796bf7042446bfc.json +1 -0
  250. package/languages/newspack-blocks-nb_NO-37552bb09e2a9fceec1970e3c6d46557.json +1 -0
  251. package/languages/newspack-blocks-nb_NO-4b2ccb4e4dc8b3491228b2feb54872f2.json +1 -0
  252. package/languages/newspack-blocks-nb_NO-4cecf783e091d36284a3e0cdafcd0fd5.json +1 -0
  253. package/languages/newspack-blocks-nb_NO-4f16e21047908d19937bc10ced63acd1.json +1 -0
  254. package/languages/newspack-blocks-nb_NO-4fdea541976076f02d56139fb35e5b42.json +1 -0
  255. package/languages/newspack-blocks-nb_NO-501b38ac90d35730a620fb0d483702fa.json +1 -0
  256. package/languages/newspack-blocks-nb_NO-53e2a1d5945b8d2b1c35e81ae1e532f3.json +1 -0
  257. package/languages/newspack-blocks-nb_NO-5d4055f484eeb00e3ea0f9d8aace0897.json +1 -0
  258. package/languages/newspack-blocks-nb_NO-5f70538e0223bc8a05b922cba67da6fb.json +1 -0
  259. package/languages/newspack-blocks-nb_NO-6c2e53bab28419c30e1eaee70ba599cf.json +1 -0
  260. package/languages/newspack-blocks-nb_NO-6ed95fb4873e6e2b81351177a44995f6.json +1 -0
  261. package/languages/newspack-blocks-nb_NO-73c6d3bde805172d1993f75397e9832d.json +1 -0
  262. package/languages/newspack-blocks-nb_NO-78456b164809d080adecb4d2b3895802.json +1 -0
  263. package/languages/newspack-blocks-nb_NO-7b1aa64ce2d962decc04666ab86c53de.json +1 -0
  264. package/languages/newspack-blocks-nb_NO-7c29764d5ef91723f5ce454f66431b9e.json +1 -0
  265. package/languages/newspack-blocks-nb_NO-912a2876091ef0dca9b26f3cfc01fc9c.json +1 -0
  266. package/languages/newspack-blocks-nb_NO-91a7ac8017d6e2159be1c5a3c1e372e4.json +1 -0
  267. package/languages/newspack-blocks-nb_NO-969286d51bb0afe10983b9aec317b5ee.json +1 -0
  268. package/languages/newspack-blocks-nb_NO-9ef9b2c60c897ad79f92951e6e9949a1.json +1 -0
  269. package/languages/newspack-blocks-nb_NO-a822c3d210c89af3cb7da28eaaef929c.json +1 -0
  270. package/languages/newspack-blocks-nb_NO-aa9f9057c77a46b31d7e325a4322f2da.json +1 -0
  271. package/languages/newspack-blocks-nb_NO-b6d3cfc30bb16d88d7bc5384bc775543.json +1 -0
  272. package/languages/newspack-blocks-nb_NO-b712270cd4eb3cae7899b50b57bdd576.json +1 -0
  273. package/languages/newspack-blocks-nb_NO-babcc0ca24e7f0145b1c8f647049f085.json +1 -0
  274. package/languages/newspack-blocks-nb_NO-bb66d96d450663284550bed5a3e9113e.json +1 -0
  275. package/languages/newspack-blocks-nb_NO-c810378e74f20906b8193ea76adb6bc0.json +1 -0
  276. package/languages/newspack-blocks-nb_NO-d3a1c55a07efd1a65e227bf120840752.json +1 -0
  277. package/languages/newspack-blocks-nb_NO-d5f23a52ecbfd492ebf819c14206a9e2.json +1 -0
  278. package/languages/newspack-blocks-nb_NO-d684e5c5ac51934ba20811c2f588e1d5.json +1 -0
  279. package/languages/newspack-blocks-nb_NO-dd56360b115d1b39c48033c1e0749a11.json +1 -0
  280. package/languages/newspack-blocks-nb_NO-e0e4434aee4db01e71268ce3edf1dd97.json +1 -0
  281. package/languages/newspack-blocks-nb_NO-e58126c278611ed6c17684ba8e7459b4.json +1 -0
  282. package/languages/newspack-blocks-nb_NO-ea3e2a660753c7bfa13b5bbd8a46bdd0.json +1 -0
  283. package/languages/newspack-blocks-nb_NO-eccbc51a43c04f59165364eda71e0be7.json +1 -0
  284. package/languages/newspack-blocks-nb_NO-eeb28f99adedd5fad3081d2756d6f4a4.json +1 -0
  285. package/languages/newspack-blocks-nb_NO-f03802d9ac1ae8f3b85caee4347b93a7.json +1 -0
  286. package/languages/newspack-blocks-nb_NO-f32a4d8bd8f1f1e03b6523dfaa4c9f73.json +1 -0
  287. package/languages/newspack-blocks-nb_NO-f5f8db76788e4079ddfa743333708b88.json +1 -0
  288. package/languages/newspack-blocks-nb_NO-f8b1589c450689398f90b179f47e74ee.json +1 -0
  289. package/languages/newspack-blocks-nb_NO-f9d0b05d4d6ddd3273f1f3fb2eb2ca50.json +1 -0
  290. package/languages/newspack-blocks-nb_NO-fbe7f8c598cf05d4603ba49fec909ded.json +1 -0
  291. package/languages/newspack-blocks-nb_NO-fcc93143c1f2b74671f595454b971f44.json +1 -0
  292. package/languages/newspack-blocks-nb_NO.mo +0 -0
  293. package/languages/newspack-blocks-nb_NO.po +2078 -0
  294. package/languages/newspack-blocks-pt_PT-01a5b44b8bc8d20f62541de420aa61ab.json +1 -0
  295. package/languages/newspack-blocks-pt_PT-0662222bf15e7a1a7b74db2dabb48d6c.json +1 -0
  296. package/languages/newspack-blocks-pt_PT-0c8dad524e2a57cee4f8efb6e35387c1.json +1 -0
  297. package/languages/newspack-blocks-pt_PT-10754bc02d28d4301c103f26dbf519ce.json +1 -0
  298. package/languages/newspack-blocks-pt_PT-2d52b39fdbc5d6c94b3514803f3720b8.json +1 -0
  299. package/languages/newspack-blocks-pt_PT-34e5c64f90b1444f3fc735376442eada.json +1 -0
  300. package/languages/newspack-blocks-pt_PT-351fd022e077061b5796bf7042446bfc.json +1 -0
  301. package/languages/newspack-blocks-pt_PT-37552bb09e2a9fceec1970e3c6d46557.json +1 -0
  302. package/languages/newspack-blocks-pt_PT-4b2ccb4e4dc8b3491228b2feb54872f2.json +1 -0
  303. package/languages/newspack-blocks-pt_PT-4cecf783e091d36284a3e0cdafcd0fd5.json +1 -0
  304. package/languages/newspack-blocks-pt_PT-4f16e21047908d19937bc10ced63acd1.json +1 -0
  305. package/languages/newspack-blocks-pt_PT-4fdea541976076f02d56139fb35e5b42.json +1 -0
  306. package/languages/newspack-blocks-pt_PT-501b38ac90d35730a620fb0d483702fa.json +1 -0
  307. package/languages/newspack-blocks-pt_PT-53e2a1d5945b8d2b1c35e81ae1e532f3.json +1 -0
  308. package/languages/newspack-blocks-pt_PT-5d4055f484eeb00e3ea0f9d8aace0897.json +1 -0
  309. package/languages/newspack-blocks-pt_PT-5f70538e0223bc8a05b922cba67da6fb.json +1 -0
  310. package/languages/newspack-blocks-pt_PT-6c2e53bab28419c30e1eaee70ba599cf.json +1 -0
  311. package/languages/newspack-blocks-pt_PT-6ed95fb4873e6e2b81351177a44995f6.json +1 -0
  312. package/languages/newspack-blocks-pt_PT-727631509ad8eec8e2cbe740c6dad199.json +1 -0
  313. package/languages/newspack-blocks-pt_PT-73c6d3bde805172d1993f75397e9832d.json +1 -0
  314. package/languages/newspack-blocks-pt_PT-78456b164809d080adecb4d2b3895802.json +1 -0
  315. package/languages/newspack-blocks-pt_PT-7b1aa64ce2d962decc04666ab86c53de.json +1 -0
  316. package/languages/newspack-blocks-pt_PT-7c29764d5ef91723f5ce454f66431b9e.json +1 -0
  317. package/languages/newspack-blocks-pt_PT-912a2876091ef0dca9b26f3cfc01fc9c.json +1 -0
  318. package/languages/newspack-blocks-pt_PT-91a7ac8017d6e2159be1c5a3c1e372e4.json +1 -0
  319. package/languages/newspack-blocks-pt_PT-969286d51bb0afe10983b9aec317b5ee.json +1 -0
  320. package/languages/newspack-blocks-pt_PT-9ef9b2c60c897ad79f92951e6e9949a1.json +1 -0
  321. package/languages/newspack-blocks-pt_PT-a822c3d210c89af3cb7da28eaaef929c.json +1 -0
  322. package/languages/newspack-blocks-pt_PT-aa9f9057c77a46b31d7e325a4322f2da.json +1 -0
  323. package/languages/newspack-blocks-pt_PT-b6d3cfc30bb16d88d7bc5384bc775543.json +1 -0
  324. package/languages/newspack-blocks-pt_PT-b712270cd4eb3cae7899b50b57bdd576.json +1 -0
  325. package/languages/newspack-blocks-pt_PT-babcc0ca24e7f0145b1c8f647049f085.json +1 -0
  326. package/languages/newspack-blocks-pt_PT-bb66d96d450663284550bed5a3e9113e.json +1 -0
  327. package/languages/newspack-blocks-pt_PT-c810378e74f20906b8193ea76adb6bc0.json +1 -0
  328. package/languages/newspack-blocks-pt_PT-d3a1c55a07efd1a65e227bf120840752.json +1 -0
  329. package/languages/newspack-blocks-pt_PT-d5f23a52ecbfd492ebf819c14206a9e2.json +1 -0
  330. package/languages/newspack-blocks-pt_PT-d684e5c5ac51934ba20811c2f588e1d5.json +1 -0
  331. package/languages/newspack-blocks-pt_PT-dd56360b115d1b39c48033c1e0749a11.json +1 -0
  332. package/languages/newspack-blocks-pt_PT-e0e4434aee4db01e71268ce3edf1dd97.json +1 -0
  333. package/languages/newspack-blocks-pt_PT-e58126c278611ed6c17684ba8e7459b4.json +1 -0
  334. package/languages/newspack-blocks-pt_PT-ea3e2a660753c7bfa13b5bbd8a46bdd0.json +1 -0
  335. package/languages/newspack-blocks-pt_PT-eccbc51a43c04f59165364eda71e0be7.json +1 -0
  336. package/languages/newspack-blocks-pt_PT-eeb28f99adedd5fad3081d2756d6f4a4.json +1 -0
  337. package/languages/newspack-blocks-pt_PT-f03802d9ac1ae8f3b85caee4347b93a7.json +1 -0
  338. package/languages/newspack-blocks-pt_PT-f32a4d8bd8f1f1e03b6523dfaa4c9f73.json +1 -0
  339. package/languages/newspack-blocks-pt_PT-f5f8db76788e4079ddfa743333708b88.json +1 -0
  340. package/languages/newspack-blocks-pt_PT-f8b1589c450689398f90b179f47e74ee.json +1 -0
  341. package/languages/newspack-blocks-pt_PT-f9d0b05d4d6ddd3273f1f3fb2eb2ca50.json +1 -0
  342. package/languages/newspack-blocks-pt_PT-fbe7f8c598cf05d4603ba49fec909ded.json +1 -0
  343. package/languages/newspack-blocks-pt_PT-fcc93143c1f2b74671f595454b971f44.json +1 -0
  344. package/languages/newspack-blocks-pt_PT.mo +0 -0
  345. package/languages/newspack-blocks-pt_PT.po +2078 -0
  346. package/languages/newspack-blocks.pot +2370 -0
  347. package/newspack-blocks.php +96 -0
  348. package/package.json +64 -0
  349. package/phpcs.xml +38 -0
  350. package/release.config.js +1 -0
  351. package/src/assets/placeholder-1024x536.jpg +0 -0
  352. package/src/assets/placeholder-600x800.jpg +0 -0
  353. package/src/assets/placeholder-800x600.jpg +0 -0
  354. package/src/assets/placeholder-800x800.jpg +0 -0
  355. package/src/assets/placeholder-donations-cover.jpg +0 -0
  356. package/src/assets/placeholder-donations-image.jpg +0 -0
  357. package/src/assets/placeholder-subscribe-cover.jpg +0 -0
  358. package/src/assets/placeholder-subscribe-image.jpg +0 -0
  359. package/src/block-patterns/donations-1.php +13 -0
  360. package/src/block-patterns/donations-2.php +13 -0
  361. package/src/block-patterns/donations-3.php +13 -0
  362. package/src/block-patterns/donations-4.php +13 -0
  363. package/src/block-patterns/donations-5.php +13 -0
  364. package/src/block-patterns/homepage-posts-1.php +13 -0
  365. package/src/block-patterns/homepage-posts-10.php +13 -0
  366. package/src/block-patterns/homepage-posts-11.php +13 -0
  367. package/src/block-patterns/homepage-posts-12.php +13 -0
  368. package/src/block-patterns/homepage-posts-13.php +13 -0
  369. package/src/block-patterns/homepage-posts-14.php +13 -0
  370. package/src/block-patterns/homepage-posts-15.php +13 -0
  371. package/src/block-patterns/homepage-posts-16.php +13 -0
  372. package/src/block-patterns/homepage-posts-17.php +13 -0
  373. package/src/block-patterns/homepage-posts-18.php +13 -0
  374. package/src/block-patterns/homepage-posts-19.php +13 -0
  375. package/src/block-patterns/homepage-posts-2.php +13 -0
  376. package/src/block-patterns/homepage-posts-20.php +13 -0
  377. package/src/block-patterns/homepage-posts-21.php +13 -0
  378. package/src/block-patterns/homepage-posts-22.php +13 -0
  379. package/src/block-patterns/homepage-posts-23.php +13 -0
  380. package/src/block-patterns/homepage-posts-24.php +13 -0
  381. package/src/block-patterns/homepage-posts-25.php +13 -0
  382. package/src/block-patterns/homepage-posts-26.php +13 -0
  383. package/src/block-patterns/homepage-posts-27.php +13 -0
  384. package/src/block-patterns/homepage-posts-28.php +13 -0
  385. package/src/block-patterns/homepage-posts-29.php +13 -0
  386. package/src/block-patterns/homepage-posts-3.php +13 -0
  387. package/src/block-patterns/homepage-posts-30.php +13 -0
  388. package/src/block-patterns/homepage-posts-31.php +13 -0
  389. package/src/block-patterns/homepage-posts-4.php +13 -0
  390. package/src/block-patterns/homepage-posts-5.php +13 -0
  391. package/src/block-patterns/homepage-posts-6.php +13 -0
  392. package/src/block-patterns/homepage-posts-7.php +13 -0
  393. package/src/block-patterns/homepage-posts-8.php +13 -0
  394. package/src/block-patterns/homepage-posts-9.php +13 -0
  395. package/src/block-patterns/subscribe-1.php +13 -0
  396. package/src/block-patterns/subscribe-2.php +13 -0
  397. package/src/block-patterns/subscribe-3.php +13 -0
  398. package/src/block-patterns/subscribe-4.php +13 -0
  399. package/src/block-patterns/subscribe-5.php +13 -0
  400. package/src/block-patterns/subscribe-6.php +13 -0
  401. package/src/block-patterns/subscribe-7.php +13 -0
  402. package/src/block-styles/core/columns/editor.scss +90 -0
  403. package/src/block-styles/core/columns/index.js +20 -0
  404. package/src/block-styles/core/columns/view.scss +131 -0
  405. package/src/block-styles/core/group/editor.scss +24 -0
  406. package/src/block-styles/core/group/index.js +25 -0
  407. package/src/block-styles/core/group/view.scss +13 -0
  408. package/src/block-styles/view.js +5 -0
  409. package/src/blocks/author-list/block.json +84 -0
  410. package/src/blocks/author-list/class-wp-rest-newspack-author-list-controller.php +381 -0
  411. package/src/blocks/author-list/edit.js +456 -0
  412. package/src/blocks/author-list/editor.js +7 -0
  413. package/src/blocks/author-list/editor.scss +1 -0
  414. package/src/blocks/author-list/index.js +60 -0
  415. package/src/blocks/author-list/view.js +5 -0
  416. package/src/blocks/author-list/view.php +180 -0
  417. package/src/blocks/author-list/view.scss +46 -0
  418. package/src/blocks/author-profile/README.md +105 -0
  419. package/src/blocks/author-profile/block.json +77 -0
  420. package/src/blocks/author-profile/class-wp-rest-newspack-authors-controller.php +618 -0
  421. package/src/blocks/author-profile/context.js +26 -0
  422. package/src/blocks/author-profile/edit.js +1031 -0
  423. package/src/blocks/author-profile/editor.js +7 -0
  424. package/src/blocks/author-profile/editor.scss +61 -0
  425. package/src/blocks/author-profile/index.js +66 -0
  426. package/src/blocks/author-profile/single-author.js +106 -0
  427. package/src/blocks/author-profile/templates.js +263 -0
  428. package/src/blocks/author-profile/variations.js +86 -0
  429. package/src/blocks/author-profile/view.js +5 -0
  430. package/src/blocks/author-profile/view.php +501 -0
  431. package/src/blocks/author-profile/view.scss +159 -0
  432. package/src/blocks/carousel/block.json +121 -0
  433. package/src/blocks/carousel/create-swiper.js +230 -0
  434. package/src/blocks/carousel/edit.js +469 -0
  435. package/src/blocks/carousel/editor.js +7 -0
  436. package/src/blocks/carousel/editor.scss +54 -0
  437. package/src/blocks/carousel/index.js +55 -0
  438. package/src/blocks/carousel/view.js +49 -0
  439. package/src/blocks/carousel/view.php +417 -0
  440. package/src/blocks/carousel/view.scss +397 -0
  441. package/src/blocks/checkout-button/block.json +117 -0
  442. package/src/blocks/checkout-button/deprecated.js +81 -0
  443. package/src/blocks/checkout-button/edit.js +385 -0
  444. package/src/blocks/checkout-button/edit.scss +67 -0
  445. package/src/blocks/checkout-button/editor.js +19 -0
  446. package/src/blocks/checkout-button/index.js +32 -0
  447. package/src/blocks/checkout-button/view.js +4 -0
  448. package/src/blocks/checkout-button/view.php +178 -0
  449. package/src/blocks/checkout-button/view.scss +39 -0
  450. package/src/blocks/donate/block.json +103 -0
  451. package/src/blocks/donate/consts.ts +25 -0
  452. package/src/blocks/donate/edit/FrequencyBasedLayout.tsx +255 -0
  453. package/src/blocks/donate/edit/TierBasedLayout.tsx +133 -0
  454. package/src/blocks/donate/edit/components/AmountValueInput.tsx +62 -0
  455. package/src/blocks/donate/edit/components/index.tsx +1 -0
  456. package/src/blocks/donate/edit/index.tsx +445 -0
  457. package/src/blocks/donate/editor.js +7 -0
  458. package/src/blocks/donate/frequency-based/index.ts +135 -0
  459. package/src/blocks/donate/frequency-based/style.scss +245 -0
  460. package/src/blocks/donate/frontend/class-newspack-blocks-donate-renderer-base.php +225 -0
  461. package/src/blocks/donate/frontend/class-newspack-blocks-donate-renderer-frequency-based.php +341 -0
  462. package/src/blocks/donate/frontend/class-newspack-blocks-donate-renderer-tiers-based.php +184 -0
  463. package/src/blocks/donate/frontend/class-newspack-blocks-donate-renderer.php +117 -0
  464. package/src/blocks/donate/index.js +72 -0
  465. package/src/blocks/donate/styles/editor.scss +230 -0
  466. package/src/blocks/donate/styles/style-variations.scss +792 -0
  467. package/src/blocks/donate/styles/view.scss +45 -0
  468. package/src/blocks/donate/tiers-based/index.ts +36 -0
  469. package/src/blocks/donate/tiers-based/slider.ts +64 -0
  470. package/src/blocks/donate/tiers-based/style.scss +185 -0
  471. package/src/blocks/donate/tiers-based/types.ts +3 -0
  472. package/src/blocks/donate/tiers-based/utils.test.js +38 -0
  473. package/src/blocks/donate/tiers-based/utils.ts +21 -0
  474. package/src/blocks/donate/tiers-based/view.ts +132 -0
  475. package/src/blocks/donate/types.ts +96 -0
  476. package/src/blocks/donate/utils.ts +108 -0
  477. package/src/blocks/donate/view.php +29 -0
  478. package/src/blocks/donate/view.ts +44 -0
  479. package/src/blocks/homepage-articles/block.json +260 -0
  480. package/src/blocks/homepage-articles/class-wp-rest-newspack-articles-controller.php +231 -0
  481. package/src/blocks/homepage-articles/edit.tsx +730 -0
  482. package/src/blocks/homepage-articles/editor.js +16 -0
  483. package/src/blocks/homepage-articles/editor.scss +226 -0
  484. package/src/blocks/homepage-articles/index.js +102 -0
  485. package/src/blocks/homepage-articles/store.js +193 -0
  486. package/src/blocks/homepage-articles/templates/article.php +290 -0
  487. package/src/blocks/homepage-articles/templates/articles-list.php +21 -0
  488. package/src/blocks/homepage-articles/templates/articles-loop.php +35 -0
  489. package/src/blocks/homepage-articles/utils.ts +270 -0
  490. package/src/blocks/homepage-articles/view.js +242 -0
  491. package/src/blocks/homepage-articles/view.php +561 -0
  492. package/src/blocks/homepage-articles/view.scss +784 -0
  493. package/src/blocks/iframe/block.json +36 -0
  494. package/src/blocks/iframe/class-wp-rest-newspack-iframe-controller.php +586 -0
  495. package/src/blocks/iframe/edit.js +232 -0
  496. package/src/blocks/iframe/editor.js +7 -0
  497. package/src/blocks/iframe/editor.scss +84 -0
  498. package/src/blocks/iframe/iframe-placeholder.js +166 -0
  499. package/src/blocks/iframe/index.js +54 -0
  500. package/src/blocks/iframe/view.js +49 -0
  501. package/src/blocks/iframe/view.php +116 -0
  502. package/src/blocks/iframe/view.scss +9 -0
  503. package/src/blocks/shared/author.js +47 -0
  504. package/src/blocks/video-playlist/edit.js +222 -0
  505. package/src/blocks/video-playlist/editor.js +7 -0
  506. package/src/blocks/video-playlist/editor.scss +23 -0
  507. package/src/blocks/video-playlist/index.js +54 -0
  508. package/src/blocks/video-playlist/view.php +188 -0
  509. package/src/components/autocomplete-tokenfield.js +189 -0
  510. package/src/components/autocomplete-tokenfield.scss +27 -0
  511. package/src/components/editor-panels.js +90 -0
  512. package/src/components/query-controls.js +450 -0
  513. package/src/components/redirect-after-success.tsx +50 -0
  514. package/src/modal-checkout/accessibility.js +73 -0
  515. package/src/modal-checkout/analytics/ga4/README.md +45 -0
  516. package/src/modal-checkout/analytics/ga4/checkout-attempt.js +18 -0
  517. package/src/modal-checkout/analytics/ga4/checkout-success.js +17 -0
  518. package/src/modal-checkout/analytics/ga4/dismissed.js +17 -0
  519. package/src/modal-checkout/analytics/ga4/loaded.js +17 -0
  520. package/src/modal-checkout/analytics/ga4/opened.js +37 -0
  521. package/src/modal-checkout/analytics/ga4/pagination.js +59 -0
  522. package/src/modal-checkout/analytics/ga4/utils/index.js +64 -0
  523. package/src/modal-checkout/analytics/index.js +6 -0
  524. package/src/modal-checkout/checkout.scss +1064 -0
  525. package/src/modal-checkout/index.js +929 -0
  526. package/src/modal-checkout/modal.js +983 -0
  527. package/src/modal-checkout/modal.scss +265 -0
  528. package/src/modal-checkout/templates/empty-html-add-recipient.php +15 -0
  529. package/src/modal-checkout/templates/empty-order-details.php +16 -0
  530. package/src/modal-checkout/templates/form-change-payment-method.php +99 -0
  531. package/src/modal-checkout/templates/form-checkout.php +74 -0
  532. package/src/modal-checkout/templates/form-coupon.php +22 -0
  533. package/src/modal-checkout/templates/form-gift-subscription.php +34 -0
  534. package/src/modal-checkout/templates/payment-method.php +29 -0
  535. package/src/modal-checkout/templates/thankyou.php +94 -0
  536. package/src/modal-checkout/utils.js +309 -0
  537. package/src/setup/block-styles.js +2 -0
  538. package/src/setup/category.js +18 -0
  539. package/src/setup/editor.js +7 -0
  540. package/src/setup/editor.scss +56 -0
  541. package/src/setup/newspack-logo.js +26 -0
  542. package/src/setup/placeholder-blocks.js +84 -0
  543. package/src/setup/unregister-blocks.js +14 -0
  544. package/src/shared/authors.php +63 -0
  545. package/src/shared/js/newspack-icon.js +31 -0
  546. package/src/shared/js/utils.js +50 -0
  547. package/src/shared/sass/_mixins.scss +42 -0
  548. package/src/shared/sass/_placeholder.scss +5 -0
  549. package/src/shared/sass/_preview.scss +12 -0
  550. package/src/shared/sass/_variables.scss +24 -0
  551. package/src/templates/author-profile-card.php +145 -0
  552. package/src/types/@wordpress/block-editor.d.ts +1 -0
  553. package/src/types/@wordpress/components.d.ts +1 -0
  554. package/src/types/index.d.ts +170 -0
  555. package/src/types/newspack-components.d.ts +7 -0
  556. package/tsconfig.json +7 -0
  557. package/vendor/autoload.php +22 -0
  558. package/vendor/composer/ClassLoader.php +579 -0
  559. package/vendor/composer/InstalledVersions.php +396 -0
  560. package/vendor/composer/LICENSE +21 -0
  561. package/vendor/composer/autoload_classmap.php +10 -0
  562. package/vendor/composer/autoload_namespaces.php +9 -0
  563. package/vendor/composer/autoload_psr4.php +9 -0
  564. package/vendor/composer/autoload_real.php +36 -0
  565. package/vendor/composer/autoload_static.php +20 -0
  566. package/vendor/composer/installed.json +5 -0
  567. package/vendor/composer/installed.php +23 -0
  568. package/webpack.config.js +82 -0
@@ -0,0 +1,347 @@
1
+ <?php
2
+ /**
3
+ * Register Newspack Blocks rest fields
4
+ *
5
+ * @package Newspack_Blocks
6
+ */
7
+
8
+ /**
9
+ * `Newspack_Blocks_API` is a wrapper for `register_rest_fields()`
10
+ */
11
+ class Newspack_Blocks_API {
12
+ /**
13
+ * Get thumbnail featured image source for the rest field.
14
+ *
15
+ * @param array $object_info The object info.
16
+ * @return array | bool Featured image if available, false if not.
17
+ */
18
+ public static function newspack_blocks_get_image_src( $object_info ) {
19
+ $featured_image_set = [];
20
+
21
+ if ( 0 === $object_info['featured_media'] ) {
22
+ return false;
23
+ }
24
+
25
+ // Large image.
26
+ $feat_img_array_large = wp_get_attachment_image_src(
27
+ $object_info['featured_media'],
28
+ 'large',
29
+ false
30
+ );
31
+ $featured_image_set['large'] = $feat_img_array_large[0] ?? null;
32
+
33
+ // Landscape image.
34
+ $landscape_size = Newspack_Blocks::image_size_for_orientation( 'landscape' );
35
+
36
+ $feat_img_array_landscape = wp_get_attachment_image_src(
37
+ $object_info['featured_media'],
38
+ $landscape_size,
39
+ false
40
+ );
41
+ $featured_image_set['landscape'] = $feat_img_array_landscape[0] ?? null;
42
+
43
+ // Portrait image.
44
+ $portrait_size = Newspack_Blocks::image_size_for_orientation( 'portrait' );
45
+
46
+ $feat_img_array_portrait = wp_get_attachment_image_src(
47
+ $object_info['featured_media'],
48
+ $portrait_size,
49
+ false
50
+ );
51
+ $featured_image_set['portrait'] = $feat_img_array_portrait[0] ?? null;
52
+
53
+ // Square image.
54
+ $square_size = Newspack_Blocks::image_size_for_orientation( 'square' );
55
+
56
+ $feat_img_array_square = wp_get_attachment_image_src(
57
+ $object_info['featured_media'],
58
+ $square_size,
59
+ false
60
+ );
61
+ $featured_image_set['square'] = $feat_img_array_square[0] ?? null;
62
+
63
+ // Uncropped image.
64
+ $uncropped_size = 'newspack-article-block-uncropped';
65
+
66
+ $feat_img_array_uncropped = wp_get_attachment_image_src(
67
+ $object_info['featured_media'],
68
+ $uncropped_size,
69
+ false
70
+ );
71
+ $featured_image_set['uncropped'] = $feat_img_array_uncropped[0] ?? null;
72
+
73
+ return $featured_image_set;
74
+ }
75
+
76
+ /**
77
+ * Get primary category for the rest field.
78
+ *
79
+ * @param array $object_info The object info.
80
+ * @return string Category name.
81
+ */
82
+ public static function newspack_blocks_get_primary_category( $object_info ) {
83
+ $category = false;
84
+
85
+ // Use Yoast primary category if set.
86
+ if ( class_exists( 'WPSEO_Primary_Term' ) ) {
87
+ $primary_term = new WPSEO_Primary_Term( 'category', $object_info['id'] );
88
+ $category_id = $primary_term->get_primary_term();
89
+ if ( $category_id ) {
90
+ $category = get_term( $category_id );
91
+ }
92
+ }
93
+
94
+ if ( ! $category ) {
95
+ $categories_list = get_the_category( $object_info['id'] );
96
+ if ( ! empty( $categories_list ) ) {
97
+ $category = $categories_list[0];
98
+ }
99
+ }
100
+
101
+ if ( ! $category ) {
102
+ return '';
103
+ }
104
+
105
+ $linked_category = '<a href="#">' . $category->name . '</a>';
106
+
107
+ return apply_filters( 'newspack_blocks_categories', $linked_category );
108
+ }
109
+
110
+ /**
111
+ * Get a list of category, tag classes for the rest field.
112
+ *
113
+ * @param array $object_info The object info.
114
+ * @return string classes from assigned categories and tags.
115
+ */
116
+ public static function newspack_blocks_get_cat_tag_classes( $object_info ) {
117
+ return Newspack_Blocks::get_term_classes( $object_info['id'] );
118
+ }
119
+
120
+ /**
121
+ * Get all sponsor information for the rest field.
122
+ *
123
+ * @param array $object_info The object info.
124
+ * @return array sponsor information.
125
+ */
126
+ public static function newspack_blocks_sponsor_info( $object_info ) {
127
+ $sponsors = Newspack_Blocks::get_all_sponsors(
128
+ $object_info['id'],
129
+ 'native',
130
+ 'post',
131
+ array(
132
+ 'maxwidth' => 80,
133
+ 'maxheight' => 40,
134
+ )
135
+ );
136
+ if ( ! empty( $sponsors ) ) {
137
+ $sponsor_info = [];
138
+ foreach ( $sponsors as $sponsor ) {
139
+ $sponsor_info_item = [
140
+ 'flag' => $sponsor['sponsor_flag'],
141
+ 'sponsor_name' => $sponsor['sponsor_name'],
142
+ 'sponsor_url' => $sponsor['sponsor_url'],
143
+ 'byline_prefix' => $sponsor['sponsor_byline'],
144
+ 'id' => $sponsor['sponsor_id'],
145
+ 'scope' => $sponsor['sponsor_scope'],
146
+ ];
147
+ if ( ! empty( $sponsor['sponsor_logo'] ) ) {
148
+ $sponsor_info_item['src'] = $sponsor['sponsor_logo']['src'];
149
+ $sponsor_info_item['img_width'] = $sponsor['sponsor_logo']['img_width'];
150
+ $sponsor_info_item['img_height'] = $sponsor['sponsor_logo']['img_height'];
151
+ }
152
+ $sponsor_info[] = $sponsor_info_item;
153
+ }
154
+ return $sponsor_info;
155
+ }
156
+
157
+ return false;
158
+ }
159
+
160
+ /**
161
+ * Pass whether there is a custom excerpt to the editor.
162
+ *
163
+ * @param array $object_info The object info.
164
+ * @return boolean custom excerpt status.
165
+ */
166
+ public static function newspack_blocks_has_custom_excerpt( $object_info ) {
167
+ $post_has_custom_excerpt = has_excerpt( $object_info['id'] );
168
+ return $post_has_custom_excerpt;
169
+ }
170
+
171
+ /**
172
+ * Register the video-playlist endpoint.
173
+ */
174
+ public static function register_video_playlist_endpoint() {
175
+ register_rest_route(
176
+ 'newspack-blocks/v1',
177
+ '/video-playlist',
178
+ [
179
+ 'methods' => 'GET',
180
+ 'callback' => [ 'Newspack_Blocks_API', 'video_playlist_endpoint' ],
181
+ 'permission_callback' => function() {
182
+ return current_user_can( 'edit_posts' );
183
+ },
184
+ ]
185
+ );
186
+ }
187
+
188
+ /**
189
+ * Process requests to the video-playlist endpoint.
190
+ *
191
+ * @param WP_REST_Request $request Request object.
192
+ * @return WP_REST_Response.
193
+ */
194
+ public static function video_playlist_endpoint( $request ) {
195
+ $args = $request->get_params();
196
+ return new \WP_REST_Response( newspack_blocks_get_video_playlist( $args ), 200 );
197
+ }
198
+
199
+ /**
200
+ * Posts endpoint
201
+ *
202
+ * @param WP_REST_Request $request Request object.
203
+ * @return WP_REST_Response.
204
+ */
205
+ public static function posts_endpoint( $request ) {
206
+ $attributes = $request->get_params();
207
+ $args = Newspack_Blocks::build_articles_query( $attributes, apply_filters( 'newspack_blocks_block_name', 'newspack-blocks/homepage-articles' ) );
208
+
209
+ if ( $attributes['exclude'] && count( $attributes['exclude'] ) ) {
210
+ $args['post__not_in'] = $attributes['exclude']; // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in
211
+ }
212
+
213
+ if ( $attributes['include'] && count( $attributes['include'] ) ) {
214
+ $args['post__in'] = $attributes['include'];
215
+ $args['orderby'] = 'post__in';
216
+ $args['order'] = 'ASC';
217
+ }
218
+
219
+ if ( isset( $attributes['showExcerpt'], $attributes['excerptLength'] ) ) {
220
+ $block_attributes = [
221
+ 'showExcerpt' => $attributes['showExcerpt'],
222
+ 'excerptLength' => $attributes['excerptLength'],
223
+ ];
224
+ Newspack_Blocks::filter_excerpt( $block_attributes );
225
+ }
226
+
227
+ $query = new WP_Query( $args );
228
+ $posts = [];
229
+
230
+ foreach ( $query->posts as $post ) {
231
+ $GLOBALS['post'] = $post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
232
+ setup_postdata( $post );
233
+
234
+ // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
235
+ $excerpt = apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );
236
+ $excerpt = apply_filters( 'the_excerpt', $excerpt );
237
+ $content = apply_filters( 'the_content', $post->post_content );
238
+ // phpcs:enable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
239
+
240
+ $meta = new WP_REST_Post_Meta_Fields( 'post' );
241
+ $data = [
242
+ 'author' => (int) $post->post_author,
243
+ 'content' => [
244
+ 'rendered' => post_password_required( $post ) ? '' : $content,
245
+ ],
246
+ 'date' => Newspack_Blocks::get_displayed_post_date( $post ),
247
+ 'date_formatted' => Newspack_Blocks::get_formatted_displayed_post_date( $post ),
248
+ 'article_meta_footer' => Newspack_Blocks::get_article_meta_footer( $post ),
249
+ 'excerpt' => [
250
+ 'rendered' => post_password_required( $post ) ? '' : $excerpt,
251
+ ],
252
+ 'full_content' => get_the_content( $post->ID ),
253
+ 'featured_media' => (int) get_post_thumbnail_id( $post->ID ),
254
+ 'id' => $post->ID,
255
+ 'meta' => $meta->get_value( $post->ID, $request ),
256
+ 'title' => [
257
+ 'rendered' => get_the_title( $post->ID ),
258
+ ],
259
+ ];
260
+
261
+ $sponsors = Newspack_Blocks::get_all_sponsors( $post->ID );
262
+ $author_info = Newspack_Blocks::prepare_authors();
263
+ $add_ons = [
264
+ 'newspack_article_classes' => Newspack_Blocks::get_term_classes( $data['id'] ),
265
+ 'newspack_category_info' => self::newspack_blocks_get_primary_category( $data ),
266
+ 'newspack_featured_image_caption' => Newspack_Blocks::get_image_caption( $data['featured_media'], $attributes['showCaption'], $attributes['showCredit'] ),
267
+ 'newspack_featured_image_src' => self::newspack_blocks_get_image_src( $data ),
268
+ 'newspack_has_custom_excerpt' => self::newspack_blocks_has_custom_excerpt( $data ),
269
+ 'newspack_post_sponsors' => self::newspack_blocks_sponsor_info( $data ),
270
+ 'newspack_sponsors_show_author' => Newspack_Blocks::newspack_display_sponsors_and_authors( $sponsors ),
271
+ 'newspack_sponsors_show_categories' => Newspack_Blocks::newspack_display_sponsors_and_categories( $sponsors ),
272
+ 'newspack_post_avatars' => \newspack_blocks_format_avatars( $author_info ),
273
+ 'newspack_post_byline' => \newspack_blocks_format_byline( $author_info ),
274
+ 'post_status' => $post->post_status,
275
+ 'post_type' => $post->post_type,
276
+ 'post_link' => Newspack_Blocks::get_post_link( $post->ID ),
277
+ ];
278
+
279
+ // Support Newspack Listings hide author/publish date options.
280
+ if ( class_exists( 'Newspack_Listings\Core' ) ) {
281
+ $add_ons['newspack_listings_hide_author'] = apply_filters( 'newspack_listings_hide_author', false ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
282
+ $add_ons['newspack_listings_hide_publish_date'] = apply_filters( 'newspack_listings_hide_publish_date', false ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
283
+ }
284
+
285
+ $posts[] = array_merge( $data, $add_ons );
286
+ }
287
+
288
+ Newspack_Blocks::remove_excerpt_filter();
289
+
290
+ return new \WP_REST_Response( $posts );
291
+ }
292
+
293
+ /**
294
+ * Lookup individual posts by title only.
295
+ *
296
+ * @param WP_REST_Request $request Request object.
297
+ * @return WP_REST_Response.
298
+ */
299
+ public static function specific_posts_endpoint( $request ) {
300
+ $params = $request->get_params();
301
+ if ( empty( $params['search'] ) ) {
302
+ return new \WP_REST_Response( [] );
303
+ }
304
+ add_filter( 'posts_where', [ 'Newspack_Blocks_API', 'add_post_title_wildcard_search' ], 10, 2 );
305
+
306
+ $args = [
307
+ 'post_status' => 'publish',
308
+ 'title_wildcard_search' => esc_sql( $params['search'] ),
309
+ 'posts_per_page' => $params['postsToShow'],
310
+ ];
311
+
312
+ if ( $params['postType'] && count( $params['postType'] ) ) {
313
+ $args['post_type'] = $params['postType'];
314
+ } else {
315
+ $args['post_type'] = 'post';
316
+ }
317
+
318
+ $query = new WP_Query( $args );
319
+ remove_filter( 'posts_where', [ 'Newspack_Blocks_API', 'add_post_title_wildcard_search' ], 10, 2 );
320
+ return new \WP_REST_Response(
321
+ array_map(
322
+ function( $post ) {
323
+ return [
324
+ 'id' => $post->ID,
325
+ 'title' => $post->post_title,
326
+ ];
327
+ },
328
+ $query->posts
329
+ ),
330
+ 200
331
+ );
332
+ }
333
+
334
+ /**
335
+ * Add title wildcard search to post lookup query.
336
+ *
337
+ * @param String $where Where clause.
338
+ * @param WP_Query $query The query.
339
+ */
340
+ public static function add_post_title_wildcard_search( $where, $query ) {
341
+ $search = ! empty( $query->query['title_wildcard_search'] ) ? $query->query['title_wildcard_search'] : null;
342
+ $where .= ' AND post_title LIKE "%' . $search . '%" ';
343
+ return $where;
344
+ }
345
+ }
346
+
347
+ add_action( 'rest_api_init', array( 'Newspack_Blocks_API', 'register_video_playlist_endpoint' ) );
@@ -0,0 +1,291 @@
1
+ <?php
2
+ /**
3
+ * Newspack block caching layer
4
+ *
5
+ * @package Newspack_Blocks
6
+ */
7
+
8
+ /**
9
+ * Cache dynamic blocks for improved performance.
10
+ */
11
+ class Newspack_Blocks_Caching {
12
+
13
+ const CACHE_GROUP = 'newspack_blocks';
14
+
15
+ /**
16
+ * Store the cache status for all blocks for this request.
17
+ *
18
+ * @var bool
19
+ */
20
+ private static $can_serve_all_blocks_from_cache = true;
21
+
22
+ /**
23
+ * Track visited reusable block IDs to spot recursion.
24
+ *
25
+ * @var array<int, bool>
26
+ */
27
+ private static $visited_reusable_blocks = [];
28
+
29
+ /**
30
+ * Store the current block index. This will be incremented with each cache reading,
31
+ * in order to add specificity to the cache key. The cache key consists of the
32
+ * hashed block attributes – which may be duplicated on a page – and a unique index.
33
+ * With index only, replacing the block would *not* invalidate cache, which is undesired.
34
+ * With hashed block attributes only, duplicated block configurations would result in
35
+ * duplication of rendered posts.
36
+ *
37
+ * @var int
38
+ */
39
+ private static $current_block_index = 0;
40
+
41
+ /**
42
+ * Add hooks and filters.
43
+ */
44
+ public static function init() {
45
+ add_action( 'init', [ __CLASS__, 'setup_block_caching' ] );
46
+ }
47
+
48
+ /**
49
+ * Initialize block caching if needed.
50
+ */
51
+ public static function setup_block_caching() {
52
+ if ( ! is_user_logged_in() || ! current_user_can( 'edit_posts' ) ) {
53
+ add_action( 'template_redirect', [ __CLASS__, 'check_all_blocks_cache_status' ] );
54
+ add_filter( 'pre_render_block', [ __CLASS__, 'maybe_serve_cached_block' ], 10, 2 );
55
+ add_filter( 'render_block', [ __CLASS__, 'maybe_cache_block' ], 9999, 2 );
56
+
57
+ /**
58
+ * Cache duration in seconds for Newspack blocks (Homepage Posts, etc.).
59
+ * Blocks are cached for non-logged-in users to improve performance.
60
+ * Set to 0 to disable caching.
61
+ *
62
+ * @constant NEWSPACK_BLOCKS_CACHE_BLOCKS_TIME
63
+ * @type int
64
+ * @default 120 (two minutes)
65
+ * @status draft
66
+ *
67
+ * @example define( 'NEWSPACK_BLOCKS_CACHE_BLOCKS_TIME', 300 );
68
+ */
69
+ if ( ! defined( 'NEWSPACK_BLOCKS_CACHE_BLOCKS_TIME' ) ) {
70
+ define( 'NEWSPACK_BLOCKS_CACHE_BLOCKS_TIME', 120 );
71
+ }
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Traverse all blocks on a page to check their cache status.
77
+ * This has to happen before any blocks are rendered.
78
+ */
79
+ public static function check_all_blocks_cache_status() {
80
+ if ( is_singular() ) {
81
+ $post = get_post();
82
+ if ( $post && property_exists( $post, 'post_content' ) ) {
83
+ self::$visited_reusable_blocks = [];
84
+ self::check_block_cache_status( parse_blocks( $post->post_content ) );
85
+ // Reset the index after initial checks.
86
+ self::$current_block_index = 0;
87
+ }
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Check if a block can be cached, recursively.
93
+ *
94
+ * @param array $blocks Array of block data.
95
+ */
96
+ private static function check_block_cache_status( $blocks ) {
97
+ $cacheable_block_names = self::get_cacheable_blocks_names();
98
+ foreach ( $blocks as $block_data ) {
99
+ // Special treatment for reusable blocks, which are blocks stored in the posts table.
100
+ if ( $block_data['blockName'] === 'core/block' && ! empty( $block_data['attrs']['ref'] ) ) {
101
+ $ref = $block_data['attrs']['ref'];
102
+ // Skip blocks we've seen before to avoid infinite recursion.
103
+ // Based on core's render_block_core_block().
104
+ if ( isset( self::$visited_reusable_blocks[ $ref ] ) ) {
105
+ continue;
106
+ }
107
+ self::$visited_reusable_blocks[ $ref ] = true;
108
+ $reusable_block_post = get_post( $ref );
109
+ if ( $reusable_block_post && property_exists( $reusable_block_post, 'post_content' ) ) {
110
+ self::check_block_cache_status( parse_blocks( $reusable_block_post->post_content ) );
111
+ }
112
+ unset( self::$visited_reusable_blocks[ $ref ] );
113
+ }
114
+ if ( in_array( $block_data['blockName'], $cacheable_block_names, true ) ) {
115
+ if ( ! self::get_cached_block_data( $block_data ) ) {
116
+ self::$can_serve_all_blocks_from_cache = false;
117
+ }
118
+ }
119
+ if ( ! empty( $block_data['innerBlocks'] ) ) {
120
+ self::check_block_cache_status( $block_data['innerBlocks'] );
121
+ }
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Get cacheable blocks' names.
127
+ */
128
+ public static function get_cacheable_blocks_names() {
129
+ $cacheable_blocks = [
130
+ 'newspack-blocks/homepage-articles',
131
+ 'newspack-blocks/carousel',
132
+ ];
133
+ return apply_filters( 'newspack_blocks_cacheable_blocks', $cacheable_blocks );
134
+ }
135
+
136
+ /**
137
+ * Determine whether a block should be cached.
138
+ *
139
+ * @param array $block_data Parsed block data.
140
+ * @return bool True if block should be cached. False otherwise.
141
+ */
142
+ protected static function should_cache_block( $block_data ) {
143
+ return in_array( $block_data['blockName'], self::get_cacheable_blocks_names(), true );
144
+ }
145
+
146
+ /**
147
+ * Get the cache key for a block's cache.
148
+ *
149
+ * @param array $block_data Parsed block data.
150
+ * @return string Cache key.
151
+ */
152
+ protected static function get_cache_key( $block_data ) {
153
+ $block_attributes = $block_data['attrs'];
154
+ $cache_key = 'np_cached_block_' . md5( wp_json_encode( $block_attributes ) ) . '_' . self::$current_block_index;
155
+ self::$current_block_index++;
156
+ return $cache_key;
157
+ }
158
+
159
+ /**
160
+ * Get the cache group for cached data.
161
+ *
162
+ * We're using a heuristic here to increase the rate of cache hits with very limited downside.
163
+ * Pages should each have their own cache group, because they are likely a landing page with various article blocks.
164
+ * Posts and other publicly_queryable post types should all share a cache group, because 99% of the time article blocks
165
+ * are in the sidebar, below-content, or (if within content) fetching specific posts. We want an article block in
166
+ * the e.g. sidebar to be served from cache across all posts.
167
+ *
168
+ * The tradeoff is that occasionally the current post may show up in an article block on a post.
169
+ * Archives should all use a global cache group, because there is nothing that would need de-duplication.
170
+ * Feeds have their own cache group because some blocks have (e.g. content loop) have different markup in feeds vs. site frontend.
171
+ *
172
+ * @return string Cache group.
173
+ */
174
+ protected static function get_cache_group() {
175
+ if ( is_singular() || is_front_page() ) {
176
+ $post_type = get_post_type();
177
+ $post_type_object = get_post_type_object( $post_type );
178
+ if ( ! $post_type_object->publicly_queryable ) {
179
+ return sprintf( self::CACHE_GROUP . '-post-%d', get_the_ID() );
180
+ }
181
+ return self::CACHE_GROUP;
182
+ } elseif ( is_feed() ) {
183
+ return self::CACHE_GROUP . '-feed';
184
+ } else {
185
+ return self::CACHE_GROUP;
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Debug logging for observing cache behavior.
191
+ *
192
+ * @param string $message Message to log.
193
+ */
194
+ protected static function debug_log( $message ) {
195
+ if ( defined( 'NEWSPACK_LOG_LEVEL' ) && (int) NEWSPACK_LOG_LEVEL >= 4 && class_exists( 'Newspack\Logger' ) ) {
196
+ Newspack\Logger::log( $message );
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Is the block available in the cache?
202
+ *
203
+ * @param array $block_data Parsed block data.
204
+ */
205
+ public static function get_cached_block_data( $block_data ) {
206
+ if ( ! self::should_cache_block( $block_data ) ) {
207
+ return false;
208
+ }
209
+
210
+ $cache_key = self::get_cache_key( $block_data );
211
+ $cache_group = self::get_cache_group();
212
+ self::debug_log( sprintf( 'Checking cache for item %s in group %s', $cache_key, $cache_group ) );
213
+
214
+ $cached_data = wp_cache_get( $cache_key, $cache_group );
215
+ if ( ! is_array( $cached_data ) || ! isset( $cached_data['timestamp_generated'], $cached_data['cached_content'] ) || empty( $cached_data['cached_content'] ) ) {
216
+ self::debug_log( sprintf( 'Cached data not found for item %s in group %s', $cache_key, $cache_group ) );
217
+ return false;
218
+ }
219
+
220
+ // Double-check to make sure cached data is still valid.
221
+ if ( $cached_data['timestamp_generated'] + NEWSPACK_BLOCKS_CACHE_BLOCKS_TIME < time() ) {
222
+ if ( class_exists( 'Newspack\Logger' ) ) {
223
+ Newspack\Logger::log( sprintf( 'Flushing cache for item %s in group %s because it expired', $cache_key, $cache_group ) );
224
+ }
225
+ wp_cache_delete( $cache_key, $cache_group );
226
+ return false;
227
+ }
228
+ self::debug_log( sprintf( 'Found cached block: item %s in group %s', $cache_key, $cache_group ) );
229
+ return $cached_data;
230
+ }
231
+
232
+ /**
233
+ * Serve a cached block if a valid one exists.
234
+ *
235
+ * @param string|null $block_html Block HTML. If you return something non-null here it will short-circuit block rendering.
236
+ * @param array $block_data Parsed block data.
237
+ * @return string|null Block markup if served from cache. Default (usually null), otherwise.
238
+ */
239
+ public static function maybe_serve_cached_block( $block_html, $block_data ) {
240
+ if ( ! self::should_cache_block( $block_data ) ) {
241
+ return $block_html;
242
+ }
243
+
244
+ // Equeue the styles needed to render the blocks.
245
+ newspack_blocks_enqueue_block_homepage_articles_styles();
246
+
247
+ if ( ! self::$can_serve_all_blocks_from_cache ) {
248
+ return $block_html;
249
+ }
250
+ $cached_data = self::get_cached_block_data( $block_data );
251
+ if ( ! $cached_data ) {
252
+ return $block_html;
253
+ }
254
+
255
+ if ( 'newspack-blocks/homepage-articles' === $block_data['blockName'] ) {
256
+ Newspack_Blocks::enqueue_view_assets( 'homepage-articles' );
257
+ } elseif ( 'newspack-blocks/carousel' === $block_data['blockName'] ) {
258
+ Newspack_Blocks::enqueue_view_assets( 'carousel' );
259
+ }
260
+
261
+ return $cached_data['cached_content'];
262
+ }
263
+
264
+ /**
265
+ * Save the block markup to cache. If we've reached this function, that means that the
266
+ * rendering wasn't short-circuited by a cached version, so we always cache here.
267
+ *
268
+ * @param string $block_html Block markup ready for rendering.
269
+ * @param array $block_data Parsed block data.
270
+ * @return string Unmodified $block_html.
271
+ */
272
+ public static function maybe_cache_block( $block_html, $block_data ) {
273
+ if ( ! self::should_cache_block( $block_data ) ) {
274
+ return $block_html;
275
+ }
276
+
277
+ $cache_key = self::get_cache_key( $block_data );
278
+ $cache_group = self::get_cache_group();
279
+
280
+ $cache_data = [
281
+ 'timestamp_generated' => time(),
282
+ 'cached_content' => $block_html,
283
+ ];
284
+ wp_cache_set( $cache_key, $cache_data, $cache_group, NEWSPACK_BLOCKS_CACHE_BLOCKS_TIME ); // phpcs:ignore WordPressVIPMinimum.Performance.LowExpiryCacheTime.CacheTimeUndetermined
285
+
286
+ self::debug_log( sprintf( 'Caching block: item %s in group %s', $cache_key, $cache_group ) );
287
+
288
+ return $block_html;
289
+ }
290
+ }
291
+ Newspack_Blocks_Caching::init();