@wordpress/editor 14.40.2-next.v.202602241322.0 → 14.40.2

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 (464) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/components/collab-sidebar/index.cjs +7 -4
  3. package/build/components/collab-sidebar/index.cjs.map +2 -2
  4. package/build/components/collab-sidebar/utils.cjs +13 -15
  5. package/build/components/collab-sidebar/utils.cjs.map +2 -2
  6. package/build/components/collaborators-overlay/avatar-iframe-styles.cjs +141 -0
  7. package/build/components/collaborators-overlay/avatar-iframe-styles.cjs.map +7 -0
  8. package/build/components/collaborators-overlay/collaborator-styles.cjs +38 -2
  9. package/build/components/collaborators-overlay/collaborator-styles.cjs.map +2 -2
  10. package/build/components/collaborators-overlay/compute-selection.cjs +185 -0
  11. package/build/components/collaborators-overlay/compute-selection.cjs.map +7 -0
  12. package/build/components/collaborators-overlay/cursor-dom-utils.cjs +243 -0
  13. package/build/components/collaborators-overlay/cursor-dom-utils.cjs.map +7 -0
  14. package/build/components/collaborators-overlay/cursor-registry.cjs +86 -0
  15. package/build/components/collaborators-overlay/cursor-registry.cjs.map +7 -0
  16. package/build/components/collaborators-overlay/index.cjs +7 -2
  17. package/build/components/collaborators-overlay/index.cjs.map +2 -2
  18. package/build/components/collaborators-overlay/overlay-iframe-styles.cjs +148 -0
  19. package/build/components/collaborators-overlay/overlay-iframe-styles.cjs.map +7 -0
  20. package/build/components/collaborators-overlay/overlay.cjs +146 -236
  21. package/build/components/collaborators-overlay/overlay.cjs.map +3 -3
  22. package/build/components/collaborators-overlay/timing-utils.cjs +46 -0
  23. package/build/components/collaborators-overlay/timing-utils.cjs.map +7 -0
  24. package/build/components/collaborators-overlay/use-block-highlighting.cjs +91 -42
  25. package/build/components/collaborators-overlay/use-block-highlighting.cjs.map +2 -2
  26. package/build/components/collaborators-overlay/use-debounced-recompute.cjs +49 -0
  27. package/build/components/collaborators-overlay/use-debounced-recompute.cjs.map +7 -0
  28. package/build/components/collaborators-overlay/use-render-cursors.cjs +82 -172
  29. package/build/components/collaborators-overlay/use-render-cursors.cjs.map +3 -3
  30. package/build/components/collaborators-presence/avatar/component.cjs +121 -0
  31. package/build/components/collaborators-presence/avatar/component.cjs.map +7 -0
  32. package/build/components/collaborators-presence/avatar/index.cjs +37 -0
  33. package/build/components/collaborators-presence/avatar/index.cjs.map +7 -0
  34. package/build/components/collaborators-presence/avatar/types.cjs +19 -0
  35. package/build/components/collaborators-presence/avatar/types.cjs.map +7 -0
  36. package/build/components/collaborators-presence/avatar/use-image-loading-status.cjs +44 -0
  37. package/build/components/collaborators-presence/avatar/use-image-loading-status.cjs.map +7 -0
  38. package/build/components/collaborators-presence/avatar-group/component.cjs +78 -0
  39. package/build/components/collaborators-presence/avatar-group/component.cjs.map +7 -0
  40. package/build/components/collaborators-presence/avatar-group/index.cjs +37 -0
  41. package/build/components/collaborators-presence/avatar-group/index.cjs.map +7 -0
  42. package/build/components/collaborators-presence/avatar-group/types.cjs +19 -0
  43. package/build/components/collaborators-presence/avatar-group/types.cjs.map +7 -0
  44. package/build/components/collaborators-presence/index.cjs +66 -19
  45. package/build/components/collaborators-presence/index.cjs.map +3 -3
  46. package/build/components/collaborators-presence/list.cjs +60 -38
  47. package/build/components/collaborators-presence/list.cjs.map +3 -3
  48. package/build/components/collaborators-presence/use-collaborator-notifications.cjs +149 -0
  49. package/build/components/collaborators-presence/use-collaborator-notifications.cjs.map +7 -0
  50. package/build/components/editor-interface/index.cjs +11 -6
  51. package/build/components/editor-interface/index.cjs.map +2 -2
  52. package/build/components/inserter-sidebar/index.cjs +2 -1
  53. package/build/components/inserter-sidebar/index.cjs.map +2 -2
  54. package/build/components/post-last-revision/index.cjs +27 -6
  55. package/build/components/post-last-revision/index.cjs.map +2 -2
  56. package/build/components/post-locked-modal/index.cjs +49 -17
  57. package/build/components/post-locked-modal/index.cjs.map +3 -3
  58. package/build/components/post-revisions-preview/block-diff.cjs +130 -34
  59. package/build/components/post-revisions-preview/block-diff.cjs.map +2 -2
  60. package/build/components/post-revisions-preview/diff-markers.cjs +6 -5
  61. package/build/components/post-revisions-preview/diff-markers.cjs.map +2 -2
  62. package/build/components/post-revisions-preview/revisions-canvas.cjs +16 -60
  63. package/build/components/post-revisions-preview/revisions-canvas.cjs.map +3 -3
  64. package/build/components/post-revisions-preview/revisions-header.cjs +33 -26
  65. package/build/components/post-revisions-preview/revisions-header.cjs.map +3 -3
  66. package/build/components/post-revisions-preview/revisions-slider.cjs +104 -39
  67. package/build/components/post-revisions-preview/revisions-slider.cjs.map +3 -3
  68. package/build/components/preferences-modal/index.cjs +36 -4
  69. package/build/components/preferences-modal/index.cjs.map +2 -2
  70. package/build/components/provider/disable-non-page-content-blocks.cjs +31 -28
  71. package/build/components/provider/disable-non-page-content-blocks.cjs.map +3 -3
  72. package/build/components/provider/index.cjs +17 -5
  73. package/build/components/provider/index.cjs.map +2 -2
  74. package/build/components/provider/use-block-editor-settings.cjs +20 -4
  75. package/build/components/provider/use-block-editor-settings.cjs.map +3 -3
  76. package/build/components/provider/{use-post-content-blocks.cjs → use-post-content-block-types.cjs} +8 -19
  77. package/build/components/provider/use-post-content-block-types.cjs.map +7 -0
  78. package/build/components/provider/use-revision-blocks.cjs +106 -0
  79. package/build/components/provider/use-revision-blocks.cjs.map +7 -0
  80. package/build/components/revision-block-diff/index.cjs +61 -0
  81. package/build/components/revision-block-diff/index.cjs.map +7 -0
  82. package/build/components/revision-diff-panel/index.cjs +68 -0
  83. package/build/components/revision-diff-panel/index.cjs.map +7 -0
  84. package/build/components/revision-fields-diff/index.cjs +96 -0
  85. package/build/components/revision-fields-diff/index.cjs.map +7 -0
  86. package/build/components/sidebar/header.cjs +1 -1
  87. package/build/components/sidebar/header.cjs.map +2 -2
  88. package/build/components/sidebar/index.cjs +7 -1
  89. package/build/components/sidebar/index.cjs.map +3 -3
  90. package/build/components/style-book/index.cjs +4 -3
  91. package/build/components/style-book/index.cjs.map +2 -2
  92. package/build/components/sync-connection-error-modal/index.cjs +187 -0
  93. package/build/components/sync-connection-error-modal/index.cjs.map +7 -0
  94. package/build/components/sync-connection-error-modal/use-retry-countdown.cjs +84 -0
  95. package/build/components/sync-connection-error-modal/use-retry-countdown.cjs.map +7 -0
  96. package/build/components/template-content-panel/index.cjs +35 -31
  97. package/build/components/template-content-panel/index.cjs.map +3 -3
  98. package/build/components/template-part-menu-items/convert-to-regular.cjs +54 -11
  99. package/build/components/template-part-menu-items/convert-to-regular.cjs.map +3 -3
  100. package/build/components/visual-editor/index.cjs +6 -15
  101. package/build/components/visual-editor/index.cjs.map +2 -2
  102. package/build/store/private-actions.cjs +46 -2
  103. package/build/store/private-actions.cjs.map +2 -2
  104. package/build/store/private-selectors.cjs +156 -21
  105. package/build/store/private-selectors.cjs.map +2 -2
  106. package/build/store/reducer.cjs +27 -0
  107. package/build/store/reducer.cjs.map +2 -2
  108. package/build/store/selectors.cjs +0 -14
  109. package/build/store/selectors.cjs.map +2 -2
  110. package/build/utils/media-finalize/index.cjs +43 -0
  111. package/build/utils/media-finalize/index.cjs.map +7 -0
  112. package/build/utils/media-upload/on-success.cjs +46 -0
  113. package/build/utils/media-upload/on-success.cjs.map +7 -0
  114. package/build/utils/sync-error-messages.cjs +32 -15
  115. package/build/utils/sync-error-messages.cjs.map +3 -3
  116. package/build-module/components/collab-sidebar/index.mjs +7 -4
  117. package/build-module/components/collab-sidebar/index.mjs.map +2 -2
  118. package/build-module/components/collab-sidebar/utils.mjs +13 -15
  119. package/build-module/components/collab-sidebar/utils.mjs.map +2 -2
  120. package/build-module/components/collaborators-overlay/avatar-iframe-styles.mjs +128 -0
  121. package/build-module/components/collaborators-overlay/avatar-iframe-styles.mjs.map +7 -0
  122. package/build-module/components/collaborators-overlay/collaborator-styles.mjs +25 -1
  123. package/build-module/components/collaborators-overlay/collaborator-styles.mjs.map +2 -2
  124. package/build-module/components/collaborators-overlay/compute-selection.mjs +166 -0
  125. package/build-module/components/collaborators-overlay/compute-selection.mjs.map +7 -0
  126. package/build-module/components/collaborators-overlay/cursor-dom-utils.mjs +213 -0
  127. package/build-module/components/collaborators-overlay/cursor-dom-utils.mjs.map +7 -0
  128. package/build-module/components/collaborators-overlay/cursor-registry.mjs +61 -0
  129. package/build-module/components/collaborators-overlay/cursor-registry.mjs.map +7 -0
  130. package/build-module/components/collaborators-overlay/index.mjs +7 -2
  131. package/build-module/components/collaborators-overlay/index.mjs.map +2 -2
  132. package/build-module/components/collaborators-overlay/overlay-iframe-styles.mjs +130 -0
  133. package/build-module/components/collaborators-overlay/overlay-iframe-styles.mjs.map +7 -0
  134. package/build-module/components/collaborators-overlay/overlay.mjs +137 -237
  135. package/build-module/components/collaborators-overlay/overlay.mjs.map +2 -2
  136. package/build-module/components/collaborators-overlay/timing-utils.mjs +21 -0
  137. package/build-module/components/collaborators-overlay/timing-utils.mjs.map +7 -0
  138. package/build-module/components/collaborators-overlay/use-block-highlighting.mjs +93 -45
  139. package/build-module/components/collaborators-overlay/use-block-highlighting.mjs.map +2 -2
  140. package/build-module/components/collaborators-overlay/use-debounced-recompute.mjs +24 -0
  141. package/build-module/components/collaborators-overlay/use-debounced-recompute.mjs.map +7 -0
  142. package/build-module/components/collaborators-overlay/use-render-cursors.mjs +83 -176
  143. package/build-module/components/collaborators-overlay/use-render-cursors.mjs.map +2 -2
  144. package/build-module/components/collaborators-presence/avatar/component.mjs +90 -0
  145. package/build-module/components/collaborators-presence/avatar/component.mjs.map +7 -0
  146. package/build-module/components/collaborators-presence/avatar/index.mjs +6 -0
  147. package/build-module/components/collaborators-presence/avatar/index.mjs.map +7 -0
  148. package/build-module/components/collaborators-presence/avatar/types.mjs +1 -0
  149. package/build-module/components/collaborators-presence/avatar/types.mjs.map +7 -0
  150. package/build-module/components/collaborators-presence/avatar/use-image-loading-status.mjs +19 -0
  151. package/build-module/components/collaborators-presence/avatar/use-image-loading-status.mjs.map +7 -0
  152. package/build-module/components/collaborators-presence/avatar-group/component.mjs +47 -0
  153. package/build-module/components/collaborators-presence/avatar-group/component.mjs.map +7 -0
  154. package/build-module/components/collaborators-presence/avatar-group/index.mjs +6 -0
  155. package/build-module/components/collaborators-presence/avatar-group/index.mjs.map +7 -0
  156. package/build-module/components/collaborators-presence/avatar-group/types.mjs +1 -0
  157. package/build-module/components/collaborators-presence/avatar-group/types.mjs.map +7 -0
  158. package/build-module/components/collaborators-presence/index.mjs +57 -23
  159. package/build-module/components/collaborators-presence/index.mjs.map +2 -2
  160. package/build-module/components/collaborators-presence/list.mjs +52 -44
  161. package/build-module/components/collaborators-presence/list.mjs.map +2 -2
  162. package/build-module/components/collaborators-presence/use-collaborator-notifications.mjs +126 -0
  163. package/build-module/components/collaborators-presence/use-collaborator-notifications.mjs.map +7 -0
  164. package/build-module/components/editor-interface/index.mjs +12 -7
  165. package/build-module/components/editor-interface/index.mjs.map +2 -2
  166. package/build-module/components/inserter-sidebar/index.mjs +2 -1
  167. package/build-module/components/inserter-sidebar/index.mjs.map +2 -2
  168. package/build-module/components/post-last-revision/index.mjs +27 -6
  169. package/build-module/components/post-last-revision/index.mjs.map +2 -2
  170. package/build-module/components/post-locked-modal/index.mjs +49 -17
  171. package/build-module/components/post-locked-modal/index.mjs.map +2 -2
  172. package/build-module/components/post-revisions-preview/block-diff.mjs +130 -34
  173. package/build-module/components/post-revisions-preview/block-diff.mjs.map +2 -2
  174. package/build-module/components/post-revisions-preview/diff-markers.mjs +6 -5
  175. package/build-module/components/post-revisions-preview/diff-markers.mjs.map +2 -2
  176. package/build-module/components/post-revisions-preview/revisions-canvas.mjs +18 -65
  177. package/build-module/components/post-revisions-preview/revisions-canvas.mjs.map +2 -2
  178. package/build-module/components/post-revisions-preview/revisions-header.mjs +36 -33
  179. package/build-module/components/post-revisions-preview/revisions-header.mjs.map +2 -2
  180. package/build-module/components/post-revisions-preview/revisions-slider.mjs +112 -42
  181. package/build-module/components/post-revisions-preview/revisions-slider.mjs.map +2 -2
  182. package/build-module/components/preferences-modal/index.mjs +36 -4
  183. package/build-module/components/preferences-modal/index.mjs.map +2 -2
  184. package/build-module/components/provider/disable-non-page-content-blocks.mjs +31 -28
  185. package/build-module/components/provider/disable-non-page-content-blocks.mjs.map +2 -2
  186. package/build-module/components/provider/index.mjs +17 -5
  187. package/build-module/components/provider/index.mjs.map +2 -2
  188. package/build-module/components/provider/use-block-editor-settings.mjs +20 -4
  189. package/build-module/components/provider/use-block-editor-settings.mjs.map +2 -2
  190. package/build-module/components/provider/use-post-content-block-types.mjs +23 -0
  191. package/build-module/components/provider/use-post-content-block-types.mjs.map +7 -0
  192. package/build-module/components/provider/use-revision-blocks.mjs +81 -0
  193. package/build-module/components/provider/use-revision-blocks.mjs.map +7 -0
  194. package/build-module/components/revision-block-diff/index.mjs +30 -0
  195. package/build-module/components/revision-block-diff/index.mjs.map +7 -0
  196. package/build-module/components/revision-diff-panel/index.mjs +37 -0
  197. package/build-module/components/revision-diff-panel/index.mjs.map +7 -0
  198. package/build-module/components/revision-fields-diff/index.mjs +65 -0
  199. package/build-module/components/revision-fields-diff/index.mjs.map +7 -0
  200. package/build-module/components/sidebar/header.mjs +1 -1
  201. package/build-module/components/sidebar/header.mjs.map +2 -2
  202. package/build-module/components/sidebar/index.mjs +7 -1
  203. package/build-module/components/sidebar/index.mjs.map +2 -2
  204. package/build-module/components/style-book/index.mjs +4 -3
  205. package/build-module/components/style-book/index.mjs.map +2 -2
  206. package/build-module/components/sync-connection-error-modal/index.mjs +170 -0
  207. package/build-module/components/sync-connection-error-modal/index.mjs.map +7 -0
  208. package/build-module/components/sync-connection-error-modal/use-retry-countdown.mjs +59 -0
  209. package/build-module/components/sync-connection-error-modal/use-retry-countdown.mjs.map +7 -0
  210. package/build-module/components/template-content-panel/index.mjs +25 -31
  211. package/build-module/components/template-content-panel/index.mjs.map +2 -2
  212. package/build-module/components/template-part-menu-items/convert-to-regular.mjs +60 -14
  213. package/build-module/components/template-part-menu-items/convert-to-regular.mjs.map +2 -2
  214. package/build-module/components/visual-editor/index.mjs +6 -15
  215. package/build-module/components/visual-editor/index.mjs.map +2 -2
  216. package/build-module/store/private-actions.mjs +44 -2
  217. package/build-module/store/private-actions.mjs.map +2 -2
  218. package/build-module/store/private-selectors.mjs +155 -21
  219. package/build-module/store/private-selectors.mjs.map +2 -2
  220. package/build-module/store/reducer.mjs +25 -0
  221. package/build-module/store/reducer.mjs.map +2 -2
  222. package/build-module/store/selectors.mjs +0 -13
  223. package/build-module/store/selectors.mjs.map +2 -2
  224. package/build-module/utils/media-finalize/index.mjs +12 -0
  225. package/build-module/utils/media-finalize/index.mjs.map +7 -0
  226. package/build-module/utils/media-upload/on-success.mjs +25 -0
  227. package/build-module/utils/media-upload/on-success.mjs.map +7 -0
  228. package/build-module/utils/sync-error-messages.mjs +27 -15
  229. package/build-module/utils/sync-error-messages.mjs.map +3 -3
  230. package/build-style/style-rtl.css +388 -132
  231. package/build-style/style.css +388 -132
  232. package/build-types/components/autocompleters/link.d.ts +8 -0
  233. package/build-types/components/autocompleters/link.d.ts.map +1 -0
  234. package/build-types/components/collab-sidebar/add-note-menu-item.d.ts +5 -0
  235. package/build-types/components/collab-sidebar/add-note-menu-item.d.ts.map +1 -0
  236. package/build-types/components/collab-sidebar/add-note.d.ts +6 -0
  237. package/build-types/components/collab-sidebar/add-note.d.ts.map +1 -0
  238. package/build-types/components/collab-sidebar/board-store.d.ts +9 -0
  239. package/build-types/components/collab-sidebar/board-store.d.ts.map +1 -0
  240. package/build-types/components/collab-sidebar/floating-container.d.ts +8 -0
  241. package/build-types/components/collab-sidebar/floating-container.d.ts.map +1 -0
  242. package/build-types/components/collab-sidebar/index.d.ts.map +1 -1
  243. package/build-types/components/collab-sidebar/note-byline.d.ts +10 -0
  244. package/build-types/components/collab-sidebar/note-byline.d.ts.map +1 -0
  245. package/build-types/components/collab-sidebar/note-card.d.ts +8 -0
  246. package/build-types/components/collab-sidebar/note-card.d.ts.map +1 -0
  247. package/build-types/components/collab-sidebar/note-form.d.ts +7 -0
  248. package/build-types/components/collab-sidebar/note-form.d.ts.map +1 -0
  249. package/build-types/components/collab-sidebar/note-indicator-toolbar.d.ts +5 -0
  250. package/build-types/components/collab-sidebar/note-indicator-toolbar.d.ts.map +1 -0
  251. package/build-types/components/collab-sidebar/note-thread.d.ts +11 -0
  252. package/build-types/components/collab-sidebar/note-thread.d.ts.map +1 -0
  253. package/build-types/components/collab-sidebar/note.d.ts +9 -0
  254. package/build-types/components/collab-sidebar/note.d.ts.map +1 -0
  255. package/build-types/components/collab-sidebar/notes.d.ts +7 -0
  256. package/build-types/components/collab-sidebar/notes.d.ts.map +1 -0
  257. package/build-types/components/collab-sidebar/utils.d.ts.map +1 -1
  258. package/build-types/components/collaborators-overlay/avatar-iframe-styles.d.ts +11 -0
  259. package/build-types/components/collaborators-overlay/avatar-iframe-styles.d.ts.map +1 -0
  260. package/build-types/components/collaborators-overlay/collaborator-styles.d.ts +17 -2
  261. package/build-types/components/collaborators-overlay/collaborator-styles.d.ts.map +1 -1
  262. package/build-types/components/collaborators-overlay/compute-selection.d.ts +24 -0
  263. package/build-types/components/collaborators-overlay/compute-selection.d.ts.map +1 -0
  264. package/build-types/components/collaborators-overlay/cursor-dom-utils.d.ts +72 -0
  265. package/build-types/components/collaborators-overlay/cursor-dom-utils.d.ts.map +1 -0
  266. package/build-types/components/collaborators-overlay/cursor-registry.d.ts +36 -0
  267. package/build-types/components/collaborators-overlay/cursor-registry.d.ts.map +1 -0
  268. package/build-types/components/collaborators-overlay/index.d.ts +7 -4
  269. package/build-types/components/collaborators-overlay/index.d.ts.map +1 -1
  270. package/build-types/components/collaborators-overlay/overlay-iframe-styles.d.ts +6 -0
  271. package/build-types/components/collaborators-overlay/overlay-iframe-styles.d.ts.map +1 -0
  272. package/build-types/components/collaborators-overlay/overlay.d.ts +4 -1
  273. package/build-types/components/collaborators-overlay/overlay.d.ts.map +1 -1
  274. package/build-types/components/collaborators-overlay/timing-utils.d.ts +11 -0
  275. package/build-types/components/collaborators-overlay/timing-utils.d.ts.map +1 -0
  276. package/build-types/components/collaborators-overlay/use-block-highlighting.d.ts +21 -5
  277. package/build-types/components/collaborators-overlay/use-block-highlighting.d.ts.map +1 -1
  278. package/build-types/components/collaborators-overlay/use-debounced-recompute.d.ts +10 -0
  279. package/build-types/components/collaborators-overlay/use-debounced-recompute.d.ts.map +1 -0
  280. package/build-types/components/collaborators-overlay/use-render-cursors.d.ts +6 -1
  281. package/build-types/components/collaborators-overlay/use-render-cursors.d.ts.map +1 -1
  282. package/build-types/components/collaborators-presence/avatar/component.d.ts +7 -0
  283. package/build-types/components/collaborators-presence/avatar/component.d.ts.map +1 -0
  284. package/build-types/components/collaborators-presence/avatar/index.d.ts +3 -0
  285. package/build-types/components/collaborators-presence/avatar/index.d.ts.map +1 -0
  286. package/build-types/components/collaborators-presence/avatar/types.d.ts +66 -0
  287. package/build-types/components/collaborators-presence/avatar/types.d.ts.map +1 -0
  288. package/build-types/components/collaborators-presence/avatar/use-image-loading-status.d.ts +17 -0
  289. package/build-types/components/collaborators-presence/avatar/use-image-loading-status.d.ts.map +1 -0
  290. package/build-types/components/collaborators-presence/avatar-group/component.d.ts +7 -0
  291. package/build-types/components/collaborators-presence/avatar-group/component.d.ts.map +1 -0
  292. package/build-types/components/collaborators-presence/avatar-group/index.d.ts +3 -0
  293. package/build-types/components/collaborators-presence/avatar-group/index.d.ts.map +1 -0
  294. package/build-types/components/collaborators-presence/avatar-group/types.d.ts +14 -0
  295. package/build-types/components/collaborators-presence/avatar-group/types.d.ts.map +1 -0
  296. package/build-types/components/collaborators-presence/index.d.ts.map +1 -1
  297. package/build-types/components/collaborators-presence/list.d.ts +6 -2
  298. package/build-types/components/collaborators-presence/list.d.ts.map +1 -1
  299. package/build-types/components/collaborators-presence/use-collaborator-notifications.d.ts +9 -0
  300. package/build-types/components/collaborators-presence/use-collaborator-notifications.d.ts.map +1 -0
  301. package/build-types/components/editor-interface/index.d.ts.map +1 -1
  302. package/build-types/components/inserter-sidebar/index.d.ts.map +1 -1
  303. package/build-types/components/media/media-editor-modal.d.ts +15 -0
  304. package/build-types/components/media/media-editor-modal.d.ts.map +1 -0
  305. package/build-types/components/post-last-revision/index.d.ts.map +1 -1
  306. package/build-types/components/post-locked-modal/index.d.ts.map +1 -1
  307. package/build-types/components/post-revisions-panel/index.d.ts +2 -0
  308. package/build-types/components/post-revisions-panel/index.d.ts.map +1 -0
  309. package/build-types/components/post-revisions-preview/block-diff.d.ts.map +1 -1
  310. package/build-types/components/post-revisions-preview/diff-markers.d.ts.map +1 -1
  311. package/build-types/components/post-revisions-preview/revisions-canvas.d.ts +2 -5
  312. package/build-types/components/post-revisions-preview/revisions-canvas.d.ts.map +1 -1
  313. package/build-types/components/post-revisions-preview/revisions-header.d.ts.map +1 -1
  314. package/build-types/components/post-revisions-preview/revisions-slider.d.ts +1 -1
  315. package/build-types/components/post-revisions-preview/revisions-slider.d.ts.map +1 -1
  316. package/build-types/components/post-text-editor/utils.d.ts +29 -0
  317. package/build-types/components/post-text-editor/utils.d.ts.map +1 -0
  318. package/build-types/components/provider/disable-non-page-content-blocks.d.ts.map +1 -1
  319. package/build-types/components/provider/index.d.ts.map +1 -1
  320. package/build-types/components/provider/use-block-editor-settings.d.ts.map +1 -1
  321. package/build-types/components/provider/use-network-reconnect.d.ts +8 -0
  322. package/build-types/components/provider/use-network-reconnect.d.ts.map +1 -0
  323. package/build-types/components/provider/use-post-content-block-types.d.ts +9 -0
  324. package/build-types/components/provider/use-post-content-block-types.d.ts.map +1 -0
  325. package/build-types/components/provider/use-revision-blocks.d.ts +10 -0
  326. package/build-types/components/provider/use-revision-blocks.d.ts.map +1 -0
  327. package/build-types/components/revision-block-diff/index.d.ts +6 -0
  328. package/build-types/components/revision-block-diff/index.d.ts.map +1 -0
  329. package/build-types/components/revision-diff-panel/index.d.ts +14 -0
  330. package/build-types/components/revision-diff-panel/index.d.ts.map +1 -0
  331. package/build-types/components/revision-fields-diff/index.d.ts +6 -0
  332. package/build-types/components/revision-fields-diff/index.d.ts.map +1 -0
  333. package/build-types/components/sidebar/dataform-post-summary.d.ts +4 -0
  334. package/build-types/components/sidebar/dataform-post-summary.d.ts.map +1 -0
  335. package/build-types/components/sidebar/index.d.ts.map +1 -1
  336. package/build-types/components/sidebar/post-revision-summary.d.ts +2 -0
  337. package/build-types/components/sidebar/post-revision-summary.d.ts.map +1 -0
  338. package/build-types/components/style-book/index.d.ts +2 -1
  339. package/build-types/components/style-book/index.d.ts.map +1 -1
  340. package/build-types/components/sync-connection-error-modal/index.d.ts +8 -0
  341. package/build-types/components/sync-connection-error-modal/index.d.ts.map +1 -0
  342. package/build-types/components/sync-connection-error-modal/use-retry-countdown.d.ts +11 -0
  343. package/build-types/components/sync-connection-error-modal/use-retry-countdown.d.ts.map +1 -0
  344. package/build-types/components/template-actions-panel/block-theme-content.d.ts +2 -0
  345. package/build-types/components/template-actions-panel/block-theme-content.d.ts.map +1 -0
  346. package/build-types/components/template-actions-panel/classic-theme-content.d.ts +2 -0
  347. package/build-types/components/template-actions-panel/classic-theme-content.d.ts.map +1 -0
  348. package/build-types/components/template-actions-panel/index.d.ts +2 -0
  349. package/build-types/components/template-actions-panel/index.d.ts.map +1 -0
  350. package/build-types/components/template-content-panel/index.d.ts.map +1 -1
  351. package/build-types/components/template-part-menu-items/convert-to-regular.d.ts.map +1 -1
  352. package/build-types/components/upload-progress-snackbar/index.d.ts +19 -0
  353. package/build-types/components/upload-progress-snackbar/index.d.ts.map +1 -0
  354. package/build-types/components/upload-progress-snackbar/stories/index.story.d.ts +28 -0
  355. package/build-types/components/upload-progress-snackbar/stories/index.story.d.ts.map +1 -0
  356. package/build-types/components/upload-progress-snackbar/tracker.d.ts +41 -0
  357. package/build-types/components/upload-progress-snackbar/tracker.d.ts.map +1 -0
  358. package/build-types/components/visual-editor/index.d.ts.map +1 -1
  359. package/build-types/store/private-actions.d.ts +12 -0
  360. package/build-types/store/private-actions.d.ts.map +1 -1
  361. package/build-types/store/private-selectors.d.ts +45 -0
  362. package/build-types/store/private-selectors.d.ts.map +1 -1
  363. package/build-types/store/reducer.d.ts +21 -0
  364. package/build-types/store/reducer.d.ts.map +1 -1
  365. package/build-types/store/selectors.d.ts +0 -10
  366. package/build-types/store/selectors.d.ts.map +1 -1
  367. package/build-types/utils/media-delete/index.d.ts +2 -0
  368. package/build-types/utils/media-delete/index.d.ts.map +1 -0
  369. package/build-types/utils/media-finalize/index.d.ts +2 -0
  370. package/build-types/utils/media-finalize/index.d.ts.map +1 -0
  371. package/build-types/utils/media-upload/on-success.d.ts +9 -0
  372. package/build-types/utils/media-upload/on-success.d.ts.map +1 -0
  373. package/build-types/utils/sync-error-messages.d.ts +17 -3
  374. package/build-types/utils/sync-error-messages.d.ts.map +1 -1
  375. package/package.json +45 -44
  376. package/src/components/collab-sidebar/index.js +7 -4
  377. package/src/components/collab-sidebar/utils.js +9 -10
  378. package/src/components/collaborators-overlay/avatar-iframe-styles.ts +134 -0
  379. package/src/components/collaborators-overlay/collaborator-styles.ts +43 -2
  380. package/src/components/collaborators-overlay/compute-selection.ts +315 -0
  381. package/src/components/collaborators-overlay/cursor-dom-utils.ts +382 -0
  382. package/src/components/collaborators-overlay/cursor-registry.ts +96 -0
  383. package/src/components/collaborators-overlay/index.tsx +12 -4
  384. package/src/components/collaborators-overlay/overlay-iframe-styles.ts +131 -0
  385. package/src/components/collaborators-overlay/overlay.tsx +145 -229
  386. package/src/components/collaborators-overlay/timing-utils.ts +30 -0
  387. package/src/components/collaborators-overlay/use-block-highlighting.ts +152 -64
  388. package/src/components/collaborators-overlay/use-debounced-recompute.ts +32 -0
  389. package/src/components/collaborators-overlay/use-render-cursors.ts +120 -282
  390. package/src/components/collaborators-presence/avatar/component.tsx +123 -0
  391. package/src/components/collaborators-presence/avatar/index.ts +2 -0
  392. package/src/components/collaborators-presence/avatar/styles.scss +184 -0
  393. package/src/components/collaborators-presence/avatar/test/index.tsx +389 -0
  394. package/src/components/collaborators-presence/avatar/types.ts +66 -0
  395. package/src/components/collaborators-presence/avatar/use-image-loading-status.ts +36 -0
  396. package/src/components/collaborators-presence/avatar-group/component.tsx +55 -0
  397. package/src/components/collaborators-presence/avatar-group/index.ts +2 -0
  398. package/src/components/collaborators-presence/avatar-group/styles.scss +33 -0
  399. package/src/components/collaborators-presence/avatar-group/test/index.tsx +139 -0
  400. package/src/components/collaborators-presence/avatar-group/types.ts +13 -0
  401. package/src/components/collaborators-presence/index.tsx +43 -12
  402. package/src/components/collaborators-presence/list.tsx +68 -40
  403. package/src/components/collaborators-presence/styles/collaborators-list.scss +26 -19
  404. package/src/components/collaborators-presence/styles/collaborators-presence.scss +6 -2
  405. package/src/components/collaborators-presence/test/use-collaborator-notifications.ts +397 -0
  406. package/src/components/collaborators-presence/use-collaborator-notifications.ts +203 -0
  407. package/src/components/document-bar/style.scss +1 -1
  408. package/src/components/editor-interface/index.js +13 -6
  409. package/src/components/inserter-sidebar/index.js +4 -1
  410. package/src/components/post-last-revision/index.js +35 -6
  411. package/src/components/post-last-revision/style.scss +0 -3
  412. package/src/components/post-locked-modal/index.js +69 -25
  413. package/src/components/post-panel-row/style.scss +1 -0
  414. package/src/components/post-revisions-preview/block-diff.js +224 -61
  415. package/src/components/post-revisions-preview/diff-markers.js +15 -12
  416. package/src/components/post-revisions-preview/revisions-canvas.js +23 -86
  417. package/src/components/post-revisions-preview/revisions-header.js +35 -37
  418. package/src/components/post-revisions-preview/revisions-slider.js +138 -62
  419. package/src/components/post-revisions-preview/style.scss +3 -3
  420. package/src/components/post-revisions-preview/test/block-diff.js +202 -35
  421. package/src/components/preferences-modal/index.js +37 -7
  422. package/src/components/provider/disable-non-page-content-blocks.js +42 -40
  423. package/src/components/provider/index.js +20 -2
  424. package/src/components/provider/use-block-editor-settings.js +21 -1
  425. package/src/components/provider/use-post-content-block-types.js +30 -0
  426. package/src/components/provider/use-revision-blocks.js +105 -0
  427. package/src/components/revision-block-diff/index.js +39 -0
  428. package/src/components/revision-diff-panel/index.js +59 -0
  429. package/src/components/revision-diff-panel/style.scss +13 -0
  430. package/src/components/revision-fields-diff/index.js +91 -0
  431. package/src/components/sidebar/header.js +1 -1
  432. package/src/components/sidebar/index.js +4 -0
  433. package/src/components/style-book/index.js +4 -2
  434. package/src/components/sync-connection-error-modal/index.tsx +253 -0
  435. package/src/components/sync-connection-error-modal/style.scss +14 -0
  436. package/src/components/sync-connection-error-modal/use-retry-countdown.ts +93 -0
  437. package/src/components/template-content-panel/index.js +30 -38
  438. package/src/components/template-part-menu-items/convert-to-regular.js +74 -12
  439. package/src/components/visual-editor/index.js +6 -23
  440. package/src/store/private-actions.js +70 -1
  441. package/src/store/private-selectors.js +216 -28
  442. package/src/store/reducer.js +41 -0
  443. package/src/store/selectors.js +0 -19
  444. package/src/style.scss +4 -1
  445. package/src/utils/media-finalize/index.js +11 -0
  446. package/src/utils/media-finalize/test/index.js +34 -0
  447. package/src/utils/media-upload/on-success.js +34 -0
  448. package/src/utils/sync-error-messages.ts +72 -0
  449. package/src/utils/test/sync-error-messages.js +34 -0
  450. package/build/components/provider/use-post-content-blocks.cjs.map +0 -7
  451. package/build/components/sync-connection-modal/index.cjs +0 -130
  452. package/build/components/sync-connection-modal/index.cjs.map +0 -7
  453. package/build-module/components/provider/use-post-content-blocks.mjs +0 -34
  454. package/build-module/components/provider/use-post-content-blocks.mjs.map +0 -7
  455. package/build-module/components/sync-connection-modal/index.mjs +0 -114
  456. package/build-module/components/sync-connection-modal/index.mjs.map +0 -7
  457. package/build-types/components/provider/use-post-content-blocks.d.ts +0 -2
  458. package/build-types/components/provider/use-post-content-blocks.d.ts.map +0 -1
  459. package/build-types/components/sync-connection-modal/index.d.ts +0 -8
  460. package/build-types/components/sync-connection-modal/index.d.ts.map +0 -1
  461. package/src/components/provider/use-post-content-blocks.js +0 -42
  462. package/src/components/sync-connection-modal/index.js +0 -140
  463. package/src/components/sync-connection-modal/style.scss +0 -11
  464. package/src/utils/sync-error-messages.js +0 -53
@@ -7,13 +7,9 @@ import clsx from 'clsx';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { Spinner } from '@wordpress/components';
10
- import {
11
- privateApis as blockEditorPrivateApis,
12
- store as blockEditorStore,
13
- } from '@wordpress/block-editor';
14
- import { createBlock, parse } from '@wordpress/blocks';
10
+ import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';
15
11
  import { useSelect } from '@wordpress/data';
16
- import { useEffect, useMemo, useRef } from '@wordpress/element';
12
+ import { useEffect } from '@wordpress/element';
17
13
  import { addFilter } from '@wordpress/hooks';
18
14
 
19
15
  /**
@@ -27,12 +23,8 @@ import {
27
23
  unregisterDiffFormatTypes,
28
24
  } from './diff-format-types';
29
25
  import { useDiffMarkers } from './diff-markers';
30
- import { preserveClientIds } from './preserve-client-ids';
31
- import { diffRevisionContent } from './block-diff';
32
26
 
33
- const { ExperimentalBlockEditorProvider, usePrivateStyleOverride } = unlock(
34
- blockEditorPrivateApis
35
- );
27
+ const { usePrivateStyleOverride } = unlock( blockEditorPrivateApis );
36
28
 
37
29
  // SVG filter for removed blocks: grayscale + red tint
38
30
  const REVISION_REMOVED_FILTER_SVG = `
@@ -66,14 +58,20 @@ const REVISION_REMOVED_FILTER_SVG = `
66
58
  const REVISION_DIFF_STYLES = `
67
59
  .is-revision-added {
68
60
  box-shadow: inset 0 0 0 9999px color-mix(in srgb, currentColor 5%, #00a32a 15%), 0 0 0 4px color-mix(in srgb, currentColor 5%, #00a32a 15%);
61
+ outline: 3px solid #00a32a;
62
+ outline-offset: 2px;
69
63
  }
70
64
  .is-revision-removed,
71
65
  .revision-diff-removed {
72
66
  text-decoration: line-through;
73
67
  filter: url(#revision-removed-filter);
74
68
  }
69
+ .is-revision-removed {
70
+ outline: 3px dashed #d63638;
71
+ outline-offset: 2px;
72
+ }
75
73
  .is-revision-modified {
76
- outline: 2px solid color-mix(in srgb, currentColor 30%, #dba617 70%) !important;
74
+ outline: 3px dotted #9a7000 !important;
77
75
  outline-offset: 2px;
78
76
  }
79
77
  .revision-diff-added {
@@ -103,7 +101,7 @@ const REVISION_DIFF_STYLES = `
103
101
  function withRevisionDiffClasses( BlockListBlock ) {
104
102
  return ( props ) => {
105
103
  const { block, className } = props;
106
- const diffStatus = block?.__revisionDiffStatus;
104
+ const diffStatus = block?.__revisionDiffStatus?.status;
107
105
 
108
106
  const enhancedClassName = clsx( className, {
109
107
  'is-revision-added': diffStatus === 'added',
@@ -150,12 +148,11 @@ function CanvasContent( { showDiff } ) {
150
148
 
151
149
  /**
152
150
  * Canvas component that renders a post revision in read-only mode.
151
+ * Block preparation and settings are handled by the parent EditorProvider.
153
152
  *
154
- * @param {Object} props Component props.
155
- * @param {boolean} props.showDiff Whether to show diff highlighting.
156
153
  * @return {React.JSX.Element} The revisions canvas component.
157
154
  */
158
- export default function RevisionsCanvas( { showDiff } ) {
155
+ export default function RevisionsCanvas() {
159
156
  useEffect( () => {
160
157
  registerDiffFormatTypes();
161
158
  return () => {
@@ -163,83 +160,23 @@ export default function RevisionsCanvas( { showDiff } ) {
163
160
  };
164
161
  }, [] );
165
162
 
166
- const { revision, previousRevision, postType, blockEditorSettings } =
167
- useSelect( ( select ) => {
168
- const {
169
- getCurrentRevision,
170
- getPreviousRevision,
171
- getCurrentPostType,
172
- } = unlock( select( editorStore ) );
173
- return {
174
- revision: getCurrentRevision(),
175
- previousRevision: getPreviousRevision(),
176
- postType: getCurrentPostType(),
177
- blockEditorSettings: select( blockEditorStore ).getSettings(),
178
- };
179
- }, [] );
180
-
181
- // Track previously rendered blocks to preserve clientIds between renders.
182
- const previousBlocksRef = useRef( [] );
183
-
184
- const blocks = useMemo( () => {
185
- const currentContent = revision?.content?.raw ?? '';
186
-
187
- let parsedBlocks;
188
- if ( showDiff ) {
189
- const previousContent = previousRevision?.content?.raw || '';
190
- // diffRevisionContent handles both normal diffing and the case
191
- // where there's no previous revision (oldest revision shows all as added).
192
- parsedBlocks = diffRevisionContent(
193
- currentContent,
194
- previousContent
195
- );
196
- } else {
197
- // When diff is disabled, just parse the current revision content.
198
- parsedBlocks = parse( currentContent );
199
- }
200
-
201
- if ( postType === 'wp_navigation' ) {
202
- parsedBlocks = [
203
- createBlock(
204
- 'core/navigation',
205
- { templateLock: false },
206
- parsedBlocks
207
- ),
208
- ];
209
- }
210
-
211
- // Preserve clientIds from previous render to prevent React unmount/remount.
212
- const blocksWithStableIds = preserveClientIds(
213
- parsedBlocks,
214
- previousBlocksRef.current
163
+ const { revision, showDiff } = useSelect( ( select ) => {
164
+ const { getCurrentRevision, isShowingRevisionDiff } = unlock(
165
+ select( editorStore )
215
166
  );
216
-
217
- // Update ref for next render.
218
- previousBlocksRef.current = blocksWithStableIds;
219
-
220
- return blocksWithStableIds;
221
- }, [
222
- revision?.content?.raw,
223
- previousRevision?.content?.raw,
224
- postType,
225
- showDiff,
226
- ] );
227
-
228
- const settings = useMemo(
229
- () => ( {
230
- ...blockEditorSettings,
231
- isPreviewMode: true,
232
- } ),
233
- [ blockEditorSettings ]
234
- );
167
+ return {
168
+ revision: getCurrentRevision(),
169
+ showDiff: isShowingRevisionDiff(),
170
+ };
171
+ }, [] );
235
172
 
236
173
  return revision ? (
237
- <ExperimentalBlockEditorProvider value={ blocks } settings={ settings }>
174
+ <>
238
175
  <DiffStyleOverrides showDiff={ showDiff } />
239
176
  <div className="editor-revisions-canvas__content">
240
177
  <CanvasContent showDiff={ showDiff } />
241
178
  </div>
242
- </ExperimentalBlockEditorProvider>
179
+ </>
243
180
  ) : (
244
181
  <div className="editor-revisions-canvas__loading">
245
182
  <Spinner />
@@ -2,12 +2,10 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useSelect, useDispatch } from '@wordpress/data';
5
- import { useViewportMatch } from '@wordpress/compose';
6
5
  import { Button } from '@wordpress/components';
7
- import { store as preferencesStore } from '@wordpress/preferences';
8
- import { PinnedItems } from '@wordpress/interface';
9
- import { __, _x } from '@wordpress/i18n';
10
- import { seen } from '@wordpress/icons';
6
+ import { store as interfaceStore } from '@wordpress/interface';
7
+ import { __, _x, isRTL } from '@wordpress/i18n';
8
+ import { drawerLeft, drawerRight, seen } from '@wordpress/icons';
11
9
 
12
10
  /**
13
11
  * Internal dependencies
@@ -15,14 +13,9 @@ import { seen } from '@wordpress/icons';
15
13
  import HeaderSkeleton from '../header/header-skeleton';
16
14
  import MoreMenu from '../more-menu';
17
15
  import PostPreviewButton from '../post-preview-button';
18
- import PreviewDropdown from '../preview-dropdown';
19
16
  import RevisionsSlider from './revisions-slider';
20
17
  import { store as editorStore } from '../../store';
21
- import {
22
- TEMPLATE_PART_POST_TYPE,
23
- PATTERN_POST_TYPE,
24
- NAVIGATION_POST_TYPE,
25
- } from '../../store/constants';
18
+ import { sidebars } from '../sidebar/constants';
26
19
  import { unlock } from '../../lock-unlock';
27
20
 
28
21
  /**
@@ -34,32 +27,24 @@ import { unlock } from '../../lock-unlock';
34
27
  * @return {React.JSX.Element} The revisions header component.
35
28
  */
36
29
  function RevisionsHeader( { showDiff, onToggleDiff } ) {
37
- const isWideViewport = useViewportMatch( 'large' );
38
- const { postType, showIconLabels, currentRevisionId } = useSelect(
39
- ( select ) => {
40
- const { get: getPreference } = select( preferencesStore );
41
- const { getCurrentPostType } = select( editorStore );
42
-
43
- return {
44
- postType: getCurrentPostType(),
45
- showIconLabels: getPreference( 'core', 'showIconLabels' ),
46
- currentRevisionId: unlock(
47
- select( editorStore )
48
- ).getCurrentRevisionId(),
49
- };
50
- },
51
- []
52
- );
30
+ const { currentRevisionId, sidebarIsOpened } = useSelect( ( select ) => {
31
+ return {
32
+ currentRevisionId: unlock(
33
+ select( editorStore )
34
+ ).getCurrentRevisionId(),
35
+ sidebarIsOpened:
36
+ !! select( interfaceStore ).getActiveComplementaryArea(
37
+ 'core'
38
+ ),
39
+ };
40
+ }, [] );
53
41
 
54
42
  const { setCurrentRevisionId, restoreRevision } = unlock(
55
43
  useDispatch( editorStore )
56
44
  );
57
45
 
58
- const disablePreviewOption = [
59
- NAVIGATION_POST_TYPE,
60
- TEMPLATE_PART_POST_TYPE,
61
- PATTERN_POST_TYPE,
62
- ].includes( postType );
46
+ const { enableComplementaryArea, disableComplementaryArea } =
47
+ useDispatch( interfaceStore );
63
48
 
64
49
  const canRestore = !! currentRevisionId;
65
50
 
@@ -85,13 +70,26 @@ function RevisionsHeader( { showDiff, onToggleDiff } ) {
85
70
  center={ <RevisionsSlider /> }
86
71
  settings={
87
72
  <>
88
- <PreviewDropdown disabled={ disablePreviewOption } />
89
-
90
73
  <PostPreviewButton className="editor-header__post-preview-button" />
91
74
 
92
- { ( isWideViewport || ! showIconLabels ) && (
93
- <PinnedItems.Slot scope="core" />
94
- ) }
75
+ <Button
76
+ __next40pxDefaultSize
77
+ icon={ isRTL() ? drawerLeft : drawerRight }
78
+ label={ _x( 'Settings', 'panel button label' ) }
79
+ isPressed={ sidebarIsOpened }
80
+ aria-expanded={ sidebarIsOpened }
81
+ onClick={ () => {
82
+ if ( sidebarIsOpened ) {
83
+ disableComplementaryArea( 'core' );
84
+ } else {
85
+ enableComplementaryArea(
86
+ 'core',
87
+ sidebars.document
88
+ );
89
+ }
90
+ } }
91
+ size="compact"
92
+ />
95
93
 
96
94
  <Button
97
95
  __next40pxDefaultSize
@@ -1,12 +1,18 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useMemo } from '@wordpress/element';
5
4
  import { useSelect, useDispatch } from '@wordpress/data';
6
- import { RangeControl, Spinner } from '@wordpress/components';
5
+ import {
6
+ RangeControl,
7
+ Spinner,
8
+ Button,
9
+ __experimentalHStack as HStack,
10
+ } from '@wordpress/components';
7
11
  import { store as coreStore } from '@wordpress/core-data';
8
- import { __ } from '@wordpress/i18n';
12
+ import { __, sprintf } from '@wordpress/i18n';
9
13
  import { dateI18n, getSettings as getDateSettings } from '@wordpress/date';
14
+ import { useMemo } from '@wordpress/element';
15
+ import { chevronLeft, chevronRight } from '@wordpress/icons';
10
16
 
11
17
  /**
12
18
  * Internal dependencies
@@ -15,78 +21,90 @@ import { store as editorStore } from '../../store';
15
21
  import { unlock } from '../../lock-unlock';
16
22
 
17
23
  /**
18
- * Slider component for navigating revisions.
24
+ * Slider component for navigating revisions with pagination.
19
25
  *
20
26
  * @return {React.JSX.Element} The revisions slider component.
21
27
  */
22
28
  function RevisionsSlider() {
23
- const { revisions, isLoading, currentRevisionId } = useSelect(
24
- ( select ) => {
25
- const { getCurrentPostId, getCurrentPostType } =
26
- select( editorStore );
27
- const { getRevisions, isResolving } = select( coreStore );
28
-
29
- const postId = getCurrentPostId();
30
- const postType = getCurrentPostType();
31
-
32
- if ( ! postId || ! postType ) {
33
- return {};
34
- }
35
-
36
- const query = { per_page: -1, context: 'edit' };
37
- return {
38
- revisions: getRevisions( 'postType', postType, postId, query ),
39
- isLoading: isResolving( 'getRevisions', [
40
- 'postType',
41
- postType,
42
- postId,
43
- query,
44
- ] ),
45
- currentRevisionId: unlock(
46
- select( editorStore )
47
- ).getCurrentRevisionId(),
48
- };
49
- },
50
- []
51
- );
29
+ const {
30
+ revisions: rawRevisions,
31
+ perPage,
32
+ currentRevisionId,
33
+ revisionKey,
34
+ revisionPage,
35
+ totalRevisions,
36
+ } = useSelect( ( select ) => {
37
+ const {
38
+ getCurrentRevisionId,
39
+ getRevisionPage,
40
+ getPageRevisions,
41
+ getRevisionsPerPage,
42
+ } = unlock( select( editorStore ) );
52
43
 
53
- const { setCurrentRevisionId } = unlock( useDispatch( editorStore ) );
44
+ const postType = select( editorStore ).getCurrentPostType();
45
+ if ( ! postType ) {
46
+ return {};
47
+ }
54
48
 
55
- const sortedRevisions = useMemo( () => {
56
- return (
57
- revisions
58
- ?.slice()
59
- .sort( ( a, b ) => new Date( a.date ) - new Date( b.date ) ) ??
60
- []
49
+ const entityConfig = select( coreStore ).getEntityConfig(
50
+ 'postType',
51
+ postType
61
52
  );
62
- }, [ revisions ] );
53
+ const _revisionKey = entityConfig?.revisionKey || 'id';
54
+ const _revisionPage = getRevisionPage();
63
55
 
64
- const selectedIndex = sortedRevisions.findIndex(
65
- ( r ) => r.id === currentRevisionId
56
+ return {
57
+ revisions: getPageRevisions( _revisionPage ),
58
+ perPage: getRevisionsPerPage(),
59
+ currentRevisionId: getCurrentRevisionId(),
60
+ revisionKey: _revisionKey,
61
+ revisionPage: _revisionPage,
62
+ totalRevisions:
63
+ select( editorStore ).getCurrentPostRevisionsCount(),
64
+ };
65
+ }, [] );
66
+
67
+ const { setCurrentRevisionId, setRevisionPage } = unlock(
68
+ useDispatch( editorStore )
69
+ );
70
+
71
+ const isLoading = ! rawRevisions;
72
+ const totalPages = Math.ceil( totalRevisions / perPage ) || 1;
73
+
74
+ // Reverse desc→asc so the slider reads oldest (left) → newest (right).
75
+ const revisions = useMemo(
76
+ () => rawRevisions && [ ...rawRevisions ].reverse(),
77
+ [ rawRevisions ]
78
+ );
79
+
80
+ const selectedIndex = revisions?.findIndex(
81
+ ( r ) => r[ revisionKey ] === currentRevisionId
66
82
  );
67
83
 
68
84
  const handleSliderChange = ( index ) => {
69
- const revision = sortedRevisions[ index ];
85
+ const revision = revisions?.[ index ];
70
86
  if ( revision ) {
71
- setCurrentRevisionId( revision.id );
87
+ setCurrentRevisionId( revision[ revisionKey ] );
72
88
  }
73
89
  };
74
90
 
75
91
  // Format date for tooltip.
76
92
  const dateSettings = getDateSettings();
77
93
  const renderTooltipContent = ( index ) => {
78
- const revision = sortedRevisions[ index ];
94
+ const revision = revisions?.[ index ];
79
95
  if ( ! revision ) {
80
96
  return index;
81
97
  }
82
98
  return dateI18n( dateSettings.formats.datetime, revision.date );
83
99
  };
84
100
 
85
- if ( isLoading ) {
101
+ const showPagination = totalPages > 1;
102
+
103
+ if ( isLoading && ! showPagination ) {
86
104
  return <Spinner />;
87
105
  }
88
106
 
89
- if ( ! sortedRevisions.length ) {
107
+ if ( ! isLoading && ! revisions?.length ) {
90
108
  return (
91
109
  <span className="editor-revisions-header__no-revisions">
92
110
  { __( 'No revisions found.' ) }
@@ -94,7 +112,7 @@ function RevisionsSlider() {
94
112
  );
95
113
  }
96
114
 
97
- if ( sortedRevisions.length === 1 ) {
115
+ if ( totalRevisions <= 1 ) {
98
116
  return (
99
117
  <span className="editor-revisions-header__no-revisions">
100
118
  { __( 'Only one revision found.' ) }
@@ -102,20 +120,78 @@ function RevisionsSlider() {
102
120
  );
103
121
  }
104
122
 
123
+ const getPageRangeLabel = ( page ) => {
124
+ const end = totalRevisions - ( page - 1 ) * perPage;
125
+ const start = Math.max( 1, end - perPage + 1 );
126
+ return sprintf(
127
+ /* translators: 1: first revision number, 2: last revision number */
128
+ __( 'Revisions %1$s–%2$s' ),
129
+ start,
130
+ end
131
+ );
132
+ };
133
+
134
+ const sliderOrSpinner =
135
+ isLoading || selectedIndex === -1 ? (
136
+ <Spinner />
137
+ ) : (
138
+ <RangeControl
139
+ __next40pxDefaultSize
140
+ aria-valuetext={ renderTooltipContent( selectedIndex ) }
141
+ className="editor-revisions-header__slider"
142
+ hideLabelFromVision
143
+ label={ __( 'Revision' ) }
144
+ max={ revisions?.length - 1 }
145
+ min={ 0 }
146
+ marks
147
+ onChange={ handleSliderChange }
148
+ renderTooltipContent={ renderTooltipContent }
149
+ value={ selectedIndex }
150
+ withInputField={ false }
151
+ />
152
+ );
153
+
154
+ if ( ! showPagination ) {
155
+ return sliderOrSpinner;
156
+ }
157
+
105
158
  return (
106
- <RangeControl
107
- __next40pxDefaultSize
108
- className="editor-revisions-header__slider"
109
- hideLabelFromVision
110
- label={ __( 'Revision' ) }
111
- max={ sortedRevisions.length - 1 }
112
- min={ 0 }
113
- marks
114
- onChange={ handleSliderChange }
115
- renderTooltipContent={ renderTooltipContent }
116
- value={ selectedIndex }
117
- withInputField={ false }
118
- />
159
+ <HStack spacing={ 2 } expanded wrap={ false }>
160
+ <Button
161
+ icon={ chevronLeft }
162
+ label={
163
+ revisionPage < totalPages
164
+ ? getPageRangeLabel( revisionPage + 1 )
165
+ : __( 'No older revisions' )
166
+ }
167
+ onClick={ () => setRevisionPage( revisionPage + 1 ) }
168
+ disabled={ isLoading || revisionPage >= totalPages }
169
+ size="compact"
170
+ accessibleWhenDisabled
171
+ />
172
+ <div
173
+ style={ {
174
+ flex: 1,
175
+ minWidth: 0,
176
+ display: 'flex',
177
+ justifyContent: 'center',
178
+ } }
179
+ >
180
+ { sliderOrSpinner }
181
+ </div>
182
+ <Button
183
+ icon={ chevronRight }
184
+ label={
185
+ revisionPage > 1
186
+ ? getPageRangeLabel( revisionPage - 1 )
187
+ : __( 'No newer revisions' )
188
+ }
189
+ onClick={ () => setRevisionPage( revisionPage - 1 ) }
190
+ disabled={ isLoading || revisionPage <= 1 }
191
+ size="compact"
192
+ accessibleWhenDisabled
193
+ />
194
+ </HStack>
119
195
  );
120
196
  }
121
197
 
@@ -35,7 +35,7 @@
35
35
  .revision-diff-markers {
36
36
  position: relative;
37
37
  flex-shrink: 0;
38
- width: 12px;
38
+ width: max(16px, 1rem);
39
39
  background: rgba(0, 0, 0, 0.05);
40
40
 
41
41
  .revision-diff-marker {
@@ -52,11 +52,11 @@
52
52
  }
53
53
 
54
54
  &.is-removed {
55
- background: #d63638;
55
+ background: repeating-linear-gradient(45deg, #d63638, #d63638 3px, rgba(#d63638, 0.45) 3px, rgba(#d63638, 0.45) 6px);
56
56
  }
57
57
 
58
58
  &.is-modified {
59
- background: #dba617;
59
+ background: repeating-linear-gradient(-45deg, #dba617, #dba617 3px, rgba(#dba617, 0.45) 3px, rgba(#dba617, 0.45) 6px);
60
60
  }
61
61
 
62
62
  &:hover {