@wordpress/editor 14.48.0 → 14.48.2-next.v.202606191442.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 (509) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/build/bindings/pattern-overrides.cjs +1 -1
  3. package/build/bindings/pattern-overrides.cjs.map +2 -2
  4. package/build/components/block-removal-warnings/index.cjs +0 -3
  5. package/build/components/block-removal-warnings/index.cjs.map +2 -2
  6. package/build/components/collab-sidebar/note-byline.cjs +1 -1
  7. package/build/components/collab-sidebar/note-byline.cjs.map +2 -2
  8. package/build/components/collab-sidebar/note-indicator-toolbar.cjs +49 -43
  9. package/build/components/collab-sidebar/note-indicator-toolbar.cjs.map +3 -3
  10. package/build/components/collab-sidebar/note.cjs +49 -17
  11. package/build/components/collab-sidebar/note.cjs.map +3 -3
  12. package/build/components/collab-sidebar/notes.cjs.map +1 -1
  13. package/build/components/collab-sidebar/utils.cjs +1 -1
  14. package/build/components/collab-sidebar/utils.cjs.map +2 -2
  15. package/build/components/collaborators-overlay/avatar-iframe-styles.cjs.map +1 -1
  16. package/build/components/collaborators-overlay/collaborator-styles.cjs.map +1 -1
  17. package/build/components/collaborators-overlay/compute-selection.cjs.map +1 -1
  18. package/build/components/collaborators-overlay/overlay-iframe-styles.cjs +1 -1
  19. package/build/components/collaborators-overlay/overlay-iframe-styles.cjs.map +1 -1
  20. package/build/components/collaborators-overlay/use-block-highlighting.cjs +1 -8
  21. package/build/components/collaborators-overlay/use-block-highlighting.cjs.map +3 -3
  22. package/build/components/collaborators-overlay/use-render-cursors.cjs +1 -7
  23. package/build/components/collaborators-overlay/use-render-cursors.cjs.map +3 -3
  24. package/build/components/collaborators-presence/avatar/component.cjs.map +2 -2
  25. package/build/components/collaborators-presence/avatar/use-image-loading-status.cjs.map +1 -1
  26. package/build/components/document-bar/index.cjs +7 -5
  27. package/build/components/document-bar/index.cjs.map +2 -2
  28. package/build/components/global-keyboard-shortcuts/index.cjs +3 -2
  29. package/build/components/global-keyboard-shortcuts/index.cjs.map +2 -2
  30. package/build/components/global-styles-sidebar/welcome-guide.cjs +3 -3
  31. package/build/components/global-styles-sidebar/welcome-guide.cjs.map +1 -1
  32. package/build/components/local-autosave-monitor/index.cjs +14 -15
  33. package/build/components/local-autosave-monitor/index.cjs.map +2 -2
  34. package/build/components/more-menu/view-more-menu-group.cjs +1 -2
  35. package/build/components/more-menu/view-more-menu-group.cjs.map +2 -2
  36. package/build/components/page-attributes/parent.cjs +2 -1
  37. package/build/components/page-attributes/parent.cjs.map +2 -2
  38. package/build/components/post-card-panel/index.cjs +1 -1
  39. package/build/components/post-card-panel/index.cjs.map +2 -2
  40. package/build/components/post-excerpt/panel.cjs +1 -1
  41. package/build/components/post-excerpt/panel.cjs.map +2 -2
  42. package/build/components/post-locked-modal/index.cjs +3 -3
  43. package/build/components/post-locked-modal/index.cjs.map +1 -1
  44. package/build/components/post-preview-button/index.cjs +2 -2
  45. package/build/components/post-preview-button/index.cjs.map +2 -2
  46. package/build/components/post-publish-button/index.cjs +115 -157
  47. package/build/components/post-publish-button/index.cjs.map +3 -3
  48. package/build/components/post-publish-button/label.cjs +2 -2
  49. package/build/components/post-publish-button/label.cjs.map +2 -2
  50. package/build/components/post-publish-panel/index.cjs.map +1 -1
  51. package/build/components/post-publish-panel/postpublish.cjs +1 -1
  52. package/build/components/post-publish-panel/postpublish.cjs.map +2 -2
  53. package/build/components/post-revisions-preview/block-diff.cjs +21 -9
  54. package/build/components/post-revisions-preview/block-diff.cjs.map +2 -2
  55. package/build/components/post-revisions-preview/diff-markers.cjs.map +2 -2
  56. package/build/components/post-revisions-preview/preserve-client-ids.cjs +2 -2
  57. package/build/components/post-revisions-preview/preserve-client-ids.cjs.map +2 -2
  58. package/build/components/post-revisions-preview/revisions-slider.cjs +1 -1
  59. package/build/components/post-revisions-preview/revisions-slider.cjs.map +2 -2
  60. package/build/components/post-revisions-timeline/index.cjs +173 -0
  61. package/build/components/post-revisions-timeline/index.cjs.map +7 -0
  62. package/build/components/post-saved-state/index.cjs +17 -26
  63. package/build/components/post-saved-state/index.cjs.map +2 -2
  64. package/build/components/post-schedule/label.cjs +5 -5
  65. package/build/components/post-schedule/label.cjs.map +1 -1
  66. package/build/components/post-taxonomies/flat-term-selector.cjs +2 -1
  67. package/build/components/post-taxonomies/flat-term-selector.cjs.map +3 -3
  68. package/build/components/post-taxonomies/hierarchical-term-selector.cjs +1 -1
  69. package/build/components/post-taxonomies/hierarchical-term-selector.cjs.map +2 -2
  70. package/build/components/post-text-editor/index.cjs +51 -0
  71. package/build/components/post-text-editor/index.cjs.map +2 -2
  72. package/build/components/post-text-editor/utils.cjs +150 -0
  73. package/build/components/post-text-editor/utils.cjs.map +7 -0
  74. package/build/components/post-url/index.cjs +1 -1
  75. package/build/components/post-url/index.cjs.map +2 -2
  76. package/build/components/post-view-link/index.cjs +1 -1
  77. package/build/components/post-view-link/index.cjs.map +2 -2
  78. package/build/components/provider/disable-non-page-content-blocks.cjs.map +1 -1
  79. package/build/components/provider/index.cjs +3 -1
  80. package/build/components/provider/index.cjs.map +3 -3
  81. package/build/components/provider/use-network-reconnect.cjs +51 -0
  82. package/build/components/provider/use-network-reconnect.cjs.map +7 -0
  83. package/build/components/resizable-editor/resize-handle.cjs.map +2 -2
  84. package/build/components/revision-diff-panel/index.cjs +7 -2
  85. package/build/components/revision-diff-panel/index.cjs.map +2 -2
  86. package/build/components/revision-fields-diff/index.cjs +8 -4
  87. package/build/components/revision-fields-diff/index.cjs.map +2 -2
  88. package/build/components/sidebar/dataform-post-summary.cjs +125 -20
  89. package/build/components/sidebar/dataform-post-summary.cjs.map +3 -3
  90. package/build/components/sidebar/index.cjs +2 -15
  91. package/build/components/sidebar/index.cjs.map +3 -3
  92. package/build/components/sidebar/post-revision-summary.cjs +11 -17
  93. package/build/components/sidebar/post-revision-summary.cjs.map +3 -3
  94. package/build/components/sidebar/post-summary.cjs +1 -1
  95. package/build/components/sidebar/post-summary.cjs.map +2 -2
  96. package/build/components/style-book/examples.cjs +1 -1
  97. package/build/components/style-book/examples.cjs.map +1 -1
  98. package/build/components/style-book/index.cjs +1 -1
  99. package/build/components/style-book/index.cjs.map +2 -2
  100. package/build/components/sync-connection-error-modal/index.cjs +3 -3
  101. package/build/components/sync-connection-error-modal/index.cjs.map +1 -1
  102. package/build/components/template-actions-panel/block-theme-content.cjs +7 -1
  103. package/build/components/template-actions-panel/block-theme-content.cjs.map +2 -2
  104. package/build/components/template-actions-panel/index.cjs +0 -9
  105. package/build/components/template-actions-panel/index.cjs.map +3 -3
  106. package/build/components/template-validation-notice/index.cjs +1 -1
  107. package/build/components/template-validation-notice/index.cjs.map +1 -1
  108. package/build/components/upload-progress-snackbar/index.cjs +161 -0
  109. package/build/components/upload-progress-snackbar/index.cjs.map +7 -0
  110. package/build/components/upload-progress-snackbar/tracker.cjs +90 -0
  111. package/build/components/upload-progress-snackbar/tracker.cjs.map +7 -0
  112. package/build/components/visual-editor/edit-template-blocks-notification.cjs +1 -1
  113. package/build/components/visual-editor/edit-template-blocks-notification.cjs.map +1 -1
  114. package/build/{components/revision-author-panel → dataviews/fields/revisions}/index.cjs +18 -26
  115. package/build/dataviews/fields/revisions/index.cjs.map +7 -0
  116. package/build/dataviews/fields/revisions/revisions-view.cjs +74 -0
  117. package/build/dataviews/fields/revisions/revisions-view.cjs.map +7 -0
  118. package/build/dataviews/store/private-actions.cjs +14 -4
  119. package/build/dataviews/store/private-actions.cjs.map +3 -3
  120. package/build/hooks/push-changes-to-global-styles/index.cjs +1 -1
  121. package/build/hooks/push-changes-to-global-styles/index.cjs.map +1 -1
  122. package/build/private-apis.cjs +2 -0
  123. package/build/private-apis.cjs.map +3 -3
  124. package/build/store/actions.cjs +1 -1
  125. package/build/store/actions.cjs.map +2 -2
  126. package/build/store/private-selectors.cjs +6 -1
  127. package/build/store/private-selectors.cjs.map +2 -2
  128. package/build/store/selectors.cjs +1 -2
  129. package/build/store/selectors.cjs.map +2 -2
  130. package/build/utils/media-upload/index.cjs +16 -0
  131. package/build/utils/media-upload/index.cjs.map +3 -3
  132. package/build/utils/set-nested-value.cjs.map +1 -1
  133. package/build-module/bindings/pattern-overrides.mjs +1 -1
  134. package/build-module/bindings/pattern-overrides.mjs.map +2 -2
  135. package/build-module/components/block-removal-warnings/index.mjs +0 -3
  136. package/build-module/components/block-removal-warnings/index.mjs.map +2 -2
  137. package/build-module/components/collab-sidebar/note-byline.mjs +1 -1
  138. package/build-module/components/collab-sidebar/note-byline.mjs.map +2 -2
  139. package/build-module/components/collab-sidebar/note-indicator-toolbar.mjs +53 -44
  140. package/build-module/components/collab-sidebar/note-indicator-toolbar.mjs.map +2 -2
  141. package/build-module/components/collab-sidebar/note.mjs +50 -18
  142. package/build-module/components/collab-sidebar/note.mjs.map +2 -2
  143. package/build-module/components/collab-sidebar/notes.mjs.map +1 -1
  144. package/build-module/components/collab-sidebar/utils.mjs +1 -1
  145. package/build-module/components/collab-sidebar/utils.mjs.map +2 -2
  146. package/build-module/components/collaborators-overlay/avatar-iframe-styles.mjs.map +1 -1
  147. package/build-module/components/collaborators-overlay/collaborator-styles.mjs.map +1 -1
  148. package/build-module/components/collaborators-overlay/compute-selection.mjs.map +1 -1
  149. package/build-module/components/collaborators-overlay/overlay-iframe-styles.mjs +1 -1
  150. package/build-module/components/collaborators-overlay/overlay-iframe-styles.mjs.map +1 -1
  151. package/build-module/components/collaborators-overlay/use-block-highlighting.mjs +1 -8
  152. package/build-module/components/collaborators-overlay/use-block-highlighting.mjs.map +2 -2
  153. package/build-module/components/collaborators-overlay/use-render-cursors.mjs +1 -7
  154. package/build-module/components/collaborators-overlay/use-render-cursors.mjs.map +2 -2
  155. package/build-module/components/collaborators-presence/avatar/component.mjs.map +2 -2
  156. package/build-module/components/collaborators-presence/avatar/use-image-loading-status.mjs.map +1 -1
  157. package/build-module/components/document-bar/index.mjs +7 -5
  158. package/build-module/components/document-bar/index.mjs.map +2 -2
  159. package/build-module/components/global-keyboard-shortcuts/index.mjs +3 -2
  160. package/build-module/components/global-keyboard-shortcuts/index.mjs.map +2 -2
  161. package/build-module/components/global-styles-sidebar/welcome-guide.mjs +3 -3
  162. package/build-module/components/global-styles-sidebar/welcome-guide.mjs.map +1 -1
  163. package/build-module/components/local-autosave-monitor/index.mjs +15 -16
  164. package/build-module/components/local-autosave-monitor/index.mjs.map +2 -2
  165. package/build-module/components/more-menu/view-more-menu-group.mjs +1 -2
  166. package/build-module/components/more-menu/view-more-menu-group.mjs.map +2 -2
  167. package/build-module/components/page-attributes/parent.mjs +2 -1
  168. package/build-module/components/page-attributes/parent.mjs.map +2 -2
  169. package/build-module/components/post-card-panel/index.mjs +1 -1
  170. package/build-module/components/post-card-panel/index.mjs.map +2 -2
  171. package/build-module/components/post-excerpt/panel.mjs +1 -1
  172. package/build-module/components/post-excerpt/panel.mjs.map +2 -2
  173. package/build-module/components/post-locked-modal/index.mjs +3 -3
  174. package/build-module/components/post-locked-modal/index.mjs.map +1 -1
  175. package/build-module/components/post-preview-button/index.mjs +2 -2
  176. package/build-module/components/post-preview-button/index.mjs.map +2 -2
  177. package/build-module/components/post-publish-button/index.mjs +117 -159
  178. package/build-module/components/post-publish-button/index.mjs.map +2 -2
  179. package/build-module/components/post-publish-button/label.mjs +2 -2
  180. package/build-module/components/post-publish-button/label.mjs.map +2 -2
  181. package/build-module/components/post-publish-panel/index.mjs.map +1 -1
  182. package/build-module/components/post-publish-panel/postpublish.mjs +1 -1
  183. package/build-module/components/post-publish-panel/postpublish.mjs.map +2 -2
  184. package/build-module/components/post-revisions-preview/block-diff.mjs +20 -8
  185. package/build-module/components/post-revisions-preview/block-diff.mjs.map +2 -2
  186. package/build-module/components/post-revisions-preview/diff-markers.mjs.map +2 -2
  187. package/build-module/components/post-revisions-preview/preserve-client-ids.mjs +1 -1
  188. package/build-module/components/post-revisions-preview/preserve-client-ids.mjs.map +1 -1
  189. package/build-module/components/post-revisions-preview/revisions-slider.mjs +1 -1
  190. package/build-module/components/post-revisions-preview/revisions-slider.mjs.map +2 -2
  191. package/build-module/components/post-revisions-timeline/index.mjs +152 -0
  192. package/build-module/components/post-revisions-timeline/index.mjs.map +7 -0
  193. package/build-module/components/post-saved-state/index.mjs +17 -26
  194. package/build-module/components/post-saved-state/index.mjs.map +2 -2
  195. package/build-module/components/post-schedule/label.mjs +5 -5
  196. package/build-module/components/post-schedule/label.mjs.map +1 -1
  197. package/build-module/components/post-taxonomies/flat-term-selector.mjs +3 -6
  198. package/build-module/components/post-taxonomies/flat-term-selector.mjs.map +2 -2
  199. package/build-module/components/post-taxonomies/hierarchical-term-selector.mjs +1 -1
  200. package/build-module/components/post-taxonomies/hierarchical-term-selector.mjs.map +2 -2
  201. package/build-module/components/post-text-editor/index.mjs +51 -0
  202. package/build-module/components/post-text-editor/index.mjs.map +2 -2
  203. package/build-module/components/post-text-editor/utils.mjs +123 -0
  204. package/build-module/components/post-text-editor/utils.mjs.map +7 -0
  205. package/build-module/components/post-url/index.mjs +1 -1
  206. package/build-module/components/post-url/index.mjs.map +2 -2
  207. package/build-module/components/post-view-link/index.mjs +1 -1
  208. package/build-module/components/post-view-link/index.mjs.map +2 -2
  209. package/build-module/components/provider/disable-non-page-content-blocks.mjs.map +1 -1
  210. package/build-module/components/provider/index.mjs +3 -1
  211. package/build-module/components/provider/index.mjs.map +2 -2
  212. package/build-module/components/provider/use-network-reconnect.mjs +30 -0
  213. package/build-module/components/provider/use-network-reconnect.mjs.map +7 -0
  214. package/build-module/components/resizable-editor/resize-handle.mjs.map +2 -2
  215. package/build-module/components/revision-diff-panel/index.mjs +7 -2
  216. package/build-module/components/revision-diff-panel/index.mjs.map +2 -2
  217. package/build-module/components/revision-fields-diff/index.mjs +8 -4
  218. package/build-module/components/revision-fields-diff/index.mjs.map +2 -2
  219. package/build-module/components/sidebar/dataform-post-summary.mjs +125 -20
  220. package/build-module/components/sidebar/dataform-post-summary.mjs.map +2 -2
  221. package/build-module/components/sidebar/index.mjs +3 -22
  222. package/build-module/components/sidebar/index.mjs.map +2 -2
  223. package/build-module/components/sidebar/post-revision-summary.mjs +11 -17
  224. package/build-module/components/sidebar/post-revision-summary.mjs.map +2 -2
  225. package/build-module/components/sidebar/post-summary.mjs +1 -1
  226. package/build-module/components/sidebar/post-summary.mjs.map +2 -2
  227. package/build-module/components/style-book/examples.mjs +1 -1
  228. package/build-module/components/style-book/examples.mjs.map +1 -1
  229. package/build-module/components/style-book/index.mjs +1 -1
  230. package/build-module/components/style-book/index.mjs.map +2 -2
  231. package/build-module/components/sync-connection-error-modal/index.mjs +3 -3
  232. package/build-module/components/sync-connection-error-modal/index.mjs.map +1 -1
  233. package/build-module/components/template-actions-panel/block-theme-content.mjs +7 -1
  234. package/build-module/components/template-actions-panel/block-theme-content.mjs.map +2 -2
  235. package/build-module/components/template-actions-panel/index.mjs +0 -9
  236. package/build-module/components/template-actions-panel/index.mjs.map +2 -2
  237. package/build-module/components/template-validation-notice/index.mjs +1 -1
  238. package/build-module/components/template-validation-notice/index.mjs.map +1 -1
  239. package/build-module/components/upload-progress-snackbar/index.mjs +135 -0
  240. package/build-module/components/upload-progress-snackbar/index.mjs.map +7 -0
  241. package/build-module/components/upload-progress-snackbar/tracker.mjs +61 -0
  242. package/build-module/components/upload-progress-snackbar/tracker.mjs.map +7 -0
  243. package/build-module/components/visual-editor/edit-template-blocks-notification.mjs +1 -1
  244. package/build-module/components/visual-editor/edit-template-blocks-notification.mjs.map +1 -1
  245. package/build-module/dataviews/fields/revisions/index.mjs +20 -0
  246. package/build-module/dataviews/fields/revisions/index.mjs.map +7 -0
  247. package/build-module/dataviews/fields/revisions/revisions-view.mjs +53 -0
  248. package/build-module/dataviews/fields/revisions/revisions-view.mjs.map +7 -0
  249. package/build-module/dataviews/store/private-actions.mjs +23 -7
  250. package/build-module/dataviews/store/private-actions.mjs.map +2 -2
  251. package/build-module/hooks/push-changes-to-global-styles/index.mjs +1 -1
  252. package/build-module/hooks/push-changes-to-global-styles/index.mjs.map +1 -1
  253. package/build-module/private-apis.mjs +2 -0
  254. package/build-module/private-apis.mjs.map +2 -2
  255. package/build-module/store/actions.mjs +1 -1
  256. package/build-module/store/actions.mjs.map +2 -2
  257. package/build-module/store/private-selectors.mjs +7 -1
  258. package/build-module/store/private-selectors.mjs.map +2 -2
  259. package/build-module/store/selectors.mjs +1 -2
  260. package/build-module/store/selectors.mjs.map +2 -2
  261. package/build-module/utils/media-upload/index.mjs +19 -0
  262. package/build-module/utils/media-upload/index.mjs.map +2 -2
  263. package/build-module/utils/set-nested-value.mjs.map +1 -1
  264. package/build-style/style-rtl.css +707 -270
  265. package/build-style/style.css +707 -270
  266. package/build-types/components/block-removal-warnings/index.d.ts.map +1 -1
  267. package/build-types/components/collab-sidebar/note-byline.d.ts +0 -3
  268. package/build-types/components/collab-sidebar/note-byline.d.ts.map +1 -1
  269. package/build-types/components/collab-sidebar/note-indicator-toolbar.d.ts.map +1 -1
  270. package/build-types/components/collab-sidebar/note.d.ts.map +1 -1
  271. package/build-types/components/collaborators-overlay/use-block-highlighting.d.ts +0 -3
  272. package/build-types/components/collaborators-overlay/use-block-highlighting.d.ts.map +1 -1
  273. package/build-types/components/collaborators-overlay/use-render-cursors.d.ts.map +1 -1
  274. package/build-types/components/collaborators-presence/avatar/component.d.ts.map +1 -1
  275. package/build-types/components/document-bar/index.d.ts.map +1 -1
  276. package/build-types/components/global-keyboard-shortcuts/index.d.ts.map +1 -1
  277. package/build-types/components/local-autosave-monitor/index.d.ts.map +1 -1
  278. package/build-types/components/more-menu/view-more-menu-group.d.ts.map +1 -1
  279. package/build-types/components/page-attributes/parent.d.ts.map +1 -1
  280. package/build-types/components/post-publish-button/index.d.ts +9 -9
  281. package/build-types/components/post-publish-button/index.d.ts.map +1 -1
  282. package/build-types/components/post-revisions-preview/block-diff.d.ts +3 -0
  283. package/build-types/components/post-revisions-preview/block-diff.d.ts.map +1 -1
  284. package/build-types/components/post-revisions-preview/diff-markers.d.ts.map +1 -1
  285. package/build-types/components/post-revisions-timeline/index.d.ts +2 -0
  286. package/build-types/components/post-revisions-timeline/index.d.ts.map +1 -0
  287. package/build-types/components/post-saved-state/index.d.ts.map +1 -1
  288. package/build-types/components/post-taxonomies/flat-term-selector.d.ts.map +1 -1
  289. package/build-types/components/post-text-editor/index.d.ts.map +1 -1
  290. package/build-types/components/post-text-editor/utils.d.ts +29 -0
  291. package/build-types/components/post-text-editor/utils.d.ts.map +1 -0
  292. package/build-types/components/provider/index.d.ts.map +1 -1
  293. package/build-types/components/provider/use-network-reconnect.d.ts +8 -0
  294. package/build-types/components/provider/use-network-reconnect.d.ts.map +1 -0
  295. package/build-types/components/resizable-editor/resize-handle.d.ts.map +1 -1
  296. package/build-types/components/revision-diff-panel/index.d.ts +3 -1
  297. package/build-types/components/revision-diff-panel/index.d.ts.map +1 -1
  298. package/build-types/components/revision-fields-diff/index.d.ts +3 -0
  299. package/build-types/components/revision-fields-diff/index.d.ts.map +1 -1
  300. package/build-types/components/sidebar/dataform-post-summary.d.ts.map +1 -1
  301. package/build-types/components/sidebar/index.d.ts.map +1 -1
  302. package/build-types/components/sidebar/post-revision-summary.d.ts.map +1 -1
  303. package/build-types/components/template-actions-panel/block-theme-content.d.ts.map +1 -1
  304. package/build-types/components/template-actions-panel/index.d.ts.map +1 -1
  305. package/build-types/components/upload-progress-snackbar/index.d.ts +19 -0
  306. package/build-types/components/upload-progress-snackbar/index.d.ts.map +1 -0
  307. package/build-types/components/upload-progress-snackbar/stories/index.story.d.ts +28 -0
  308. package/build-types/components/upload-progress-snackbar/stories/index.story.d.ts.map +1 -0
  309. package/build-types/components/upload-progress-snackbar/tracker.d.ts +41 -0
  310. package/build-types/components/upload-progress-snackbar/tracker.d.ts.map +1 -0
  311. package/build-types/dataviews/fields/revisions/index.d.ts +8 -0
  312. package/build-types/dataviews/fields/revisions/index.d.ts.map +1 -0
  313. package/build-types/dataviews/fields/revisions/revisions-view.d.ts +2 -0
  314. package/build-types/dataviews/fields/revisions/revisions-view.d.ts.map +1 -0
  315. package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
  316. package/build-types/private-apis.d.ts.map +1 -1
  317. package/build-types/store/private-selectors.d.ts +1 -1
  318. package/build-types/store/private-selectors.d.ts.map +1 -1
  319. package/build-types/store/selectors.d.ts +1 -1
  320. package/build-types/store/selectors.d.ts.map +1 -1
  321. package/build-types/utils/get-template-part-icon.d.ts.map +1 -1
  322. package/build-types/utils/media-upload/index.d.ts.map +1 -1
  323. package/package.json +59 -50
  324. package/src/bindings/pattern-overrides.js +1 -1
  325. package/src/bindings/test/pattern-overrides.js +65 -0
  326. package/src/components/README.md +1 -1
  327. package/src/components/block-removal-warnings/index.js +0 -7
  328. package/src/components/collab-sidebar/note-byline.js +0 -1
  329. package/src/components/collab-sidebar/note-indicator-toolbar.js +73 -60
  330. package/src/components/collab-sidebar/note.js +64 -29
  331. package/src/components/collab-sidebar/style.scss +20 -0
  332. package/src/components/collaborators-overlay/use-block-highlighting.ts +0 -9
  333. package/src/components/collaborators-overlay/use-render-cursors.ts +0 -8
  334. package/src/components/collaborators-presence/avatar/component.tsx +0 -1
  335. package/src/components/collaborators-presence/avatar/test/index.tsx +8 -4
  336. package/src/components/document-bar/index.js +8 -3
  337. package/src/components/document-bar/style.scss +4 -2
  338. package/src/components/global-keyboard-shortcuts/index.js +2 -1
  339. package/src/components/local-autosave-monitor/index.js +23 -21
  340. package/src/components/more-menu/view-more-menu-group.js +1 -2
  341. package/src/components/page-attributes/parent.js +1 -0
  342. package/src/components/post-card-panel/index.js +1 -1
  343. package/src/components/post-publish-button/index.js +146 -192
  344. package/src/components/post-publish-button/test/index.js +149 -113
  345. package/src/components/post-revisions-preview/block-diff.js +63 -19
  346. package/src/components/post-revisions-preview/diff-markers.js +0 -1
  347. package/src/components/post-revisions-preview/preserve-client-ids.js +1 -1
  348. package/src/components/post-revisions-preview/test/block-diff.js +109 -6
  349. package/src/components/post-revisions-timeline/index.js +186 -0
  350. package/src/components/post-revisions-timeline/style.scss +43 -0
  351. package/src/components/post-saved-state/index.js +23 -26
  352. package/src/components/post-saved-state/test/index.js +18 -0
  353. package/src/components/post-taxonomies/flat-term-selector.js +4 -7
  354. package/src/components/post-text-editor/index.js +65 -0
  355. package/src/components/post-text-editor/test/utils.js +210 -0
  356. package/src/components/post-text-editor/utils.js +204 -0
  357. package/src/components/post-type-support-check/test/index.js +11 -0
  358. package/src/components/post-url/index.js +1 -1
  359. package/src/components/post-view-link/index.js +1 -1
  360. package/src/components/post-view-link/test/index.js +71 -0
  361. package/src/components/provider/index.js +6 -1
  362. package/src/components/provider/test/use-network-reconnect.js +137 -0
  363. package/src/components/provider/use-network-reconnect.js +44 -0
  364. package/src/components/resizable-editor/resize-handle.js +0 -1
  365. package/src/components/revision-diff-panel/index.js +8 -2
  366. package/src/components/revision-fields-diff/index.js +19 -3
  367. package/src/components/sidebar/dataform-post-summary.js +196 -25
  368. package/src/components/sidebar/index.js +4 -23
  369. package/src/components/sidebar/post-revision-summary.js +8 -15
  370. package/src/components/sidebar/post-summary.js +1 -1
  371. package/src/components/style-book/index.js +1 -1
  372. package/src/components/template-actions-panel/block-theme-content.js +10 -2
  373. package/src/components/template-actions-panel/index.js +0 -15
  374. package/src/components/upload-progress-snackbar/README.md +26 -0
  375. package/src/components/upload-progress-snackbar/index.js +216 -0
  376. package/src/components/upload-progress-snackbar/stories/index.story.tsx +85 -0
  377. package/src/components/upload-progress-snackbar/style.scss +30 -0
  378. package/src/components/upload-progress-snackbar/test/index.js +199 -0
  379. package/src/components/upload-progress-snackbar/tracker.js +105 -0
  380. package/src/dataviews/fields/revisions/index.tsx +28 -0
  381. package/src/dataviews/fields/revisions/revisions-view.tsx +59 -0
  382. package/src/dataviews/store/private-actions.ts +27 -6
  383. package/src/private-apis.js +2 -0
  384. package/src/store/private-selectors.js +11 -1
  385. package/src/store/selectors.js +1 -3
  386. package/src/store/test/private-selectors.js +69 -0
  387. package/src/style.scss +2 -1
  388. package/src/utils/media-upload/index.js +27 -0
  389. package/build/components/post-revisions-panel/index.cjs +0 -173
  390. package/build/components/post-revisions-panel/index.cjs.map +0 -7
  391. package/build/components/revision-author-panel/index.cjs.map +0 -7
  392. package/build/components/revision-created-panel/index.cjs +0 -47
  393. package/build/components/revision-created-panel/index.cjs.map +0 -7
  394. package/build-module/components/post-revisions-panel/index.mjs +0 -148
  395. package/build-module/components/post-revisions-panel/index.mjs.map +0 -7
  396. package/build-module/components/revision-author-panel/index.mjs +0 -28
  397. package/build-module/components/revision-author-panel/index.mjs.map +0 -7
  398. package/build-module/components/revision-created-panel/index.mjs +0 -26
  399. package/build-module/components/revision-created-panel/index.mjs.map +0 -7
  400. package/build-types/components/post-revisions-panel/index.d.ts +0 -2
  401. package/build-types/components/post-revisions-panel/index.d.ts.map +0 -1
  402. package/build-types/components/revision-author-panel/index.d.ts +0 -2
  403. package/build-types/components/revision-author-panel/index.d.ts.map +0 -1
  404. package/build-types/components/revision-created-panel/index.d.ts +0 -2
  405. package/build-types/components/revision-created-panel/index.d.ts.map +0 -1
  406. package/src/components/commands/index.native.js +0 -2
  407. package/src/components/deprecated.native.js +0 -47
  408. package/src/components/editor-help/add-blocks.native.js +0 -40
  409. package/src/components/editor-help/customize-blocks.native.js +0 -40
  410. package/src/components/editor-help/help-detail-navigation-screen.native.js +0 -67
  411. package/src/components/editor-help/help-get-support-button.native.js +0 -38
  412. package/src/components/editor-help/help-section-title.native.js +0 -29
  413. package/src/components/editor-help/help-topic-row.native.js +0 -33
  414. package/src/components/editor-help/icon-move-blocks.native.js +0 -10
  415. package/src/components/editor-help/images/add-dark.png +0 -0
  416. package/src/components/editor-help/images/add-dark@2x.png +0 -0
  417. package/src/components/editor-help/images/add-dark@3x.png +0 -0
  418. package/src/components/editor-help/images/add-light.png +0 -0
  419. package/src/components/editor-help/images/add-light@2x.png +0 -0
  420. package/src/components/editor-help/images/add-light@3x.png +0 -0
  421. package/src/components/editor-help/images/block-layout-collage.png +0 -0
  422. package/src/components/editor-help/images/block-layout-collage@2x.png +0 -0
  423. package/src/components/editor-help/images/block-layout-collage@3x.png +0 -0
  424. package/src/components/editor-help/images/build-layouts-dark.png +0 -0
  425. package/src/components/editor-help/images/build-layouts-dark@2x.png +0 -0
  426. package/src/components/editor-help/images/build-layouts-dark@3x.png +0 -0
  427. package/src/components/editor-help/images/build-layouts-light.png +0 -0
  428. package/src/components/editor-help/images/build-layouts-light@2x.png +0 -0
  429. package/src/components/editor-help/images/build-layouts-light@3x.png +0 -0
  430. package/src/components/editor-help/images/drag-and-drop-dark.png +0 -0
  431. package/src/components/editor-help/images/drag-and-drop-dark@2x.png +0 -0
  432. package/src/components/editor-help/images/drag-and-drop-dark@3x.png +0 -0
  433. package/src/components/editor-help/images/drag-and-drop-light.png +0 -0
  434. package/src/components/editor-help/images/drag-and-drop-light@2x.png +0 -0
  435. package/src/components/editor-help/images/drag-and-drop-light@3x.png +0 -0
  436. package/src/components/editor-help/images/edit-media-dark.png +0 -0
  437. package/src/components/editor-help/images/edit-media-dark@2x.png +0 -0
  438. package/src/components/editor-help/images/edit-media-dark@3x.png +0 -0
  439. package/src/components/editor-help/images/edit-media-light.png +0 -0
  440. package/src/components/editor-help/images/edit-media-light@2x.png +0 -0
  441. package/src/components/editor-help/images/edit-media-light@3x.png +0 -0
  442. package/src/components/editor-help/images/embed-media-dark.png +0 -0
  443. package/src/components/editor-help/images/embed-media-dark@2x.png +0 -0
  444. package/src/components/editor-help/images/embed-media-dark@3x.png +0 -0
  445. package/src/components/editor-help/images/embed-media-light.png +0 -0
  446. package/src/components/editor-help/images/embed-media-light@2x.png +0 -0
  447. package/src/components/editor-help/images/embed-media-light@3x.png +0 -0
  448. package/src/components/editor-help/images/move-dark.png +0 -0
  449. package/src/components/editor-help/images/move-dark@2x.png +0 -0
  450. package/src/components/editor-help/images/move-dark@3x.png +0 -0
  451. package/src/components/editor-help/images/move-light.png +0 -0
  452. package/src/components/editor-help/images/move-light@2x.png +0 -0
  453. package/src/components/editor-help/images/move-light@3x.png +0 -0
  454. package/src/components/editor-help/images/options-dark.png +0 -0
  455. package/src/components/editor-help/images/options-dark@2x.png +0 -0
  456. package/src/components/editor-help/images/options-dark@3x.png +0 -0
  457. package/src/components/editor-help/images/options-light.png +0 -0
  458. package/src/components/editor-help/images/options-light@2x.png +0 -0
  459. package/src/components/editor-help/images/options-light@3x.png +0 -0
  460. package/src/components/editor-help/images/rich-text-dark.png +0 -0
  461. package/src/components/editor-help/images/rich-text-dark@2x.png +0 -0
  462. package/src/components/editor-help/images/rich-text-dark@3x.png +0 -0
  463. package/src/components/editor-help/images/rich-text-light.png +0 -0
  464. package/src/components/editor-help/images/rich-text-light@2x.png +0 -0
  465. package/src/components/editor-help/images/rich-text-light@3x.png +0 -0
  466. package/src/components/editor-help/images/settings-dark.png +0 -0
  467. package/src/components/editor-help/images/settings-dark@2x.png +0 -0
  468. package/src/components/editor-help/images/settings-dark@3x.png +0 -0
  469. package/src/components/editor-help/images/settings-light.png +0 -0
  470. package/src/components/editor-help/images/settings-light@2x.png +0 -0
  471. package/src/components/editor-help/images/settings-light@3x.png +0 -0
  472. package/src/components/editor-help/index.native.js +0 -208
  473. package/src/components/editor-help/intro-to-blocks.native.js +0 -91
  474. package/src/components/editor-help/move-blocks.native.js +0 -55
  475. package/src/components/editor-help/remove-blocks.native.js +0 -35
  476. package/src/components/editor-help/style.android.scss +0 -6
  477. package/src/components/editor-help/style.ios.scss +0 -6
  478. package/src/components/editor-help/style.scss +0 -123
  479. package/src/components/editor-help/test/index.native.js +0 -81
  480. package/src/components/editor-help/view-sections.native.js +0 -79
  481. package/src/components/error-boundary/index.native.js +0 -192
  482. package/src/components/error-boundary/style.native.scss +0 -116
  483. package/src/components/index.native.js +0 -15
  484. package/src/components/offline-status/index.native.js +0 -99
  485. package/src/components/offline-status/style.native.scss +0 -28
  486. package/src/components/offline-status/test/index.native.js +0 -108
  487. package/src/components/post-revisions-panel/index.js +0 -161
  488. package/src/components/post-revisions-panel/style.scss +0 -16
  489. package/src/components/post-title/index.native.js +0 -282
  490. package/src/components/post-title/style.native.scss +0 -13
  491. package/src/components/post-title/test/__snapshots__/index.native.js.snap +0 -25
  492. package/src/components/post-title/test/index.native.js +0 -78
  493. package/src/components/provider/index.native.js +0 -497
  494. package/src/components/provider/use-block-editor-settings.native.js +0 -48
  495. package/src/components/revision-author-panel/index.js +0 -36
  496. package/src/components/revision-created-panel/index.js +0 -36
  497. package/src/components/template-part-menu-items/index.native.js +0 -3
  498. package/src/hooks/index.native.js +0 -0
  499. package/src/index.native.js +0 -16
  500. package/src/private-apis.native.js +0 -33
  501. package/src/store/actions.native.js +0 -27
  502. package/src/store/reducer.native.js +0 -94
  503. package/src/store/selectors.native.js +0 -57
  504. package/src/store/test/actions.native.js +0 -16
  505. package/src/store/test/reducer.native.js +0 -36
  506. package/src/store/test/selectors.native.js +0 -28
  507. package/src/utils/index.native.js +0 -6
  508. package/src/utils/media-sideload/index.native.js +0 -1
  509. package/src/utils/media-upload/index.native.js +0 -1
@@ -4,186 +4,222 @@
4
4
  import { render, screen } from '@testing-library/react';
5
5
  import userEvent from '@testing-library/user-event';
6
6
 
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import { dispatch, select } from '@wordpress/data';
11
+
7
12
  /**
8
13
  * Internal dependencies
9
14
  */
10
- import { PostPublishButton } from '../';
15
+ import PostPublishButton from '../';
16
+ import { store as editorStore } from '../../../store';
11
17
 
12
18
  describe( 'PostPublishButton', () => {
19
+ beforeEach( () => {
20
+ jest.spyOn( select( editorStore ), 'getCurrentPost' ).mockReturnValue( {
21
+ _links: {},
22
+ } );
23
+ jest.spyOn( dispatch( editorStore ), 'editPost' ).mockReturnValue();
24
+ jest.spyOn( dispatch( editorStore ), 'savePost' ).mockReturnValue();
25
+ } );
26
+
27
+ afterEach( () => {
28
+ jest.restoreAllMocks();
29
+ } );
30
+
31
+ function mockSelector( name, value ) {
32
+ jest.spyOn( select( editorStore ), name ).mockReturnValue( value );
33
+ }
34
+
35
+ function mockHasPublishAction( hasPublishAction ) {
36
+ jest.spyOn( select( editorStore ), 'getCurrentPost' ).mockReturnValue( {
37
+ _links: hasPublishAction ? { 'wp:action-publish': true } : {},
38
+ } );
39
+ }
40
+
13
41
  describe( 'aria-disabled', () => {
14
42
  it( 'should be true if post is currently saving', () => {
15
- render( <PostPublishButton isPublishable isSaveable isSaving /> );
43
+ mockSelector( 'isEditedPostPublishable', true );
44
+ mockSelector( 'isEditedPostSaveable', true );
45
+ mockSelector( 'isSavingPost', true );
46
+
47
+ render( <PostPublishButton /> );
16
48
 
17
- expect(
18
- screen.getByRole( 'button', { name: 'Submit for Review' } )
19
- ).toHaveAttribute( 'aria-disabled', 'true' );
49
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
50
+ 'aria-disabled',
51
+ 'true'
52
+ );
20
53
  } );
21
54
 
22
55
  it( 'should be true if post is not publishable and not forceIsDirty', () => {
23
- render(
24
- <PostPublishButton
25
- isSaveable
26
- isPublishable={ false }
27
- forceIsDirty={ false }
28
- />
29
- );
56
+ mockSelector( 'isEditedPostSaveable', true );
57
+ mockSelector( 'isEditedPostPublishable', false );
58
+
59
+ render( <PostPublishButton forceIsDirty={ false } /> );
30
60
 
31
- expect(
32
- screen.getByRole( 'button', { name: 'Submit for Review' } )
33
- ).toHaveAttribute( 'aria-disabled', 'true' );
61
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
62
+ 'aria-disabled',
63
+ 'true'
64
+ );
34
65
  } );
35
66
 
36
67
  it( 'should be true if post is not saveable', () => {
37
- render( <PostPublishButton isPublishable isSaveable={ false } /> );
68
+ mockSelector( 'isEditedPostPublishable', true );
69
+ mockSelector( 'isEditedPostSaveable', false );
38
70
 
39
- expect(
40
- screen.getByRole( 'button', { name: 'Submit for Review' } )
41
- ).toHaveAttribute( 'aria-disabled', 'true' );
71
+ render( <PostPublishButton /> );
72
+
73
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
74
+ 'aria-disabled',
75
+ 'true'
76
+ );
42
77
  } );
43
78
 
44
79
  it( 'should be true if post saving is locked', () => {
45
- render(
46
- <PostPublishButton
47
- isPublishable
48
- isSaveable
49
- isPostSavingLocked
50
- />
80
+ mockSelector( 'isEditedPostPublishable', true );
81
+ mockSelector( 'isEditedPostSaveable', true );
82
+ mockSelector( 'isPostSavingLocked', true );
83
+
84
+ render( <PostPublishButton /> );
85
+
86
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
87
+ 'aria-disabled',
88
+ 'true'
51
89
  );
90
+ } );
91
+
92
+ it( 'should be true if a non-post entity is being saved', () => {
93
+ mockSelector( 'isEditedPostPublishable', true );
94
+ mockSelector( 'isEditedPostSaveable', true );
95
+ mockSelector( 'isSavingNonPostEntityChanges', true );
52
96
 
53
- expect(
54
- screen.getByRole( 'button', { name: 'Submit for Review' } )
55
- ).toHaveAttribute( 'aria-disabled', 'true' );
97
+ render( <PostPublishButton /> );
98
+
99
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
100
+ 'aria-disabled',
101
+ 'true'
102
+ );
56
103
  } );
57
104
 
58
105
  it( 'should be false if post is saveable but not publishable and forceIsDirty is true', () => {
59
- render(
60
- <PostPublishButton
61
- isSaveable
62
- isPublishable={ false }
63
- forceIsDirty
64
- />
65
- );
106
+ mockSelector( 'isEditedPostSaveable', true );
107
+ mockSelector( 'isEditedPostPublishable', false );
66
108
 
67
- expect(
68
- screen.getByRole( 'button', { name: 'Submit for Review' } )
69
- ).toHaveAttribute( 'aria-disabled', 'false' );
109
+ render( <PostPublishButton forceIsDirty /> );
110
+
111
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
112
+ 'aria-disabled',
113
+ 'false'
114
+ );
70
115
  } );
71
116
 
72
117
  it( 'should be false if post is publishave and saveable', () => {
73
- render( <PostPublishButton isPublishable isSaveable /> );
118
+ mockSelector( 'isEditedPostPublishable', true );
119
+ mockSelector( 'isEditedPostSaveable', true );
74
120
 
75
- expect(
76
- screen.getByRole( 'button', { name: 'Submit for Review' } )
77
- ).toHaveAttribute( 'aria-disabled', 'false' );
121
+ render( <PostPublishButton /> );
122
+
123
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
124
+ 'aria-disabled',
125
+ 'false'
126
+ );
78
127
  } );
79
128
  } );
80
129
 
81
130
  describe( 'publish status', () => {
82
131
  it( 'should be pending for contributor', async () => {
83
132
  const user = userEvent.setup();
84
- const savePostStatus = jest.fn();
85
- render(
86
- <PostPublishButton
87
- hasPublishAction={ false }
88
- savePostStatus={ savePostStatus }
89
- isSaveable
90
- isPublishable
91
- />
92
- );
133
+ mockHasPublishAction( false );
134
+ mockSelector( 'isEditedPostSaveable', true );
135
+ mockSelector( 'isEditedPostPublishable', true );
93
136
 
94
- await user.click(
95
- screen.getByRole( 'button', { name: 'Submit for Review' } )
96
- );
137
+ render( <PostPublishButton /> );
138
+
139
+ await user.click( screen.getByRole( 'button' ) );
97
140
 
98
- expect( savePostStatus ).toHaveBeenCalledWith( 'pending' );
141
+ expect( dispatch( editorStore ).editPost ).toHaveBeenCalledWith(
142
+ { status: 'pending' },
143
+ { undoIgnore: true }
144
+ );
99
145
  } );
100
146
 
101
147
  it( 'should be future for scheduled post', async () => {
102
148
  const user = userEvent.setup();
103
- const savePostStatus = jest.fn();
104
- render(
105
- <PostPublishButton
106
- hasPublishAction
107
- savePostStatus={ savePostStatus }
108
- isBeingScheduled
109
- isSaveable
110
- isPublishable
111
- />
112
- );
149
+ mockHasPublishAction( true );
150
+ mockSelector( 'isEditedPostBeingScheduled', true );
151
+ mockSelector( 'isEditedPostSaveable', true );
152
+ mockSelector( 'isEditedPostPublishable', true );
113
153
 
114
- await user.click(
115
- screen.getByRole( 'button', { name: 'Submit for Review' } )
116
- );
154
+ render( <PostPublishButton /> );
117
155
 
118
- expect( savePostStatus ).toHaveBeenCalledWith( 'future' );
156
+ await user.click( screen.getByRole( 'button' ) );
157
+
158
+ expect( dispatch( editorStore ).editPost ).toHaveBeenCalledWith(
159
+ { status: 'future' },
160
+ { undoIgnore: true }
161
+ );
119
162
  } );
120
163
 
121
164
  it( 'should be private for private visibility', async () => {
122
165
  const user = userEvent.setup();
123
- const savePostStatus = jest.fn();
124
- render(
125
- <PostPublishButton
126
- hasPublishAction
127
- savePostStatus={ savePostStatus }
128
- visibility="private"
129
- isSaveable
130
- isPublishable
131
- />
132
- );
166
+ mockHasPublishAction( true );
167
+ mockSelector( 'getEditedPostVisibility', 'private' );
168
+ mockSelector( 'isEditedPostSaveable', true );
169
+ mockSelector( 'isEditedPostPublishable', true );
133
170
 
134
- await user.click(
135
- screen.getByRole( 'button', { name: 'Submit for Review' } )
136
- );
171
+ render( <PostPublishButton /> );
172
+
173
+ await user.click( screen.getByRole( 'button' ) );
137
174
 
138
- expect( savePostStatus ).toHaveBeenCalledWith( 'private' );
175
+ expect( dispatch( editorStore ).editPost ).toHaveBeenCalledWith(
176
+ { status: 'private' },
177
+ { undoIgnore: true }
178
+ );
139
179
  } );
140
180
 
141
181
  it( 'should be publish otherwise', async () => {
142
182
  const user = userEvent.setup();
143
- const savePostStatus = jest.fn();
144
- render(
145
- <PostPublishButton
146
- hasPublishAction
147
- savePostStatus={ savePostStatus }
148
- isSaveable
149
- isPublishable
150
- />
151
- );
183
+ mockHasPublishAction( true );
184
+ mockSelector( 'isEditedPostSaveable', true );
185
+ mockSelector( 'isEditedPostPublishable', true );
152
186
 
153
- await user.click(
154
- screen.getByRole( 'button', { name: 'Submit for Review' } )
155
- );
187
+ render( <PostPublishButton /> );
188
+
189
+ await user.click( screen.getByRole( 'button' ) );
156
190
 
157
- expect( savePostStatus ).toHaveBeenCalledWith( 'publish' );
191
+ expect( dispatch( editorStore ).editPost ).toHaveBeenCalledWith(
192
+ { status: 'publish' },
193
+ { undoIgnore: true }
194
+ );
158
195
  } );
159
196
  } );
160
197
 
161
198
  describe( 'click', () => {
162
199
  it( 'should save with status', async () => {
163
200
  const user = userEvent.setup();
164
- const savePostStatus = jest.fn();
165
- render(
166
- <PostPublishButton
167
- hasPublishAction
168
- savePostStatus={ savePostStatus }
169
- isSaveable
170
- isPublishable
171
- />
172
- );
201
+ mockHasPublishAction( true );
202
+ mockSelector( 'isEditedPostSaveable', true );
203
+ mockSelector( 'isEditedPostPublishable', true );
173
204
 
174
- await user.click(
175
- screen.getByRole( 'button', { name: 'Submit for Review' } )
176
- );
205
+ render( <PostPublishButton /> );
177
206
 
178
- expect( savePostStatus ).toHaveBeenCalledWith( 'publish' );
207
+ await user.click( screen.getByRole( 'button' ) );
208
+
209
+ expect( dispatch( editorStore ).editPost ).toHaveBeenCalledWith(
210
+ { status: 'publish' },
211
+ { undoIgnore: true }
212
+ );
213
+ expect( dispatch( editorStore ).savePost ).toHaveBeenCalled();
179
214
  } );
180
215
  } );
181
216
 
182
217
  it( 'should have save modifier class', () => {
183
- render( <PostPublishButton isSaving isPublished /> );
218
+ mockSelector( 'isSavingPost', true );
219
+ mockSelector( 'isCurrentPostPublished', true );
220
+
221
+ render( <PostPublishButton /> );
184
222
 
185
- expect(
186
- screen.getByRole( 'button', { name: 'Submit for Review' } )
187
- ).toHaveClass( 'is-busy' );
223
+ expect( screen.getByRole( 'button' ) ).toHaveClass( 'is-busy' );
188
224
  } );
189
225
  } );
@@ -1,8 +1,12 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { diffArrays } from 'diff/lib/diff/array';
5
- import { diffWords } from 'diff/lib/diff/word';
4
+ /*
5
+ * `diffWordsWithSpace` preserves the v4-style per-word output. v6+
6
+ * stopped treating whitespace as a token in `diffWords`, which coalesces
7
+ * adjacent word changes into a single removed/added pair.
8
+ */
9
+ import { diffArrays, diffWordsWithSpace } from 'diff';
6
10
 
7
11
  /**
8
12
  * WordPress dependencies
@@ -28,6 +32,26 @@ import { unlock } from '../../lock-unlock';
28
32
 
29
33
  const { parseRawBlock } = unlock( blocksPrivateApis );
30
34
 
35
+ /**
36
+ * Whether a grammar-parsed raw block is a whitespace-only freeform pseudo-block
37
+ * (the `\n\n` between block markers, etc). These are stripped from both arrays
38
+ * before LCS to keep the matching pivot stable: under `diff` v6's tie-breaker,
39
+ * a whitespace block could otherwise be selected as the LCS anchor in
40
+ * `[paragraph, whitespace, paragraph]` swaps, mis-pairing the surrounding
41
+ * paragraphs in `pairSimilarBlocks`. Whitespace pseudo-blocks don't render
42
+ * anyway (`parseRawBlock` returns undefined for them), so dropping them
43
+ * before the diff has no user-visible effect.
44
+ *
45
+ * @param {Object} rawBlock A raw block from `@wordpress/block-serialization-default-parser`.
46
+ * @return {boolean} True if the block should be excluded from LCS matching.
47
+ */
48
+ function isWhitespaceRawBlock( rawBlock ) {
49
+ return (
50
+ rawBlock.blockName === null &&
51
+ ( ! rawBlock.innerHTML || ! rawBlock.innerHTML.trim() )
52
+ );
53
+ }
54
+
31
55
  /**
32
56
  * Safely stringifies a value for display and comparison.
33
57
  *
@@ -233,27 +257,34 @@ function pairSimilarBlocks( blocks ) {
233
257
  };
234
258
 
235
259
  // Decide where to place the modified block by checking
236
- // what's between the removed and added positions.
237
- // If there are unpaired added blocks between them,
238
- // placing at the removed position would put the modified
239
- // block before content that comes before it in the
240
- // current revision so use the added position.
241
- // Otherwise, use the removed position to keep the
242
- // previous revision's order intact.
260
+ // what's between the removed and added positions. If any
261
+ // block between them is in the current revision (an
262
+ // unchanged block, or an unpaired added block), placing
263
+ // the modification at the removed position would put it
264
+ // before content that already comes before it in the
265
+ // current revision — so use the added position instead.
266
+ // Otherwise, use the removed position to keep the previous
267
+ // revision's reading order intact.
268
+ //
269
+ // 'removed' blocks (and added blocks already absorbed via
270
+ // `pairedAdded`) aren't checked because they aren't in the
271
+ // current revision and so don't count as crossing it.
243
272
  const lo = Math.min( rem.index, bestMatch.index );
244
273
  const hi = Math.max( rem.index, bestMatch.index );
245
- let hasAddedBetween = false;
274
+ let crossesCurrentContent = false;
246
275
  for ( let i = lo + 1; i < hi; i++ ) {
247
- if (
248
- blocks[ i ].__revisionDiffStatus?.status === 'added' &&
249
- ! pairedAdded.has( i )
250
- ) {
251
- hasAddedBetween = true;
276
+ const status = blocks[ i ].__revisionDiffStatus?.status;
277
+ if ( status === undefined ) {
278
+ crossesCurrentContent = true;
279
+ break;
280
+ }
281
+ if ( status === 'added' && ! pairedAdded.has( i ) ) {
282
+ crossesCurrentContent = true;
252
283
  break;
253
284
  }
254
285
  }
255
286
 
256
- if ( hasAddedBetween ) {
287
+ if ( crossesCurrentContent ) {
257
288
  // Use the added position — don't jump before
258
289
  // current-revision content.
259
290
  modifications.set( bestMatch.index, modifiedBlock );
@@ -287,11 +318,21 @@ function pairSimilarBlocks( blocks ) {
287
318
  * Detects modifications when exactly 1 block is removed and 1 is added
288
319
  * with the same blockName (1:1 replacement = modification).
289
320
  *
321
+ * Whitespace-only freeform pseudo-blocks are filtered at every recursive
322
+ * level so this function is safe to call directly with raw output from
323
+ * `@wordpress/block-serialization-default-parser`. The duplicate work for
324
+ * inner-block recursion is negligible and keeps the contract self-contained.
325
+ *
290
326
  * @param {Array} currentRaw Current revision's raw blocks.
291
327
  * @param {Array} previousRaw Previous revision's raw blocks.
292
328
  * @return {Array} Merged raw blocks with diff status injected.
293
329
  */
294
330
  function diffRawBlocks( currentRaw, previousRaw ) {
331
+ // Strip whitespace-only freeform pseudo-blocks before LCS — see
332
+ // `isWhitespaceRawBlock` for why.
333
+ currentRaw = currentRaw.filter( ( b ) => ! isWhitespaceRawBlock( b ) );
334
+ previousRaw = previousRaw.filter( ( b ) => ! isWhitespaceRawBlock( b ) );
335
+
295
336
  const createBlockSignature = ( rawBlock ) =>
296
337
  JSON.stringify( {
297
338
  name: rawBlock.blockName,
@@ -502,8 +543,8 @@ function applyRichTextDiff( currentRichText, previousRichText ) {
502
543
  const currentText = currentRichText.toPlainText();
503
544
  const previousText = previousRichText.toPlainText();
504
545
 
505
- // Diff the plain text (words for cleaner output)
506
- const textDiff = diffWords( previousText, currentText );
546
+ // Diff the plain text (words for cleaner output).
547
+ const textDiff = diffWordsWithSpace( previousText, currentText );
507
548
 
508
549
  let result = create( { text: '' } );
509
550
  let currentIdx = 0;
@@ -660,7 +701,10 @@ function applyDiffToBlock( currentBlock, previousBlock, diffStatus ) {
660
701
  previousBlock.attributes[ attrName ]
661
702
  );
662
703
  if ( currStr !== prevStr ) {
663
- changedAttributes[ attrName ] = diffWords( prevStr, currStr );
704
+ changedAttributes[ attrName ] = diffWordsWithSpace(
705
+ prevStr,
706
+ currStr
707
+ );
664
708
  }
665
709
  }
666
710
  }
@@ -15,7 +15,6 @@ import {
15
15
  store as blockEditorStore,
16
16
  } from '@wordpress/block-editor';
17
17
  import { __ } from '@wordpress/i18n';
18
- // eslint-disable-next-line @wordpress/use-recommended-components -- `Tooltip` is not yet on the recommended `@wordpress/ui` allow-list; landing as a migration step ahead of the wider rollout.
19
18
  import { Tooltip } from '@wordpress/ui';
20
19
 
21
20
  /**
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { diffArrays } from 'diff/lib/diff/array';
4
+ import { diffArrays } from 'diff';
5
5
 
6
6
  /**
7
7
  * Preserves clientIds from previously rendered blocks to prevent flashing.
@@ -339,30 +339,32 @@ describe( 'diffRevisionContent', () => {
339
339
  ] );
340
340
  const blocks = diffRevisionContent( current, previous );
341
341
 
342
- // LCS matches one block ("First block content" at prev[0] -> curr[1]).
342
+ // LCS matches one block ("Second block content" at prev[1] -> curr[0]).
343
343
  // The other block appears as removed + added (showing the reorder).
344
344
  // We intentionally don't pair identical blocks as "modified" since
345
345
  // there's no actual content change - just a position change.
346
+ // (Pre-v8, LCS matched the other block. Both are equally-valid
347
+ // choices for a pure swap.)
346
348
  expect( normalizeBlockTree( blocks ) ).toMatchObject( [
347
349
  {
348
350
  name: 'core/paragraph',
349
351
  attributes: {
350
- content: 'Second block content',
351
- __revisionDiffStatus: { status: 'added' },
352
+ content: 'First block content',
353
+ __revisionDiffStatus: { status: 'removed' },
352
354
  },
353
355
  },
354
356
  {
355
357
  name: 'core/paragraph',
356
358
  attributes: {
357
- content: 'First block content',
359
+ content: 'Second block content',
358
360
  __revisionDiffStatus: undefined,
359
361
  },
360
362
  },
361
363
  {
362
364
  name: 'core/paragraph',
363
365
  attributes: {
364
- content: 'Second block content',
365
- __revisionDiffStatus: { status: 'removed' },
366
+ content: 'First block content',
367
+ __revisionDiffStatus: { status: 'added' },
366
368
  },
367
369
  },
368
370
  ] );
@@ -441,6 +443,107 @@ describe( 'diffRevisionContent', () => {
441
443
  ] );
442
444
  } );
443
445
 
446
+ it( 'filters whitespace-only freeform pseudo-blocks before LCS', () => {
447
+ /*
448
+ * Direct canary for the whitespace-pseudo-block filter in
449
+ * `diffRawBlocks`. The grammar parser emits
450
+ * `{ blockName: null, innerHTML: '\n\n' }` for the whitespace
451
+ * between block markers; under `diff` v6+'s LCS tie-breaker,
452
+ * those pseudo-blocks would otherwise be selected as the match
453
+ * anchor in [paragraph, whitespace, paragraph] swaps, leaving
454
+ * `pairSimilarBlocks` with two removed and two added paragraphs
455
+ * to mis-match by similarity. With the filter, the LCS picks a
456
+ * content block and the surrounding paragraphs pair cleanly.
457
+ */
458
+ const previous = serialize( [
459
+ createBlock( 'core/paragraph', { content: 'Alpha content' } ),
460
+ createBlock( 'core/paragraph', { content: 'Beta content' } ),
461
+ ] );
462
+ const current = serialize( [
463
+ createBlock( 'core/paragraph', {
464
+ content: 'Beta content modified',
465
+ } ),
466
+ createBlock( 'core/paragraph', { content: 'Alpha content' } ),
467
+ ] );
468
+ const blocks = diffRevisionContent( current, previous );
469
+ const normalized = normalizeBlockTree( blocks );
470
+
471
+ const statuses = normalized.map(
472
+ ( b ) => b.attributes.__revisionDiffStatus?.status
473
+ );
474
+ // Exactly one modified pair and one unchanged anchor — not the
475
+ // double-modified mis-pair that the unfiltered LCS would yield.
476
+ expect( statuses.filter( ( s ) => s === 'modified' ) ).toHaveLength(
477
+ 1
478
+ );
479
+ expect( statuses.filter( ( s ) => s === undefined ) ).toHaveLength( 1 );
480
+
481
+ const unchanged = normalized.find(
482
+ ( b ) => b.attributes.__revisionDiffStatus === undefined
483
+ );
484
+ expect( unchanged.attributes.content ).toBe( 'Alpha content' );
485
+ } );
486
+
487
+ it( 'places paired modification at current-revision position when only unchanged blocks sit between', () => {
488
+ /*
489
+ * Direct canary for the `crossesCurrentContent` "unchanged
490
+ * between removed and added" branch. The modified block crosses
491
+ * two unchanged paragraphs; the placement heuristic should
492
+ * anchor it at its current-revision position (index 0), not at
493
+ * the removed position (index 3) — otherwise the modified block
494
+ * would render after content that already comes before it in
495
+ * the current revision.
496
+ */
497
+ const previous = serialize( [
498
+ createBlock( 'core/paragraph', {
499
+ content: 'Stays one anchor sentence',
500
+ } ),
501
+ createBlock( 'core/paragraph', {
502
+ content: 'Stays two anchor sentence',
503
+ } ),
504
+ createBlock( 'core/paragraph', {
505
+ content: 'Original tail content sentence',
506
+ } ),
507
+ ] );
508
+ const current = serialize( [
509
+ createBlock( 'core/paragraph', {
510
+ content: 'Original tail content sentence rewritten',
511
+ } ),
512
+ createBlock( 'core/paragraph', {
513
+ content: 'Stays one anchor sentence',
514
+ } ),
515
+ createBlock( 'core/paragraph', {
516
+ content: 'Stays two anchor sentence',
517
+ } ),
518
+ ] );
519
+ const blocks = diffRevisionContent( current, previous );
520
+
521
+ expect( normalizeBlockTree( blocks ) ).toMatchObject( [
522
+ {
523
+ name: 'core/paragraph',
524
+ attributes: {
525
+ content:
526
+ 'Original tail content sentence<ins title="Added" class="revision-diff-added"> rewritten</ins>',
527
+ __revisionDiffStatus: { status: 'modified' },
528
+ },
529
+ },
530
+ {
531
+ name: 'core/paragraph',
532
+ attributes: {
533
+ content: 'Stays one anchor sentence',
534
+ __revisionDiffStatus: undefined,
535
+ },
536
+ },
537
+ {
538
+ name: 'core/paragraph',
539
+ attributes: {
540
+ content: 'Stays two anchor sentence',
541
+ __revisionDiffStatus: undefined,
542
+ },
543
+ },
544
+ ] );
545
+ } );
546
+
444
547
  describe( 'inner blocks', () => {
445
548
  it( 'handles deeply nested inner blocks', () => {
446
549
  const previous = serialize( [