@wordpress/editor 14.45.2-next.v.202605131032.0 → 14.47.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 (326) hide show
  1. package/CHANGELOG.md +12 -1
  2. package/build/components/collab-sidebar/add-note.cjs +6 -0
  3. package/build/components/collab-sidebar/add-note.cjs.map +2 -2
  4. package/build/components/collab-sidebar/hooks.cjs +36 -24
  5. package/build/components/collab-sidebar/hooks.cjs.map +2 -2
  6. package/build/components/collab-sidebar/index.cjs +19 -10
  7. package/build/components/collab-sidebar/index.cjs.map +2 -2
  8. package/build/components/collab-sidebar/note-byline.cjs +16 -9
  9. package/build/components/collab-sidebar/note-byline.cjs.map +2 -2
  10. package/build/components/collab-sidebar/notes.cjs +20 -11
  11. package/build/components/collab-sidebar/notes.cjs.map +2 -2
  12. package/build/components/collab-sidebar/utils.cjs +42 -2
  13. package/build/components/collab-sidebar/utils.cjs.map +2 -2
  14. package/build/components/collaborators-overlay/compute-selection.cjs +39 -15
  15. package/build/components/collaborators-overlay/compute-selection.cjs.map +3 -3
  16. package/build/components/collaborators-overlay/use-block-highlighting.cjs +10 -2
  17. package/build/components/collaborators-overlay/use-block-highlighting.cjs.map +3 -3
  18. package/build/components/collaborators-overlay/use-render-cursors.cjs +15 -7
  19. package/build/components/collaborators-overlay/use-render-cursors.cjs.map +3 -3
  20. package/build/components/collaborators-presence/avatar/component.cjs +5 -1
  21. package/build/components/collaborators-presence/avatar/component.cjs.map +3 -3
  22. package/build/components/collaborators-presence/use-collaborator-notifications.cjs +6 -3
  23. package/build/components/collaborators-presence/use-collaborator-notifications.cjs.map +2 -2
  24. package/build/components/editor-interface/index.cjs +17 -16
  25. package/build/components/editor-interface/index.cjs.map +3 -3
  26. package/build/components/editor-notices/index.cjs +6 -1
  27. package/build/components/editor-notices/index.cjs.map +3 -3
  28. package/build/components/global-styles/hooks.cjs +12 -1
  29. package/build/components/global-styles/hooks.cjs.map +2 -2
  30. package/build/components/header/index.cjs +11 -6
  31. package/build/components/header/index.cjs.map +2 -2
  32. package/build/components/media/media-editor-modal.cjs +14 -1
  33. package/build/components/media/media-editor-modal.cjs.map +2 -2
  34. package/build/components/post-card-panel/index.cjs +7 -1
  35. package/build/components/post-card-panel/index.cjs.map +3 -3
  36. package/build/components/post-last-revision/index.cjs +28 -8
  37. package/build/components/post-last-revision/index.cjs.map +2 -2
  38. package/build/components/post-locked-modal/index.cjs +9 -6
  39. package/build/components/post-locked-modal/index.cjs.map +2 -2
  40. package/build/components/post-publish-button/label.cjs +0 -7
  41. package/build/components/post-publish-button/label.cjs.map +2 -2
  42. package/build/components/post-publish-panel/prepublish.cjs +8 -1
  43. package/build/components/post-publish-panel/prepublish.cjs.map +3 -3
  44. package/build/components/post-revisions-panel/index.cjs +7 -0
  45. package/build/components/post-revisions-panel/index.cjs.map +2 -2
  46. package/build/components/post-revisions-preview/diff-markers.cjs +21 -13
  47. package/build/components/post-revisions-preview/diff-markers.cjs.map +2 -2
  48. package/build/components/post-revisions-preview/revisions-canvas.cjs +7 -1
  49. package/build/components/post-revisions-preview/revisions-canvas.cjs.map +2 -2
  50. package/build/components/post-taxonomies/check.cjs +1 -2
  51. package/build/components/post-taxonomies/check.cjs.map +2 -2
  52. package/build/components/post-taxonomies/index.cjs +1 -2
  53. package/build/components/post-taxonomies/index.cjs.map +2 -2
  54. package/build/components/preferences-modal/index.cjs +1 -1
  55. package/build/components/preferences-modal/index.cjs.map +2 -2
  56. package/build/components/preview-dropdown/index.cjs.map +3 -3
  57. package/build/components/provider/index.cjs +5 -21
  58. package/build/components/provider/index.cjs.map +3 -3
  59. package/build/components/provider/use-block-editor-settings.cjs +16 -9
  60. package/build/components/provider/use-block-editor-settings.cjs.map +3 -3
  61. package/build/components/resizable-editor/resize-handle.cjs +24 -16
  62. package/build/components/resizable-editor/resize-handle.cjs.map +2 -2
  63. package/build/components/sidebar/header.cjs +16 -21
  64. package/build/components/sidebar/header.cjs.map +3 -3
  65. package/build/components/sidebar/index.cjs +2 -6
  66. package/build/components/sidebar/index.cjs.map +2 -2
  67. package/build/components/start-page-options/index.cjs +14 -4
  68. package/build/components/start-page-options/index.cjs.map +2 -2
  69. package/build/components/start-template-options/index.cjs +8 -6
  70. package/build/components/start-template-options/index.cjs.map +2 -2
  71. package/build/components/styles-canvas/style-book.cjs +59 -2
  72. package/build/components/styles-canvas/style-book.cjs.map +2 -2
  73. package/build/components/sync-connection-error-modal/index.cjs +10 -7
  74. package/build/components/sync-connection-error-modal/index.cjs.map +3 -3
  75. package/build/components/template-actions-panel/block-theme-content.cjs +21 -12
  76. package/build/components/template-actions-panel/block-theme-content.cjs.map +2 -2
  77. package/build/dataviews/store/private-actions.cjs.map +2 -2
  78. package/build/store/private-actions.cjs +17 -1
  79. package/build/store/private-actions.cjs.map +3 -3
  80. package/build/store/private-selectors.cjs +18 -0
  81. package/build/store/private-selectors.cjs.map +2 -2
  82. package/build/store/selectors.cjs +0 -17
  83. package/build/store/selectors.cjs.map +2 -2
  84. package/build/{components/media → utils/media-delete}/index.cjs +12 -13
  85. package/build/utils/media-delete/index.cjs.map +7 -0
  86. package/build/utils/media-finalize/index.cjs +3 -1
  87. package/build/utils/media-finalize/index.cjs.map +2 -2
  88. package/build/utils/sync-error-messages.cjs +9 -0
  89. package/build/utils/sync-error-messages.cjs.map +2 -2
  90. package/build-module/components/collab-sidebar/add-note.mjs +6 -0
  91. package/build-module/components/collab-sidebar/add-note.mjs.map +2 -2
  92. package/build-module/components/collab-sidebar/hooks.mjs +42 -25
  93. package/build-module/components/collab-sidebar/hooks.mjs.map +2 -2
  94. package/build-module/components/collab-sidebar/index.mjs +19 -10
  95. package/build-module/components/collab-sidebar/index.mjs.map +2 -2
  96. package/build-module/components/collab-sidebar/note-byline.mjs +17 -10
  97. package/build-module/components/collab-sidebar/note-byline.mjs.map +2 -2
  98. package/build-module/components/collab-sidebar/notes.mjs +26 -13
  99. package/build-module/components/collab-sidebar/notes.mjs.map +2 -2
  100. package/build-module/components/collab-sidebar/utils.mjs +38 -2
  101. package/build-module/components/collab-sidebar/utils.mjs.map +2 -2
  102. package/build-module/components/collaborators-overlay/compute-selection.mjs +36 -12
  103. package/build-module/components/collaborators-overlay/compute-selection.mjs.map +2 -2
  104. package/build-module/components/collaborators-overlay/use-block-highlighting.mjs +10 -3
  105. package/build-module/components/collaborators-overlay/use-block-highlighting.mjs.map +2 -2
  106. package/build-module/components/collaborators-overlay/use-render-cursors.mjs +11 -6
  107. package/build-module/components/collaborators-overlay/use-render-cursors.mjs.map +2 -2
  108. package/build-module/components/collaborators-presence/avatar/component.mjs +7 -3
  109. package/build-module/components/collaborators-presence/avatar/component.mjs.map +2 -2
  110. package/build-module/components/collaborators-presence/use-collaborator-notifications.mjs +6 -3
  111. package/build-module/components/collaborators-presence/use-collaborator-notifications.mjs.map +2 -2
  112. package/build-module/components/editor-interface/index.mjs +22 -17
  113. package/build-module/components/editor-interface/index.mjs.map +2 -2
  114. package/build-module/components/editor-notices/index.mjs +6 -1
  115. package/build-module/components/editor-notices/index.mjs.map +2 -2
  116. package/build-module/components/global-styles/hooks.mjs +12 -1
  117. package/build-module/components/global-styles/hooks.mjs.map +2 -2
  118. package/build-module/components/header/index.mjs +11 -6
  119. package/build-module/components/header/index.mjs.map +2 -2
  120. package/build-module/components/media/media-editor-modal.mjs +14 -1
  121. package/build-module/components/media/media-editor-modal.mjs.map +2 -2
  122. package/build-module/components/post-card-panel/index.mjs +8 -2
  123. package/build-module/components/post-card-panel/index.mjs.map +2 -2
  124. package/build-module/components/post-last-revision/index.mjs +29 -9
  125. package/build-module/components/post-last-revision/index.mjs.map +2 -2
  126. package/build-module/components/post-locked-modal/index.mjs +9 -6
  127. package/build-module/components/post-locked-modal/index.mjs.map +2 -2
  128. package/build-module/components/post-publish-button/label.mjs +0 -7
  129. package/build-module/components/post-publish-button/label.mjs.map +2 -2
  130. package/build-module/components/post-publish-panel/prepublish.mjs +9 -2
  131. package/build-module/components/post-publish-panel/prepublish.mjs.map +2 -2
  132. package/build-module/components/post-revisions-panel/index.mjs +7 -0
  133. package/build-module/components/post-revisions-panel/index.mjs.map +2 -2
  134. package/build-module/components/post-revisions-preview/diff-markers.mjs +22 -14
  135. package/build-module/components/post-revisions-preview/diff-markers.mjs.map +2 -2
  136. package/build-module/components/post-revisions-preview/revisions-canvas.mjs +7 -1
  137. package/build-module/components/post-revisions-preview/revisions-canvas.mjs.map +2 -2
  138. package/build-module/components/post-taxonomies/check.mjs +1 -2
  139. package/build-module/components/post-taxonomies/check.mjs.map +2 -2
  140. package/build-module/components/post-taxonomies/index.mjs +1 -2
  141. package/build-module/components/post-taxonomies/index.mjs.map +2 -2
  142. package/build-module/components/preferences-modal/index.mjs +1 -1
  143. package/build-module/components/preferences-modal/index.mjs.map +2 -2
  144. package/build-module/components/preview-dropdown/index.mjs +2 -2
  145. package/build-module/components/preview-dropdown/index.mjs.map +2 -2
  146. package/build-module/components/provider/index.mjs +6 -22
  147. package/build-module/components/provider/index.mjs.map +2 -2
  148. package/build-module/components/provider/use-block-editor-settings.mjs +16 -9
  149. package/build-module/components/provider/use-block-editor-settings.mjs.map +2 -2
  150. package/build-module/components/resizable-editor/resize-handle.mjs +26 -18
  151. package/build-module/components/resizable-editor/resize-handle.mjs.map +2 -2
  152. package/build-module/components/sidebar/header.mjs +11 -16
  153. package/build-module/components/sidebar/header.mjs.map +2 -2
  154. package/build-module/components/sidebar/index.mjs +2 -7
  155. package/build-module/components/sidebar/index.mjs.map +2 -2
  156. package/build-module/components/start-page-options/index.mjs +14 -4
  157. package/build-module/components/start-page-options/index.mjs.map +2 -2
  158. package/build-module/components/start-template-options/index.mjs +8 -6
  159. package/build-module/components/start-template-options/index.mjs.map +2 -2
  160. package/build-module/components/styles-canvas/style-book.mjs +60 -3
  161. package/build-module/components/styles-canvas/style-book.mjs.map +2 -2
  162. package/build-module/components/sync-connection-error-modal/index.mjs +14 -8
  163. package/build-module/components/sync-connection-error-modal/index.mjs.map +2 -2
  164. package/build-module/components/template-actions-panel/block-theme-content.mjs +21 -13
  165. package/build-module/components/template-actions-panel/block-theme-content.mjs.map +2 -2
  166. package/build-module/dataviews/store/private-actions.mjs.map +2 -2
  167. package/build-module/store/private-actions.mjs +16 -1
  168. package/build-module/store/private-actions.mjs.map +2 -2
  169. package/build-module/store/private-selectors.mjs +18 -0
  170. package/build-module/store/private-selectors.mjs.map +2 -2
  171. package/build-module/store/selectors.mjs +0 -16
  172. package/build-module/store/selectors.mjs.map +2 -2
  173. package/build-module/utils/media-delete/index.mjs +12 -0
  174. package/build-module/utils/media-delete/index.mjs.map +7 -0
  175. package/build-module/utils/media-finalize/index.mjs +3 -1
  176. package/build-module/utils/media-finalize/index.mjs.map +2 -2
  177. package/build-module/utils/sync-error-messages.mjs +8 -0
  178. package/build-module/utils/sync-error-messages.mjs.map +2 -2
  179. package/build-style/style-rtl.css +462 -408
  180. package/build-style/style.css +462 -408
  181. package/build-types/components/collab-sidebar/add-note.d.ts.map +1 -1
  182. package/build-types/components/collab-sidebar/hooks.d.ts.map +1 -1
  183. package/build-types/components/collab-sidebar/index.d.ts.map +1 -1
  184. package/build-types/components/collab-sidebar/note-byline.d.ts +3 -0
  185. package/build-types/components/collab-sidebar/note-byline.d.ts.map +1 -1
  186. package/build-types/components/collab-sidebar/notes.d.ts.map +1 -1
  187. package/build-types/components/collab-sidebar/utils.d.ts +33 -0
  188. package/build-types/components/collab-sidebar/utils.d.ts.map +1 -1
  189. package/build-types/components/collaborators-overlay/compute-selection.d.ts.map +1 -1
  190. package/build-types/components/collaborators-overlay/use-block-highlighting.d.ts +3 -0
  191. package/build-types/components/collaborators-overlay/use-block-highlighting.d.ts.map +1 -1
  192. package/build-types/components/collaborators-overlay/use-render-cursors.d.ts.map +1 -1
  193. package/build-types/components/collaborators-presence/avatar/component.d.ts.map +1 -1
  194. package/build-types/components/collaborators-presence/use-collaborator-notifications.d.ts.map +1 -1
  195. package/build-types/components/editor-interface/index.d.ts.map +1 -1
  196. package/build-types/components/editor-notices/index.d.ts.map +1 -1
  197. package/build-types/components/global-styles/hooks.d.ts.map +1 -1
  198. package/build-types/components/media/media-editor-modal.d.ts +6 -2
  199. package/build-types/components/media/media-editor-modal.d.ts.map +1 -1
  200. package/build-types/components/post-card-panel/index.d.ts.map +1 -1
  201. package/build-types/components/post-last-revision/index.d.ts.map +1 -1
  202. package/build-types/components/post-locked-modal/index.d.ts +1 -6
  203. package/build-types/components/post-locked-modal/index.d.ts.map +1 -1
  204. package/build-types/components/post-publish-button/label.d.ts.map +1 -1
  205. package/build-types/components/post-publish-panel/prepublish.d.ts.map +1 -1
  206. package/build-types/components/post-revisions-panel/index.d.ts +1 -1
  207. package/build-types/components/post-revisions-panel/index.d.ts.map +1 -1
  208. package/build-types/components/post-revisions-preview/diff-markers.d.ts.map +1 -1
  209. package/build-types/components/post-revisions-preview/revisions-canvas.d.ts.map +1 -1
  210. package/build-types/components/post-taxonomies/check.d.ts.map +1 -1
  211. package/build-types/components/post-taxonomies/flat-term-selector.d.ts +1 -6
  212. package/build-types/components/post-taxonomies/hierarchical-term-selector.d.ts +1 -6
  213. package/build-types/components/post-taxonomies/index.d.ts.map +1 -1
  214. package/build-types/components/provider/index.d.ts.map +1 -1
  215. package/build-types/components/provider/use-block-editor-settings.d.ts.map +1 -1
  216. package/build-types/components/resizable-editor/resize-handle.d.ts.map +1 -1
  217. package/build-types/components/sidebar/index.d.ts.map +1 -1
  218. package/build-types/components/start-page-options/index.d.ts.map +1 -1
  219. package/build-types/components/start-template-options/index.d.ts.map +1 -1
  220. package/build-types/components/styles-canvas/style-book.d.ts.map +1 -1
  221. package/build-types/components/sync-connection-error-modal/index.d.ts.map +1 -1
  222. package/build-types/components/template-actions-panel/block-theme-content.d.ts.map +1 -1
  223. package/build-types/dataviews/store/private-actions.d.ts +0 -1
  224. package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
  225. package/build-types/store/private-actions.d.ts +15 -0
  226. package/build-types/store/private-actions.d.ts.map +1 -1
  227. package/build-types/store/private-selectors.d.ts +10 -0
  228. package/build-types/store/private-selectors.d.ts.map +1 -1
  229. package/build-types/store/selectors.d.ts +0 -10
  230. package/build-types/store/selectors.d.ts.map +1 -1
  231. package/build-types/utils/get-template-part-icon.d.ts.map +1 -1
  232. package/build-types/utils/media-delete/index.d.ts +2 -0
  233. package/build-types/utils/media-delete/index.d.ts.map +1 -0
  234. package/build-types/utils/media-finalize/index.d.ts +1 -1
  235. package/build-types/utils/media-finalize/index.d.ts.map +1 -1
  236. package/build-types/utils/sync-error-messages.d.ts +1 -0
  237. package/build-types/utils/sync-error-messages.d.ts.map +1 -1
  238. package/package.json +48 -48
  239. package/src/components/collab-sidebar/add-note.js +9 -0
  240. package/src/components/collab-sidebar/hooks.js +53 -29
  241. package/src/components/collab-sidebar/index.js +28 -14
  242. package/src/components/collab-sidebar/note-byline.js +15 -10
  243. package/src/components/collab-sidebar/notes.js +36 -14
  244. package/src/components/collab-sidebar/test/utils.js +375 -1
  245. package/src/components/collab-sidebar/utils.js +70 -1
  246. package/src/components/collaborators-overlay/compute-selection.ts +67 -19
  247. package/src/components/collaborators-overlay/use-block-highlighting.ts +14 -1
  248. package/src/components/collaborators-overlay/use-render-cursors.ts +15 -4
  249. package/src/components/collaborators-presence/avatar/component.tsx +10 -3
  250. package/src/components/collaborators-presence/avatar/test/index.tsx +50 -18
  251. package/src/components/collaborators-presence/styles/collaborators-presence.scss +4 -1
  252. package/src/components/collaborators-presence/test/use-collaborator-notifications.ts +2 -1
  253. package/src/components/collaborators-presence/use-collaborator-notifications.ts +6 -4
  254. package/src/components/editor-help/help-topic-row.native.js +2 -2
  255. package/src/components/editor-interface/index.js +22 -23
  256. package/src/components/editor-interface/style.scss +4 -0
  257. package/src/components/editor-notices/index.js +7 -1
  258. package/src/components/error-boundary/index.native.js +2 -2
  259. package/src/components/global-styles/hooks.js +26 -0
  260. package/src/components/global-styles-sidebar/style.scss +0 -9
  261. package/src/components/header/index.js +12 -12
  262. package/src/components/media/media-editor-modal.js +20 -2
  263. package/src/components/offline-status/index.native.js +2 -2
  264. package/src/components/post-card-panel/index.js +5 -2
  265. package/src/components/post-last-revision/index.js +37 -9
  266. package/src/components/post-last-revision/style.scss +0 -3
  267. package/src/components/post-locked-modal/index.js +8 -5
  268. package/src/components/post-panel-row/style.scss +1 -0
  269. package/src/components/post-publish-button/label.js +0 -11
  270. package/src/components/post-publish-panel/prepublish.js +6 -2
  271. package/src/components/post-revisions-panel/index.js +8 -0
  272. package/src/components/post-revisions-preview/diff-markers.js +17 -11
  273. package/src/components/post-revisions-preview/revisions-canvas.js +7 -1
  274. package/src/components/post-revisions-preview/style.scss +4 -4
  275. package/src/components/post-taxonomies/check.js +1 -2
  276. package/src/components/post-taxonomies/index.js +1 -2
  277. package/src/components/preferences-modal/index.js +1 -1
  278. package/src/components/preview-dropdown/index.js +2 -2
  279. package/src/components/provider/index.js +10 -31
  280. package/src/components/provider/use-block-editor-settings.js +19 -12
  281. package/src/components/resizable-editor/resize-handle.js +22 -16
  282. package/src/components/sidebar/header.js +18 -28
  283. package/src/components/sidebar/index.js +5 -14
  284. package/src/components/start-page-options/index.js +19 -4
  285. package/src/components/start-template-options/index.js +13 -6
  286. package/src/components/styles-canvas/style-book.js +75 -13
  287. package/src/components/sync-connection-error-modal/index.tsx +25 -11
  288. package/src/components/template-actions-panel/block-theme-content.js +19 -13
  289. package/src/components/text-editor/style.scss +2 -2
  290. package/src/dataviews/store/private-actions.ts +0 -1
  291. package/src/store/private-actions.js +27 -0
  292. package/src/store/private-selectors.js +26 -0
  293. package/src/store/selectors.js +0 -24
  294. package/src/store/test/actions.js +34 -0
  295. package/src/utils/media-delete/index.js +11 -0
  296. package/src/utils/media-finalize/index.js +6 -1
  297. package/src/utils/media-finalize/test/index.js +32 -2
  298. package/src/utils/sync-error-messages.ts +8 -0
  299. package/src/utils/test/sync-error-messages.js +1 -0
  300. package/build/components/global-styles-provider/index.cjs +0 -181
  301. package/build/components/global-styles-provider/index.cjs.map +0 -7
  302. package/build/components/media/index.cjs.map +0 -7
  303. package/build/components/media/metadata-panel.cjs +0 -96
  304. package/build/components/media/metadata-panel.cjs.map +0 -7
  305. package/build/components/media/preview.cjs +0 -39
  306. package/build/components/media/preview.cjs.map +0 -7
  307. package/build-module/components/global-styles-provider/index.mjs +0 -156
  308. package/build-module/components/global-styles-provider/index.mjs.map +0 -7
  309. package/build-module/components/media/index.mjs +0 -8
  310. package/build-module/components/media/index.mjs.map +0 -7
  311. package/build-module/components/media/metadata-panel.mjs +0 -65
  312. package/build-module/components/media/metadata-panel.mjs.map +0 -7
  313. package/build-module/components/media/preview.mjs +0 -21
  314. package/build-module/components/media/preview.mjs.map +0 -7
  315. package/build-types/components/global-styles-provider/index.d.ts +0 -16
  316. package/build-types/components/global-styles-provider/index.d.ts.map +0 -1
  317. package/build-types/components/media/index.d.ts +0 -3
  318. package/build-types/components/media/index.d.ts.map +0 -1
  319. package/build-types/components/media/metadata-panel.d.ts +0 -12
  320. package/build-types/components/media/metadata-panel.d.ts.map +0 -1
  321. package/build-types/components/media/preview.d.ts +0 -9
  322. package/build-types/components/media/preview.d.ts.map +0 -1
  323. package/src/components/global-styles-provider/index.js +0 -207
  324. package/src/components/media/index.js +0 -2
  325. package/src/components/media/metadata-panel.js +0 -77
  326. package/src/components/media/preview.js +0 -35
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/editor",
3
- "version": "14.45.2-next.v.202605131032.0+f6d6e7149",
3
+ "version": "14.47.0",
4
4
  "description": "Enhanced block editor for WordPress posts.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -60,50 +60,50 @@
60
60
  "build-module/bindings/**"
61
61
  ],
62
62
  "dependencies": {
63
- "@wordpress/a11y": "^4.45.1-next.v.202605131032.0+f6d6e7149",
64
- "@wordpress/api-fetch": "^7.45.1-next.v.202605131032.0+f6d6e7149",
65
- "@wordpress/base-styles": "^8.0.1-next.v.202605131032.0+f6d6e7149",
66
- "@wordpress/blob": "^4.45.1-next.v.202605131032.0+f6d6e7149",
67
- "@wordpress/block-editor": "^15.19.1-next.v.202605131032.0+f6d6e7149",
68
- "@wordpress/block-serialization-default-parser": "^5.45.1-next.v.202605131032.0+f6d6e7149",
69
- "@wordpress/blocks": "^15.18.1-next.v.202605131032.0+f6d6e7149",
70
- "@wordpress/commands": "^1.45.1-next.v.202605131032.0+f6d6e7149",
71
- "@wordpress/components": "^33.1.1-next.v.202605131032.0+f6d6e7149",
72
- "@wordpress/compose": "^7.45.1-next.v.202605131032.0+f6d6e7149",
73
- "@wordpress/core-data": "^7.45.1-next.v.202605131032.0+f6d6e7149",
74
- "@wordpress/data": "^10.45.1-next.v.202605131032.0+f6d6e7149",
75
- "@wordpress/dataviews": "^14.2.1-next.v.202605131032.0+f6d6e7149",
76
- "@wordpress/date": "^5.45.1-next.v.202605131032.0+f6d6e7149",
77
- "@wordpress/deprecated": "^4.45.1-next.v.202605131032.0+f6d6e7149",
78
- "@wordpress/dom": "^4.45.1-next.v.202605131032.0+f6d6e7149",
79
- "@wordpress/element": "^6.45.1-next.v.202605131032.0+f6d6e7149",
80
- "@wordpress/fields": "^0.37.1-next.v.202605131032.0+f6d6e7149",
81
- "@wordpress/global-styles-engine": "^1.12.1-next.v.202605131032.0+f6d6e7149",
82
- "@wordpress/global-styles-ui": "^1.12.1-next.v.202605131032.0+f6d6e7149",
83
- "@wordpress/hooks": "^4.45.1-next.v.202605131032.0+f6d6e7149",
84
- "@wordpress/html-entities": "^4.45.1-next.v.202605131032.0+f6d6e7149",
85
- "@wordpress/i18n": "^6.18.1-next.v.202605131032.0+f6d6e7149",
86
- "@wordpress/icons": "^13.0.1-next.v.202605131032.0+f6d6e7149",
87
- "@wordpress/interface": "^9.30.1-next.v.202605131032.0+f6d6e7149",
88
- "@wordpress/keyboard-shortcuts": "^5.45.1-next.v.202605131032.0+f6d6e7149",
89
- "@wordpress/keycodes": "^4.45.1-next.v.202605131032.0+f6d6e7149",
90
- "@wordpress/media-editor": "^0.8.1-next.v.202605131032.0+f6d6e7149",
91
- "@wordpress/media-fields": "^0.10.1-next.v.202605131032.0+f6d6e7149",
92
- "@wordpress/media-utils": "^5.45.1-next.v.202605131032.0+f6d6e7149",
93
- "@wordpress/notices": "^5.45.1-next.v.202605131032.0+f6d6e7149",
94
- "@wordpress/patterns": "^2.45.1-next.v.202605131032.0+f6d6e7149",
95
- "@wordpress/plugins": "^7.45.1-next.v.202605131032.0+f6d6e7149",
96
- "@wordpress/preferences": "^4.45.1-next.v.202605131032.0+f6d6e7149",
97
- "@wordpress/private-apis": "^1.45.1-next.v.202605131032.0+f6d6e7149",
98
- "@wordpress/reusable-blocks": "^5.45.1-next.v.202605131032.0+f6d6e7149",
99
- "@wordpress/rich-text": "^7.45.1-next.v.202605131032.0+f6d6e7149",
100
- "@wordpress/server-side-render": "^6.21.1-next.v.202605131032.0+f6d6e7149",
101
- "@wordpress/ui": "^0.13.1-next.v.202605131032.0+f6d6e7149",
102
- "@wordpress/upload-media": "^0.30.1-next.v.202605131032.0+f6d6e7149",
103
- "@wordpress/url": "^4.45.1-next.v.202605131032.0+f6d6e7149",
104
- "@wordpress/views": "^1.12.1-next.v.202605131032.0+f6d6e7149",
105
- "@wordpress/warning": "^3.45.1-next.v.202605131032.0+f6d6e7149",
106
- "@wordpress/wordcount": "^4.45.1-next.v.202605131032.0+f6d6e7149",
63
+ "@wordpress/a11y": "^4.47.0",
64
+ "@wordpress/api-fetch": "^7.47.0",
65
+ "@wordpress/base-styles": "^9.0.0",
66
+ "@wordpress/blob": "^4.47.0",
67
+ "@wordpress/block-editor": "^15.20.0",
68
+ "@wordpress/block-serialization-default-parser": "^5.47.0",
69
+ "@wordpress/blocks": "^15.20.0",
70
+ "@wordpress/commands": "^1.47.0",
71
+ "@wordpress/components": "^34.0.0",
72
+ "@wordpress/compose": "^8.0.0",
73
+ "@wordpress/core-data": "^7.47.0",
74
+ "@wordpress/data": "^10.47.0",
75
+ "@wordpress/dataviews": "^15.0.0",
76
+ "@wordpress/date": "^5.47.0",
77
+ "@wordpress/deprecated": "^4.47.0",
78
+ "@wordpress/dom": "^4.47.0",
79
+ "@wordpress/element": "^7.0.0",
80
+ "@wordpress/fields": "^0.39.0",
81
+ "@wordpress/global-styles-engine": "^1.14.0",
82
+ "@wordpress/global-styles-ui": "^1.14.0",
83
+ "@wordpress/hooks": "^4.47.0",
84
+ "@wordpress/html-entities": "^4.47.0",
85
+ "@wordpress/i18n": "^6.20.0",
86
+ "@wordpress/icons": "^13.2.0",
87
+ "@wordpress/interface": "^9.32.0",
88
+ "@wordpress/keyboard-shortcuts": "^5.47.0",
89
+ "@wordpress/keycodes": "^4.47.0",
90
+ "@wordpress/media-editor": "^0.10.0",
91
+ "@wordpress/media-fields": "^0.12.0",
92
+ "@wordpress/media-utils": "^5.47.0",
93
+ "@wordpress/notices": "^5.47.0",
94
+ "@wordpress/patterns": "^2.47.0",
95
+ "@wordpress/plugins": "^7.47.0",
96
+ "@wordpress/preferences": "^4.47.0",
97
+ "@wordpress/private-apis": "^1.47.0",
98
+ "@wordpress/reusable-blocks": "^5.47.0",
99
+ "@wordpress/rich-text": "^7.47.0",
100
+ "@wordpress/server-side-render": "^6.23.0",
101
+ "@wordpress/ui": "^0.14.0",
102
+ "@wordpress/upload-media": "^0.32.0",
103
+ "@wordpress/url": "^4.47.0",
104
+ "@wordpress/views": "^1.14.0",
105
+ "@wordpress/warning": "^3.47.0",
106
+ "@wordpress/wordcount": "^4.47.0",
107
107
  "change-case": "^4.1.2",
108
108
  "client-zip": "^2.4.5",
109
109
  "clsx": "^2.1.1",
@@ -120,11 +120,11 @@
120
120
  "deep-freeze": "0.0.1"
121
121
  },
122
122
  "peerDependencies": {
123
- "react": "^18.0.0",
124
- "react-dom": "^18.0.0"
123
+ "react": "^19.2.4",
124
+ "react-dom": "^19.2.4"
125
125
  },
126
126
  "publishConfig": {
127
127
  "access": "public"
128
128
  },
129
- "gitHead": "0e198c7ac7ca634e73ded9220ce048c0302174dd"
129
+ "gitHead": "d653c5fd6161571a0c2ebde28553d6e25624eacc"
130
130
  }
@@ -2,6 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
+ import { useRef } from '@wordpress/element';
5
6
  import { useSelect, useDispatch } from '@wordpress/data';
6
7
  import {
7
8
  store as blockEditorStore,
@@ -34,6 +35,7 @@ export function AddNote( { onSubmit, sidebarRef, floating } ) {
34
35
  const blockElement = useBlockElement( clientId );
35
36
  const { toggleBlockSpotlight } = unlock( useDispatch( blockEditorStore ) );
36
37
  const { selectNote } = unlock( useDispatch( editorStore ) );
38
+ const isSubmittingRef = useRef( false );
37
39
 
38
40
  const unselectNote = () => {
39
41
  selectNote( undefined );
@@ -61,6 +63,12 @@ export function AddNote( { onSubmit, sidebarRef, floating } ) {
61
63
  if ( ! document.hasFocus() ) {
62
64
  return;
63
65
  }
66
+ // Prevent blur from closing the form while the async submit
67
+ // is in progress. Clicking "Add note" moves focus away,
68
+ // triggering blur before onSubmit completes.
69
+ if ( isSubmittingRef.current ) {
70
+ return;
71
+ }
64
72
  if ( event.currentTarget.contains( event.relatedTarget ) ) {
65
73
  return;
66
74
  }
@@ -71,6 +79,7 @@ export function AddNote( { onSubmit, sidebarRef, floating } ) {
71
79
  <NoteCard>
72
80
  <NoteForm
73
81
  onSubmit={ async ( inputComment ) => {
82
+ isSubmittingRef.current = true;
74
83
  const { id } = await onSubmit( {
75
84
  content: inputComment,
76
85
  } );
@@ -26,7 +26,12 @@ import { store as editorStore } from '../../store';
26
26
  import { FLOATING_NOTES_SIDEBAR } from './constants';
27
27
  import { unlock } from '../../lock-unlock';
28
28
  import { createBoardStore } from './board-store';
29
- import { calculateNotePositions } from './utils';
29
+ import {
30
+ calculateNotePositions,
31
+ getNoteIdsFromMetadata,
32
+ addNoteIdToMetadata,
33
+ removeNoteIdFromMetadata,
34
+ } from './utils';
30
35
 
31
36
  const { cleanEmptyObject } = unlock( blockEditorPrivateApis );
32
37
 
@@ -59,15 +64,19 @@ export function useNoteThreads( postId ) {
59
64
  return { notes: [], unresolvedNotes: [] };
60
65
  }
61
66
 
62
- // Single pass over clientIds: build clientId->noteId map AND reverse lookup.
67
+ // Single pass over clientIds builds the forward map and reverse lookup
68
+ // together. getNoteIdsFromMetadata returns numeric ids, matching the
69
+ // types returned by the comments REST endpoint.
63
70
  const blocksWithNotes = {};
64
71
  const clientIdByNoteId = new Map();
65
72
  for ( const clientId of clientIds ) {
66
- const noteId = getBlockAttributes( clientId )?.metadata?.noteId;
67
- if ( noteId ) {
68
- const key = String( noteId );
69
- blocksWithNotes[ clientId ] = key;
70
- clientIdByNoteId.set( key, clientId );
73
+ const metadata = getBlockAttributes( clientId )?.metadata;
74
+ const noteIds = getNoteIdsFromMetadata( metadata );
75
+ if ( noteIds.length > 0 ) {
76
+ blocksWithNotes[ clientId ] = noteIds;
77
+ for ( const noteId of noteIds ) {
78
+ clientIdByNoteId.set( noteId, clientId );
79
+ }
71
80
  }
72
81
  }
73
82
 
@@ -81,7 +90,7 @@ export function useNoteThreads( postId ) {
81
90
  reply: [],
82
91
  blockClientId:
83
92
  item.parent === 0
84
- ? clientIdByNoteId.get( String( item.id ) ) ?? null
93
+ ? clientIdByNoteId.get( item.id ) ?? null
85
94
  : null,
86
95
  };
87
96
  threadsById.set( item.id, thread );
@@ -101,20 +110,21 @@ export function useNoteThreads( postId ) {
101
110
  return { notes: [], unresolvedNotes: [] };
102
111
  }
103
112
 
104
- // Single partition over notes-in-block-order.
113
+ // Single partition over notes-in-block-order. Each block can have
114
+ // multiple note IDs, so iterate the flattened list.
105
115
  const unresolved = [];
106
116
  const resolved = [];
107
- for ( const noteId of Object.values( blocksWithNotes ) ) {
108
- const thread =
109
- threadsById.get( Number( noteId ) ) ??
110
- threadsById.get( noteId );
111
- if ( ! thread ) {
112
- continue;
113
- }
114
- if ( thread.status === 'hold' ) {
115
- unresolved.push( thread );
116
- } else if ( thread.status === 'approved' ) {
117
- resolved.push( thread );
117
+ for ( const noteIds of Object.values( blocksWithNotes ) ) {
118
+ for ( const noteId of noteIds ) {
119
+ const thread = threadsById.get( noteId );
120
+ if ( ! thread ) {
121
+ continue;
122
+ }
123
+ if ( thread.status === 'hold' ) {
124
+ unresolved.push( thread );
125
+ } else if ( thread.status === 'approved' ) {
126
+ resolved.push( thread );
127
+ }
118
128
  }
119
129
  }
120
130
 
@@ -170,14 +180,22 @@ export function useNoteActions() {
170
180
  );
171
181
 
172
182
  // If it's a top-level note, update the block attributes with the note id.
183
+ // Read-modify-write on metadata is racy under concurrent edits:
184
+ // two near-simultaneous adds against the same base will each write
185
+ // a 2-element array and the later write wins, dropping the other
186
+ // id. Tracking issue: https://github.com/WordPress/gutenberg/issues/74751.
173
187
  if ( ! parent && savedRecord?.id ) {
174
188
  const clientId = getSelectedBlockClientId();
189
+ if ( ! clientId ) {
190
+ return savedRecord;
191
+ }
175
192
  const metadata = getBlockAttributes( clientId )?.metadata;
193
+ const updatedMetadata = addNoteIdToMetadata(
194
+ metadata,
195
+ savedRecord.id
196
+ );
176
197
  updateBlockAttributes( clientId, {
177
- metadata: {
178
- ...metadata,
179
- noteId: savedRecord.id,
180
- },
198
+ metadata: cleanEmptyObject( updatedMetadata ),
181
199
  } );
182
200
  }
183
201
 
@@ -267,13 +285,19 @@ export function useNoteActions() {
267
285
  } );
268
286
 
269
287
  if ( ! note.parent ) {
270
- const clientId = getSelectedBlockClientId();
288
+ // Use blockClientId if available, otherwise fall back to selected block.
289
+ const clientId =
290
+ note.blockClientId || getSelectedBlockClientId();
291
+ if ( ! clientId ) {
292
+ return;
293
+ }
271
294
  const metadata = getBlockAttributes( clientId )?.metadata;
295
+ const updatedMetadata = removeNoteIdFromMetadata(
296
+ metadata,
297
+ note.id
298
+ );
272
299
  updateBlockAttributes( clientId, {
273
- metadata: cleanEmptyObject( {
274
- ...metadata,
275
- noteId: undefined,
276
- } ),
300
+ metadata: cleanEmptyObject( updatedMetadata ),
277
301
  } );
278
302
  }
279
303
 
@@ -24,8 +24,9 @@ import { Notes } from './notes';
24
24
  import { store as editorStore } from '../../store';
25
25
  import { AddNoteMenuItem } from './add-note-menu-item';
26
26
  import { NoteAvatarIndicator } from './note-indicator-toolbar';
27
- import { useGlobalStylesContext } from '../global-styles-provider';
27
+ import { useGlobalStyles } from '../global-styles';
28
28
  import { useNoteThreads, useEnableFloatingSidebar } from './hooks';
29
+ import { getNoteIdsFromMetadata, pickPrimaryNote } from './utils';
29
30
  import PostTypeSupportCheck from '../post-type-support-check';
30
31
  import { unlock } from '../../lock-unlock';
31
32
 
@@ -53,6 +54,8 @@ function NotesSidebar( { postId } ) {
53
54
  : false,
54
55
  };
55
56
  }, [] );
57
+
58
+ const blockNoteIds = getNoteIdsFromMetadata( { noteId } );
56
59
  const { isDistractionFree } = useSelect( ( select ) => {
57
60
  const { get } = select( preferencesStore );
58
61
  return {
@@ -108,9 +111,11 @@ function NotesSidebar( { postId } ) {
108
111
  }
109
112
 
110
113
  function openNoteForBlock( targetClientId ) {
111
- const target = notes.find(
112
- ( note ) => note.blockClientId === targetClientId
114
+ // A block can carry multiple threads; surface the most relevant.
115
+ const blockThreads = notes.filter(
116
+ ( thread ) => thread.blockClientId === targetClientId
113
117
  );
118
+ const target = pickPrimaryNote( blockThreads );
114
119
  return focusNote( {
115
120
  targetClientId,
116
121
  noteId: target?.id ?? 'new',
@@ -118,28 +123,35 @@ function NotesSidebar( { postId } ) {
118
123
  } );
119
124
  }
120
125
 
126
+ function addNewNoteForBlock( targetClientId ) {
127
+ return focusNote( {
128
+ targetClientId,
129
+ noteId: 'new',
130
+ isApproved: false,
131
+ } );
132
+ }
133
+
121
134
  useShortcut(
122
135
  'core/editor/new-note',
123
136
  ( event ) => {
124
137
  event.preventDefault();
125
- openNoteForBlock( clientId );
138
+ addNewNoteForBlock( clientId );
126
139
  },
127
140
  {
128
- // When multiple notes per block are supported. Remove note ID check.
129
- // See: https://github.com/WordPress/gutenberg/pull/75147.
130
- isDisabled:
131
- isDistractionFree || isClassicBlock || ! clientId || !! noteId,
141
+ isDisabled: isDistractionFree || isClassicBlock || ! clientId,
132
142
  }
133
143
  );
134
144
 
135
145
  // Get the global styles to set the background color of the sidebar.
136
- const { merged: GlobalStyles } = useGlobalStylesContext();
146
+ const { merged: GlobalStyles } = useGlobalStyles();
137
147
  const backgroundColor = GlobalStyles?.styles?.color?.background;
138
148
 
139
- // Find the current thread for the selected block.
140
- const currentThread = noteId
141
- ? notes.find( ( thread ) => thread.id === noteId )
142
- : null;
149
+ // Surface one thread for the avatar indicator.
150
+ const currentThreads =
151
+ blockNoteIds.length > 0
152
+ ? notes.filter( ( thread ) => blockNoteIds.includes( thread.id ) )
153
+ : [];
154
+ const currentThread = pickPrimaryNote( currentThreads );
143
155
 
144
156
  if ( isDistractionFree ) {
145
157
  return <AddNoteMenuItem isDistractionFree />;
@@ -154,7 +166,9 @@ function NotesSidebar( { postId } ) {
154
166
  />
155
167
  ) }
156
168
  <AddNoteMenuItem
157
- onClick={ ( menuClientId ) => openNoteForBlock( menuClientId ) }
169
+ onClick={ ( menuClientId ) =>
170
+ addNewNoteForBlock( menuClientId )
171
+ }
158
172
  />
159
173
  { showAllNotesSidebar && (
160
174
  <PluginSidebar
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { Tooltip } from '@wordpress/components';
5
- import { Stack } from '@wordpress/ui';
4
+ // 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.
5
+ import { Stack, Tooltip } from '@wordpress/ui';
6
6
  import { __, _x } from '@wordpress/i18n';
7
7
  import {
8
8
  dateI18n,
@@ -95,14 +95,19 @@ export function NoteByline( { avatar, name, date, userId } ) {
95
95
  { name ?? currentUserName }
96
96
  </span>
97
97
  { date && (
98
- <Tooltip text={ tooltipText }>
99
- <time
100
- dateTime={ commentDateTime }
101
- className="editor-collab-sidebar-panel__user-time"
102
- >
103
- { commentDateText }
104
- </time>
105
- </Tooltip>
98
+ <Tooltip.Root>
99
+ <Tooltip.Trigger
100
+ render={
101
+ <time
102
+ dateTime={ commentDateTime }
103
+ className="editor-collab-sidebar-panel__user-time"
104
+ >
105
+ { commentDateText }
106
+ </time>
107
+ }
108
+ />
109
+ <Tooltip.Popup>{ tooltipText }</Tooltip.Popup>
110
+ </Tooltip.Root>
106
111
  ) }
107
112
  </Stack>
108
113
  </>
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useEffect, useMemo } from '@wordpress/element';
4
+ import { useEffect, useMemo, useRef } from '@wordpress/element';
5
5
  import { __ } from '@wordpress/i18n';
6
6
  import { useSelect, useDispatch } from '@wordpress/data';
7
7
  import { Stack } from '@wordpress/ui';
@@ -15,7 +15,11 @@ import {
15
15
  */
16
16
  import { unlock } from '../../lock-unlock';
17
17
  import { NoteThread } from './note-thread';
18
- import { focusNoteThread } from './utils';
18
+ import {
19
+ focusNoteThread,
20
+ getNoteIdsFromMetadata,
21
+ pickPrimaryNote,
22
+ } from './utils';
19
23
  import { useFloatingBoard, useNoteActions } from './hooks';
20
24
  import { AddNote } from './add-note';
21
25
  import { store as editorStore } from '../../store';
@@ -33,7 +37,7 @@ export function Notes( { notes, sidebarRef, isFloating = false, styles } ) {
33
37
  useDispatch( blockEditorStore )
34
38
  );
35
39
 
36
- const { blockNoteId, selectedBlockClientId, orderedBlockIds } = useSelect(
40
+ const { noteId, selectedBlockClientId, orderedBlockIds } = useSelect(
37
41
  ( select ) => {
38
42
  const {
39
43
  getBlockAttributes,
@@ -42,7 +46,7 @@ export function Notes( { notes, sidebarRef, isFloating = false, styles } ) {
42
46
  } = select( blockEditorStore );
43
47
  const clientId = getSelectedBlockClientId();
44
48
  return {
45
- blockNoteId: clientId
49
+ noteId: clientId
46
50
  ? getBlockAttributes( clientId )?.metadata?.noteId
47
51
  : null,
48
52
  selectedBlockClientId: clientId,
@@ -77,15 +81,15 @@ export function Notes( { notes, sidebarRef, isFloating = false, styles } ) {
77
81
  };
78
82
  const out = [];
79
83
  orderedBlockIds.forEach( ( blockId ) => {
84
+ // Blocks can carry multiple notes — surface them all.
85
+ const threadsForBlock = notes.filter(
86
+ ( t ) => t.blockClientId === blockId
87
+ );
88
+ out.push( ...threadsForBlock );
80
89
  if ( blockId === selectedBlockClientId ) {
90
+ // Place the new note placeholder after the block's existing
91
+ // threads so the form appears alongside them.
81
92
  out.push( newNoteThread );
82
- } else {
83
- const threadForBlock = notes.find(
84
- ( t ) => t.blockClientId === blockId
85
- );
86
- if ( threadForBlock ) {
87
- out.push( threadForBlock );
88
- }
89
93
  }
90
94
  } );
91
95
  return out;
@@ -128,10 +132,28 @@ export function Notes( { notes, sidebarRef, isFloating = false, styles } ) {
128
132
  }
129
133
  };
130
134
 
131
- // Auto-select the related note thread when a block is selected.
135
+ // Pick the most relevant thread for the selected block. Derived outside
136
+ // the effect so the effect body stays minimal.
137
+ const targetNoteId = useMemo( () => {
138
+ const blockNoteIds = getNoteIdsFromMetadata( { noteId } );
139
+ const blockThreads = notes.filter( ( t ) =>
140
+ blockNoteIds.includes( t.id )
141
+ );
142
+ return pickPrimaryNote( blockThreads )?.id;
143
+ }, [ noteId, notes ] );
144
+
145
+ // Sync the selected note to the new block's primary thread when the
146
+ // block context changes. The ref tracks the previous block id so the
147
+ // effect only fires on block transitions, leaving in-block note changes
148
+ // (Escape, Cancel, "new" form) alone.
149
+ const prevBlockIdRef = useRef( selectedBlockClientId );
132
150
  useEffect( () => {
133
- selectNote( blockNoteId ?? undefined );
134
- }, [ blockNoteId, selectNote ] );
151
+ if ( prevBlockIdRef.current === selectedBlockClientId ) {
152
+ return;
153
+ }
154
+ prevBlockIdRef.current = selectedBlockClientId;
155
+ selectNote( targetNoteId );
156
+ }, [ selectedBlockClientId, targetNoteId, selectNote ] );
135
157
 
136
158
  // Focus the selected note when requested.
137
159
  useEffect( () => {