@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,204 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { diffChars } from 'diff/lib/diff/character';
5
+ import { diffLines } from 'diff/lib/diff/line';
6
+
7
+ // Character diffing (Myers) is cheap when the edit distance is small but
8
+ // degrades toward O(n^2) as the two strings diverge: a full replacement of
9
+ // ~10k differing chars blocks the main thread for seconds. Cap the input handed
10
+ // to diffChars so the worst case stays small (~100ms); larger windows fall back
11
+ // to a line diff, with the cursor remapped by getCursorOffsetFromCommonText...
12
+ const STRING_TOO_LARGE_THRESHOLD = 1000;
13
+
14
+ /**
15
+ * Diffs two strings into a list of `{ value, added?, removed? }` change parts.
16
+ *
17
+ * @param {string} oldValue The previous string.
18
+ * @param {string} newValue The next string.
19
+ * @return {Array<Object>} The diff change parts.
20
+ */
21
+ export function getDiff( oldValue, newValue ) {
22
+ const maxStringLength = Math.max( oldValue.length, newValue.length );
23
+
24
+ if ( maxStringLength <= STRING_TOO_LARGE_THRESHOLD ) {
25
+ return diffChars( oldValue, newValue );
26
+ }
27
+
28
+ let start = 0;
29
+ const minStringLength = Math.min( oldValue.length, newValue.length );
30
+
31
+ while (
32
+ start < minStringLength &&
33
+ oldValue[ start ] === newValue[ start ]
34
+ ) {
35
+ start++;
36
+ }
37
+
38
+ let oldEnd = oldValue.length;
39
+ let newEnd = newValue.length;
40
+
41
+ while (
42
+ oldEnd > start &&
43
+ newEnd > start &&
44
+ oldValue[ oldEnd - 1 ] === newValue[ newEnd - 1 ]
45
+ ) {
46
+ oldEnd--;
47
+ newEnd--;
48
+ }
49
+
50
+ const oldChangedValue = oldValue.slice( start, oldEnd );
51
+ const newChangedValue = newValue.slice( start, newEnd );
52
+ const maxChangedStringLength = Math.max(
53
+ oldChangedValue.length,
54
+ newChangedValue.length
55
+ );
56
+ let changes;
57
+
58
+ if ( maxChangedStringLength <= STRING_TOO_LARGE_THRESHOLD ) {
59
+ changes = diffChars( oldChangedValue, newChangedValue );
60
+ } else {
61
+ changes = diffLines( oldChangedValue, newChangedValue );
62
+ }
63
+
64
+ if ( start > 0 ) {
65
+ changes.unshift( { value: oldValue.slice( 0, start ) } );
66
+ }
67
+
68
+ if ( oldEnd < oldValue.length ) {
69
+ changes.push( { value: oldValue.slice( oldEnd ) } );
70
+ }
71
+
72
+ return changes;
73
+ }
74
+
75
+ function clampCursorPosition( position, value ) {
76
+ return Math.max( 0, Math.min( value.length, position ) );
77
+ }
78
+
79
+ // A coarse (line-level) diff reports a whole changed region as one replacement,
80
+ // which would otherwise snap the cursor to the region's end. Recover a precise
81
+ // position by finding the longest run of text ending at the cursor that is
82
+ // preserved in the replacement, then placing the cursor just past where that
83
+ // run starts in the new text. This uses indexOf (near-linear in V8) rather than
84
+ // a character diff, so it stays cheap even across a large single-line region.
85
+ function getCursorOffsetFromCommonTextBeforeCursor(
86
+ oldValue,
87
+ newValue,
88
+ position
89
+ ) {
90
+ const oldValueBeforeCursor = oldValue.slice( 0, position );
91
+ let low = 1;
92
+ let high = oldValueBeforeCursor.length;
93
+ let cursorOffset;
94
+
95
+ while ( low <= high ) {
96
+ const length = Math.floor( ( low + high ) / 2 );
97
+ const index = newValue.indexOf(
98
+ oldValueBeforeCursor.slice( oldValueBeforeCursor.length - length )
99
+ );
100
+
101
+ if ( index === -1 ) {
102
+ high = length - 1;
103
+ } else {
104
+ cursorOffset = index + length;
105
+ low = length + 1;
106
+ }
107
+ }
108
+
109
+ return cursorOffset;
110
+ }
111
+
112
+ /**
113
+ * Maps a cursor position from the old string to the new string given a diff.
114
+ *
115
+ * @param {number} position The cursor position in the old string.
116
+ * @param {Array<Object>} changes The diff returned by `getDiff`.
117
+ * @param {string} oldValue The previous string.
118
+ * @param {string} newValue The next string.
119
+ * @return {number} The adjusted cursor position in the new string.
120
+ */
121
+ export function adjustPosition( position, changes, oldValue, newValue ) {
122
+ let oldIndex = 0;
123
+ let newIndex = 0;
124
+ let adjustedPosition = position;
125
+
126
+ for ( let i = 0; i < changes.length; i++ ) {
127
+ const change = changes[ i ];
128
+ if ( ! change.added && ! change.removed ) {
129
+ oldIndex += change.value.length;
130
+ newIndex += change.value.length;
131
+ continue;
132
+ }
133
+
134
+ const oldStart = oldIndex;
135
+ const newStart = newIndex;
136
+ let oldLength = 0;
137
+ let newLength = 0;
138
+
139
+ while (
140
+ i < changes.length &&
141
+ ( changes[ i ].added || changes[ i ].removed )
142
+ ) {
143
+ if ( changes[ i ].removed ) {
144
+ oldLength += changes[ i ].value.length;
145
+ } else {
146
+ newLength += changes[ i ].value.length;
147
+ }
148
+ i++;
149
+ }
150
+ i--;
151
+
152
+ const oldEnd = oldStart + oldLength;
153
+ const newEnd = newStart + newLength;
154
+
155
+ if ( position < oldStart ) {
156
+ // The cursor is before this change, so nothing here can move it.
157
+ break;
158
+ }
159
+
160
+ if ( oldLength === 0 ) {
161
+ // Pure insertion at or before the cursor: shift it right by the
162
+ // inserted length.
163
+ adjustedPosition += newLength;
164
+ } else if ( position <= oldEnd ) {
165
+ // The cursor falls inside a replaced region; recover its precise
166
+ // spot from the text preserved around it.
167
+ const cursorOffset = getCursorOffsetFromCommonTextBeforeCursor(
168
+ oldValue.slice( oldStart, oldEnd ),
169
+ newValue.slice( newStart, newEnd ),
170
+ position - oldStart
171
+ );
172
+
173
+ adjustedPosition =
174
+ cursorOffset === undefined ? newEnd : newStart + cursorOffset;
175
+ break;
176
+ } else {
177
+ // The cursor is after this change: shift it by the net length delta.
178
+ adjustedPosition += newLength - oldLength;
179
+ }
180
+
181
+ oldIndex += oldLength;
182
+ newIndex += newLength;
183
+ }
184
+
185
+ return clampCursorPosition( adjustedPosition, newValue );
186
+ }
187
+
188
+ /**
189
+ * Diffs `oldValue` against `newValue` and maps a cursor `position` from the old
190
+ * string to the new one.
191
+ *
192
+ * @param {number} position The cursor position in the old string.
193
+ * @param {string} oldValue The previous string.
194
+ * @param {string} newValue The next string.
195
+ * @return {number} The adjusted cursor position in the new string.
196
+ */
197
+ export function getAdjustedCursorPosition( position, oldValue, newValue ) {
198
+ return adjustPosition(
199
+ position,
200
+ getDiff( oldValue, newValue ),
201
+ oldValue,
202
+ newValue
203
+ );
204
+ }
@@ -54,6 +54,17 @@ describe( 'PostTypeSupportCheck', () => {
54
54
  expect( container ).not.toHaveTextContent( 'Supported' );
55
55
  } );
56
56
 
57
+ it( 'does not crash when the post type has no `supports` object', () => {
58
+ setupUseSelectMock( {} );
59
+ const { container } = render(
60
+ <PostTypeSupportCheck supportKeys="title">
61
+ Supported
62
+ </PostTypeSupportCheck>
63
+ );
64
+
65
+ expect( container ).not.toHaveTextContent( 'Supported' );
66
+ } );
67
+
57
68
  it( 'renders its children when post type is known and supports', () => {
58
69
  setupUseSelectMock( {
59
70
  supports: {
@@ -58,7 +58,7 @@ export default function PostURL( { onClose } ) {
58
58
  postSlug: safeDecodeURIComponent(
59
59
  select( editorStore ).getEditedPostSlug()
60
60
  ),
61
- viewPostLabel: postType?.labels.view_item,
61
+ viewPostLabel: postType?.labels?.view_item,
62
62
  postLink: post.link,
63
63
  permalinkPrefix: permalinkParts?.prefix,
64
64
  permalinkSuffix: permalinkParts?.suffix,
@@ -24,7 +24,7 @@ export default function PostViewLink() {
24
24
  return {
25
25
  permalink: select( editorStore ).getPermalink(),
26
26
  isPublished: select( editorStore ).isCurrentPostPublished(),
27
- label: postType?.labels.view_item,
27
+ label: postType?.labels?.view_item,
28
28
  hasLoaded: !! postType,
29
29
  showIconLabels: get( 'core', 'showIconLabels' ),
30
30
  };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen } from '@testing-library/react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useSelect } from '@wordpress/data';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import PostViewLink from '../';
15
+
16
+ jest.mock( '@wordpress/data/src/components/use-select', () => jest.fn() );
17
+
18
+ const DEFAULTS = {
19
+ postType: { labels: { view_item: 'View Post' } },
20
+ permalink: 'https://example.com/sample/',
21
+ isPublished: true,
22
+ showIconLabels: false,
23
+ };
24
+
25
+ function setupUseSelectMock( overrides = {} ) {
26
+ // Use object spread (not destructure defaults) so an explicit `undefined`
27
+ // override actually overrides the default value.
28
+ const data = { ...DEFAULTS, ...overrides };
29
+ useSelect.mockImplementation( ( cb ) =>
30
+ cb( () => ( {
31
+ getCurrentPostType: () => 'post',
32
+ getPostType: () => data.postType,
33
+ getPermalink: () => data.permalink,
34
+ isCurrentPostPublished: () => data.isPublished,
35
+ get: () => data.showIconLabels,
36
+ } ) )
37
+ );
38
+ }
39
+
40
+ describe( 'PostViewLink', () => {
41
+ it( 'renders the post type-specific view label when available', () => {
42
+ setupUseSelectMock();
43
+ render( <PostViewLink /> );
44
+ expect( screen.getByLabelText( 'View Post' ) ).toBeInTheDocument();
45
+ } );
46
+
47
+ it( 'falls back to "View post" without crashing when the post type has no labels', () => {
48
+ // See https://github.com/WordPress/gutenberg/issues/62918.
49
+ setupUseSelectMock( { postType: {} } );
50
+ render( <PostViewLink /> );
51
+ expect( screen.getByLabelText( 'View post' ) ).toBeInTheDocument();
52
+ } );
53
+
54
+ it( 'renders nothing if the post is not published', () => {
55
+ setupUseSelectMock( { isPublished: false } );
56
+ const { container } = render( <PostViewLink /> );
57
+ expect( container ).toBeEmptyDOMElement();
58
+ } );
59
+
60
+ it( 'renders nothing if no permalink is available', () => {
61
+ setupUseSelectMock( { permalink: undefined } );
62
+ const { container } = render( <PostViewLink /> );
63
+ expect( container ).toBeEmptyDOMElement();
64
+ } );
65
+
66
+ it( 'renders nothing while the post type has not loaded', () => {
67
+ setupUseSelectMock( { postType: undefined } );
68
+ const { container } = render( <PostViewLink /> );
69
+ expect( container ).toBeEmptyDOMElement();
70
+ } );
71
+ } );
@@ -36,6 +36,7 @@ import { useHideBlocksFromInserter } from './use-hide-blocks-from-inserter';
36
36
  import { useRevisionBlocks } from './use-revision-blocks';
37
37
  import useCommands from '../commands';
38
38
  import useUploadSaveLock from './use-upload-save-lock';
39
+ import useNetworkReconnect from './use-network-reconnect';
39
40
  import BlockRemovalWarnings from '../block-removal-warnings';
40
41
  import StartPageOptions from '../start-page-options';
41
42
  import KeyboardShortcutHelpModal from '../keyboard-shortcut-help-modal';
@@ -379,7 +380,8 @@ export const ExperimentalEditorProvider = withRegistryProvider(
379
380
  }, [ post.type, post.id, setEditedPost, removeNotice ] );
380
381
 
381
382
  // Synchronize the editor settings as they change.
382
- useEffect( () => {
383
+ // Do it as a layout effect so that rendered UI with outdated settings is not painted.
384
+ useLayoutEffect( () => {
383
385
  updateEditorSettings( settings );
384
386
  }, [ settings, updateEditorSettings ] );
385
387
 
@@ -403,6 +405,9 @@ export const ExperimentalEditorProvider = withRegistryProvider(
403
405
  // Lock post saving when media uploads are in progress (experimental feature).
404
406
  useUploadSaveLock();
405
407
 
408
+ // Pause/resume media upload queue on network disconnect/reconnect.
409
+ useNetworkReconnect();
410
+
406
411
  if ( ! isReady || ! mode ) {
407
412
  return null;
408
413
  }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { renderHook } from '@testing-library/react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useRegistry } from '@wordpress/data';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import useNetworkReconnect from '../use-network-reconnect';
15
+
16
+ const mockPauseQueue = jest.fn();
17
+ const mockResumeQueue = jest.fn();
18
+
19
+ jest.mock( '@wordpress/data', () => ( {
20
+ useRegistry: jest.fn(),
21
+ } ) );
22
+
23
+ jest.mock( '@wordpress/upload-media', () => ( {
24
+ store: 'core/upload-media',
25
+ } ) );
26
+
27
+ jest.mock( '../../../lock-unlock', () => ( {
28
+ unlock: jest.fn( () => ( {
29
+ pauseQueue: mockPauseQueue,
30
+ resumeQueue: mockResumeQueue,
31
+ } ) ),
32
+ } ) );
33
+
34
+ describe( 'useNetworkReconnect', () => {
35
+ const originalAddEventListener = window.addEventListener;
36
+ const originalRemoveEventListener = window.removeEventListener;
37
+ let listeners;
38
+
39
+ beforeEach( () => {
40
+ mockPauseQueue.mockClear();
41
+ mockResumeQueue.mockClear();
42
+ listeners = {};
43
+ window.addEventListener = jest.fn( ( event, cb ) => {
44
+ listeners[ event ] = cb;
45
+ } );
46
+ window.removeEventListener = jest.fn( ( event ) => {
47
+ delete listeners[ event ];
48
+ } );
49
+ useRegistry.mockReturnValue( {
50
+ dispatch: jest.fn( () => ( {} ) ),
51
+ } );
52
+ } );
53
+
54
+ afterEach( () => {
55
+ window.addEventListener = originalAddEventListener;
56
+ window.removeEventListener = originalRemoveEventListener;
57
+ delete window.__clientSideMediaProcessing;
58
+ } );
59
+
60
+ it( 'does nothing when client-side media processing is disabled', () => {
61
+ window.__clientSideMediaProcessing = false;
62
+ renderHook( () => useNetworkReconnect() );
63
+
64
+ expect( window.addEventListener ).not.toHaveBeenCalled();
65
+ } );
66
+
67
+ it( 'does nothing when the flag is undefined', () => {
68
+ renderHook( () => useNetworkReconnect() );
69
+
70
+ expect( window.addEventListener ).not.toHaveBeenCalled();
71
+ } );
72
+
73
+ it( 'registers offline and online listeners when enabled', () => {
74
+ window.__clientSideMediaProcessing = true;
75
+ renderHook( () => useNetworkReconnect() );
76
+
77
+ expect( window.addEventListener ).toHaveBeenCalledWith(
78
+ 'offline',
79
+ expect.any( Function )
80
+ );
81
+ expect( window.addEventListener ).toHaveBeenCalledWith(
82
+ 'online',
83
+ expect.any( Function )
84
+ );
85
+ } );
86
+
87
+ it( 'pauses the queue when the offline event fires', () => {
88
+ window.__clientSideMediaProcessing = true;
89
+ renderHook( () => useNetworkReconnect() );
90
+
91
+ listeners.offline();
92
+
93
+ expect( mockPauseQueue ).toHaveBeenCalledTimes( 1 );
94
+ expect( mockResumeQueue ).not.toHaveBeenCalled();
95
+ } );
96
+
97
+ it( 'resumes the queue when the online event fires', () => {
98
+ window.__clientSideMediaProcessing = true;
99
+ renderHook( () => useNetworkReconnect() );
100
+
101
+ listeners.online();
102
+
103
+ expect( mockResumeQueue ).toHaveBeenCalledTimes( 1 );
104
+ expect( mockPauseQueue ).not.toHaveBeenCalled();
105
+ } );
106
+
107
+ it( 'handles multiple offline/online cycles', () => {
108
+ window.__clientSideMediaProcessing = true;
109
+ renderHook( () => useNetworkReconnect() );
110
+
111
+ listeners.offline();
112
+ listeners.online();
113
+ listeners.offline();
114
+ listeners.online();
115
+
116
+ expect( mockPauseQueue ).toHaveBeenCalledTimes( 2 );
117
+ expect( mockResumeQueue ).toHaveBeenCalledTimes( 2 );
118
+ } );
119
+
120
+ it( 'removes the listeners on unmount', () => {
121
+ window.__clientSideMediaProcessing = true;
122
+ const { unmount } = renderHook( () => useNetworkReconnect() );
123
+
124
+ unmount();
125
+
126
+ expect( window.removeEventListener ).toHaveBeenCalledWith(
127
+ 'offline',
128
+ expect.any( Function )
129
+ );
130
+ expect( window.removeEventListener ).toHaveBeenCalledWith(
131
+ 'online',
132
+ expect.any( Function )
133
+ );
134
+ expect( listeners.offline ).toBeUndefined();
135
+ expect( listeners.online ).toBeUndefined();
136
+ } );
137
+ } );
@@ -0,0 +1,44 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useEffect } from '@wordpress/element';
5
+ import { useRegistry } from '@wordpress/data';
6
+ import { store as uploadStore } from '@wordpress/upload-media';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import { unlock } from '../../lock-unlock';
12
+
13
+ /**
14
+ * A hook that pauses the media upload queue when the browser goes offline
15
+ * and resumes it when connectivity is restored.
16
+ *
17
+ * Only active when client-side media processing is enabled.
18
+ */
19
+ export default function useNetworkReconnect() {
20
+ const isEnabled = window.__clientSideMediaProcessing;
21
+ const registry = useRegistry();
22
+
23
+ useEffect( () => {
24
+ if ( ! isEnabled ) {
25
+ return;
26
+ }
27
+
28
+ const handleOffline = () => {
29
+ unlock( registry.dispatch( uploadStore ) ).pauseQueue();
30
+ };
31
+
32
+ const handleOnline = () => {
33
+ unlock( registry.dispatch( uploadStore ) ).resumeQueue();
34
+ };
35
+
36
+ window.addEventListener( 'offline', handleOffline );
37
+ window.addEventListener( 'online', handleOnline );
38
+
39
+ return () => {
40
+ window.removeEventListener( 'offline', handleOffline );
41
+ window.removeEventListener( 'online', handleOnline );
42
+ };
43
+ }, [ isEnabled, registry ] );
44
+ }
@@ -4,7 +4,6 @@
4
4
  import { __ } from '@wordpress/i18n';
5
5
  import { LEFT, RIGHT } from '@wordpress/keycodes';
6
6
  import { __unstableMotion as motion } from '@wordpress/components';
7
- // eslint-disable-next-line @wordpress/use-recommended-components -- `Tooltip` is not yet on the recommended `@wordpress/ui` allow-list; landing as a migration step ahead of the wider rollout.
8
7
  import { Tooltip, VisuallyHidden } from '@wordpress/ui';
9
8
 
10
9
  const DELTA_DISTANCE = 20; // The distance to resize per keydown in pixels.
@@ -15,8 +15,14 @@ import PostPanelRow from '../post-panel-row';
15
15
  * @param {string} props.title Panel title.
16
16
  * @param {Object} props.entries Map of key → diffWords parts arrays.
17
17
  * @param {boolean} props.initialOpen Whether the panel starts open.
18
+ * @param {string} [props.className] Optional class for the content wrapper.
18
19
  */
19
- export default function RevisionDiffPanel( { title, entries, initialOpen } ) {
20
+ export default function RevisionDiffPanel( {
21
+ title,
22
+ entries,
23
+ initialOpen,
24
+ className,
25
+ } ) {
20
26
  if ( ! entries ) {
21
27
  return null;
22
28
  }
@@ -53,7 +59,7 @@ export default function RevisionDiffPanel( { title, entries, initialOpen } ) {
53
59
 
54
60
  return (
55
61
  <PanelBody title={ title } initialOpen={ initialOpen }>
56
- { fields }
62
+ <div className={ className }>{ fields }</div>
57
63
  </PanelBody>
58
64
  );
59
65
  }
@@ -1,7 +1,12 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { diffWords } from 'diff/lib/diff/word';
4
+ /*
5
+ * `diffWordsWithSpace` preserves the v4-style per-word output. v6+
6
+ * stopped treating whitespace as a token in `diffWords`, which coalesces
7
+ * adjacent word changes into a single removed/added pair.
8
+ */
9
+ import { diffWordsWithSpace } from 'diff';
5
10
 
6
11
  /**
7
12
  * WordPress dependencies
@@ -33,6 +38,16 @@ function stringifyValue( value ) {
33
38
  return String( value );
34
39
  }
35
40
 
41
+ /**
42
+ * Determines whether a meta value should be treated as empty.
43
+ *
44
+ * @param {string} str The stringified value.
45
+ * @return {boolean} Whether the value is effectively empty.
46
+ */
47
+ function isEmptyMeta( str ) {
48
+ return ! str || str === '[]' || str === '{}';
49
+ }
50
+
36
51
  /**
37
52
  * Panel that shows meta field diffs between the current revision and
38
53
  * the previous revision in the document sidebar during revision mode.
@@ -67,11 +82,11 @@ export default function RevisionFieldsDiffPanel() {
67
82
  const revStr = stringifyValue( revisionMeta[ key ] );
68
83
  const prevStr = stringifyValue( previousMeta[ key ] );
69
84
 
70
- if ( ! revStr && ! prevStr ) {
85
+ if ( isEmptyMeta( revStr ) && isEmptyMeta( prevStr ) ) {
71
86
  continue;
72
87
  }
73
88
 
74
- result[ key ] = diffWords( prevStr, revStr );
89
+ result[ key ] = diffWordsWithSpace( prevStr, revStr );
75
90
  }
76
91
 
77
92
  if ( Object.keys( result ).length === 0 ) {
@@ -86,6 +101,7 @@ export default function RevisionFieldsDiffPanel() {
86
101
  title={ __( 'Meta' ) }
87
102
  entries={ entries }
88
103
  initialOpen={ false }
104
+ className="editor-revision-meta-diff__content"
89
105
  />
90
106
  );
91
107
  }