@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,216 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect, useDispatch } from '@wordpress/data';
5
+ import { useEffect, useMemo, useRef, useState } from '@wordpress/element';
6
+ import { __, sprintf } from '@wordpress/i18n';
7
+ import { speak } from '@wordpress/a11y';
8
+ import { store as uploadStore } from '@wordpress/upload-media';
9
+ import { store as noticesStore } from '@wordpress/notices';
10
+ import { Icon as WCIcon, Spinner } from '@wordpress/components';
11
+ import { check } from '@wordpress/icons';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import { useTracker } from './tracker';
17
+
18
+ const NOTICE_ID = 'upload-progress';
19
+
20
+ // How long the completion checkmark is shown before the snackbar dismisses.
21
+ const COMPLETION_DISPLAY_MS = 3000;
22
+
23
+ // Longest filename shown before it is middle-truncated. Long names (e.g. the
24
+ // UUID-style names some sources produce) would otherwise stretch the snackbar.
25
+ const MAX_FILENAME_LENGTH = 40;
26
+
27
+ /**
28
+ * Middle-truncates a filename that exceeds `MAX_FILENAME_LENGTH`, keeping the
29
+ * start and the end (so the file extension stays visible).
30
+ *
31
+ * @param {string} filename The filename to truncate.
32
+ * @return {string} The original or middle-truncated filename.
33
+ */
34
+ function truncateFilename( filename ) {
35
+ if ( filename.length <= MAX_FILENAME_LENGTH ) {
36
+ return filename;
37
+ }
38
+ const ellipsis = '…';
39
+ const visible = MAX_FILENAME_LENGTH - ellipsis.length;
40
+ const front = Math.ceil( visible / 2 );
41
+ const back = Math.floor( visible / 2 );
42
+ return (
43
+ filename.slice( 0, front ) +
44
+ ellipsis +
45
+ filename.slice( filename.length - back )
46
+ );
47
+ }
48
+
49
+ // Exported so the Storybook story can render the exact icon markup the notice
50
+ // uses, keeping the visual review faithful to what ships.
51
+ export const UPLOAD_SPINNER = (
52
+ <span
53
+ className="editor-upload-progress-snackbar__spinner"
54
+ aria-hidden="true"
55
+ >
56
+ <Spinner />
57
+ </span>
58
+ );
59
+
60
+ export const UPLOAD_DONE = (
61
+ <span className="editor-upload-progress-snackbar__check" aria-hidden="true">
62
+ <WCIcon icon={ check } />
63
+ </span>
64
+ );
65
+
66
+ /**
67
+ * Manages a snackbar notice that shows media upload progress while uploads are
68
+ * in progress. It creates/updates a notice via the notices store so that it
69
+ * positions and stacks with every other snackbar in the editor.
70
+ *
71
+ * Reads from two sources to cover both upload paths:
72
+ * - `@wordpress/upload-media` store (client-side media processing path).
73
+ * - An editor-local tracker populated by the traditional `mediaUpload`
74
+ * wrapper (non-CSM path — e.g. Safari, or when a filter disables CSM).
75
+ *
76
+ * Only counts original user-uploaded files (items without a `parentId`),
77
+ * ignoring generated subsizes/thumbnails.
78
+ *
79
+ * @return {null} This component renders nothing — it only manages a notice.
80
+ */
81
+ export default function UploadProgressSnackbar() {
82
+ const items = useSelect(
83
+ ( select ) => select( uploadStore ).getItems(),
84
+ []
85
+ );
86
+ const tracker = useTracker();
87
+
88
+ // CSM path: originals in the upload-media queue (subsizes excluded). Memoized
89
+ // so its reference is stable across renders where `items` is unchanged, since
90
+ // it's a dependency of the effect below.
91
+ const csmOriginals = useMemo(
92
+ () => items.filter( ( item ) => ! item.parentId ),
93
+ [ items ]
94
+ );
95
+ const csmRemaining = csmOriginals.length;
96
+
97
+ // Non-CSM path: files tracked by the editor's mediaUpload wrapper.
98
+ const trackedRemaining = tracker ? tracker.total - tracker.completed : 0;
99
+
100
+ const remaining = csmRemaining + trackedRemaining;
101
+
102
+ // Track peak total across sources during a session. The CSM queue removes
103
+ // items on completion, and the tracker tops out at its recorded total, so
104
+ // `total` has to be tracked as the high-water mark.
105
+ const [ peak, setPeak ] = useState( 0 );
106
+ const sessionTotal = csmRemaining + ( tracker ? tracker.total : 0 );
107
+ if ( sessionTotal > peak ) {
108
+ setPeak( sessionTotal );
109
+ }
110
+
111
+ const { createNotice, removeNotice } = useDispatch( noticesStore );
112
+
113
+ // Track whether the user has dismissed the notice. If so, don't re-create
114
+ // it until the current batch finishes and a new one starts.
115
+ const dismissedRef = useRef( false );
116
+ const wasUploadingRef = useRef( false );
117
+
118
+ // Timeout that removes the completion-state (checkmark) notice after a
119
+ // brief display. Held so a new upload can cancel it.
120
+ const completionTimeoutRef = useRef( null );
121
+ useEffect( () => {
122
+ return () => {
123
+ if ( completionTimeoutRef.current ) {
124
+ clearTimeout( completionTimeoutRef.current );
125
+ }
126
+ };
127
+ }, [] );
128
+
129
+ useEffect( () => {
130
+ const isUploading = remaining > 0;
131
+
132
+ if ( isUploading && ! wasUploadingRef.current ) {
133
+ dismissedRef.current = false;
134
+ speak( __( 'Media upload started' ), 'polite' );
135
+ // A new batch started during the completion display: cancel the
136
+ // pending dismissal so the snackbar transitions straight back
137
+ // into the uploading state, and reset the peak so the new batch
138
+ // counts from `1 of N` rather than resuming the previous total.
139
+ if ( completionTimeoutRef.current ) {
140
+ clearTimeout( completionTimeoutRef.current );
141
+ completionTimeoutRef.current = null;
142
+ setPeak( 0 );
143
+ }
144
+ } else if ( ! isUploading && wasUploadingRef.current ) {
145
+ speak( __( 'Media upload complete' ), 'polite' );
146
+
147
+ if ( ! dismissedRef.current ) {
148
+ createNotice( 'info', __( 'Upload complete' ), {
149
+ id: NOTICE_ID,
150
+ type: 'snackbar',
151
+ isDismissible: false,
152
+ explicitDismiss: false,
153
+ speak: false,
154
+ icon: UPLOAD_DONE,
155
+ onDismiss: () => {
156
+ dismissedRef.current = true;
157
+ },
158
+ } );
159
+
160
+ completionTimeoutRef.current = setTimeout( () => {
161
+ removeNotice( NOTICE_ID );
162
+ completionTimeoutRef.current = null;
163
+ setPeak( 0 );
164
+ }, COMPLETION_DISPLAY_MS );
165
+ } else {
166
+ setPeak( 0 );
167
+ }
168
+ }
169
+
170
+ wasUploadingRef.current = isUploading;
171
+
172
+ if ( ! isUploading || dismissedRef.current ) {
173
+ return;
174
+ }
175
+
176
+ const total = peak;
177
+ const current = total - remaining + 1;
178
+
179
+ // Prefer the CSM queue's first original filename, then fall back to
180
+ // the tracker's first pending filename.
181
+ const filename = truncateFilename(
182
+ csmOriginals[ 0 ]?.sourceFile?.name ||
183
+ tracker?.pending[ 0 ] ||
184
+ __( 'Uploading' )
185
+ );
186
+
187
+ const content =
188
+ total === 1
189
+ ? sprintf(
190
+ /* translators: %s: filename. */
191
+ __( 'Uploading — %s' ),
192
+ filename
193
+ )
194
+ : sprintf(
195
+ /* translators: 1: current upload number, 2: total uploads, 3: filename. */
196
+ __( 'Uploading %1$d of %2$d — %3$s' ),
197
+ current,
198
+ total,
199
+ filename
200
+ );
201
+
202
+ createNotice( 'info', content, {
203
+ id: NOTICE_ID,
204
+ type: 'snackbar',
205
+ isDismissible: false,
206
+ explicitDismiss: true,
207
+ speak: false,
208
+ icon: UPLOAD_SPINNER,
209
+ onDismiss: () => {
210
+ dismissedRef.current = true;
211
+ },
212
+ } );
213
+ }, [ remaining, peak, csmOriginals, tracker, createNotice, removeNotice ] );
214
+
215
+ return null;
216
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { Meta, StoryObj } from '@storybook/react-vite';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { Snackbar } from '@wordpress/components';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import { UPLOAD_DONE, UPLOAD_SPINNER } from '../index';
15
+
16
+ /**
17
+ * The `UploadProgressSnackbar` component itself renders no UI: it manages a
18
+ * snackbar notice via the notices store while media uploads are in progress.
19
+ *
20
+ * These stories render the `Snackbar` with the same icon markup and text the
21
+ * notice produces, so the in-progress and completed states can be reviewed
22
+ * visually without running an actual upload.
23
+ */
24
+ const meta: Meta< typeof Snackbar > = {
25
+ title: 'Editor/UploadProgressSnackbar',
26
+ component: Snackbar,
27
+ parameters: {
28
+ docs: { canvas: { sourceState: 'shown' } },
29
+ },
30
+ argTypes: {
31
+ icon: { control: false },
32
+ children: { control: false },
33
+ },
34
+ };
35
+ export default meta;
36
+
37
+ type Story = StoryObj< typeof Snackbar >;
38
+
39
+ export const Uploading: Story = {
40
+ args: {
41
+ icon: UPLOAD_SPINNER,
42
+ children: 'Uploading — sunset-over-the-bay.jpg',
43
+ explicitDismiss: true,
44
+ },
45
+ };
46
+
47
+ export const UploadingMultiple: Story = {
48
+ args: {
49
+ icon: UPLOAD_SPINNER,
50
+ children: 'Uploading 1 of 3 — sunset-over-the-bay.jpg',
51
+ explicitDismiss: true,
52
+ },
53
+ };
54
+
55
+ export const Complete: Story = {
56
+ args: {
57
+ icon: UPLOAD_DONE,
58
+ children: 'Upload complete',
59
+ },
60
+ };
61
+
62
+ /**
63
+ * All states shown together for quick comparison of the icon alignment and
64
+ * sizing between the spinner and the completion checkmark.
65
+ */
66
+ export const AllStates: Story = {
67
+ render: () => (
68
+ <div
69
+ style={ {
70
+ display: 'flex',
71
+ flexDirection: 'column',
72
+ alignItems: 'flex-start',
73
+ gap: '12px',
74
+ } }
75
+ >
76
+ <Snackbar icon={ UPLOAD_SPINNER } explicitDismiss>
77
+ Uploading — sunset-over-the-bay.jpg
78
+ </Snackbar>
79
+ <Snackbar icon={ UPLOAD_SPINNER } explicitDismiss>
80
+ Uploading 1 of 3 — sunset-over-the-bay.jpg
81
+ </Snackbar>
82
+ <Snackbar icon={ UPLOAD_DONE }>Upload complete</Snackbar>
83
+ </div>
84
+ ),
85
+ };
@@ -0,0 +1,30 @@
1
+ @use "@wordpress/base-styles/variables" as *;
2
+
3
+ .editor-upload-progress-snackbar__spinner,
4
+ .editor-upload-progress-snackbar__check {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ // Size the slot to $icon-size to match the icon dimensions the Snackbar's
9
+ // absolute positioning is tuned for, so the spinner and checkmark sit
10
+ // vertically centered against the notice text.
11
+ width: $icon-size;
12
+ height: $icon-size;
13
+ }
14
+
15
+ .editor-upload-progress-snackbar__spinner .components-spinner {
16
+ // The Spinner ships with an asymmetric default margin (top, not bottom),
17
+ // which offsets it within the centered icon slot. Reset it so the flex
18
+ // centering above keeps the spinner vertically centered against the text.
19
+ margin: 0;
20
+ }
21
+
22
+ .editor-upload-progress-snackbar__check svg {
23
+ // Render at the full icon size: the check glyph only occupies the center of
24
+ // its viewBox, so a smaller size makes the mark look faint next to the text.
25
+ width: $icon-size;
26
+ height: $icon-size;
27
+ // The icon ships without a fill, which renders black and disappears against
28
+ // the dark snackbar. Inherit the snackbar's white text color instead.
29
+ fill: currentColor;
30
+ }
@@ -0,0 +1,199 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, act } from '@testing-library/react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useSelect } from '@wordpress/data';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import UploadProgressSnackbar from '../';
15
+ import { addFiles, advance, reset } from '../tracker';
16
+
17
+ jest.mock( '@wordpress/data/src/components/use-select', () => {
18
+ const mock = jest.fn();
19
+ return mock;
20
+ } );
21
+
22
+ const mockCreateNotice = jest.fn();
23
+ const mockRemoveNotice = jest.fn();
24
+
25
+ jest.mock( '@wordpress/data/src/components/use-dispatch', () => {
26
+ return {
27
+ useDispatch: jest.fn( () => ( {
28
+ createNotice: mockCreateNotice,
29
+ removeNotice: mockRemoveNotice,
30
+ } ) ),
31
+ useDispatchWithMap: jest.fn(),
32
+ };
33
+ } );
34
+
35
+ jest.mock( '@wordpress/a11y', () => ( {
36
+ speak: jest.fn(),
37
+ } ) );
38
+
39
+ function mockQueue( items ) {
40
+ useSelect.mockImplementation( ( mapSelect ) =>
41
+ mapSelect( () => ( {
42
+ getItems: () => items,
43
+ isUploading: () => items.length > 0,
44
+ } ) )
45
+ );
46
+ }
47
+
48
+ function makeItem( id, name, { parentId } = {} ) {
49
+ return {
50
+ id,
51
+ sourceFile: { name },
52
+ status: 'PROCESSING',
53
+ parentId,
54
+ };
55
+ }
56
+
57
+ describe( 'UploadProgressSnackbar', () => {
58
+ beforeEach( () => {
59
+ jest.clearAllMocks();
60
+ reset();
61
+ } );
62
+
63
+ it( 'does not create a notice when both sources are empty', () => {
64
+ mockQueue( [] );
65
+ render( <UploadProgressSnackbar /> );
66
+ expect( mockCreateNotice ).not.toHaveBeenCalled();
67
+ } );
68
+
69
+ it( 'creates a notice with the filename when a single CSM upload is in progress', () => {
70
+ mockQueue( [ makeItem( '1', 'photo.jpg' ) ] );
71
+ render( <UploadProgressSnackbar /> );
72
+ expect( mockCreateNotice ).toHaveBeenCalledWith(
73
+ 'info',
74
+ expect.stringContaining( 'photo.jpg' ),
75
+ expect.objectContaining( {
76
+ id: 'upload-progress',
77
+ type: 'snackbar',
78
+ } )
79
+ );
80
+ expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toBe(
81
+ 'Uploading — photo.jpg'
82
+ );
83
+ } );
84
+
85
+ it( 'shows batch count for CSM uploads', () => {
86
+ mockQueue( [
87
+ makeItem( '1', 'a.jpg' ),
88
+ makeItem( '2', 'b.jpg' ),
89
+ makeItem( '3', 'c.jpg' ),
90
+ ] );
91
+ render( <UploadProgressSnackbar /> );
92
+ expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toMatch( /1 of 3/ );
93
+ } );
94
+
95
+ it( 'excludes subsizes from the CSM count', () => {
96
+ mockQueue( [
97
+ makeItem( '1', 'photo.jpg' ),
98
+ makeItem( '1-thumb', 'photo-150x150.jpg', { parentId: '1' } ),
99
+ makeItem( '1-medium', 'photo-300x300.jpg', { parentId: '1' } ),
100
+ ] );
101
+ render( <UploadProgressSnackbar /> );
102
+ expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toBe(
103
+ 'Uploading — photo.jpg'
104
+ );
105
+ } );
106
+
107
+ it( 'shows non-CSM uploads tracked by the editor mediaUpload wrapper', () => {
108
+ mockQueue( [] );
109
+ act( () => {
110
+ addFiles( [ 'traditional.jpg' ] );
111
+ } );
112
+ render( <UploadProgressSnackbar /> );
113
+ expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toBe(
114
+ 'Uploading — traditional.jpg'
115
+ );
116
+ } );
117
+
118
+ it( 'shows batch count for non-CSM uploads', () => {
119
+ mockQueue( [] );
120
+ act( () => {
121
+ addFiles( [ 'a.jpg', 'b.jpg', 'c.jpg' ] );
122
+ } );
123
+ render( <UploadProgressSnackbar /> );
124
+ expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toMatch( /1 of 3/ );
125
+ expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toMatch( /a\.jpg/ );
126
+ } );
127
+
128
+ it( 'shows a completion notice and then removes it when uploads finish', () => {
129
+ jest.useFakeTimers();
130
+ try {
131
+ mockQueue( [] );
132
+ act( () => {
133
+ addFiles( [ 'a.jpg' ] );
134
+ } );
135
+ render( <UploadProgressSnackbar /> );
136
+ expect( mockCreateNotice ).toHaveBeenCalled();
137
+ mockCreateNotice.mockClear();
138
+
139
+ act( () => {
140
+ advance( 1 );
141
+ } );
142
+
143
+ // Completion notice replaces the progress notice (same ID).
144
+ expect( mockCreateNotice ).toHaveBeenCalledWith(
145
+ 'info',
146
+ 'Upload complete',
147
+ expect.objectContaining( {
148
+ id: 'upload-progress',
149
+ type: 'snackbar',
150
+ icon: expect.anything(),
151
+ } )
152
+ );
153
+ expect( mockRemoveNotice ).not.toHaveBeenCalled();
154
+
155
+ act( () => {
156
+ jest.runAllTimers();
157
+ } );
158
+
159
+ expect( mockRemoveNotice ).toHaveBeenCalledWith(
160
+ 'upload-progress'
161
+ );
162
+ } finally {
163
+ jest.useRealTimers();
164
+ }
165
+ } );
166
+
167
+ it( 'middle-truncates a long filename while keeping the extension', () => {
168
+ const longName =
169
+ 'a-really-long-uuid-like-filename-1234567890-abcdefghij.jpg';
170
+ mockQueue( [ makeItem( '1', longName ) ] );
171
+ render( <UploadProgressSnackbar /> );
172
+ const content = mockCreateNotice.mock.calls[ 0 ][ 1 ];
173
+ // Truncated: shorter than the original, marked with an ellipsis, and the
174
+ // extension is still visible.
175
+ expect( content ).toContain( '…' );
176
+ expect( content ).not.toContain( longName );
177
+ expect( content ).toMatch( /\.jpg$/ );
178
+ } );
179
+
180
+ it( 'does not truncate a short filename', () => {
181
+ mockQueue( [ makeItem( '1', 'photo.jpg' ) ] );
182
+ render( <UploadProgressSnackbar /> );
183
+ expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toBe(
184
+ 'Uploading — photo.jpg'
185
+ );
186
+ } );
187
+
188
+ it( 'includes a spinner icon on the in-progress notice', () => {
189
+ mockQueue( [ makeItem( '1', 'photo.jpg' ) ] );
190
+ render( <UploadProgressSnackbar /> );
191
+ expect( mockCreateNotice ).toHaveBeenCalledWith(
192
+ 'info',
193
+ expect.any( String ),
194
+ expect.objectContaining( {
195
+ icon: expect.anything(),
196
+ } )
197
+ );
198
+ } );
199
+ } );
@@ -0,0 +1,105 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSyncExternalStore } from '@wordpress/element';
5
+
6
+ /**
7
+ * A minimal in-memory tracker for in-flight media uploads that happen outside
8
+ * the `@wordpress/upload-media` store (i.e. the traditional / non-CSM upload
9
+ * path). The editor's `mediaUpload` wrapper writes to it; the
10
+ * `UploadProgressSnackbar` reads from it.
11
+ *
12
+ * State shape: { total, completed, pending: string[] }
13
+ * - `total`: total files registered in the current session.
14
+ * - `completed`: files that have finished (succeeded OR errored).
15
+ * - `pending`: remaining filenames in submission order.
16
+ *
17
+ * The tracker holds at most one "session" at a time — if a new batch starts
18
+ * while one is in progress, its files are appended to the existing session.
19
+ */
20
+
21
+ let state = null;
22
+ const listeners = new Set();
23
+
24
+ function notify() {
25
+ listeners.forEach( ( listener ) => listener() );
26
+ }
27
+
28
+ /**
29
+ * Registers a new batch of files that have started uploading.
30
+ *
31
+ * @param {string[]} filenames Filenames in submission order.
32
+ */
33
+ export function addFiles( filenames ) {
34
+ if ( ! filenames.length ) {
35
+ return;
36
+ }
37
+ if ( ! state ) {
38
+ state = { total: 0, completed: 0, pending: [] };
39
+ }
40
+ state = {
41
+ total: state.total + filenames.length,
42
+ completed: state.completed,
43
+ pending: [ ...state.pending, ...filenames ],
44
+ };
45
+ notify();
46
+ }
47
+
48
+ /**
49
+ * Advances the tracker by a number of finished files (success or error).
50
+ *
51
+ * @param {number} count Number of files that finished since the last call.
52
+ */
53
+ export function advance( count ) {
54
+ if ( ! state || count <= 0 ) {
55
+ return;
56
+ }
57
+ const completed = Math.min( state.total, state.completed + count );
58
+ const pending = state.pending.slice( count );
59
+ if ( completed >= state.total ) {
60
+ state = null;
61
+ } else {
62
+ state = { total: state.total, completed, pending };
63
+ }
64
+ notify();
65
+ }
66
+
67
+ /**
68
+ * Resets the tracker to its empty state.
69
+ *
70
+ * Test-only helper: `state` is a module-level singleton, so tests call this in
71
+ * `beforeEach` to isolate cases from one another. Not used in production -
72
+ * `advance` clears the state on its own once every file in a batch finishes.
73
+ */
74
+ export function reset() {
75
+ if ( state === null ) {
76
+ return;
77
+ }
78
+ state = null;
79
+ notify();
80
+ }
81
+
82
+ /**
83
+ * Returns the current tracker state, or `null` when idle.
84
+ *
85
+ * @return {?{total: number, completed: number, pending: string[]}} Tracker state.
86
+ */
87
+ export function getState() {
88
+ return state;
89
+ }
90
+
91
+ function subscribe( listener ) {
92
+ listeners.add( listener );
93
+ return () => {
94
+ listeners.delete( listener );
95
+ };
96
+ }
97
+
98
+ /**
99
+ * React hook that subscribes to the tracker.
100
+ *
101
+ * @return {?{total: number, completed: number, pending: string[]}} Tracker state.
102
+ */
103
+ export function useTracker() {
104
+ return useSyncExternalStore( subscribe, getState, getState );
105
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import type { Field } from '@wordpress/dataviews';
5
+ import type { BasePost } from '@wordpress/fields';
6
+ import { __ } from '@wordpress/i18n';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import RevisionsView from './revisions-view';
12
+
13
+ const revisionsField: Field< BasePost > = {
14
+ id: 'revisions',
15
+ label: __( 'Revisions' ),
16
+ readOnly: true,
17
+ enableSorting: false,
18
+ render: RevisionsView,
19
+ isVisible: ( item ) => {
20
+ const revisionsCount =
21
+ item._links?.[ 'version-history' ]?.[ 0 ]?.count ?? 0;
22
+ const lastRevisionId =
23
+ item._links?.[ 'predecessor-version' ]?.[ 0 ]?.id ?? null;
24
+ return !! lastRevisionId && revisionsCount >= 2;
25
+ },
26
+ };
27
+
28
+ export default revisionsField;