@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
@@ -0,0 +1,186 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect, useDispatch } from '@wordpress/data';
5
+ import { store as coreStore } from '@wordpress/core-data';
6
+ import { DataViewsPicker, filterSortAndPaginate } from '@wordpress/dataviews';
7
+ import { dateI18n, getDate, humanTimeDiff, getSettings } from '@wordpress/date';
8
+ import { useCallback, useEffect, useMemo, useState } from '@wordpress/element';
9
+ import { __ } from '@wordpress/i18n';
10
+ import { authorField } from '@wordpress/fields';
11
+ import { Text } from '@wordpress/ui';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import { store as editorStore } from '../../store';
17
+ import { unlock } from '../../lock-unlock';
18
+ import { PostContentInformationUI } from '../post-content-information';
19
+
20
+ const PAGE_SIZE = 10;
21
+ const EMPTY_ARRAY = [];
22
+ const defaultLayouts = { pickerActivity: true };
23
+ const baseView = {
24
+ type: 'pickerActivity',
25
+ titleField: 'date',
26
+ descriptionField: 'details',
27
+ fields: [ 'author' ],
28
+ layout: { density: 'compact' },
29
+ page: 1,
30
+ perPage: PAGE_SIZE,
31
+ };
32
+
33
+ const DAY_IN_MILLISECONDS = 86400000;
34
+
35
+ function getDisplayDate( value ) {
36
+ const dateNowInMs = getDate( null ).getTime();
37
+ const date = getDate( value ?? null );
38
+ return dateNowInMs - date.getTime() > DAY_IN_MILLISECONDS
39
+ ? dateI18n( getSettings().formats.datetimeAbbreviated, date )
40
+ : humanTimeDiff( date );
41
+ }
42
+
43
+ export default function PostRevisionsTimeline() {
44
+ const { setCurrentRevisionId } = unlock( useDispatch( editorStore ) );
45
+ const [ view, setView ] = useState( baseView );
46
+
47
+ const { revisions, revisionKey, currentRevisionId, currentRevision } =
48
+ useSelect( ( select ) => {
49
+ const { getCurrentPostType } = select( editorStore );
50
+ const {
51
+ getCurrentRevisionId: _getCurrentRevisionId,
52
+ getCurrentRevision,
53
+ getRevisionPage,
54
+ getPageRevisions,
55
+ } = unlock( select( editorStore ) );
56
+ const { getEntityConfig } = select( coreStore );
57
+
58
+ const _postType = getCurrentPostType();
59
+ const entityConfig = getEntityConfig( 'postType', _postType );
60
+ const _revisionKey = entityConfig?.revisionKey || 'id';
61
+ const _currentRevisionId = _getCurrentRevisionId();
62
+
63
+ return {
64
+ // Same desc-ordered window the header slider renders (warm cache).
65
+ revisions: getPageRevisions( getRevisionPage() ),
66
+ revisionKey: _revisionKey,
67
+ currentRevisionId: _currentRevisionId,
68
+ currentRevision: _currentRevisionId
69
+ ? getCurrentRevision()
70
+ : undefined,
71
+ };
72
+ }, [] );
73
+
74
+ const postContent = currentRevision?.content?.raw;
75
+
76
+ const isLoading = ! revisions;
77
+
78
+ const fields = useMemo(
79
+ () => [
80
+ {
81
+ id: 'date',
82
+ label: __( 'Date' ),
83
+ // Return the humanized label the row renders so the picker
84
+ // option's accessible name announces e.g. "5 minutes ago"
85
+ // instead of the raw ISO timestamp.
86
+ getValue: ( { item } ) => getDisplayDate( item.date ),
87
+ render: ( { item } ) => (
88
+ <Text
89
+ variant="heading-sm"
90
+ render={ <time dateTime={ item.date } /> }
91
+ >
92
+ { getDisplayDate( item.date ) }
93
+ </Text>
94
+ ),
95
+ enableSorting: false,
96
+ enableHiding: false,
97
+ },
98
+ authorField,
99
+ {
100
+ id: 'details',
101
+ label: __( 'Details' ),
102
+ render: ( { item } ) => {
103
+ if (
104
+ String( item[ revisionKey ] ) !==
105
+ String( currentRevisionId )
106
+ ) {
107
+ return null;
108
+ }
109
+ return (
110
+ <PostContentInformationUI postContent={ postContent } />
111
+ );
112
+ },
113
+ enableSorting: false,
114
+ enableHiding: false,
115
+ },
116
+ ],
117
+ [ revisionKey, currentRevisionId, postContent ]
118
+ );
119
+
120
+ const { data: shownRevisions, paginationInfo } = useMemo(
121
+ () => filterSortAndPaginate( revisions || EMPTY_ARRAY, view, fields ),
122
+ [ revisions, view, fields ]
123
+ );
124
+
125
+ // Keep the selected revision visible: when it changes (e.g. the slider
126
+ // scrubs), jump to the client-side page that contains it. Keyed on the
127
+ // selection/data, not view.page, so manual paging stays free browsing.
128
+ useEffect( () => {
129
+ if ( ! currentRevisionId || ! revisions ) {
130
+ return;
131
+ }
132
+ const index = revisions.findIndex(
133
+ ( r ) => String( r[ revisionKey ] ) === String( currentRevisionId )
134
+ );
135
+ if ( index < 0 ) {
136
+ return;
137
+ }
138
+ const page = Math.floor( index / view.perPage ) + 1;
139
+ setView( ( v ) => ( v.page === page ? v : { ...v, page } ) );
140
+ }, [ currentRevisionId, revisions, revisionKey, view.perPage ] );
141
+
142
+ const selection = useMemo(
143
+ () =>
144
+ currentRevisionId ? [ String( currentRevisionId ) ] : EMPTY_ARRAY,
145
+ [ currentRevisionId ]
146
+ );
147
+
148
+ const onChangeSelection = useCallback(
149
+ ( newSelection ) => {
150
+ // Revisions mode always keeps one revision selected. Clicking the
151
+ // active revision yields an empty selection, which we ignore so the
152
+ // timeline never ends up with nothing selected.
153
+ if ( newSelection.length === 0 ) {
154
+ return;
155
+ }
156
+ const selectedId = newSelection[ newSelection.length - 1 ];
157
+ setCurrentRevisionId( Number( selectedId ) );
158
+ },
159
+ [ setCurrentRevisionId ]
160
+ );
161
+
162
+ const getItemId = useCallback(
163
+ ( item ) => String( item[ revisionKey ] ),
164
+ [ revisionKey ]
165
+ );
166
+
167
+ return (
168
+ <div className="editor-post-revisions-timeline">
169
+ <DataViewsPicker
170
+ view={ view }
171
+ onChangeView={ setView }
172
+ fields={ fields }
173
+ data={ shownRevisions }
174
+ isLoading={ isLoading }
175
+ paginationInfo={ paginationInfo }
176
+ defaultLayouts={ defaultLayouts }
177
+ getItemId={ getItemId }
178
+ selection={ selection }
179
+ onChangeSelection={ onChangeSelection }
180
+ >
181
+ <DataViewsPicker.Layout />
182
+ <DataViewsPicker.Footer />
183
+ </DataViewsPicker>
184
+ </div>
185
+ );
186
+ }
@@ -0,0 +1,43 @@
1
+ // Give the revisions inspector a bounded height so the timeline scrolls
2
+ // internally and the picker's pagination stays pinned to the bottom.
3
+ //
4
+ // The timeline only renders in revisions mode, so its ancestors are scoped
5
+ // with `:has()` — keeping this layout out of the generic editor sidebar.
6
+ .interface-complementary-area:has(.editor-post-revisions-timeline) {
7
+ display: flex;
8
+ flex-direction: column;
9
+ overflow: hidden;
10
+
11
+ // The tabs header keeps its natural height.
12
+ .editor-sidebar__panel-tabs {
13
+ flex-shrink: 0;
14
+ }
15
+ }
16
+
17
+ .editor-sidebar__panel:has(.editor-post-revisions-timeline) {
18
+ display: flex;
19
+ flex-direction: column;
20
+ flex: 1;
21
+ min-height: 0;
22
+
23
+ // The document tab panel hands its bounded height down to the timeline.
24
+ [role="tabpanel"]:has(.editor-post-revisions-timeline) {
25
+ display: flex;
26
+ flex-direction: column;
27
+ flex: 1;
28
+ min-height: 0;
29
+ }
30
+
31
+ // Cap only the post-meta diff content so a large
32
+ // diff (e.g. footnotes) can't dominate the column.
33
+ .editor-revision-meta-diff__content {
34
+ max-height: 80px;
35
+ overflow-y: auto;
36
+ }
37
+
38
+ // timeline grows to fill the leftover space and scrolls internally.
39
+ .editor-post-revisions-timeline {
40
+ flex: 1;
41
+ min-height: 0;
42
+ }
43
+ }
@@ -46,6 +46,7 @@ export default function PostSavedState( { forceIsDirty } ) {
46
46
  isSaveable,
47
47
  isSaving,
48
48
  isSavingLocked,
49
+ isSavingNonPostEntityChanges,
49
50
  isScheduled,
50
51
  hasPublishAction,
51
52
  showIconLabels,
@@ -54,35 +55,25 @@ export default function PostSavedState( { forceIsDirty } ) {
54
55
  postType,
55
56
  } = useSelect(
56
57
  ( select ) => {
57
- const {
58
- isEditedPostNew,
59
- isCurrentPostPublished,
60
- isCurrentPostScheduled,
61
- isEditedPostDirty,
62
- isSavingPost,
63
- isEditedPostSaveable,
64
- isPostSavingLocked,
65
- getCurrentPost,
66
- isAutosavingPost,
67
- getEditedPostAttribute,
68
- getPostEdits,
69
- } = select( editorStore );
58
+ const store = select( editorStore );
70
59
  const { get } = select( preferencesStore );
71
60
  return {
72
- isAutosaving: isAutosavingPost(),
73
- isDirty: forceIsDirty || isEditedPostDirty(),
74
- isNew: isEditedPostNew(),
75
- isPublished: isCurrentPostPublished(),
76
- isSaving: isSavingPost(),
77
- isSaveable: isEditedPostSaveable(),
78
- isSavingLocked: isPostSavingLocked(),
79
- isScheduled: isCurrentPostScheduled(),
61
+ isAutosaving: store.isAutosavingPost(),
62
+ isDirty: forceIsDirty || store.isEditedPostDirty(),
63
+ isNew: store.isEditedPostNew(),
64
+ isPublished: store.isCurrentPostPublished(),
65
+ isSaving: store.isSavingPost(),
66
+ isSaveable: store.isEditedPostSaveable(),
67
+ isSavingLocked: store.isPostSavingLocked(),
68
+ isSavingNonPostEntityChanges:
69
+ store.isSavingNonPostEntityChanges(),
70
+ isScheduled: store.isCurrentPostScheduled(),
80
71
  hasPublishAction:
81
- getCurrentPost()?._links?.[ 'wp:action-publish' ] ?? false,
72
+ !! store.getCurrentPost()?._links?.[ 'wp:action-publish' ],
82
73
  showIconLabels: get( 'core', 'showIconLabels' ),
83
- postStatus: getEditedPostAttribute( 'status' ),
84
- postStatusHasChanged: !! getPostEdits()?.status,
85
- postType: select( editorStore ).getCurrentPostType(),
74
+ postStatus: store.getEditedPostAttribute( 'status' ),
75
+ postStatusHasChanged: !! store.getPostEdits()?.status,
76
+ postType: store.getCurrentPostType(),
86
77
  };
87
78
  },
88
79
  [ forceIsDirty ]
@@ -143,7 +134,13 @@ export default function PostSavedState( { forceIsDirty } ) {
143
134
 
144
135
  const isSaved = forceSavedMessage || ( ! isNew && ! isDirty );
145
136
  const isSavedState = isSaving || isSaved;
146
- const isDisabled = isSaving || isSaved || ! isSaveable || isSavingLocked;
137
+ const isDisabled =
138
+ isSaving ||
139
+ isSaved ||
140
+ ! isSaveable ||
141
+ isSavingLocked ||
142
+ // Disable while a non-post entity (e.g. a newly created term) is mid-save.
143
+ isSavingNonPostEntityChanges;
147
144
  let text;
148
145
 
149
146
  if ( isSaving ) {
@@ -71,6 +71,24 @@ describe( 'PostSavedState', () => {
71
71
  expect( screen.getByRole( 'button' ) ).toMatchSnapshot();
72
72
  } );
73
73
 
74
+ it( 'returns a disabled button while a non-post entity is being saved', () => {
75
+ useSelect.mockImplementation( () => ( {
76
+ isDirty: true,
77
+ isNew: false,
78
+ isSaveable: true,
79
+ isSaving: false,
80
+ isSavingNonPostEntityChanges: true,
81
+ postStatus: 'draft',
82
+ } ) );
83
+
84
+ render( <PostSavedState /> );
85
+
86
+ expect( screen.getByRole( 'button' ) ).toHaveAttribute(
87
+ 'aria-disabled',
88
+ 'true'
89
+ );
90
+ } );
91
+
74
92
  it( 'should return Saved text if not new and not dirty', () => {
75
93
  useSelect.mockImplementation( () => ( {
76
94
  isDirty: false,
@@ -3,11 +3,8 @@
3
3
  */
4
4
  import { __, _x, sprintf } from '@wordpress/i18n';
5
5
  import { useEffect, useMemo, useState } from '@wordpress/element';
6
- import {
7
- FormTokenField,
8
- withFilters,
9
- __experimentalVStack as VStack,
10
- } from '@wordpress/components';
6
+ import { FormTokenField, withFilters } from '@wordpress/components';
7
+ import { Stack } from '@wordpress/ui';
11
8
  import { useSelect, useDispatch } from '@wordpress/data';
12
9
  import { store as coreStore } from '@wordpress/core-data';
13
10
  import { useDebounce } from '@wordpress/compose';
@@ -280,7 +277,7 @@ export function FlatTermSelector( { slug } ) {
280
277
  );
281
278
 
282
279
  return (
283
- <VStack spacing={ 4 }>
280
+ <Stack direction="column" gap="lg">
284
281
  <FormTokenField
285
282
  __next40pxDefaultSize
286
283
  value={ values }
@@ -296,7 +293,7 @@ export function FlatTermSelector( { slug } ) {
296
293
  } }
297
294
  />
298
295
  <MostUsedTerms taxonomy={ taxonomy } onSelect={ appendTerm } />
299
- </VStack>
296
+ </Stack>
300
297
  );
301
298
  }
302
299
 
@@ -6,6 +6,7 @@ import Textarea from 'react-autosize-textarea';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
+ import { useLayoutEffect, useRef } from '@wordpress/element';
9
10
  import { __ } from '@wordpress/i18n';
10
11
  import { store as coreStore } from '@wordpress/core-data';
11
12
  import { useDispatch, useSelect } from '@wordpress/data';
@@ -16,6 +17,7 @@ import { VisuallyHidden } from '@wordpress/ui';
16
17
  * Internal dependencies
17
18
  */
18
19
  import { store as editorStore } from '../../store';
20
+ import { adjustPosition, getDiff } from './utils';
19
21
 
20
22
  /**
21
23
  * Displays the Post Text Editor along with content in Visual and Text mode.
@@ -24,6 +26,9 @@ import { store as editorStore } from '../../store';
24
26
  */
25
27
  export default function PostTextEditor() {
26
28
  const instanceId = useInstanceId( PostTextEditor );
29
+ const textareaRef = useRef();
30
+ const previousValueRef = useRef();
31
+ const selectionRef = useRef();
27
32
  const { value, type, id } = useSelect( ( select ) => {
28
33
  const { getCurrentPostType, getCurrentPostId, getEditedPostContent } =
29
34
  select( editorStore );
@@ -35,6 +40,58 @@ export default function PostTextEditor() {
35
40
  }, [] );
36
41
  const { editEntityRecord } = useDispatch( coreStore );
37
42
 
43
+ useLayoutEffect( () => {
44
+ const textarea = textareaRef.current;
45
+ const previousValue = previousValueRef.current;
46
+ previousValueRef.current = value;
47
+
48
+ if (
49
+ ! textarea ||
50
+ previousValue === undefined ||
51
+ previousValue === value ||
52
+ ! selectionRef.current
53
+ ) {
54
+ return;
55
+ }
56
+
57
+ const { selectionStart, selectionEnd, selectionDirection } =
58
+ selectionRef.current;
59
+ const changes = getDiff( previousValue, value );
60
+ const adjustedSelectionStart = adjustPosition(
61
+ selectionStart,
62
+ changes,
63
+ previousValue,
64
+ value
65
+ );
66
+ const adjustedSelectionEnd = adjustPosition(
67
+ selectionEnd,
68
+ changes,
69
+ previousValue,
70
+ value
71
+ );
72
+
73
+ textarea.setSelectionRange(
74
+ adjustedSelectionStart,
75
+ adjustedSelectionEnd,
76
+ selectionDirection
77
+ );
78
+ selectionRef.current = {
79
+ selectionStart: adjustedSelectionStart,
80
+ selectionEnd: adjustedSelectionEnd,
81
+ selectionDirection,
82
+ };
83
+ }, [ value ] );
84
+
85
+ const updateSelection = ( event ) => {
86
+ const { selectionStart, selectionEnd, selectionDirection } =
87
+ event.target;
88
+ selectionRef.current = {
89
+ selectionStart,
90
+ selectionEnd,
91
+ selectionDirection,
92
+ };
93
+ };
94
+
38
95
  return (
39
96
  <>
40
97
  <VisuallyHidden
@@ -46,14 +103,22 @@ export default function PostTextEditor() {
46
103
  <Textarea
47
104
  autoComplete="off"
48
105
  dir="auto"
106
+ ref={ textareaRef }
49
107
  value={ value }
50
108
  onChange={ ( event ) => {
109
+ updateSelection( event );
110
+ previousValueRef.current = event.target.value;
51
111
  editEntityRecord( 'postType', type, id, {
52
112
  content: event.target.value,
53
113
  blocks: undefined,
54
114
  selection: undefined,
55
115
  } );
56
116
  } }
117
+ onFocus={ updateSelection }
118
+ // A click or arrow-key caret move does not fire `select` (only
119
+ // range selections do), so track those moves via mouseup/keyup.
120
+ onMouseUp={ updateSelection }
121
+ onKeyUp={ updateSelection }
57
122
  className="editor-post-text-editor"
58
123
  id={ `post-content-${ instanceId }` }
59
124
  placeholder={ __( 'Start writing with text or HTML' ) }
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { getAdjustedCursorPosition } from '../utils';
5
+
6
+ describe( 'PostTextEditor', () => {
7
+ describe( 'getAdjustedCursorPosition', () => {
8
+ it( 'keeps the cursor in place when text is inserted after it', () => {
9
+ expect(
10
+ getAdjustedCursorPosition( 3, 'foo bar', 'foo bar baz' )
11
+ ).toBe( 3 );
12
+ } );
13
+
14
+ it( 'moves the cursor when text is inserted before it', () => {
15
+ expect( getAdjustedCursorPosition( 4, 'abcd', 'abXYcd' ) ).toBe(
16
+ 6
17
+ );
18
+ } );
19
+
20
+ it( 'moves the cursor when text is deleted before it', () => {
21
+ expect( getAdjustedCursorPosition( 6, 'abcdef', 'abef' ) ).toBe(
22
+ 4
23
+ );
24
+ } );
25
+
26
+ it( 'moves the cursor to the end of a replacement around it', () => {
27
+ expect( getAdjustedCursorPosition( 3, 'abcdef', 'abXYef' ) ).toBe(
28
+ 4
29
+ );
30
+ } );
31
+
32
+ it( 'handles multiple separated changes in one update', () => {
33
+ expect(
34
+ getAdjustedCursorPosition( 7, 'abcdefghij', 'abXXcdefYYghij' )
35
+ ).toBe( 11 );
36
+ } );
37
+
38
+ it( 'keeps the cursor in place when large text is inserted after it', () => {
39
+ const oldValue = `cursor\n${ 'a\n'.repeat( 6000 ) }`;
40
+ const newValue = `${ oldValue }remote\n`;
41
+
42
+ expect(
43
+ getAdjustedCursorPosition( 'cursor'.length, oldValue, newValue )
44
+ ).toBe( 'cursor'.length );
45
+ } );
46
+
47
+ it( 'moves the cursor when large text is inserted before it', () => {
48
+ const oldValue = `cursor\n${ 'a\n'.repeat( 6000 ) }`;
49
+ const newValue = `remote\n${ oldValue }`;
50
+
51
+ expect(
52
+ getAdjustedCursorPosition( 'cursor'.length, oldValue, newValue )
53
+ ).toBe( 'remote\n'.length + 'cursor'.length );
54
+ } );
55
+
56
+ it( 'moves the cursor when large text is deleted before it', () => {
57
+ const deletedPrefix = 'remote\n';
58
+ const newValue = `cursor\n${ 'a\n'.repeat( 6000 ) }`;
59
+ const oldValue = `${ deletedPrefix }${ newValue }`;
60
+ const position = deletedPrefix.length + 'cursor'.length;
61
+
62
+ expect(
63
+ getAdjustedCursorPosition( position, oldValue, newValue )
64
+ ).toBe( 'cursor'.length );
65
+ } );
66
+
67
+ it( 'moves the cursor when large single-line HTML is inserted before it', () => {
68
+ const opening = '<!-- wp:paragraph -->\n<p>';
69
+ const closing = '</p>\n<!-- /wp:paragraph -->';
70
+ const content = 'a'.repeat( 120000 );
71
+ const insertedText = 'remote';
72
+ const tailText = 'tail';
73
+ const oldValue = `${ opening }${ content }${ closing }`;
74
+ const newValue = `${ opening }${ insertedText }${ content.slice(
75
+ 0,
76
+ 100000
77
+ ) }${ tailText }${ content.slice( 100000 ) }${ closing }`;
78
+ const position = opening.length + 60000;
79
+
80
+ expect(
81
+ getAdjustedCursorPosition( position, oldValue, newValue )
82
+ ).toBe( position + insertedText.length );
83
+ } );
84
+
85
+ it( 'moves the cursor when large single-line HTML is deleted before it', () => {
86
+ const opening = '<!-- wp:paragraph -->\n<p>';
87
+ const closing = '</p>\n<!-- /wp:paragraph -->';
88
+ const deletedText = 'remote'.repeat( 1000 );
89
+ const deletedTailText = 'tail';
90
+ const content = 'a'.repeat( 120000 );
91
+ const newValue = `${ opening }${ content }${ closing }`;
92
+ const oldValue = `${ opening }${ deletedText }${ content.slice(
93
+ 0,
94
+ 100000
95
+ ) }${ deletedTailText }${ content.slice( 100000 ) }${ closing }`;
96
+ const position = opening.length + deletedText.length + 60000;
97
+
98
+ expect(
99
+ getAdjustedCursorPosition( position, oldValue, newValue )
100
+ ).toBe( position - deletedText.length );
101
+ } );
102
+
103
+ it( 'keeps the cursor in an unchanged same-line prefix before a large replacement', () => {
104
+ const prefix = `${ 'a'.repeat( 300 ) }\n${ 'b'.repeat( 199 ) }`;
105
+ const suffix = 'tail';
106
+ const oldValue = `${ prefix }old${ 'x'.repeat(
107
+ 11000
108
+ ) }${ suffix }`;
109
+ const newValue = `${ prefix }new${ 'y'.repeat(
110
+ 11000
111
+ ) }${ suffix }`;
112
+ const position = 450;
113
+
114
+ expect(
115
+ getAdjustedCursorPosition( position, oldValue, newValue )
116
+ ).toBe( position );
117
+ } );
118
+
119
+ it( 'moves the cursor when large same-line text is inserted before it and replaced after it', () => {
120
+ const opening = '<!-- wp:paragraph -->\n<p>';
121
+ const closing = '</p>\n<!-- /wp:paragraph -->';
122
+ const content = 'a'.repeat( 120000 );
123
+ const insertedText = 'remote';
124
+ const oldValue = `${ opening }${ content }${ closing }`;
125
+ const newValue = `${ opening }${ content.slice(
126
+ 0,
127
+ 50000
128
+ ) }${ insertedText }${ content.slice(
129
+ 50000,
130
+ 100000
131
+ ) }b${ content.slice( 100001 ) }${ closing }`;
132
+ const position = opening.length + 60000;
133
+
134
+ expect(
135
+ getAdjustedCursorPosition( position, oldValue, newValue )
136
+ ).toBe( position + insertedText.length );
137
+ } );
138
+
139
+ it( 'moves the cursor when large same-line text is deleted before it and inserted after it', () => {
140
+ const opening = '<!-- wp:paragraph -->\n<p>';
141
+ const closing = '</p>\n<!-- /wp:paragraph -->';
142
+ const content = 'a'.repeat( 120000 );
143
+ const deletedText = 'remote'.repeat( 1000 );
144
+ const insertedTailText = 'tail';
145
+ const commonTextBeforeCursor = 500;
146
+ const oldValue = `${ opening }${ content.slice(
147
+ 0,
148
+ 50000
149
+ ) }${ deletedText }${ content.slice( 50000 ) }${ closing }`;
150
+ const newValue = `${ opening }${ content.slice(
151
+ 0,
152
+ 100000
153
+ ) }${ insertedTailText }${ content.slice( 100000 ) }${ closing }`;
154
+ const position =
155
+ opening.length +
156
+ 50000 +
157
+ deletedText.length +
158
+ commonTextBeforeCursor;
159
+
160
+ expect(
161
+ getAdjustedCursorPosition( position, oldValue, newValue )
162
+ ).toBe( position - deletedText.length );
163
+ } );
164
+
165
+ it( 'maps the cursor through a pure insertion in a large single line', () => {
166
+ // "HEAD"/"TAIL" wrap the unchanged content, so the new value contains
167
+ // the old changed window and it routes through the line-diff fallback.
168
+ const opening = '<!-- wp:paragraph -->\n<p>';
169
+ const closing = '</p>\n<!-- /wp:paragraph -->';
170
+ const content = 'a'.repeat( 120000 );
171
+ const oldValue = `${ opening }${ content }${ closing }`;
172
+ const newValue = `${ opening }HEAD${ content }TAIL${ closing }`;
173
+ const position = opening.length + 60000;
174
+
175
+ expect(
176
+ getAdjustedCursorPosition( position, oldValue, newValue )
177
+ ).toBe( position + 'HEAD'.length );
178
+ } );
179
+
180
+ it( 'maps the cursor through a pure deletion in a large single line', () => {
181
+ const opening = '<!-- wp:paragraph -->\n<p>';
182
+ const closing = '</p>\n<!-- /wp:paragraph -->';
183
+ const content = 'a'.repeat( 120000 );
184
+ const oldValue = `${ opening }HEAD${ content }TAIL${ closing }`;
185
+ const newValue = `${ opening }${ content }${ closing }`;
186
+ const position = opening.length + 'HEAD'.length + 60000;
187
+
188
+ expect(
189
+ getAdjustedCursorPosition( position, oldValue, newValue )
190
+ ).toBe( position - 'HEAD'.length );
191
+ } );
192
+
193
+ it( 'handles a large fully-divergent replacement without blocking', () => {
194
+ // Neither side contains the other and the changed window exceeds the
195
+ // diffChars threshold, so this routes to the line-diff fallback. A
196
+ // character diff here would be O(n^2) and freeze the main thread for
197
+ // seconds; completing within the test timeout guards that path.
198
+ const oldValue = 'a'.repeat( 8000 );
199
+ const newValue = 'b'.repeat( 8000 );
200
+ const result = getAdjustedCursorPosition(
201
+ 4000,
202
+ oldValue,
203
+ newValue
204
+ );
205
+
206
+ expect( result ).toBeGreaterThanOrEqual( 0 );
207
+ expect( result ).toBeLessThanOrEqual( newValue.length );
208
+ } );
209
+ } );
210
+ } );