@wordpress/edit-site 5.26.0 → 5.27.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 (330) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/actions/index.js +139 -36
  3. package/build/components/actions/index.js.map +1 -1
  4. package/build/components/editor-canvas-container/index.js +1 -1
  5. package/build/components/editor-canvas-container/index.js.map +1 -1
  6. package/build/components/global-styles/font-families.js +3 -2
  7. package/build/components/global-styles/font-families.js.map +1 -1
  8. package/build/components/global-styles/font-family-item.js +3 -4
  9. package/build/components/global-styles/font-family-item.js.map +1 -1
  10. package/build/components/global-styles/font-library-modal/context.js +80 -41
  11. package/build/components/global-styles/font-library-modal/context.js.map +1 -1
  12. package/build/components/global-styles/font-library-modal/font-collection.js +49 -22
  13. package/build/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  14. package/build/components/global-styles/font-library-modal/fonts-grid.js +4 -1
  15. package/build/components/global-styles/font-library-modal/fonts-grid.js.map +1 -1
  16. package/build/components/global-styles/font-library-modal/index.js +4 -4
  17. package/build/components/global-styles/font-library-modal/index.js.map +1 -1
  18. package/build/components/global-styles/font-library-modal/installed-fonts.js +16 -8
  19. package/build/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  20. package/build/components/global-styles/font-library-modal/library-font-card.js +1 -1
  21. package/build/components/global-styles/font-library-modal/library-font-card.js.map +1 -1
  22. package/build/components/global-styles/font-library-modal/library-font-variant.js +2 -2
  23. package/build/components/global-styles/font-library-modal/library-font-variant.js.map +1 -1
  24. package/build/components/global-styles/font-library-modal/local-fonts.js +13 -4
  25. package/build/components/global-styles/font-library-modal/local-fonts.js.map +1 -1
  26. package/build/components/global-styles/font-library-modal/resolvers.js +49 -20
  27. package/build/components/global-styles/font-library-modal/resolvers.js.map +1 -1
  28. package/build/components/global-styles/font-library-modal/utils/filter-fonts.js +17 -2
  29. package/build/components/global-styles/font-library-modal/utils/filter-fonts.js.map +1 -1
  30. package/build/components/global-styles/font-library-modal/utils/index.js +103 -17
  31. package/build/components/global-styles/font-library-modal/utils/index.js.map +1 -1
  32. package/build/components/global-styles/font-library-modal/utils/preview-styles.js +4 -3
  33. package/build/components/global-styles/font-library-modal/utils/preview-styles.js.map +1 -1
  34. package/build/components/global-styles/screen-typography.js +4 -1
  35. package/build/components/global-styles/screen-typography.js.map +1 -1
  36. package/build/components/layout/hooks.js +6 -5
  37. package/build/components/layout/hooks.js.map +1 -1
  38. package/build/components/layout/index.js +19 -28
  39. package/build/components/layout/index.js.map +1 -1
  40. package/build/components/layout/router.js +135 -0
  41. package/build/components/layout/router.js.map +1 -0
  42. package/build/components/page-pages/index.js +92 -69
  43. package/build/components/page-pages/index.js.map +1 -1
  44. package/build/components/page-patterns/dataviews-pattern-actions.js +11 -6
  45. package/build/components/page-patterns/dataviews-pattern-actions.js.map +1 -1
  46. package/build/components/page-patterns/index.js +295 -15
  47. package/build/components/page-patterns/index.js.map +1 -1
  48. package/build/components/{page-templates/template-actions.js → page-templates-template-parts/actions.js} +51 -23
  49. package/build/components/page-templates-template-parts/actions.js.map +1 -0
  50. package/build/components/page-templates-template-parts/add-new-template-part.js.map +1 -0
  51. package/build/components/page-templates-template-parts/index.js +395 -0
  52. package/build/components/page-templates-template-parts/index.js.map +1 -0
  53. package/build/components/preferences-modal/index.js +9 -134
  54. package/build/components/preferences-modal/index.js.map +1 -1
  55. package/build/components/revisions/index.js +1 -1
  56. package/build/components/revisions/index.js.map +1 -1
  57. package/build/components/save-button/index.js +4 -2
  58. package/build/components/save-button/index.js.map +1 -1
  59. package/build/components/save-panel/index.js +6 -5
  60. package/build/components/save-panel/index.js.map +1 -1
  61. package/build/components/sidebar/index.js +3 -1
  62. package/build/components/sidebar/index.js.map +1 -1
  63. package/build/components/sidebar-dataviews/dataview-item.js +3 -1
  64. package/build/components/sidebar-dataviews/dataview-item.js.map +1 -1
  65. package/build/components/sidebar-dataviews/default-views.js +4 -2
  66. package/build/components/sidebar-dataviews/default-views.js.map +1 -1
  67. package/build/components/sidebar-dataviews/index.js +2 -2
  68. package/build/components/sidebar-dataviews/index.js.map +1 -1
  69. package/build/components/sidebar-navigation-screen/index.js +8 -7
  70. package/build/components/sidebar-navigation-screen/index.js.map +1 -1
  71. package/build/components/sidebar-navigation-screen-pages/index.js +2 -10
  72. package/build/components/sidebar-navigation-screen-pages/index.js.map +1 -1
  73. package/build/components/sidebar-navigation-screen-pages-dataviews/index.js +26 -3
  74. package/build/components/sidebar-navigation-screen-pages-dataviews/index.js.map +1 -1
  75. package/build/components/sidebar-navigation-screen-templates/index.js +63 -8
  76. package/build/components/sidebar-navigation-screen-templates/index.js.map +1 -1
  77. package/build/components/sidebar-navigation-screen-templates-browse/content.js +76 -0
  78. package/build/components/sidebar-navigation-screen-templates-browse/content.js.map +1 -0
  79. package/build/components/sidebar-navigation-screen-templates-browse/index.js +9 -2
  80. package/build/components/sidebar-navigation-screen-templates-browse/index.js.map +1 -1
  81. package/build/components/site-hub/index.js +3 -1
  82. package/build/components/site-hub/index.js.map +1 -1
  83. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js +47 -12
  84. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  85. package/build/components/sync-state-with-url/use-sync-path-with-url.js +25 -2
  86. package/build/components/sync-state-with-url/use-sync-path-with-url.js.map +1 -1
  87. package/build/hooks/commands/use-edit-mode-commands.js +33 -5
  88. package/build/hooks/commands/use-edit-mode-commands.js.map +1 -1
  89. package/build/hooks/push-changes-to-global-styles/index.js +13 -6
  90. package/build/hooks/push-changes-to-global-styles/index.js.map +1 -1
  91. package/build/hooks/template-part-edit.js +7 -6
  92. package/build/hooks/template-part-edit.js.map +1 -1
  93. package/build/index.js +1 -1
  94. package/build/index.js.map +1 -1
  95. package/build/store/actions.js +11 -29
  96. package/build/store/actions.js.map +1 -1
  97. package/build/store/private-actions.js +85 -1
  98. package/build/store/private-actions.js.map +1 -1
  99. package/build/store/selectors.js +2 -2
  100. package/build/store/selectors.js.map +1 -1
  101. package/build/utils/get-is-list-page.js +1 -1
  102. package/build/utils/get-is-list-page.js.map +1 -1
  103. package/build/utils/use-actual-current-theme.js +32 -0
  104. package/build/utils/use-actual-current-theme.js.map +1 -0
  105. package/build-module/components/actions/index.js +139 -36
  106. package/build-module/components/actions/index.js.map +1 -1
  107. package/build-module/components/editor-canvas-container/index.js +1 -1
  108. package/build-module/components/editor-canvas-container/index.js.map +1 -1
  109. package/build-module/components/global-styles/font-families.js +3 -2
  110. package/build-module/components/global-styles/font-families.js.map +1 -1
  111. package/build-module/components/global-styles/font-family-item.js +4 -5
  112. package/build-module/components/global-styles/font-family-item.js.map +1 -1
  113. package/build-module/components/global-styles/font-library-modal/context.js +82 -42
  114. package/build-module/components/global-styles/font-library-modal/context.js.map +1 -1
  115. package/build-module/components/global-styles/font-library-modal/font-collection.js +49 -22
  116. package/build-module/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  117. package/build-module/components/global-styles/font-library-modal/fonts-grid.js +4 -1
  118. package/build-module/components/global-styles/font-library-modal/fonts-grid.js.map +1 -1
  119. package/build-module/components/global-styles/font-library-modal/index.js +4 -4
  120. package/build-module/components/global-styles/font-library-modal/index.js.map +1 -1
  121. package/build-module/components/global-styles/font-library-modal/installed-fonts.js +16 -8
  122. package/build-module/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  123. package/build-module/components/global-styles/font-library-modal/library-font-card.js +1 -1
  124. package/build-module/components/global-styles/font-library-modal/library-font-card.js.map +1 -1
  125. package/build-module/components/global-styles/font-library-modal/library-font-variant.js +2 -2
  126. package/build-module/components/global-styles/font-library-modal/library-font-variant.js.map +1 -1
  127. package/build-module/components/global-styles/font-library-modal/local-fonts.js +13 -4
  128. package/build-module/components/global-styles/font-library-modal/local-fonts.js.map +1 -1
  129. package/build-module/components/global-styles/font-library-modal/resolvers.js +45 -18
  130. package/build-module/components/global-styles/font-library-modal/resolvers.js.map +1 -1
  131. package/build-module/components/global-styles/font-library-modal/utils/filter-fonts.js +17 -2
  132. package/build-module/components/global-styles/font-library-modal/utils/filter-fonts.js.map +1 -1
  133. package/build-module/components/global-styles/font-library-modal/utils/index.js +99 -16
  134. package/build-module/components/global-styles/font-library-modal/utils/index.js.map +1 -1
  135. package/build-module/components/global-styles/font-library-modal/utils/preview-styles.js +4 -3
  136. package/build-module/components/global-styles/font-library-modal/utils/preview-styles.js.map +1 -1
  137. package/build-module/components/global-styles/screen-typography.js +4 -1
  138. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  139. package/build-module/components/layout/hooks.js +6 -5
  140. package/build-module/components/layout/hooks.js.map +1 -1
  141. package/build-module/components/layout/index.js +19 -28
  142. package/build-module/components/layout/index.js.map +1 -1
  143. package/build-module/components/layout/router.js +127 -0
  144. package/build-module/components/layout/router.js.map +1 -0
  145. package/build-module/components/page-pages/index.js +91 -70
  146. package/build-module/components/page-pages/index.js.map +1 -1
  147. package/build-module/components/page-patterns/dataviews-pattern-actions.js +11 -6
  148. package/build-module/components/page-patterns/dataviews-pattern-actions.js.map +1 -1
  149. package/build-module/components/page-patterns/index.js +296 -16
  150. package/build-module/components/page-patterns/index.js.map +1 -1
  151. package/build-module/components/{page-templates/template-actions.js → page-templates-template-parts/actions.js} +52 -24
  152. package/build-module/components/page-templates-template-parts/actions.js.map +1 -0
  153. package/build-module/components/page-templates-template-parts/add-new-template-part.js.map +1 -0
  154. package/build-module/components/page-templates-template-parts/index.js +385 -0
  155. package/build-module/components/page-templates-template-parts/index.js.map +1 -0
  156. package/build-module/components/preferences-modal/index.js +12 -136
  157. package/build-module/components/preferences-modal/index.js.map +1 -1
  158. package/build-module/components/revisions/index.js +1 -1
  159. package/build-module/components/revisions/index.js.map +1 -1
  160. package/build-module/components/save-button/index.js +4 -2
  161. package/build-module/components/save-button/index.js.map +1 -1
  162. package/build-module/components/save-panel/index.js +7 -6
  163. package/build-module/components/save-panel/index.js.map +1 -1
  164. package/build-module/components/sidebar/index.js +3 -1
  165. package/build-module/components/sidebar/index.js.map +1 -1
  166. package/build-module/components/sidebar-dataviews/dataview-item.js +3 -1
  167. package/build-module/components/sidebar-dataviews/dataview-item.js.map +1 -1
  168. package/build-module/components/sidebar-dataviews/default-views.js +4 -2
  169. package/build-module/components/sidebar-dataviews/default-views.js.map +1 -1
  170. package/build-module/components/sidebar-dataviews/index.js +2 -2
  171. package/build-module/components/sidebar-dataviews/index.js.map +1 -1
  172. package/build-module/components/sidebar-navigation-screen/index.js +8 -7
  173. package/build-module/components/sidebar-navigation-screen/index.js.map +1 -1
  174. package/build-module/components/sidebar-navigation-screen-pages/index.js +2 -10
  175. package/build-module/components/sidebar-navigation-screen-pages/index.js.map +1 -1
  176. package/build-module/components/sidebar-navigation-screen-pages-dataviews/index.js +27 -4
  177. package/build-module/components/sidebar-navigation-screen-pages-dataviews/index.js.map +1 -1
  178. package/build-module/components/sidebar-navigation-screen-templates/index.js +64 -9
  179. package/build-module/components/sidebar-navigation-screen-templates/index.js.map +1 -1
  180. package/build-module/components/sidebar-navigation-screen-templates-browse/content.js +68 -0
  181. package/build-module/components/sidebar-navigation-screen-templates-browse/content.js.map +1 -0
  182. package/build-module/components/sidebar-navigation-screen-templates-browse/index.js +9 -2
  183. package/build-module/components/sidebar-navigation-screen-templates-browse/index.js.map +1 -1
  184. package/build-module/components/site-hub/index.js +3 -1
  185. package/build-module/components/site-hub/index.js.map +1 -1
  186. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js +47 -11
  187. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  188. package/build-module/components/sync-state-with-url/use-sync-path-with-url.js +25 -2
  189. package/build-module/components/sync-state-with-url/use-sync-path-with-url.js.map +1 -1
  190. package/build-module/hooks/commands/use-edit-mode-commands.js +33 -5
  191. package/build-module/hooks/commands/use-edit-mode-commands.js.map +1 -1
  192. package/build-module/hooks/push-changes-to-global-styles/index.js +13 -6
  193. package/build-module/hooks/push-changes-to-global-styles/index.js.map +1 -1
  194. package/build-module/hooks/template-part-edit.js +7 -6
  195. package/build-module/hooks/template-part-edit.js.map +1 -1
  196. package/build-module/index.js +1 -1
  197. package/build-module/index.js.map +1 -1
  198. package/build-module/store/actions.js +13 -30
  199. package/build-module/store/actions.js.map +1 -1
  200. package/build-module/store/private-actions.js +83 -0
  201. package/build-module/store/private-actions.js.map +1 -1
  202. package/build-module/store/selectors.js +2 -2
  203. package/build-module/store/selectors.js.map +1 -1
  204. package/build-module/utils/get-is-list-page.js +1 -1
  205. package/build-module/utils/get-is-list-page.js.map +1 -1
  206. package/build-module/utils/use-actual-current-theme.js +24 -0
  207. package/build-module/utils/use-actual-current-theme.js.map +1 -0
  208. package/build-style/style-rtl.css +302 -188
  209. package/build-style/style.css +302 -188
  210. package/package.json +42 -42
  211. package/src/components/actions/index.js +236 -84
  212. package/src/components/editor-canvas-container/index.js +1 -1
  213. package/src/components/global-styles/font-families.js +14 -8
  214. package/src/components/global-styles/font-family-item.js +7 -4
  215. package/src/components/global-styles/font-library-modal/context.js +156 -50
  216. package/src/components/global-styles/font-library-modal/font-collection.js +56 -21
  217. package/src/components/global-styles/font-library-modal/fonts-grid.js +6 -2
  218. package/src/components/global-styles/font-library-modal/index.js +4 -4
  219. package/src/components/global-styles/font-library-modal/installed-fonts.js +18 -8
  220. package/src/components/global-styles/font-library-modal/library-font-card.js +2 -1
  221. package/src/components/global-styles/font-library-modal/library-font-variant.js +10 -9
  222. package/src/components/global-styles/font-library-modal/local-fonts.js +14 -4
  223. package/src/components/global-styles/font-library-modal/resolvers.js +50 -17
  224. package/src/components/global-styles/font-library-modal/style.scss +1 -0
  225. package/src/components/global-styles/font-library-modal/utils/filter-fonts.js +19 -2
  226. package/src/components/global-styles/font-library-modal/utils/index.js +136 -29
  227. package/src/components/global-styles/font-library-modal/utils/preview-styles.js +7 -3
  228. package/src/components/global-styles/font-library-modal/utils/test/filter-fonts.spec.js +40 -10
  229. package/src/components/global-styles/font-library-modal/utils/test/preview-styles.spec.js +5 -5
  230. package/src/components/global-styles/screen-typography.js +9 -3
  231. package/src/components/global-styles/style.scss +4 -0
  232. package/src/components/header-edit-mode/style.scss +15 -5
  233. package/src/components/layout/hooks.js +6 -5
  234. package/src/components/layout/index.js +80 -96
  235. package/src/components/layout/router.js +121 -0
  236. package/src/components/layout/style.scss +13 -16
  237. package/src/components/page/style.scss +1 -8
  238. package/src/components/page-pages/index.js +142 -148
  239. package/src/components/page-pages/style.scss +41 -2
  240. package/src/components/page-patterns/dataviews-pattern-actions.js +11 -6
  241. package/src/components/page-patterns/index.js +392 -14
  242. package/src/components/page-patterns/style.scss +36 -2
  243. package/src/components/{page-templates/template-actions.js → page-templates-template-parts/actions.js} +90 -37
  244. package/src/components/{page-templates → page-templates-template-parts}/index.js +198 -169
  245. package/src/components/page-templates-template-parts/style.scss +44 -0
  246. package/src/components/preferences-modal/index.js +8 -211
  247. package/src/components/revisions/index.js +1 -1
  248. package/src/components/save-button/index.js +7 -4
  249. package/src/components/save-panel/index.js +13 -12
  250. package/src/components/sidebar/index.js +4 -5
  251. package/src/components/sidebar-dataviews/dataview-item.js +2 -1
  252. package/src/components/sidebar-dataviews/default-views.js +4 -2
  253. package/src/components/sidebar-dataviews/index.js +8 -6
  254. package/src/components/sidebar-navigation-item/style.scss +1 -1
  255. package/src/components/sidebar-navigation-screen/index.js +19 -10
  256. package/src/components/sidebar-navigation-screen-pages/index.js +2 -10
  257. package/src/components/sidebar-navigation-screen-pages-dataviews/index.js +32 -6
  258. package/src/components/sidebar-navigation-screen-templates/index.js +85 -28
  259. package/src/components/sidebar-navigation-screen-templates/style.scss +9 -0
  260. package/src/components/sidebar-navigation-screen-templates-browse/content.js +73 -0
  261. package/src/components/sidebar-navigation-screen-templates-browse/index.js +10 -1
  262. package/src/components/site-hub/index.js +4 -1
  263. package/src/components/site-hub/style.scss +1 -12
  264. package/src/components/site-icon/style.scss +1 -1
  265. package/src/components/sync-state-with-url/use-init-edited-entity-from-url.js +40 -10
  266. package/src/components/sync-state-with-url/use-sync-path-with-url.js +32 -0
  267. package/src/hooks/commands/use-edit-mode-commands.js +50 -3
  268. package/src/hooks/push-changes-to-global-styles/index.js +29 -23
  269. package/src/hooks/template-part-edit.js +12 -12
  270. package/src/index.js +1 -1
  271. package/src/store/actions.js +17 -51
  272. package/src/store/private-actions.js +133 -0
  273. package/src/store/selectors.js +2 -4
  274. package/src/style.scss +2 -1
  275. package/src/utils/get-is-list-page.js +3 -2
  276. package/src/utils/use-actual-current-theme.js +27 -0
  277. package/build/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js +0 -58
  278. package/build/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js.map +0 -1
  279. package/build/components/global-styles/font-library-modal/utils/get-notice-from-response.js +0 -71
  280. package/build/components/global-styles/font-library-modal/utils/get-notice-from-response.js.map +0 -1
  281. package/build/components/page-main/index.js +0 -44
  282. package/build/components/page-main/index.js.map +0 -1
  283. package/build/components/page-patterns/dataviews-patterns.js +0 -307
  284. package/build/components/page-patterns/dataviews-patterns.js.map +0 -1
  285. package/build/components/page-template-parts/add-new-template-part.js.map +0 -1
  286. package/build/components/page-template-parts/index.js +0 -81
  287. package/build/components/page-template-parts/index.js.map +0 -1
  288. package/build/components/page-templates/index.js +0 -352
  289. package/build/components/page-templates/index.js.map +0 -1
  290. package/build/components/page-templates/template-actions.js.map +0 -1
  291. package/build/components/post-preview/index.js +0 -29
  292. package/build/components/post-preview/index.js.map +0 -1
  293. package/build/components/preferences-modal/enable-feature.js +0 -36
  294. package/build/components/preferences-modal/enable-feature.js.map +0 -1
  295. package/build/components/preferences-modal/enable-panel-option.js +0 -33
  296. package/build/components/preferences-modal/enable-panel-option.js.map +0 -1
  297. package/build-module/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js +0 -52
  298. package/build-module/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js.map +0 -1
  299. package/build-module/components/global-styles/font-library-modal/utils/get-notice-from-response.js +0 -63
  300. package/build-module/components/global-styles/font-library-modal/utils/get-notice-from-response.js.map +0 -1
  301. package/build-module/components/page-main/index.js +0 -36
  302. package/build-module/components/page-main/index.js.map +0 -1
  303. package/build-module/components/page-patterns/dataviews-patterns.js +0 -299
  304. package/build-module/components/page-patterns/dataviews-patterns.js.map +0 -1
  305. package/build-module/components/page-template-parts/add-new-template-part.js.map +0 -1
  306. package/build-module/components/page-template-parts/index.js +0 -73
  307. package/build-module/components/page-template-parts/index.js.map +0 -1
  308. package/build-module/components/page-templates/index.js +0 -344
  309. package/build-module/components/page-templates/index.js.map +0 -1
  310. package/build-module/components/page-templates/template-actions.js.map +0 -1
  311. package/build-module/components/post-preview/index.js +0 -21
  312. package/build-module/components/post-preview/index.js.map +0 -1
  313. package/build-module/components/preferences-modal/enable-feature.js +0 -29
  314. package/build-module/components/preferences-modal/enable-feature.js.map +0 -1
  315. package/build-module/components/preferences-modal/enable-panel-option.js +0 -26
  316. package/build-module/components/preferences-modal/enable-panel-option.js.map +0 -1
  317. package/src/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js +0 -58
  318. package/src/components/global-styles/font-library-modal/utils/get-notice-from-response.js +0 -62
  319. package/src/components/global-styles/font-library-modal/utils/test/getIntersectingFontFaces.spec.js +0 -271
  320. package/src/components/global-styles/font-library-modal/utils/test/makeFormDataFromFontFamily.spec.js +0 -58
  321. package/src/components/page-main/index.js +0 -38
  322. package/src/components/page-patterns/dataviews-patterns.js +0 -380
  323. package/src/components/page-template-parts/index.js +0 -99
  324. package/src/components/page-templates/style.scss +0 -13
  325. package/src/components/post-preview/index.js +0 -16
  326. package/src/components/preferences-modal/enable-feature.js +0 -31
  327. package/src/components/preferences-modal/enable-panel-option.js +0 -23
  328. /package/build/components/{page-template-parts → page-templates-template-parts}/add-new-template-part.js +0 -0
  329. /package/build-module/components/{page-template-parts → page-templates-template-parts}/add-new-template-part.js +0 -0
  330. /package/src/components/{page-template-parts → page-templates-template-parts}/add-new-template-part.js +0 -0
@@ -1,42 +1,420 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { __ } from '@wordpress/i18n';
5
- import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';
4
+ import {
5
+ __experimentalHStack as HStack,
6
+ Button,
7
+ Tooltip,
8
+ Flex,
9
+ } from '@wordpress/components';
6
10
  import { getQueryArgs } from '@wordpress/url';
11
+ import { __, _x } from '@wordpress/i18n';
12
+ import {
13
+ useState,
14
+ useMemo,
15
+ useCallback,
16
+ useId,
17
+ useEffect,
18
+ } from '@wordpress/element';
19
+ import {
20
+ BlockPreview,
21
+ privateApis as blockEditorPrivateApis,
22
+ } from '@wordpress/block-editor';
23
+ import {
24
+ DataViews,
25
+ sortByTextFields,
26
+ getPaginationResults,
27
+ } from '@wordpress/dataviews';
28
+ import {
29
+ Icon,
30
+ header,
31
+ footer,
32
+ symbolFilled as uncategorized,
33
+ symbol,
34
+ lockSmall,
35
+ } from '@wordpress/icons';
36
+ import { usePrevious } from '@wordpress/compose';
7
37
 
8
38
  /**
9
39
  * Internal dependencies
10
40
  */
11
- import { PATTERN_DEFAULT_CATEGORY, PATTERN_TYPES } from '../../utils/constants';
12
41
  import Page from '../page';
13
- import PatternsList from './patterns-list';
42
+ import {
43
+ LAYOUT_GRID,
44
+ PATTERN_TYPES,
45
+ TEMPLATE_PART_POST_TYPE,
46
+ PATTERN_SYNC_TYPES,
47
+ PATTERN_DEFAULT_CATEGORY,
48
+ ENUMERATION_TYPE,
49
+ OPERATOR_IN,
50
+ } from '../../utils/constants';
51
+ import {
52
+ exportJSONaction,
53
+ renameAction,
54
+ resetAction,
55
+ deleteAction,
56
+ duplicatePatternAction,
57
+ duplicateTemplatePartAction,
58
+ } from './dataviews-pattern-actions';
14
59
  import usePatternSettings from './use-pattern-settings';
15
60
  import { unlock } from '../../lock-unlock';
61
+ import usePatterns from './use-patterns';
62
+ import PatternsHeader from './header';
63
+ import { useLink } from '../routes/link';
16
64
 
17
- const { ExperimentalBlockEditorProvider } = unlock( blockEditorPrivateApis );
65
+ const { ExperimentalBlockEditorProvider, useGlobalStyle } = unlock(
66
+ blockEditorPrivateApis
67
+ );
18
68
 
19
- export default function PagePatterns() {
20
- const { categoryType, categoryId } = getQueryArgs( window.location.href );
69
+ const templatePartIcons = { header, footer, uncategorized };
70
+ const EMPTY_ARRAY = [];
71
+ const defaultConfigPerViewType = {
72
+ [ LAYOUT_GRID ]: {
73
+ mediaField: 'preview',
74
+ primaryField: 'title',
75
+ },
76
+ };
77
+ const DEFAULT_VIEW = {
78
+ type: LAYOUT_GRID,
79
+ search: '',
80
+ page: 1,
81
+ perPage: 20,
82
+ hiddenFields: [ 'sync-status' ],
83
+ layout: {
84
+ ...defaultConfigPerViewType[ LAYOUT_GRID ],
85
+ },
86
+ filters: [],
87
+ };
88
+
89
+ const SYNC_FILTERS = [
90
+ {
91
+ value: PATTERN_SYNC_TYPES.full,
92
+ label: _x( 'Synced', 'Option that shows all synchronized patterns' ),
93
+ description: __( 'Patterns that are kept in sync across the site.' ),
94
+ },
95
+ {
96
+ value: PATTERN_SYNC_TYPES.unsynced,
97
+ label: _x(
98
+ 'Not synced',
99
+ 'Option that shows all patterns that are not synchronized'
100
+ ),
101
+ description: __(
102
+ 'Patterns that can be changed freely without affecting the site.'
103
+ ),
104
+ },
105
+ ];
106
+
107
+ function PreviewWrapper( { item, onClick, ariaDescribedBy, children } ) {
108
+ if ( item.type === PATTERN_TYPES.theme ) {
109
+ return children;
110
+ }
111
+ return (
112
+ <button
113
+ className="page-patterns-preview-field__button"
114
+ type="button"
115
+ onClick={ onClick }
116
+ aria-label={ item.title }
117
+ aria-describedby={ ariaDescribedBy }
118
+ >
119
+ { children }
120
+ </button>
121
+ );
122
+ }
123
+
124
+ function Preview( { item, categoryId, viewType } ) {
125
+ const descriptionId = useId();
126
+ const isUserPattern = item.type === PATTERN_TYPES.user;
127
+ const isNonUserPattern = item.type === PATTERN_TYPES.theme;
128
+ const isTemplatePart = item.type === TEMPLATE_PART_POST_TYPE;
129
+ const isEmpty = ! item.blocks?.length;
130
+ // Only custom patterns or custom template parts can be renamed or deleted.
131
+ const isCustomPattern =
132
+ isUserPattern || ( isTemplatePart && item.isCustom );
133
+ const ariaDescriptions = [];
134
+ if ( isCustomPattern ) {
135
+ // User patterns don't have descriptions, but can be edited and deleted, so include some help text.
136
+ ariaDescriptions.push(
137
+ __( 'Press Enter to edit, or Delete to delete the pattern.' )
138
+ );
139
+ } else if ( item.description ) {
140
+ ariaDescriptions.push( item.description );
141
+ }
142
+
143
+ if ( isNonUserPattern ) {
144
+ ariaDescriptions.push(
145
+ __( 'Theme & plugin patterns cannot be edited.' )
146
+ );
147
+ }
148
+ const [ backgroundColor ] = useGlobalStyle( 'color.background' );
149
+ const { onClick } = useLink( {
150
+ postType: item.type,
151
+ postId: isUserPattern ? item.id : item.name,
152
+ categoryId,
153
+ categoryType: isTemplatePart ? item.type : PATTERN_TYPES.theme,
154
+ } );
155
+
156
+ return (
157
+ <>
158
+ <div
159
+ className={ `page-patterns-preview-field is-viewtype-${ viewType }` }
160
+ style={ { backgroundColor } }
161
+ >
162
+ <PreviewWrapper
163
+ item={ item }
164
+ onClick={ onClick }
165
+ ariaDescribedBy={
166
+ ariaDescriptions.length
167
+ ? ariaDescriptions
168
+ .map(
169
+ ( _, index ) =>
170
+ `${ descriptionId }-${ index }`
171
+ )
172
+ .join( ' ' )
173
+ : undefined
174
+ }
175
+ >
176
+ { isEmpty && isTemplatePart && __( 'Empty template part' ) }
177
+ { isEmpty && ! isTemplatePart && __( 'Empty pattern' ) }
178
+ { ! isEmpty && <BlockPreview blocks={ item.blocks } /> }
179
+ </PreviewWrapper>
180
+ </div>
181
+ { ariaDescriptions.map( ( ariaDescription, index ) => (
182
+ <div
183
+ key={ index }
184
+ hidden
185
+ id={ `${ descriptionId }-${ index }` }
186
+ >
187
+ { ariaDescription }
188
+ </div>
189
+ ) ) }
190
+ </>
191
+ );
192
+ }
193
+
194
+ function Title( { item, categoryId } ) {
195
+ const isUserPattern = item.type === PATTERN_TYPES.user;
196
+ const isNonUserPattern = item.type === PATTERN_TYPES.theme;
197
+ const isTemplatePart = item.type === TEMPLATE_PART_POST_TYPE;
198
+ let itemIcon;
199
+ const { onClick } = useLink( {
200
+ postType: item.type,
201
+ postId: isUserPattern ? item.id : item.name,
202
+ categoryId,
203
+ categoryType: isTemplatePart ? item.type : PATTERN_TYPES.theme,
204
+ } );
205
+ if ( ! isUserPattern && templatePartIcons[ categoryId ] ) {
206
+ itemIcon = templatePartIcons[ categoryId ];
207
+ } else {
208
+ itemIcon =
209
+ item.syncStatus === PATTERN_SYNC_TYPES.full ? symbol : undefined;
210
+ }
211
+ return (
212
+ <HStack alignment="center" justify="flex-start" spacing={ 2 }>
213
+ { itemIcon && ! isNonUserPattern && (
214
+ <Tooltip
215
+ placement="top"
216
+ text={ __(
217
+ 'Editing this pattern will also update anywhere it is used'
218
+ ) }
219
+ >
220
+ <Icon
221
+ className="edit-site-patterns__pattern-icon"
222
+ icon={ itemIcon }
223
+ />
224
+ </Tooltip>
225
+ ) }
226
+ { item.type === PATTERN_TYPES.theme && (
227
+ <Tooltip
228
+ placement="top"
229
+ text={ __( 'This pattern cannot be edited.' ) }
230
+ >
231
+ <Icon
232
+ className="edit-site-patterns__pattern-lock-icon"
233
+ icon={ lockSmall }
234
+ size={ 24 }
235
+ />
236
+ </Tooltip>
237
+ ) }
238
+ <Flex
239
+ as="div"
240
+ gap={ 0 }
241
+ justify="left"
242
+ className="edit-site-patterns__pattern-title"
243
+ >
244
+ { item.type === PATTERN_TYPES.theme ? (
245
+ item.title
246
+ ) : (
247
+ <Button
248
+ variant="link"
249
+ onClick={ onClick }
250
+ // Required for the grid's roving tab index system.
251
+ // See https://github.com/WordPress/gutenberg/pull/51898#discussion_r1243399243.
252
+ tabIndex="-1"
253
+ >
254
+ { item.title || item.name }
255
+ </Button>
256
+ ) }
257
+ </Flex>
258
+ </HStack>
259
+ );
260
+ }
261
+
262
+ export default function DataviewsPatterns() {
263
+ const { categoryType, categoryId = PATTERN_DEFAULT_CATEGORY } =
264
+ getQueryArgs( window.location.href );
21
265
  const type = categoryType || PATTERN_TYPES.theme;
22
- const category = categoryId || PATTERN_DEFAULT_CATEGORY;
23
- const settings = usePatternSettings();
266
+ const [ view, setView ] = useState( DEFAULT_VIEW );
267
+ const isUncategorizedThemePatterns =
268
+ type === PATTERN_TYPES.theme && categoryId === 'uncategorized';
269
+ const previousCategoryId = usePrevious( categoryId );
270
+ const viewSyncStatus = view.filters?.find(
271
+ ( { field } ) => field === 'sync-status'
272
+ )?.value;
273
+ const { patterns, isResolving } = usePatterns(
274
+ type,
275
+ isUncategorizedThemePatterns ? '' : categoryId,
276
+ {
277
+ search: view.search,
278
+ syncStatus: viewSyncStatus,
279
+ }
280
+ );
281
+ const fields = useMemo( () => {
282
+ const _fields = [
283
+ {
284
+ header: __( 'Preview' ),
285
+ id: 'preview',
286
+ render: ( { item } ) => (
287
+ <Preview
288
+ item={ item }
289
+ categoryId={ categoryId }
290
+ viewType={ view.type }
291
+ />
292
+ ),
293
+ enableSorting: false,
294
+ enableHiding: false,
295
+ },
296
+ {
297
+ header: __( 'Title' ),
298
+ id: 'title',
299
+ getValue: ( { item } ) => item.title,
300
+ render: ( { item } ) => (
301
+ <Title item={ item } categoryId={ categoryId } />
302
+ ),
303
+ enableHiding: false,
304
+ },
305
+ ];
306
+ if ( type === PATTERN_TYPES.theme ) {
307
+ _fields.push( {
308
+ header: __( 'Sync Status' ),
309
+ id: 'sync-status',
310
+ render: ( { item } ) => {
311
+ // User patterns can have their sync statuses checked directly.
312
+ // Non-user patterns are all unsynced for the time being.
313
+ return (
314
+ SYNC_FILTERS.find(
315
+ ( { value } ) => value === item.syncStatus
316
+ )?.label ||
317
+ SYNC_FILTERS.find(
318
+ ( { value } ) =>
319
+ value === PATTERN_SYNC_TYPES.unsynced
320
+ ).label
321
+ );
322
+ },
323
+ type: ENUMERATION_TYPE,
324
+ elements: SYNC_FILTERS,
325
+ filterBy: {
326
+ operators: [ OPERATOR_IN ],
327
+ },
328
+ enableSorting: false,
329
+ } );
330
+ }
331
+ return _fields;
332
+ }, [ view.type, categoryId, type ] );
333
+ // Reset the page number when the category changes.
334
+ useEffect( () => {
335
+ if ( previousCategoryId !== categoryId ) {
336
+ setView( DEFAULT_VIEW );
337
+ }
338
+ }, [ categoryId, previousCategoryId ] );
339
+ const { data, paginationInfo } = useMemo( () => {
340
+ if ( ! patterns ) {
341
+ return {
342
+ data: EMPTY_ARRAY,
343
+ paginationInfo: { totalItems: 0, totalPages: 0 },
344
+ };
345
+ }
346
+ let filteredData = [ ...patterns ];
347
+ // Handle sorting.
348
+ if ( view.sort ) {
349
+ filteredData = sortByTextFields( {
350
+ data: filteredData,
351
+ view,
352
+ fields,
353
+ textFields: [ 'title', 'author' ],
354
+ } );
355
+ }
356
+ // Handle pagination.
357
+ return getPaginationResults( {
358
+ data: filteredData,
359
+ view,
360
+ } );
361
+ }, [ patterns, view, fields ] );
24
362
 
363
+ const actions = useMemo(
364
+ () => [
365
+ renameAction,
366
+ duplicatePatternAction,
367
+ duplicateTemplatePartAction,
368
+ exportJSONaction,
369
+ resetAction,
370
+ deleteAction,
371
+ ],
372
+ []
373
+ );
374
+ const onChangeView = useCallback(
375
+ ( newView ) => {
376
+ if ( newView.type !== view.type ) {
377
+ newView = {
378
+ ...newView,
379
+ layout: {
380
+ ...defaultConfigPerViewType[ newView.type ],
381
+ },
382
+ };
383
+ }
384
+ setView( newView );
385
+ },
386
+ [ view.type, setView ]
387
+ );
388
+ const id = useId();
389
+ const settings = usePatternSettings();
25
390
  // Wrap everything in a block editor provider.
26
391
  // This ensures 'styles' that are needed for the previews are synced
27
392
  // from the site editor store to the block editor store.
393
+ // TODO: check if I add the provider in every preview like in templates...
28
394
  return (
29
395
  <ExperimentalBlockEditorProvider settings={ settings }>
30
396
  <Page
31
- className="edit-site-patterns"
32
397
  title={ __( 'Patterns content' ) }
398
+ className="edit-site-page-patterns-dataviews"
33
399
  hideTitleFromUI
34
400
  >
35
- <PatternsList
36
- // Reset the states when switching between categories and types.
37
- key={ `${ type }-${ category }` }
401
+ <PatternsHeader
402
+ categoryId={ categoryId }
38
403
  type={ type }
39
- categoryId={ category }
404
+ titleId={ `${ id }-title` }
405
+ descriptionId={ `${ id }-description` }
406
+ />
407
+ <DataViews
408
+ paginationInfo={ paginationInfo }
409
+ fields={ fields }
410
+ actions={ actions }
411
+ data={ data || EMPTY_ARRAY }
412
+ getItemId={ ( item ) => item.name }
413
+ isLoading={ isResolving }
414
+ view={ view }
415
+ onChangeView={ onChangeView }
416
+ deferredRendering={ true }
417
+ supportedLayouts={ [ LAYOUT_GRID ] }
40
418
  />
41
419
  </Page>
42
420
  </ExperimentalBlockEditorProvider>
@@ -1,10 +1,11 @@
1
1
  .edit-site-patterns {
2
+ background: #1e1e1e;
2
3
  border-left: 1px solid $gray-800;
3
- background: none;
4
4
  margin: $header-height 0 0;
5
5
  border-radius: 0;
6
6
  padding: 0;
7
7
  overflow-x: auto;
8
+ min-height: 100%;
8
9
 
9
10
  .components-base-control {
10
11
  width: 100%;
@@ -230,9 +231,33 @@
230
231
  */
231
232
  .edit-site-page-patterns-dataviews {
232
233
  .page-patterns-preview-field {
234
+ display: flex;
235
+ flex-direction: column;
236
+ height: 100%;
237
+ border-radius: 3px 3px 0 0;
238
+
233
239
  &.is-viewtype-grid {
234
240
  .block-editor-block-preview__container {
235
- height: auto;
241
+ height: 100%;
242
+ border-radius: 3px 3px 0 0;
243
+ }
244
+ }
245
+
246
+ .page-patterns-preview-field__button {
247
+ box-shadow: none;
248
+ border: none;
249
+ padding: 0;
250
+ background-color: unset;
251
+ box-sizing: border-box;
252
+ cursor: pointer;
253
+ overflow: hidden;
254
+ height: 100%;
255
+ border-radius: 3px 3px 0 0;
256
+
257
+ &:focus-visible {
258
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
259
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
260
+ outline: 2px solid transparent;
236
261
  }
237
262
  }
238
263
  }
@@ -254,6 +279,15 @@
254
279
  top: 0;
255
280
  z-index: 2;
256
281
  }
282
+
283
+ .edit-site-patterns__pattern-title {
284
+ display: block;
285
+ width: 100%;
286
+ white-space: nowrap;
287
+ overflow: hidden;
288
+ text-overflow: ellipsis;
289
+ color: inherit;
290
+ }
257
291
  }
258
292
 
259
293
  .dataviews-action-modal__duplicate-pattern {
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { backup, trash } from '@wordpress/icons';
5
- import { __, sprintf } from '@wordpress/i18n';
5
+ import { __, sprintf, _n } from '@wordpress/i18n';
6
6
  import { useDispatch } from '@wordpress/data';
7
7
  import { useMemo, useState } from '@wordpress/element';
8
8
  import { store as coreStore } from '@wordpress/core-data';
@@ -19,6 +19,7 @@ import {
19
19
  /**
20
20
  * Internal dependencies
21
21
  */
22
+ import { unlock } from '../../lock-unlock';
22
23
  import { store as editSiteStore } from '../../store';
23
24
  import isTemplateRevertable from '../../utils/is-template-revertable';
24
25
  import isTemplateRemovable from '../../utils/is-template-removable';
@@ -32,39 +33,64 @@ export function useResetTemplateAction() {
32
33
  return useMemo(
33
34
  () => ( {
34
35
  id: 'reset-template',
35
- label: __( 'Reset template' ),
36
+ label: __( 'Reset' ),
36
37
  isPrimary: true,
37
38
  icon: backup,
38
39
  isEligible: isTemplateRevertable,
39
- async callback( template ) {
40
+ supportsBulk: true,
41
+ async callback( templates ) {
40
42
  try {
41
- await revertTemplate( template, { allowUndo: false } );
42
- await saveEditedEntityRecord(
43
- 'postType',
44
- template.type,
45
- template.id
46
- );
43
+ for ( const template of templates ) {
44
+ await revertTemplate( template, {
45
+ allowUndo: false,
46
+ } );
47
+ await saveEditedEntityRecord(
48
+ 'postType',
49
+ template.type,
50
+ template.id
51
+ );
52
+ }
47
53
 
48
54
  createSuccessNotice(
49
- sprintf(
50
- /* translators: The template/part's name. */
51
- __( '"%s" reverted.' ),
52
- decodeEntities( template.title.rendered )
53
- ),
55
+ templates.length > 1
56
+ ? sprintf(
57
+ /* translators: The number of items. */
58
+ __( '%s items reverted.' ),
59
+ templates.length
60
+ )
61
+ : sprintf(
62
+ /* translators: The template/part's name. */
63
+ __( '"%s" reverted.' ),
64
+ decodeEntities(
65
+ templates[ 0 ].title.rendered
66
+ )
67
+ ),
54
68
  {
55
69
  type: 'snackbar',
56
70
  id: 'edit-site-template-reverted',
57
71
  }
58
72
  );
59
73
  } catch ( error ) {
60
- const fallbackErrorMessage =
61
- template.type === TEMPLATE_POST_TYPE
62
- ? __(
63
- 'An error occurred while reverting the template.'
64
- )
65
- : __(
66
- 'An error occurred while reverting the template part.'
67
- );
74
+ let fallbackErrorMessage;
75
+ if ( templates[ 0 ].type === TEMPLATE_POST_TYPE ) {
76
+ fallbackErrorMessage =
77
+ templates.length === 1
78
+ ? __(
79
+ 'An error occurred while reverting the template.'
80
+ )
81
+ : __(
82
+ 'An error occurred while reverting the templates.'
83
+ );
84
+ } else {
85
+ fallbackErrorMessage =
86
+ templates.length === 1
87
+ ? __(
88
+ 'An error occurred while reverting the template part.'
89
+ )
90
+ : __(
91
+ 'An error occurred while reverting the template parts.'
92
+ );
93
+ }
68
94
  const errorMessage =
69
95
  error.message && error.code !== 'unknown_error'
70
96
  ? error.message
@@ -85,21 +111,34 @@ export function useResetTemplateAction() {
85
111
 
86
112
  export const deleteTemplateAction = {
87
113
  id: 'delete-template',
88
- label: __( 'Delete template' ),
114
+ label: __( 'Delete' ),
89
115
  isPrimary: true,
90
116
  icon: trash,
91
117
  isEligible: isTemplateRemovable,
118
+ supportsBulk: true,
92
119
  hideModalHeader: true,
93
- RenderModal: ( { item: template, closeModal } ) => {
94
- const { removeTemplate } = useDispatch( editSiteStore );
120
+ RenderModal: ( { items: templates, closeModal, onPerform } ) => {
121
+ const { removeTemplates } = unlock( useDispatch( editSiteStore ) );
95
122
  return (
96
123
  <VStack spacing="5">
97
124
  <Text>
98
- { sprintf(
99
- // translators: %s: The template or template part's title.
100
- __( 'Are you sure you want to delete "%s"?' ),
101
- decodeEntities( template.title.rendered )
102
- ) }
125
+ { templates.length > 1
126
+ ? sprintf(
127
+ // translators: %d: number of items to delete.
128
+ _n(
129
+ 'Delete %d item?',
130
+ 'Delete %d items?',
131
+ templates.length
132
+ ),
133
+ templates.length
134
+ )
135
+ : sprintf(
136
+ // translators: %s: The template or template part's titles
137
+ __( 'Delete "%s"?' ),
138
+ decodeEntities(
139
+ templates?.[ 0 ]?.title?.rendered
140
+ )
141
+ ) }
103
142
  </Text>
104
143
  <HStack justify="right">
105
144
  <Button variant="tertiary" onClick={ closeModal }>
@@ -107,11 +146,15 @@ export const deleteTemplateAction = {
107
146
  </Button>
108
147
  <Button
109
148
  variant="primary"
110
- onClick={ () =>
111
- removeTemplate( template, {
149
+ onClick={ async () => {
150
+ await removeTemplates( templates, {
112
151
  allowUndo: false,
113
- } )
114
- }
152
+ } );
153
+ if ( onPerform ) {
154
+ onPerform();
155
+ }
156
+ closeModal();
157
+ } }
115
158
  >
116
159
  { __( 'Delete' ) }
117
160
  </Button>
@@ -124,9 +167,19 @@ export const deleteTemplateAction = {
124
167
  export const renameTemplateAction = {
125
168
  id: 'rename-template',
126
169
  label: __( 'Rename' ),
127
- isEligible: ( template ) =>
128
- isTemplateRemovable( template ) && template.is_custom,
129
- RenderModal: ( { item: template, closeModal } ) => {
170
+ isEligible: ( template ) => {
171
+ // We can only remove templates or template parts that can be removed.
172
+ // Additionally in the case of templates, we can only remove custom templates.
173
+ if (
174
+ ! isTemplateRemovable( template ) ||
175
+ ( template.type === TEMPLATE_POST_TYPE && ! template.is_custom )
176
+ ) {
177
+ return false;
178
+ }
179
+ return true;
180
+ },
181
+ RenderModal: ( { items: templates, closeModal } ) => {
182
+ const template = templates[ 0 ];
130
183
  const title = decodeEntities( template.title.rendered );
131
184
  const [ editedTitle, setEditedTitle ] = useState( title );
132
185
  const {