@automattic/newspack-blocks 1.37.0 → 1.48.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 (292) hide show
  1. package/.cache/babel/00255e6096be9e31ec354db849dfefaa.json.gz +0 -0
  2. package/.cache/babel/0265bee20d709ac92f56456637727f4b.json.gz +0 -0
  3. package/.cache/babel/02986ba19dc461a152ea1c45f3f36a27.json.gz +0 -0
  4. package/.cache/babel/06a1700c1a4a989fc7886c86bf6223f7.json.gz +0 -0
  5. package/.cache/babel/07169c73863508b392f15022920bd0b6.json.gz +0 -0
  6. package/.cache/babel/0a5083e561829e3884cb5c71388adc3f.json.gz +0 -0
  7. package/.cache/babel/0a713997b6e4f45849ed6a4bff79cca5.json.gz +0 -0
  8. package/.cache/babel/0a9506bf649ffbe854e75459cf6b8972.json.gz +0 -0
  9. package/.cache/babel/0c12c4398bbbf2d771b13dd1d0e64097.json.gz +0 -0
  10. package/.cache/babel/0f8c18da204f4cc2777ca3191f10c309.json.gz +0 -0
  11. package/.cache/babel/0fced15ed787cc4239bb53c1d12892e6.json.gz +0 -0
  12. package/.cache/babel/10faf7c74a89e9aa4d8b9528a654913e.json.gz +0 -0
  13. package/.cache/babel/1353b411b65a123b5dc35012db11aa1d.json.gz +0 -0
  14. package/.cache/babel/1729336f326db1cf54b9c1671dc5e36c.json.gz +0 -0
  15. package/.cache/babel/17a433ab631a32d0712f3f75cf85ea99.json.gz +0 -0
  16. package/.cache/babel/1948e72d907f681ff771881ad6800ee1.json.gz +0 -0
  17. package/.cache/babel/1ab4bf44aa14d2eb7e6911900a3b2c12.json.gz +0 -0
  18. package/.cache/babel/1decfd137cac87a75bd83ffbd39c9106.json.gz +0 -0
  19. package/.cache/babel/2143ceff6d186bc13bc902e0f1f33dbf.json.gz +0 -0
  20. package/.cache/babel/23c63332718e167968a7c2a8a5f730eb.json.gz +0 -0
  21. package/.cache/babel/24bf53676e12293cbf88d01e649fd167.json.gz +0 -0
  22. package/.cache/babel/26ba0bb46844575022e54a8819fbf405.json.gz +0 -0
  23. package/.cache/babel/281ca171ce8947f87f574df11059e00b.json.gz +0 -0
  24. package/.cache/babel/28700b83434e4dbfb9a20d7ec0a7e7a4.json.gz +0 -0
  25. package/.cache/babel/29cf8eeea8630ade027e34459f2e49ee.json.gz +0 -0
  26. package/.cache/babel/2b0dd254a46223a93e6259d2b797a7e7.json.gz +0 -0
  27. package/.cache/babel/2da6786ede3ddda4c86eeac524a6a796.json.gz +0 -0
  28. package/.cache/babel/2e7ce10fdee94274b48d528f94c32b34.json.gz +0 -0
  29. package/.cache/babel/2f93fed1706a40d82122281cc3677074.json.gz +0 -0
  30. package/.cache/babel/3a59b710e9745ef93148d6d74ee7d16f.json.gz +0 -0
  31. package/.cache/babel/3b2c440027c793c8f7978d7622cbfca0.json.gz +0 -0
  32. package/.cache/babel/3ca939ace4af88e266942d93837ab37a.json.gz +0 -0
  33. package/.cache/babel/3e671670c4d395cd1804ef4be31955e4.json.gz +0 -0
  34. package/.cache/babel/3e69fe002d9973c0030152a51da9477a.json.gz +0 -0
  35. package/.cache/babel/3f5f8ea603fd57850c6683c750fe53d8.json.gz +0 -0
  36. package/.cache/babel/41abaaadb68b0657a95fa0c356873def.json.gz +0 -0
  37. package/.cache/babel/421ac952d6b472ba18e1cb95ef65f42a.json.gz +0 -0
  38. package/.cache/babel/424185dd50e91d8dee5fdae43086010e.json.gz +0 -0
  39. package/.cache/babel/427a6423ebde76bcb488747127e47351.json.gz +0 -0
  40. package/.cache/babel/43e800659f23430a181fb4fc328eb6ef.json.gz +0 -0
  41. package/.cache/babel/469651017a2b6f3b9f63fda034974b3a.json.gz +0 -0
  42. package/.cache/babel/480d26447b7ee019a37e4e18422403e9.json.gz +0 -0
  43. package/.cache/babel/4b58fad313d90a4c1577a2766e6c924c.json.gz +0 -0
  44. package/.cache/babel/4d2d42fea63650192d1a3a5648b621c5.json.gz +0 -0
  45. package/.cache/babel/4d8c26a76e77fa64d01f30a5f2d62f85.json.gz +0 -0
  46. package/.cache/babel/4f606ce6656565507a74aaac8dc21eea.json.gz +0 -0
  47. package/.cache/babel/505f37592f4c601ccdc1581ca89d9009.json.gz +0 -0
  48. package/.cache/babel/50aaf34aa54b2cd3058518e42850bb62.json.gz +0 -0
  49. package/.cache/babel/51fbf389462feb111228ba7ec64c631d.json.gz +0 -0
  50. package/.cache/babel/51fc90ae5fe129a095172032f304dc2c.json.gz +0 -0
  51. package/.cache/babel/53dbf5484c5601528c2fd8d7fe728b78.json.gz +0 -0
  52. package/.cache/babel/58e4535574062eb2d8fa56d002e7190d.json.gz +0 -0
  53. package/.cache/babel/5aa5e8d1492938c62999de022c4b220e.json.gz +0 -0
  54. package/.cache/babel/5d64e475284e52c104df17e26066b17b.json.gz +0 -0
  55. package/.cache/babel/6333c664d69f13036f42bcf575c8e65d.json.gz +0 -0
  56. package/.cache/babel/635c439786b8522888342779b28ee9ee.json.gz +0 -0
  57. package/.cache/babel/648cffdd5ec4a2446f8935a17b98080b.json.gz +0 -0
  58. package/.cache/babel/64b0dd478e6f2dd51de5ee20e311aee7.json.gz +0 -0
  59. package/.cache/babel/6531721abbc0b3906b28b268ed7914af.json.gz +0 -0
  60. package/.cache/babel/66bf5585c7901a76c7d4014fa9ffed40.json.gz +0 -0
  61. package/.cache/babel/6ef313cb6d3a59f73a6b78e1a729fb13.json.gz +0 -0
  62. package/.cache/babel/6f14eed506421f15710d3dfafe3dcd93.json.gz +0 -0
  63. package/.cache/babel/70f6c01d8c6bc3efc41c97eaf49f7617.json.gz +0 -0
  64. package/.cache/babel/72321dde68f0bb9c334d90d6f4584be8.json.gz +0 -0
  65. package/.cache/babel/76c815fab58595f57e01af6591791d57.json.gz +0 -0
  66. package/.cache/babel/7c10f4d554daa8efe1e0a4457fb6d27b.json.gz +0 -0
  67. package/.cache/babel/7dffccddd9780ab37fb79f809947c2cd.json.gz +0 -0
  68. package/.cache/babel/7e5162e3319cd5d6fca6c0db0516aaeb.json.gz +0 -0
  69. package/.cache/babel/803192c922f7d419648bab7e1201b22e.json.gz +0 -0
  70. package/.cache/babel/81f3f0f896d29cdf88f8543dedb77787.json.gz +0 -0
  71. package/.cache/babel/84c019d3d643195fb37d08110f15f8c9.json.gz +0 -0
  72. package/.cache/babel/853c31db7c4351f2f36d1021c667224d.json.gz +0 -0
  73. package/.cache/babel/88ec99735ea4f314937736f04360ff8c.json.gz +0 -0
  74. package/.cache/babel/8959ab8fcfa783cb56e9418b99c0951c.json.gz +0 -0
  75. package/.cache/babel/8b9624d721f8706682e33fe1853c8287.json.gz +0 -0
  76. package/.cache/babel/8de5c373bbc4b6fbeec373d582935887.json.gz +0 -0
  77. package/.cache/babel/8f24517cff634d2e91c19e51be8816cc.json.gz +0 -0
  78. package/.cache/babel/901e1bb823eca196b594baa35a35a81c.json.gz +0 -0
  79. package/.cache/babel/90dbc666ff9fa3b88f305fe90a9917bf.json.gz +0 -0
  80. package/.cache/babel/91b62dfd9475df7a39dc08fbd43847f9.json.gz +0 -0
  81. package/.cache/babel/956daf27323e3b87bf8bf9bbf58881ed.json.gz +0 -0
  82. package/.cache/babel/959e9b81103c539a9d85ac60955451b9.json.gz +0 -0
  83. package/.cache/babel/963b1e44be998c4dcc6845745c377369.json.gz +0 -0
  84. package/.cache/babel/966b41ac1317b3e03ca1e59f7eb57e8c.json.gz +0 -0
  85. package/.cache/babel/969d5992cc682e3b43761ef02c10b851.json.gz +0 -0
  86. package/.cache/babel/99df128bb528d0f95a56b311801d14c1.json.gz +0 -0
  87. package/.cache/babel/9b33e7d21f3fc4955a536a033cced71b.json.gz +0 -0
  88. package/.cache/babel/9c5ec84f77314a621c01ad77da7ccb58.json.gz +0 -0
  89. package/.cache/babel/9d325af12a88623602a5f8c2fce04847.json.gz +0 -0
  90. package/.cache/babel/a413e4d325543836d0800684bb26ed04.json.gz +0 -0
  91. package/.cache/babel/a5405f86b8d1485e62a125275507e60f.json.gz +0 -0
  92. package/.cache/babel/a7f7461321ca6fd4360df04bb894c106.json.gz +0 -0
  93. package/.cache/babel/a8a6812e1c7b65cc6d0bdebe2a35c8ca.json.gz +0 -0
  94. package/.cache/babel/aa89cfc4c88fcc465b8d74af824e7f6b.json.gz +0 -0
  95. package/.cache/babel/adbaeb5ddf5612b3dcd233a3f6f17bf2.json.gz +0 -0
  96. package/.cache/babel/ae18cd6ec42a3366c73435b62a9f5f70.json.gz +0 -0
  97. package/.cache/babel/aea149ee1ec6fa3ca7839c63f5edd78d.json.gz +0 -0
  98. package/.cache/babel/af1b34067a69854e109c0b0e45d90e43.json.gz +0 -0
  99. package/.cache/babel/b3a335ab950f502914013810b43b0ad5.json.gz +0 -0
  100. package/.cache/babel/b6cfba15cda3404d4b1041df448ed2b2.json.gz +0 -0
  101. package/.cache/babel/ba711530bd319618a0510d8361bebb45.json.gz +0 -0
  102. package/.cache/babel/ba77e682225df6126b636458055601d9.json.gz +0 -0
  103. package/.cache/babel/bab8189a74eee8d72702d1510b52b3b3.json.gz +0 -0
  104. package/.cache/babel/bd8741020db56bb5d999252812d1d717.json.gz +0 -0
  105. package/.cache/babel/beaa874c5e01203d9dbe23cb89405276.json.gz +0 -0
  106. package/.cache/babel/c196c9b8c21953c474acdaa9029b3cbf.json.gz +0 -0
  107. package/.cache/babel/c1e31e6c217023eb3d3fd5d3de486ac3.json.gz +0 -0
  108. package/.cache/babel/c3aa996443e7f377aa423bcc03ffc617.json.gz +0 -0
  109. package/.cache/babel/c481eae84d69b65405a44af442dbfea7.json.gz +0 -0
  110. package/.cache/babel/c4a817d6c4bf6eb3687ffccc5c2df801.json.gz +0 -0
  111. package/.cache/babel/c8b10cf6f706fb669d6dd7564385768d.json.gz +0 -0
  112. package/.cache/babel/caa2f98ba4af6eba0605543f690693c6.json.gz +0 -0
  113. package/.cache/babel/cada4b2cecb2c1fcc48b7a7ecda54907.json.gz +0 -0
  114. package/.cache/babel/d1bed5404789c427c32965ac6ecad0d9.json.gz +0 -0
  115. package/.cache/babel/d395e8c0a9c63680f2dcf90ca0e91d4a.json.gz +0 -0
  116. package/.cache/babel/d4672090e0dd9a73bfb00bd770b23643.json.gz +0 -0
  117. package/.cache/babel/d4c81f65fe6d78cdbdcf1ef901b7ba1b.json.gz +0 -0
  118. package/.cache/babel/d515ddc0797ea256ff7271507737e9ce.json.gz +0 -0
  119. package/.cache/babel/d742848d263503f79168f1a6b8a52097.json.gz +0 -0
  120. package/.cache/babel/d834b41d7028519ecd0cbc8c65d33dde.json.gz +0 -0
  121. package/.cache/babel/d9060b9162e7caf974db0b90b6134727.json.gz +0 -0
  122. package/.cache/babel/d946975b9beac51a39f600461e84b1b6.json.gz +0 -0
  123. package/.cache/babel/daf0af780cff2270b1ae0e4b97a5a4ab.json.gz +0 -0
  124. package/.cache/babel/db5215643b0737dc5245972a5c25f736.json.gz +0 -0
  125. package/.cache/babel/dd57b8d31664b147b9f1e3f5cd18cc2a.json.gz +0 -0
  126. package/.cache/babel/e0c78bdaae19f15e2dd4a773e842422b.json.gz +0 -0
  127. package/.cache/babel/e1a2c7e4fc3afe9cc6e03d60f4e4a23d.json.gz +0 -0
  128. package/.cache/babel/e210ff9aa99df972b8d81c4bda70f642.json.gz +0 -0
  129. package/.cache/babel/e259a73f84d5b92b94e6d094719264c3.json.gz +0 -0
  130. package/.cache/babel/e6ce03a9908c9c4dc2c723531f1073f6.json.gz +0 -0
  131. package/.cache/babel/e8a1501dd8e4b3389ecdc8f722622359.json.gz +0 -0
  132. package/.cache/babel/eb3bb371036da362c42db50248d0b180.json.gz +0 -0
  133. package/.cache/babel/eb854e03c810bdb969497b2a36119bfa.json.gz +0 -0
  134. package/.cache/babel/ec25bb53826070b7f301e64f02355b8c.json.gz +0 -0
  135. package/.cache/babel/edbaca20e4a65f850c3d8321c1945718.json.gz +0 -0
  136. package/.cache/babel/f059f1ca9e49d5c3e655d20339860dce.json.gz +0 -0
  137. package/.cache/babel/f24c559fb42ef906405966598baf5f80.json.gz +0 -0
  138. package/.cache/babel/f2f333c3c546ad711d722d782decd450.json.gz +0 -0
  139. package/.cache/babel/f42c854ce8f1dc1a6e6fe7c510b033a5.json.gz +0 -0
  140. package/.cache/babel/f5211608f22c2e12594eafdbc4e66aa5.json.gz +0 -0
  141. package/.cache/babel/f645b8c88a49718cd778e3595212d4eb.json.gz +0 -0
  142. package/.cache/babel/f66dda5c4e4e9d04eb6b7411fcb12a65.json.gz +0 -0
  143. package/.cache/babel/f9d5b6f3f5438342dba75c2ce6143eef.json.gz +0 -0
  144. package/.cache/babel/fc9c60ee1d2e8783ba4c08db5cf97d40.json.gz +0 -0
  145. package/.cache/babel/fd558798cea72d04fb826468a89d72aa.json.gz +0 -0
  146. package/.cache/babel/fe735cbd0f6e131e28d8b6eb1f39141b.json.gz +0 -0
  147. package/.eslintrc.js +3 -26
  148. package/.nvmrc +1 -0
  149. package/CHANGELOG.md +422 -0
  150. package/babel.config.js +6 -0
  151. package/block-list.json +1 -1
  152. package/composer.json +2 -2
  153. package/composer.lock +446 -161
  154. package/dist/author-list/view.asset.php +1 -0
  155. package/dist/author-list/view.css +1 -0
  156. package/dist/author-list/view.js +1 -0
  157. package/dist/author-list/view.rtl.css +1 -0
  158. package/dist/author-profile/view.asset.php +1 -0
  159. package/dist/author-profile/view.css +1 -0
  160. package/dist/author-profile/view.js +1 -0
  161. package/dist/author-profile/view.rtl.css +1 -0
  162. package/dist/block_styles.asset.php +1 -0
  163. package/dist/block_styles.css +1 -0
  164. package/dist/block_styles.js +1 -0
  165. package/dist/block_styles.rtl.css +1 -0
  166. package/dist/carousel/view.asset.php +1 -0
  167. package/dist/carousel/view.css +1 -0
  168. package/dist/carousel/view.js +1 -0
  169. package/dist/carousel/view.rtl.css +1 -0
  170. package/dist/donate/view.asset.php +1 -0
  171. package/dist/donate/view.css +1 -0
  172. package/dist/donate/view.js +1 -0
  173. package/dist/donate/view.rtl.css +1 -0
  174. package/dist/donateStreamlined.asset.php +1 -0
  175. package/dist/donateStreamlined.css +1 -0
  176. package/dist/donateStreamlined.js +1 -0
  177. package/dist/donateStreamlined.rtl.css +1 -0
  178. package/dist/editor.asset.php +1 -0
  179. package/dist/editor.css +1 -0
  180. package/dist/editor.js +41 -0
  181. package/dist/editor.rtl.css +1 -0
  182. package/dist/homepage-articles/view.asset.php +1 -0
  183. package/dist/homepage-articles/view.css +1 -0
  184. package/dist/homepage-articles/view.js +1 -0
  185. package/dist/homepage-articles/view.rtl.css +1 -0
  186. package/dist/iframe/view.asset.php +1 -0
  187. package/dist/iframe/view.css +1 -0
  188. package/dist/iframe/view.js +1 -0
  189. package/dist/iframe/view.rtl.css +1 -0
  190. package/includes/class-newspack-blocks-api.php +14 -69
  191. package/includes/class-newspack-blocks-patterns.php +4 -1
  192. package/includes/class-newspack-blocks.php +421 -95
  193. package/newspack-blocks.php +26 -2
  194. package/package.json +31 -129
  195. package/postcss.config.js +11 -0
  196. package/src/block-patterns/subscribe-2.php +1 -1
  197. package/src/block-patterns/subscribe-3.php +1 -1
  198. package/src/block-patterns/subscribe-7.php +12 -0
  199. package/src/block-patterns/subscribe-8.php +12 -0
  200. package/src/block-patterns/subscribe-9.php +12 -0
  201. package/src/block-styles/core/columns/editor.scss +5 -8
  202. package/src/block-styles/core/columns/view.scss +83 -42
  203. package/src/blocks/author-list/block.json +82 -0
  204. package/src/blocks/author-list/class-wp-rest-newspack-author-list-controller.php +387 -0
  205. package/src/blocks/author-list/edit.js +527 -0
  206. package/src/blocks/author-list/editor.js +7 -0
  207. package/src/blocks/author-list/editor.scss +1 -0
  208. package/src/blocks/author-list/index.js +45 -0
  209. package/src/blocks/author-list/view.js +5 -0
  210. package/src/blocks/author-list/view.php +175 -0
  211. package/src/blocks/author-list/view.scss +46 -0
  212. package/src/blocks/author-profile/block.json +8 -0
  213. package/src/blocks/author-profile/class-wp-rest-newspack-authors-controller.php +69 -14
  214. package/src/blocks/author-profile/edit.js +212 -189
  215. package/src/blocks/author-profile/editor.scss +1 -1
  216. package/src/blocks/author-profile/single-author.js +100 -0
  217. package/src/blocks/author-profile/view.php +38 -92
  218. package/src/blocks/author-profile/view.scss +120 -1
  219. package/src/blocks/carousel/create-swiper.js +14 -5
  220. package/src/blocks/carousel/edit.js +4 -2
  221. package/src/blocks/carousel/editor.scss +3 -12
  222. package/src/blocks/carousel/view.js +1 -1
  223. package/src/blocks/carousel/view.php +9 -5
  224. package/src/blocks/carousel/view.scss +29 -3
  225. package/src/blocks/donate/class-wp-rest-newspack-donate-controller.php +22 -24
  226. package/src/blocks/donate/edit.js +49 -42
  227. package/src/blocks/donate/editor.scss +27 -3
  228. package/src/blocks/donate/index.js +31 -4
  229. package/src/blocks/donate/streamlined/index.js +248 -0
  230. package/src/blocks/donate/streamlined/index.test.js +125 -0
  231. package/src/blocks/donate/streamlined/style.scss +324 -0
  232. package/src/blocks/donate/streamlined/utils.js +174 -0
  233. package/src/blocks/donate/streamlined/utils.test.js +18 -0
  234. package/src/blocks/donate/view.php +77 -36
  235. package/src/blocks/donate/view.scss +291 -0
  236. package/src/blocks/homepage-articles/block.json +8 -0
  237. package/src/blocks/homepage-articles/class-wp-rest-newspack-articles-controller.php +24 -78
  238. package/src/blocks/homepage-articles/edit.js +26 -0
  239. package/src/blocks/homepage-articles/store.js +11 -1
  240. package/src/blocks/homepage-articles/templates/article.php +31 -3
  241. package/src/blocks/homepage-articles/templates/articles-loop.php +6 -5
  242. package/src/blocks/homepage-articles/utils.js +11 -10
  243. package/src/blocks/homepage-articles/view.php +4 -1
  244. package/src/blocks/homepage-articles/view.scss +69 -24
  245. package/src/blocks/iframe/block.json +34 -0
  246. package/src/blocks/iframe/class-wp-rest-newspack-iframe-controller.php +345 -0
  247. package/src/blocks/iframe/edit.js +252 -0
  248. package/src/blocks/iframe/editor.js +7 -0
  249. package/src/blocks/iframe/editor.scss +84 -0
  250. package/src/blocks/iframe/icons.js +10 -0
  251. package/src/blocks/iframe/iframe-placeholder.js +180 -0
  252. package/src/blocks/iframe/index.js +48 -0
  253. package/src/blocks/iframe/view.js +5 -0
  254. package/src/blocks/iframe/view.php +130 -0
  255. package/src/blocks/iframe/view.scss +9 -0
  256. package/src/blocks/video-playlist/view.php +4 -3
  257. package/src/components/query-controls.js +5 -4
  258. package/src/setup/editor.js +0 -1
  259. package/src/shared/js/utils.js +1 -1
  260. package/src/templates/author-profile-card.php +99 -0
  261. package/vendor/autoload.php +7 -0
  262. package/vendor/composer/ClassLoader.php +572 -0
  263. package/vendor/composer/InstalledVersions.php +350 -0
  264. package/vendor/composer/LICENSE +21 -0
  265. package/vendor/composer/autoload_classmap.php +10 -0
  266. package/vendor/composer/autoload_namespaces.php +9 -0
  267. package/vendor/composer/autoload_psr4.php +9 -0
  268. package/vendor/composer/autoload_real.php +55 -0
  269. package/vendor/composer/autoload_static.php +20 -0
  270. package/vendor/composer/installed.json +5 -0
  271. package/vendor/composer/installed.php +23 -0
  272. package/webpack.config.js +2 -3
  273. package/.circleci/config.yml +0 -96
  274. package/.distignore +0 -36
  275. package/.editorconfig +0 -22
  276. package/.github/ISSUE_TEMPLATE/Bug_report.md +0 -21
  277. package/.github/ISSUE_TEMPLATE/Enhancement.md +0 -17
  278. package/.github/ISSUE_TEMPLATE/Feature_request.md +0 -17
  279. package/.github/PULL_REQUEST_TEMPLATE.md +0 -29
  280. package/.github/workflows/main.yml +0 -15
  281. package/.phpcs.xml.dist +0 -55
  282. package/.prettierrc +0 -10
  283. package/.stylelintrc +0 -21
  284. package/.travis.yml +0 -67
  285. package/phpunit.xml.dist +0 -16
  286. package/src/blocks/author-profile/shared.scss +0 -95
  287. package/src/blocks/donate/streamlined.js +0 -180
  288. package/src/blocks/donate/streamlined.scss +0 -124
  289. package/src/setup/public-path.js +0 -13
  290. package/src/setup/view.js +0 -4
  291. package/tests/bootstrap.php +0 -31
  292. package/tests/test-sample.php +0 -20
@@ -256,26 +256,6 @@
256
256
  width: 100% !important;
257
257
  }
258
258
 
259
- figcaption {
260
- bottom: 1em;
261
- /* autoprefixer: ignore next */
262
- -webkit-box-orient: vertical;
263
- color: rgba( white, 0.9 );
264
- display: -webkit-box;
265
- font-style: italic;
266
- left: 0;
267
- -webkit-line-clamp: 1;
268
- margin: 0;
269
- max-height: 1.6em;
270
- overflow: hidden;
271
- padding: 0 1em;
272
- position: absolute;
273
- right: 0;
274
- text-align: right;
275
- text-overflow: ellipsis;
276
- z-index: 2;
277
- }
278
-
279
259
  &::after {
280
260
  background: rgba( 0, 0, 0, 0.5 );
281
261
  bottom: 0;
@@ -289,12 +269,13 @@
289
269
  }
290
270
 
291
271
  .entry-wrapper {
292
- padding: 2em 1em;
272
+ padding: 2rem 1rem;
293
273
  position: relative;
274
+ width: 100%;
294
275
  z-index: 2;
295
276
 
296
277
  @include media( desktop ) {
297
- padding: 2em 1.5em;
278
+ padding: 2rem 1.5rem;
298
279
  }
299
280
  }
300
281
 
@@ -306,6 +287,30 @@
306
287
  color: #fff;
307
288
  }
308
289
  }
290
+
291
+ figcaption {
292
+ bottom: 1em;
293
+ /* autoprefixer: ignore next */
294
+ -webkit-box-orient: vertical;
295
+ color: rgba( white, 0.9 );
296
+ display: -webkit-box;
297
+ font-style: italic;
298
+ left: 0;
299
+ -webkit-line-clamp: 1;
300
+ margin: 0;
301
+ max-height: 1.6em;
302
+ overflow: hidden;
303
+ padding: 0 1rem;
304
+ position: absolute;
305
+ right: 0;
306
+ text-align: right;
307
+ text-overflow: ellipsis;
308
+ z-index: 2;
309
+
310
+ @include media( desktop ) {
311
+ padding: 0 1.5rem;
312
+ }
313
+ }
309
314
  }
310
315
 
311
316
  /* "More" button & related elements styles */
@@ -352,6 +357,46 @@
352
357
  position: relative;
353
358
  width: auto;
354
359
  }
360
+
361
+ // Ensure centre alignment when selected.
362
+ &.has-text-align-center {
363
+ .cat-links,
364
+ .entry-meta,
365
+ .sponsor-logos {
366
+ justify-content: center;
367
+ }
368
+
369
+ .sponsor-logos > * {
370
+ margin: 0;
371
+ }
372
+
373
+ &.image-alignbehind figcaption,
374
+ figcaption {
375
+ text-align: inherit;
376
+ }
377
+ }
378
+
379
+ // Ensure right alignment when selected.
380
+ &.has-text-align-right {
381
+ .cat-links,
382
+ .entry-meta,
383
+ .sponsor-logos {
384
+ justify-content: flex-end;
385
+ }
386
+
387
+ figcaption {
388
+ text-align: inherit;
389
+ }
390
+
391
+ .entry-date:not( :first-child ) {
392
+ margin-left: 1.5em;
393
+ }
394
+
395
+ .entry-meta .byline:not( :last-child ),
396
+ .sponsor-logos > * {
397
+ margin: 0;
398
+ }
399
+ }
355
400
  }
356
401
 
357
402
  /* stylelint-disable selector-type-no-unknown */
@@ -410,7 +455,7 @@ amp-script .wpnbha {
410
455
  &.ts-9,
411
456
  &.ts-8 {
412
457
  .entry-title {
413
- line-height: 1.1em;
458
+ line-height: 1.1;
414
459
  }
415
460
  @include media( tablet ) {
416
461
  article .avatar {
@@ -691,7 +736,7 @@ amp-script .wpnbha {
691
736
  &--in-homepage-block {
692
737
  margin-top: 0.3em;
693
738
  margin-bottom: 0;
694
- line-height: 1.4em;
739
+ line-height: 1.4;
695
740
  font-style: italic;
696
741
  }
697
742
  }
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "iframe",
3
+ "category": "newspack",
4
+ "attributes": {
5
+ "className": {
6
+ "type": "string",
7
+ "default": ""
8
+ },
9
+ "src": {
10
+ "type": "string",
11
+ "default": ""
12
+ },
13
+ "archiveFolder": {
14
+ "type": "string",
15
+ "default": ""
16
+ },
17
+ "height": {
18
+ "type": "string",
19
+ "default": "600px"
20
+ },
21
+ "width": {
22
+ "type": "string",
23
+ "default": "100%"
24
+ },
25
+ "isFullScreen": {
26
+ "type": "boolean",
27
+ "default": false
28
+ },
29
+ "mode": {
30
+ "type": "string",
31
+ "default": "iframe"
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,345 @@
1
+ <?php
2
+ /**
3
+ * WP_REST_Newspack_Iframe_Controller file.
4
+ *
5
+ * @package WordPress
6
+ */
7
+
8
+ // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound
9
+
10
+ /**
11
+ * Class WP_REST_Newspack_Iframe_Controller.
12
+ */
13
+ class WP_REST_Newspack_Iframe_Controller extends WP_REST_Controller {
14
+ const IFRAME_UPLOAD_DIR = '/newspack_iframes/';
15
+ const IFRAME_ENTRY_FILE = 'index.html';
16
+
17
+ /**
18
+ * Constructs the controller.
19
+ *
20
+ * @access public
21
+ */
22
+ public function __construct() {
23
+ $this->namespace = 'newspack-blocks/v1';
24
+ $this->rest_base = 'iframe';
25
+ }
26
+
27
+ /**
28
+ * Registers the necessary REST API routes.
29
+ *
30
+ * @access public
31
+ */
32
+ public function register_routes() {
33
+ register_rest_route(
34
+ $this->namespace,
35
+ '/newspack-blocks-iframe-archive',
36
+ [
37
+ [
38
+ 'methods' => WP_REST_Server::EDITABLE,
39
+ 'callback' => [ $this, 'import_iframe_from_uploaded_file' ],
40
+ 'permission_callback' => function() {
41
+ return current_user_can( 'edit_posts' );
42
+ },
43
+ ],
44
+ ]
45
+ );
46
+
47
+ register_rest_route(
48
+ $this->namespace,
49
+ '/newspack-blocks-iframe-archive-from-media',
50
+ [
51
+ [
52
+ 'methods' => WP_REST_Server::EDITABLE,
53
+ 'callback' => [ $this, 'import_iframe_archive_from_media_library' ],
54
+ 'permission_callback' => function() {
55
+ return current_user_can( 'edit_posts' );
56
+ },
57
+ ],
58
+ ]
59
+ );
60
+
61
+ register_rest_route(
62
+ $this->namespace,
63
+ '/newspack-blocks-iframe-mode-from-url',
64
+ [
65
+ [
66
+ 'methods' => WP_REST_Server::EDITABLE,
67
+ 'callback' => [ $this, 'get_iframe_mode_from_url' ],
68
+ 'permission_callback' => function() {
69
+ return current_user_can( 'edit_posts' );
70
+ },
71
+ ],
72
+ ]
73
+ );
74
+
75
+ register_rest_route(
76
+ $this->namespace,
77
+ '/newspack-blocks-remove-iframe-archive',
78
+ [
79
+ [
80
+ 'methods' => WP_REST_Server::DELETABLE,
81
+ 'callback' => [ $this, 'remove_iframe_archive' ],
82
+ 'permission_callback' => function() {
83
+ return current_user_can( 'edit_posts' );
84
+ },
85
+ ],
86
+ ]
87
+ );
88
+ }
89
+
90
+ /**
91
+ * Receive the iframe content, handle it, and returns the URL and the folder name.
92
+ *
93
+ * @param WP_REST_Request $request Request object.
94
+ * @return WP_REST_Response
95
+ */
96
+ public function import_iframe_from_uploaded_file( $request ) {
97
+ $response = [];
98
+ $files = $request->get_file_params();
99
+
100
+ if ( count( $files ) > 0 && array_key_exists( 'iframe_file', $files ) ) {
101
+ $iframe_file = $files['iframe_file'];
102
+ $iframe_folder = pathinfo( $iframe_file['name'] )['filename'] . '-' . wp_generate_password( 8, false );
103
+
104
+ if ( in_array( $iframe_file['type'], array_keys( Newspack_Blocks::iframe_document_accepted_file_mimes() ), true ) ) {
105
+ $file_extension = pathinfo( $iframe_file['name'], PATHINFO_EXTENSION );
106
+ $response = $this->process_iframe_document( $request, "$iframe_folder.$file_extension", $iframe_file['tmp_name'] );
107
+ } elseif ( in_array( $iframe_file['type'], array_keys( Newspack_Blocks::iframe_archive_accepted_file_mimes() ), true ) ) {
108
+ $response = $this->process_iframe_archive( $request, $iframe_folder, $iframe_file['tmp_name'] );
109
+ } else {
110
+ $response = new WP_Error(
111
+ 'newspack_blocks',
112
+ __( 'Could not find the iframe file on your request.', 'newspack-blocks' ),
113
+ [ 'status' => '400' ]
114
+ );
115
+ }
116
+ } else {
117
+ $response = new WP_Error(
118
+ 'newspack_blocks',
119
+ __( 'Could not find the iframe file on your request.', 'newspack-blocks' ),
120
+ [ 'status' => '400' ]
121
+ );
122
+ }
123
+
124
+ return rest_ensure_response( $response );
125
+ }
126
+
127
+ /**
128
+ * Receive the iframe archive, unzip it, and returns the URL and the folder name.
129
+ *
130
+ * @param WP_REST_Request $request Request object.
131
+ * @return WP_REST_Response
132
+ */
133
+ public function import_iframe_archive_from_media_library( $request ) {
134
+ $response = [];
135
+ $data = $request->get_body_params();
136
+
137
+ if ( array_key_exists( 'media_id', $data ) ) {
138
+ $media = get_post( $data['media_id'] );
139
+ $media_path = get_attached_file( $data['media_id'] );
140
+
141
+ if ( $media_path && in_array( $media->post_mime_type, array_keys( Newspack_Blocks::iframe_document_accepted_file_mimes() ), true ) ) {
142
+ $iframe_folder = $media->post_title . '-' . wp_generate_password( 8, false );
143
+ $file_extension = Newspack_Blocks::iframe_document_accepted_file_mimes()[ $media->post_mime_type ];
144
+
145
+ $response = $this->process_iframe_document( $request, "$iframe_folder.$file_extension", $media_path );
146
+ } elseif ( $media_path && in_array( $media->post_mime_type, array_keys( Newspack_Blocks::iframe_archive_accepted_file_mimes() ), true ) ) {
147
+ $iframe_folder = $media->post_title . '-' . wp_generate_password( 8, false );
148
+
149
+ $response = $this->process_iframe_archive( $request, $iframe_folder, $media_path );
150
+ } else {
151
+ $response = new WP_Error(
152
+ 'newspack_blocks',
153
+ __( 'Please choose a valid (.zip) assets archive.', 'newspack-blocks' ),
154
+ [ 'status' => '400' ]
155
+ );
156
+ }
157
+ } else {
158
+ $response = new WP_Error(
159
+ 'newspack_blocks',
160
+ __( 'Please choose a valid (.zip) assets archive.', 'newspack-blocks' ),
161
+ [ 'status' => '400' ]
162
+ );
163
+ }
164
+
165
+ return rest_ensure_response( $response );
166
+ }
167
+
168
+ /**
169
+ * Receive the iframe content, handle it, and returns the URL and the folder name.
170
+ *
171
+ * @param WP_REST_Request $request Request object.
172
+ * @return WP_REST_Response
173
+ */
174
+ public function get_iframe_mode_from_url( $request ) {
175
+ $data = $request->get_body_params();
176
+ $mode = 'iframe';
177
+
178
+ // If we need to remove the previous document, it's a good place to do it here.
179
+ if ( array_key_exists( 'iframe_url', $data ) && ! empty( $data['iframe_url'] ) ) {
180
+ $content_type = wp_remote_head( $data['iframe_url'] )['headers']->offsetGet( 'content-type' );
181
+ if ( in_array( $content_type, array_keys( Newspack_Blocks::iframe_document_accepted_file_mimes() ), true ) ) {
182
+ $mode = 'document';
183
+ }
184
+ }
185
+
186
+ return rest_ensure_response( [ 'mode' => $mode ] );
187
+ }
188
+
189
+ /**
190
+ * Process iframe source from uploaded document file or from media file.
191
+ *
192
+ * @param WP_REST_REQUEST $request Request object.
193
+ * @param string $document_filename Document filename.
194
+ * @param string $media_source_path iframe assets zip file path.
195
+ * @return WP_REST_Response
196
+ */
197
+ private function process_iframe_document( $request, $document_filename, $media_source_path ) {
198
+ $wp_upload_dir = wp_upload_dir();
199
+ $iframe_upload_dir = $wp_upload_dir['path'] . self::IFRAME_UPLOAD_DIR;
200
+ $iframe_path = $iframe_upload_dir . $document_filename;
201
+ $data = $request->get_body_params();
202
+
203
+ // Create iframe directory if not existing.
204
+ if ( ! file_exists( $iframe_upload_dir ) ) {
205
+ wp_mkdir_p( $iframe_upload_dir );
206
+ }
207
+
208
+ // If we need to remove the previous document, it's a good place to do it here.
209
+ if ( array_key_exists( 'archive_folder', $data ) && ! empty( $data['archive_folder'] ) ) {
210
+ $this->remove_folder( $wp_upload_dir['basedir'] . $data['archive_folder'] );
211
+ }
212
+
213
+ // Copy uploaded document file to destination.
214
+ if ( copy( $media_source_path, $iframe_path ) ) {
215
+ return [
216
+ 'mode' => 'document',
217
+ 'src' => $wp_upload_dir['url'] . self::IFRAME_UPLOAD_DIR . $document_filename,
218
+ 'dir' => path_join( $wp_upload_dir['subdir'] . self::IFRAME_UPLOAD_DIR, $document_filename ),
219
+ ];
220
+ }
221
+
222
+ return new WP_Error(
223
+ 'newspack_blocks',
224
+ __( 'Could not upload your document.', 'newspack-blocks' ),
225
+ [ 'status' => '400' ]
226
+ );
227
+ }
228
+
229
+ /**
230
+ * Process iframe archive from uploaded zip or from media file.
231
+ *
232
+ * @param WP_REST_REQUEST $request Request object.
233
+ * @param string $iframe_folder where to extract the iframe assets.
234
+ * @param string $media_path iframe assets zip file path.
235
+ * @return WP_REST_Response
236
+ */
237
+ private function process_iframe_archive( $request, $iframe_folder, $media_path ) {
238
+ $wp_upload_dir = wp_upload_dir();
239
+ $iframe_upload_dir = $wp_upload_dir['path'] . self::IFRAME_UPLOAD_DIR;
240
+ $iframe_path = $iframe_upload_dir . $iframe_folder;
241
+ $data = $request->get_body_params();
242
+
243
+ // create iframe directory if not existing.
244
+ if ( ! file_exists( $iframe_upload_dir ) ) {
245
+ wp_mkdir_p( $iframe_upload_dir );
246
+ }
247
+
248
+ // unzip iframe archive.
249
+ $zip = new ZipArchive();
250
+ $res = $zip->open( $media_path );
251
+
252
+ if ( true === $res ) {
253
+ $zip->extractTo( $iframe_path );
254
+ $zip->close();
255
+
256
+ // check if iframe entry file is there.
257
+ if ( file_exists( path_join( $iframe_path, self::IFRAME_ENTRY_FILE ) ) ) {
258
+ $response = [
259
+ 'mode' => 'iframe',
260
+ 'src' => $wp_upload_dir['url'] . self::IFRAME_UPLOAD_DIR . $iframe_folder . DIRECTORY_SEPARATOR,
261
+ 'dir' => path_join( $wp_upload_dir['subdir'] . self::IFRAME_UPLOAD_DIR, $iframe_folder ),
262
+ ];
263
+
264
+ // if we need to remove the previous archive, it's a good place to do it here.
265
+ if ( array_key_exists( 'archive_folder', $data ) && ! empty( $data['archive_folder'] ) ) {
266
+ $this->remove_folder( $wp_upload_dir['basedir'] . $data['archive_folder'] );
267
+ }
268
+ } else {
269
+ // check if its not a one folder archive: archive.zip > archive > index.html.
270
+ $archive_folders = array_values(
271
+ array_filter(
272
+ glob( "$iframe_path/*", GLOB_ONLYDIR ),
273
+ function( $file ) {
274
+ return false === strpos( $file, '__MACOSX' );
275
+ }
276
+ )
277
+ );
278
+
279
+ if ( 1 === count( $archive_folders ) && file_exists( path_join( $archive_folders[0], self::IFRAME_ENTRY_FILE ) ) ) {
280
+ $response = [
281
+ 'mode' => 'iframe',
282
+ 'src' => $wp_upload_dir['url'] . self::IFRAME_UPLOAD_DIR . $iframe_folder . DIRECTORY_SEPARATOR . basename( $archive_folders[0] ) . DIRECTORY_SEPARATOR,
283
+ 'dir' => path_join( $wp_upload_dir['subdir'] . self::IFRAME_UPLOAD_DIR, $iframe_folder . DIRECTORY_SEPARATOR ),
284
+ ];
285
+
286
+ // if we need to remove the previous archive, it's a good place to do it here.
287
+ if ( array_key_exists( 'archive_folder', $data ) && ! empty( $data['archive_folder'] ) ) {
288
+ $this->remove_folder( $wp_upload_dir['basedir'] . $data['archive_folder'] );
289
+ }
290
+ } else {
291
+ // if not, remove the uploaded archive data and raise an error.
292
+ $this->remove_folder( $iframe_path );
293
+
294
+ $response = new WP_Error(
295
+ 'newspack_blocks',
296
+ /* translators: %s: iframe entry file (e.g. index,html) */
297
+ sprintf( __( '%s was not found in the iframe archive.', 'newspack-blocks' ), self::IFRAME_ENTRY_FILE ),
298
+ [ 'status' => '400' ]
299
+ );
300
+ }
301
+ }
302
+ } else {
303
+ $response = new WP_Error(
304
+ 'newspack_blocks',
305
+ __( "Could not unzip the iframe archive, make sure it's a valid .zip archive file.", 'newspack-blocks' ),
306
+ [ 'status' => '400' ]
307
+ );
308
+ }
309
+
310
+ return $response;
311
+ }
312
+
313
+ /**
314
+ * Delete iframe archive, this is called when changing the iframe source.
315
+ *
316
+ * @param WP_REST_Request $request Request object.
317
+ * @return WP_REST_Response
318
+ */
319
+ public function remove_iframe_archive( $request ) {
320
+ $wp_upload_dir = wp_upload_dir();
321
+ $data = $request->get_json_params();
322
+
323
+ if ( array_key_exists( 'archive_folder', $data ) && ! empty( $data['archive_folder'] ) ) {
324
+ $this->remove_folder( $wp_upload_dir['basedir'] . $data['archive_folder'] );
325
+ }
326
+
327
+ return rest_ensure_response( [] );
328
+ }
329
+
330
+ /**
331
+ * Remove a folder. Called to remove the iframe archive folder.
332
+ *
333
+ * @param string $folder folder path to remove.
334
+ * @return void
335
+ */
336
+ private function remove_folder( $folder ) {
337
+ if ( ! class_exists( 'WP_Filesystem_Direct' ) ) {
338
+ require_once ABSPATH . '/wp-admin/includes/class-wp-filesystem-base.php';
339
+ require_once ABSPATH . '/wp-admin/includes/class-wp-filesystem-direct.php';
340
+ }
341
+
342
+ $file_system = new WP_Filesystem_Direct( false );
343
+ $file_system->rmdir( $folder, true );
344
+ }
345
+ }