@wordpress/block-editor 12.5.0 → 12.7.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 (442) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +2 -6
  3. package/build/autocompleters/block.js +6 -2
  4. package/build/autocompleters/block.js.map +1 -1
  5. package/build/components/block-draggable/index.js +6 -3
  6. package/build/components/block-draggable/index.js.map +1 -1
  7. package/build/components/block-draggable/index.native.js +2 -2
  8. package/build/components/block-draggable/index.native.js.map +1 -1
  9. package/build/components/block-edit/edit.js +25 -13
  10. package/build/components/block-edit/edit.js.map +1 -1
  11. package/build/components/block-editing-mode/index.js +1 -1
  12. package/build/components/block-editing-mode/index.js.map +1 -1
  13. package/build/components/block-list/block-outline.native.js +14 -18
  14. package/build/components/block-list/block-outline.native.js.map +1 -1
  15. package/build/components/block-list/block.js +4 -2
  16. package/build/components/block-list/block.js.map +1 -1
  17. package/build/components/block-list/block.native.js +21 -42
  18. package/build/components/block-list/block.native.js.map +1 -1
  19. package/build/components/block-list/index.js +2 -4
  20. package/build/components/block-list/index.js.map +1 -1
  21. package/build/components/block-mover/index.native.js +1 -1
  22. package/build/components/block-mover/index.native.js.map +1 -1
  23. package/build/components/block-parent-selector/index.js +6 -21
  24. package/build/components/block-parent-selector/index.js.map +1 -1
  25. package/build/components/block-preview/auto.js +6 -1
  26. package/build/components/block-preview/auto.js.map +1 -1
  27. package/build/components/block-removal-warning-modal/index.js +1 -4
  28. package/build/components/block-removal-warning-modal/index.js.map +1 -1
  29. package/build/components/block-settings/button.native.js +2 -2
  30. package/build/components/block-settings/button.native.js.map +1 -1
  31. package/build/components/block-settings-menu/block-settings-dropdown.js +3 -17
  32. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  33. package/build/components/{block-mobile-toolbar/block-actions-menu.native.js → block-toolbar/block-toolbar-menu.native.js} +7 -5
  34. package/build/components/block-toolbar/block-toolbar-menu.native.js.map +1 -0
  35. package/build/components/block-toolbar/index.js +4 -33
  36. package/build/components/block-toolbar/index.js.map +1 -1
  37. package/build/components/block-toolbar/index.native.js +62 -3
  38. package/build/components/block-toolbar/index.native.js.map +1 -1
  39. package/build/components/block-toolbar/utils.js +56 -51
  40. package/build/components/block-toolbar/utils.js.map +1 -1
  41. package/build/components/block-tools/block-contextual-toolbar.js +4 -2
  42. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  43. package/build/components/block-variation-picker/index.native.js +10 -20
  44. package/build/components/block-variation-picker/index.native.js.map +1 -1
  45. package/build/components/colors-gradients/control.js +4 -2
  46. package/build/components/colors-gradients/control.js.map +1 -1
  47. package/build/components/editor-styles/index.js +2 -2
  48. package/build/components/editor-styles/index.js.map +1 -1
  49. package/build/components/font-sizes/fluid-utils.js +11 -11
  50. package/build/components/font-sizes/fluid-utils.js.map +1 -1
  51. package/build/components/global-styles/behaviors-panel.js +66 -0
  52. package/build/components/global-styles/behaviors-panel.js.map +1 -0
  53. package/build/components/global-styles/color-panel.js +21 -15
  54. package/build/components/global-styles/color-panel.js.map +1 -1
  55. package/build/components/global-styles/dimensions-panel.js +13 -2
  56. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  57. package/build/components/global-styles/get-block-css-selector.js +4 -8
  58. package/build/components/global-styles/get-block-css-selector.js.map +1 -1
  59. package/build/components/global-styles/hooks.js +131 -27
  60. package/build/components/global-styles/hooks.js.map +1 -1
  61. package/build/components/global-styles/index.js +20 -0
  62. package/build/components/global-styles/index.js.map +1 -1
  63. package/build/components/global-styles/typography-panel.js +18 -3
  64. package/build/components/global-styles/typography-panel.js.map +1 -1
  65. package/build/components/global-styles/typography-utils.js +4 -4
  66. package/build/components/global-styles/typography-utils.js.map +1 -1
  67. package/build/components/global-styles/use-global-styles-output.js +12 -18
  68. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  69. package/build/components/global-styles/utils.js +7 -7
  70. package/build/components/global-styles/utils.js.map +1 -1
  71. package/build/components/iframe/index.js +36 -48
  72. package/build/components/iframe/index.js.map +1 -1
  73. package/build/components/iframe/use-compatibility-styles.js +5 -0
  74. package/build/components/iframe/use-compatibility-styles.js.map +1 -1
  75. package/build/components/index.js +1 -10
  76. package/build/components/index.js.map +1 -1
  77. package/build/components/inner-blocks/index.js +3 -1
  78. package/build/components/inner-blocks/index.js.map +1 -1
  79. package/build/components/inner-blocks/index.native.js +3 -1
  80. package/build/components/inner-blocks/index.native.js.map +1 -1
  81. package/build/components/inner-blocks/use-nested-settings-update.js +33 -7
  82. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  83. package/build/components/inserter/hooks/use-block-types-state.js +6 -2
  84. package/build/components/inserter/hooks/use-block-types-state.js.map +1 -1
  85. package/build/components/inserter/hooks/use-debounced-input.js +5 -7
  86. package/build/components/inserter/hooks/use-debounced-input.js.map +1 -1
  87. package/build/components/inserter/hooks/use-patterns-state.js +3 -2
  88. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  89. package/build/components/inserter/index.js +2 -4
  90. package/build/components/inserter/index.js.map +1 -1
  91. package/build/components/inserter/index.native.js +21 -32
  92. package/build/components/inserter/index.native.js.map +1 -1
  93. package/build/components/inserter/reusable-block-rename-hint.js +23 -3
  94. package/build/components/inserter/reusable-block-rename-hint.js.map +1 -1
  95. package/build/components/inserter/reusable-blocks-tab.js +3 -2
  96. package/build/components/inserter/reusable-blocks-tab.js.map +1 -1
  97. package/build/components/inserter-list-item/index.js +1 -1
  98. package/build/components/inserter-list-item/index.js.map +1 -1
  99. package/build/components/link-control/index.js +51 -7
  100. package/build/components/link-control/index.js.map +1 -1
  101. package/build/components/link-control/link-preview.js +3 -3
  102. package/build/components/link-control/link-preview.js.map +1 -1
  103. package/build/components/link-control/search-item.js +1 -1
  104. package/build/components/link-control/search-item.js.map +1 -1
  105. package/build/components/list-view/use-list-view-client-ids.js +2 -2
  106. package/build/components/list-view/use-list-view-client-ids.js.map +1 -1
  107. package/build/components/list-view/use-list-view-drop-zone.js +6 -1
  108. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  109. package/build/components/media-placeholder/index.native.js +65 -31
  110. package/build/components/media-placeholder/index.native.js.map +1 -1
  111. package/build/components/media-replace-flow/index.native.js +15 -3
  112. package/build/components/media-replace-flow/index.native.js.map +1 -1
  113. package/build/components/preview-options/index.js +2 -2
  114. package/build/components/preview-options/index.js.map +1 -1
  115. package/build/components/rich-text/content.js +0 -36
  116. package/build/components/rich-text/content.js.map +1 -1
  117. package/build/components/rich-text/format-edit.js +57 -28
  118. package/build/components/rich-text/format-edit.js.map +1 -1
  119. package/build/components/rich-text/get-rich-text-values.js +111 -0
  120. package/build/components/rich-text/get-rich-text-values.js.map +1 -0
  121. package/build/components/spacing-sizes-control/hooks/use-spacing-sizes.js +1 -1
  122. package/build/components/spacing-sizes-control/hooks/use-spacing-sizes.js.map +1 -1
  123. package/build/components/spacing-sizes-control/input-controls/axial.js +6 -2
  124. package/build/components/spacing-sizes-control/input-controls/axial.js.map +1 -1
  125. package/build/components/spacing-sizes-control/input-controls/separated.js +5 -1
  126. package/build/components/spacing-sizes-control/input-controls/separated.js.map +1 -1
  127. package/build/components/spacing-sizes-control/input-controls/single.js +5 -1
  128. package/build/components/spacing-sizes-control/input-controls/single.js.map +1 -1
  129. package/build/components/spacing-sizes-control/utils.js +2 -2
  130. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  131. package/build/components/use-block-display-information/index.js +7 -3
  132. package/build/components/use-block-display-information/index.js.map +1 -1
  133. package/build/components/use-block-drop-zone/index.native.js +49 -8
  134. package/build/components/use-block-drop-zone/index.native.js.map +1 -1
  135. package/build/components/use-setting/index.js +5 -9
  136. package/build/components/use-setting/index.js.map +1 -1
  137. package/build/hooks/behaviors.js +5 -12
  138. package/build/hooks/behaviors.js.map +1 -1
  139. package/build/hooks/border.js +2 -1
  140. package/build/hooks/border.js.map +1 -1
  141. package/build/hooks/margin.js +1 -1
  142. package/build/hooks/margin.js.map +1 -1
  143. package/build/hooks/padding.js +1 -1
  144. package/build/hooks/padding.js.map +1 -1
  145. package/build/hooks/style.js +11 -2
  146. package/build/hooks/style.js.map +1 -1
  147. package/build/hooks/utils.js +1 -7
  148. package/build/hooks/utils.js.map +1 -1
  149. package/build/private-apis.js +10 -3
  150. package/build/private-apis.js.map +1 -1
  151. package/build/store/actions.js +3 -4
  152. package/build/store/actions.js.map +1 -1
  153. package/build/store/private-selectors.js +5 -6
  154. package/build/store/private-selectors.js.map +1 -1
  155. package/build/store/reducer.js +0 -1
  156. package/build/store/reducer.js.map +1 -1
  157. package/build/store/selectors.js +23 -79
  158. package/build/store/selectors.js.map +1 -1
  159. package/build/utils/object.js +38 -2
  160. package/build/utils/object.js.map +1 -1
  161. package/build-module/autocompleters/block.js +7 -3
  162. package/build-module/autocompleters/block.js.map +1 -1
  163. package/build-module/components/block-draggable/index.js +6 -3
  164. package/build-module/components/block-draggable/index.js.map +1 -1
  165. package/build-module/components/block-draggable/index.native.js +2 -2
  166. package/build-module/components/block-draggable/index.native.js.map +1 -1
  167. package/build-module/components/block-edit/edit.js +27 -10
  168. package/build-module/components/block-edit/edit.js.map +1 -1
  169. package/build-module/components/block-editing-mode/index.js +1 -1
  170. package/build-module/components/block-editing-mode/index.js.map +1 -1
  171. package/build-module/components/block-list/block-outline.native.js +14 -18
  172. package/build-module/components/block-list/block-outline.native.js.map +1 -1
  173. package/build-module/components/block-list/block.js +4 -2
  174. package/build-module/components/block-list/block.js.map +1 -1
  175. package/build-module/components/block-list/block.native.js +24 -43
  176. package/build-module/components/block-list/block.native.js.map +1 -1
  177. package/build-module/components/block-list/index.js +2 -3
  178. package/build-module/components/block-list/index.js.map +1 -1
  179. package/build-module/components/block-mover/index.native.js +3 -3
  180. package/build-module/components/block-mover/index.native.js.map +1 -1
  181. package/build-module/components/block-parent-selector/index.js +7 -22
  182. package/build-module/components/block-parent-selector/index.js.map +1 -1
  183. package/build-module/components/block-preview/auto.js +6 -1
  184. package/build-module/components/block-preview/auto.js.map +1 -1
  185. package/build-module/components/block-removal-warning-modal/index.js +1 -4
  186. package/build-module/components/block-removal-warning-modal/index.js.map +1 -1
  187. package/build-module/components/block-settings/button.native.js +3 -3
  188. package/build-module/components/block-settings/button.native.js.map +1 -1
  189. package/build-module/components/block-settings-menu/block-settings-dropdown.js +4 -18
  190. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  191. package/build-module/components/{block-mobile-toolbar/block-actions-menu.native.js → block-toolbar/block-toolbar-menu.native.js} +9 -7
  192. package/build-module/components/block-toolbar/block-toolbar-menu.native.js.map +1 -0
  193. package/build-module/components/block-toolbar/index.js +6 -35
  194. package/build-module/components/block-toolbar/index.js.map +1 -1
  195. package/build-module/components/block-toolbar/index.native.js +60 -4
  196. package/build-module/components/block-toolbar/index.native.js.map +1 -1
  197. package/build-module/components/block-toolbar/utils.js +54 -49
  198. package/build-module/components/block-toolbar/utils.js.map +1 -1
  199. package/build-module/components/block-tools/block-contextual-toolbar.js +4 -2
  200. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  201. package/build-module/components/block-variation-picker/index.native.js +13 -23
  202. package/build-module/components/block-variation-picker/index.native.js.map +1 -1
  203. package/build-module/components/colors-gradients/control.js +3 -2
  204. package/build-module/components/colors-gradients/control.js.map +1 -1
  205. package/build-module/components/editor-styles/index.js +2 -2
  206. package/build-module/components/editor-styles/index.js.map +1 -1
  207. package/build-module/components/font-sizes/fluid-utils.js +11 -11
  208. package/build-module/components/font-sizes/fluid-utils.js.map +1 -1
  209. package/build-module/components/global-styles/behaviors-panel.js +57 -0
  210. package/build-module/components/global-styles/behaviors-panel.js.map +1 -0
  211. package/build-module/components/global-styles/color-panel.js +21 -15
  212. package/build-module/components/global-styles/color-panel.js.map +1 -1
  213. package/build-module/components/global-styles/dimensions-panel.js +13 -2
  214. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  215. package/build-module/components/global-styles/get-block-css-selector.js +4 -8
  216. package/build-module/components/global-styles/get-block-css-selector.js.map +1 -1
  217. package/build-module/components/global-styles/hooks.js +127 -27
  218. package/build-module/components/global-styles/hooks.js.map +1 -1
  219. package/build-module/components/global-styles/index.js +2 -1
  220. package/build-module/components/global-styles/index.js.map +1 -1
  221. package/build-module/components/global-styles/typography-panel.js +18 -3
  222. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  223. package/build-module/components/global-styles/typography-utils.js +4 -4
  224. package/build-module/components/global-styles/typography-utils.js.map +1 -1
  225. package/build-module/components/global-styles/use-global-styles-output.js +13 -18
  226. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  227. package/build-module/components/global-styles/utils.js +6 -6
  228. package/build-module/components/global-styles/utils.js.map +1 -1
  229. package/build-module/components/iframe/index.js +37 -49
  230. package/build-module/components/iframe/index.js.map +1 -1
  231. package/build-module/components/iframe/use-compatibility-styles.js +5 -0
  232. package/build-module/components/iframe/use-compatibility-styles.js.map +1 -1
  233. package/build-module/components/index.js +0 -5
  234. package/build-module/components/index.js.map +1 -1
  235. package/build-module/components/inner-blocks/index.js +3 -1
  236. package/build-module/components/inner-blocks/index.js.map +1 -1
  237. package/build-module/components/inner-blocks/index.native.js +3 -1
  238. package/build-module/components/inner-blocks/index.native.js.map +1 -1
  239. package/build-module/components/inner-blocks/use-nested-settings-update.js +30 -7
  240. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  241. package/build-module/components/inserter/hooks/use-block-types-state.js +7 -3
  242. package/build-module/components/inserter/hooks/use-block-types-state.js.map +1 -1
  243. package/build-module/components/inserter/hooks/use-debounced-input.js +5 -7
  244. package/build-module/components/inserter/hooks/use-debounced-input.js.map +1 -1
  245. package/build-module/components/inserter/hooks/use-patterns-state.js +3 -2
  246. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  247. package/build-module/components/inserter/index.js +2 -4
  248. package/build-module/components/inserter/index.js.map +1 -1
  249. package/build-module/components/inserter/index.native.js +22 -33
  250. package/build-module/components/inserter/index.native.js.map +1 -1
  251. package/build-module/components/inserter/reusable-block-rename-hint.js +22 -3
  252. package/build-module/components/inserter/reusable-block-rename-hint.js.map +1 -1
  253. package/build-module/components/inserter/reusable-blocks-tab.js +3 -2
  254. package/build-module/components/inserter/reusable-blocks-tab.js.map +1 -1
  255. package/build-module/components/inserter-list-item/index.js +1 -1
  256. package/build-module/components/inserter-list-item/index.js.map +1 -1
  257. package/build-module/components/link-control/index.js +49 -7
  258. package/build-module/components/link-control/index.js.map +1 -1
  259. package/build-module/components/link-control/link-preview.js +3 -3
  260. package/build-module/components/link-control/link-preview.js.map +1 -1
  261. package/build-module/components/link-control/search-item.js +1 -1
  262. package/build-module/components/link-control/search-item.js.map +1 -1
  263. package/build-module/components/list-view/use-list-view-client-ids.js +2 -2
  264. package/build-module/components/list-view/use-list-view-client-ids.js.map +1 -1
  265. package/build-module/components/list-view/use-list-view-drop-zone.js +6 -1
  266. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  267. package/build-module/components/media-placeholder/index.native.js +66 -33
  268. package/build-module/components/media-placeholder/index.native.js.map +1 -1
  269. package/build-module/components/media-replace-flow/index.native.js +15 -3
  270. package/build-module/components/media-replace-flow/index.native.js.map +1 -1
  271. package/build-module/components/preview-options/index.js +2 -2
  272. package/build-module/components/preview-options/index.js.map +1 -1
  273. package/build-module/components/rich-text/content.js +1 -36
  274. package/build-module/components/rich-text/content.js.map +1 -1
  275. package/build-module/components/rich-text/format-edit.js +51 -26
  276. package/build-module/components/rich-text/format-edit.js.map +1 -1
  277. package/build-module/components/rich-text/get-rich-text-values.js +100 -0
  278. package/build-module/components/rich-text/get-rich-text-values.js.map +1 -0
  279. package/build-module/components/spacing-sizes-control/hooks/use-spacing-sizes.js +1 -1
  280. package/build-module/components/spacing-sizes-control/hooks/use-spacing-sizes.js.map +1 -1
  281. package/build-module/components/spacing-sizes-control/input-controls/axial.js +7 -3
  282. package/build-module/components/spacing-sizes-control/input-controls/axial.js.map +1 -1
  283. package/build-module/components/spacing-sizes-control/input-controls/separated.js +6 -2
  284. package/build-module/components/spacing-sizes-control/input-controls/separated.js.map +1 -1
  285. package/build-module/components/spacing-sizes-control/input-controls/single.js +6 -2
  286. package/build-module/components/spacing-sizes-control/input-controls/single.js.map +1 -1
  287. package/build-module/components/spacing-sizes-control/utils.js +2 -2
  288. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  289. package/build-module/components/use-block-display-information/index.js +7 -3
  290. package/build-module/components/use-block-display-information/index.js.map +1 -1
  291. package/build-module/components/use-block-drop-zone/index.native.js +50 -8
  292. package/build-module/components/use-block-drop-zone/index.native.js.map +1 -1
  293. package/build-module/components/use-setting/index.js +5 -9
  294. package/build-module/components/use-setting/index.js.map +1 -1
  295. package/build-module/hooks/behaviors.js +5 -12
  296. package/build-module/hooks/behaviors.js.map +1 -1
  297. package/build-module/hooks/border.js +2 -1
  298. package/build-module/hooks/border.js.map +1 -1
  299. package/build-module/hooks/margin.js +1 -1
  300. package/build-module/hooks/margin.js.map +1 -1
  301. package/build-module/hooks/padding.js +1 -1
  302. package/build-module/hooks/padding.js.map +1 -1
  303. package/build-module/hooks/style.js +11 -2
  304. package/build-module/hooks/style.js.map +1 -1
  305. package/build-module/hooks/utils.js +2 -7
  306. package/build-module/hooks/utils.js.map +1 -1
  307. package/build-module/private-apis.js +7 -2
  308. package/build-module/private-apis.js.map +1 -1
  309. package/build-module/store/actions.js +4 -5
  310. package/build-module/store/actions.js.map +1 -1
  311. package/build-module/store/private-selectors.js +3 -3
  312. package/build-module/store/private-selectors.js.map +1 -1
  313. package/build-module/store/reducer.js +0 -1
  314. package/build-module/store/reducer.js.map +1 -1
  315. package/build-module/store/selectors.js +20 -75
  316. package/build-module/store/selectors.js.map +1 -1
  317. package/build-module/utils/object.js +34 -2
  318. package/build-module/utils/object.js.map +1 -1
  319. package/build-style/content-rtl.css +2 -1
  320. package/build-style/content.css +2 -1
  321. package/build-style/style-rtl.css +25 -6
  322. package/build-style/style.css +25 -6
  323. package/package.json +32 -32
  324. package/src/autocompleters/block.js +21 -6
  325. package/src/components/block-controls/README.md +89 -0
  326. package/src/components/block-draggable/index.js +13 -4
  327. package/src/components/block-draggable/index.native.js +7 -3
  328. package/src/components/block-draggable/test/index.native.js +2 -57
  329. package/src/components/block-edit/edit.js +26 -9
  330. package/src/components/block-edit/test/edit.js +1 -1
  331. package/src/components/block-editing-mode/index.js +1 -1
  332. package/src/components/block-list/block-outline.native.js +26 -25
  333. package/src/components/block-list/block.js +6 -1
  334. package/src/components/block-list/block.native.js +24 -38
  335. package/src/components/block-list/block.native.scss +18 -40
  336. package/src/components/block-list/index.js +3 -6
  337. package/src/components/block-list/style.native.scss +3 -3
  338. package/src/components/block-list/test/block-invalid-warning.native.js +8 -1
  339. package/src/components/block-mover/index.native.js +3 -3
  340. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +40 -6
  341. package/src/components/block-parent-selector/index.js +30 -42
  342. package/src/components/block-preview/auto.js +8 -1
  343. package/src/components/block-preview/style.scss +2 -1
  344. package/src/components/block-removal-warning-modal/index.js +0 -3
  345. package/src/components/block-settings/button.native.js +12 -6
  346. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -13
  347. package/src/components/{block-mobile-toolbar/block-actions-menu.native.js → block-toolbar/block-toolbar-menu.native.js} +15 -10
  348. package/src/components/block-toolbar/index.js +36 -64
  349. package/src/components/block-toolbar/index.native.js +86 -6
  350. package/src/components/{block-mobile-toolbar/test/block-actions-menu.native.js → block-toolbar/test/block-toolbar-menu.native.js} +20 -54
  351. package/src/components/block-toolbar/test/index.native.js +42 -0
  352. package/src/components/block-toolbar/utils.js +57 -45
  353. package/src/components/block-tools/block-contextual-toolbar.js +43 -35
  354. package/src/components/block-tools/style.scss +17 -5
  355. package/src/components/block-variation-picker/index.native.js +52 -72
  356. package/src/components/button-block-appender/styles.native.scss +2 -2
  357. package/src/components/caption/README.md +49 -0
  358. package/src/components/color-palette/test/__snapshots__/control.js.snap +1 -1
  359. package/src/components/colors-gradients/control.js +3 -2
  360. package/src/components/editor-styles/index.js +2 -2
  361. package/src/components/font-sizes/fluid-utils.js +17 -17
  362. package/src/components/font-sizes/test/fluid-utils.js +6 -6
  363. package/src/components/global-styles/behaviors-panel.js +71 -0
  364. package/src/components/global-styles/color-panel.js +23 -16
  365. package/src/components/global-styles/dimensions-panel.js +8 -2
  366. package/src/components/global-styles/get-block-css-selector.js +5 -9
  367. package/src/components/global-styles/hooks.js +134 -31
  368. package/src/components/global-styles/index.js +3 -0
  369. package/src/components/global-styles/test/typography-utils.js +6 -6
  370. package/src/components/global-styles/typography-panel.js +17 -5
  371. package/src/components/global-styles/typography-utils.js +4 -4
  372. package/src/components/global-styles/use-global-styles-output.js +36 -18
  373. package/src/components/global-styles/utils.js +17 -7
  374. package/src/components/iframe/index.js +30 -56
  375. package/src/components/iframe/use-compatibility-styles.js +5 -0
  376. package/src/components/index.js +0 -5
  377. package/src/components/inner-blocks/README.md +10 -0
  378. package/src/components/inner-blocks/index.js +4 -0
  379. package/src/components/inner-blocks/index.native.js +4 -0
  380. package/src/components/inner-blocks/use-nested-settings-update.js +32 -5
  381. package/src/components/inserter/hooks/use-block-types-state.js +15 -6
  382. package/src/components/inserter/hooks/use-debounced-input.js +8 -7
  383. package/src/components/inserter/hooks/use-patterns-state.js +2 -1
  384. package/src/components/inserter/index.js +2 -3
  385. package/src/components/inserter/index.native.js +17 -36
  386. package/src/components/inserter/reusable-block-rename-hint.js +18 -1
  387. package/src/components/inserter/reusable-blocks-tab.js +4 -1
  388. package/src/components/inserter/style.native.scss +10 -15
  389. package/src/components/inserter-list-item/index.js +3 -1
  390. package/src/components/link-control/README.md +12 -3
  391. package/src/components/link-control/index.js +47 -7
  392. package/src/components/link-control/link-preview.js +6 -4
  393. package/src/components/link-control/search-item.js +1 -1
  394. package/src/components/link-control/style.scss +11 -3
  395. package/src/components/link-control/test/index.js +28 -1
  396. package/src/components/list-view/use-list-view-client-ids.js +2 -2
  397. package/src/components/list-view/use-list-view-drop-zone.js +5 -1
  398. package/src/components/media-placeholder/index.native.js +108 -59
  399. package/src/components/media-placeholder/styles.native.scss +59 -24
  400. package/src/components/media-replace-flow/index.native.js +12 -3
  401. package/src/components/media-upload/test/index.native.js +1 -0
  402. package/src/components/preview-options/README.md +18 -17
  403. package/src/components/preview-options/index.js +2 -2
  404. package/src/components/rich-text/content.js +1 -46
  405. package/src/components/rich-text/format-edit.js +62 -38
  406. package/src/components/rich-text/get-rich-text-values.js +99 -0
  407. package/src/components/spacing-sizes-control/hooks/use-spacing-sizes.js +1 -1
  408. package/src/components/spacing-sizes-control/input-controls/axial.js +17 -2
  409. package/src/components/spacing-sizes-control/input-controls/separated.js +17 -2
  410. package/src/components/spacing-sizes-control/input-controls/single.js +12 -2
  411. package/src/components/spacing-sizes-control/test/utils.js +9 -1
  412. package/src/components/spacing-sizes-control/utils.js +2 -2
  413. package/src/components/text-transform-control/README.md +44 -0
  414. package/src/components/use-block-display-information/index.js +12 -5
  415. package/src/components/use-block-drop-zone/index.native.js +65 -28
  416. package/src/components/use-setting/index.js +8 -8
  417. package/src/hooks/behaviors.js +10 -16
  418. package/src/hooks/border.js +2 -1
  419. package/src/hooks/margin.js +4 -1
  420. package/src/hooks/padding.js +4 -1
  421. package/src/hooks/style.js +7 -3
  422. package/src/hooks/utils.js +5 -7
  423. package/src/private-apis.js +9 -1
  424. package/src/store/actions.js +23 -30
  425. package/src/store/private-selectors.js +3 -6
  426. package/src/store/reducer.js +0 -1
  427. package/src/store/selectors.js +36 -85
  428. package/src/store/test/actions.js +3 -0
  429. package/src/store/test/private-selectors.js +5 -5
  430. package/src/store/test/reducer.js +14 -7
  431. package/src/store/test/selectors.js +8 -7
  432. package/src/utils/object.js +32 -2
  433. package/src/utils/test/object.js +36 -0
  434. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +0 -1
  435. package/build/components/block-mobile-toolbar/index.native.js +0 -135
  436. package/build/components/block-mobile-toolbar/index.native.js.map +0 -1
  437. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +0 -1
  438. package/build-module/components/block-mobile-toolbar/index.native.js +0 -116
  439. package/build-module/components/block-mobile-toolbar/index.native.js.map +0 -1
  440. package/src/components/block-mobile-toolbar/index.native.js +0 -127
  441. package/src/components/block-mobile-toolbar/style.native.scss +0 -16
  442. /package/src/components/{block-mobile-toolbar/test/__snapshots__/block-actions-menu.native.js.snap → block-toolbar/test/__snapshots__/block-toolbar-menu.native.js.snap} +0 -0
@@ -28,23 +28,24 @@ const MyPreviewOptions = () => (
28
28
  className="edit-post-post-preview-dropdown"
29
29
  deviceType={ deviceType }
30
30
  setDeviceType={ setPreviewDeviceType }
31
- >
32
- <MenuGroup>
33
- <div className="edit-post-header-preview__grouping-external">
34
- <PostPreviewButton
35
- className={ 'edit-post-header-preview__button-external' }
36
- role="menuitem"
37
- forceIsAutosaveable={ hasActiveMetaboxes }
38
- forcePreviewLink={ isSaving ? null : undefined }
39
- textContent={
40
- <>
41
- { __( 'Preview in new tab' ) }
42
- <Icon icon={ external } />
43
- </>
44
- }
45
- />
46
- </div>
47
- </MenuGroup>
31
+ > { ( { onClose } ) => (
32
+ <MenuGroup>
33
+ <div className="edit-post-header-preview__grouping-external">
34
+ <PostPreviewButton
35
+ className="edit-post-header-preview__button-external"
36
+ role="menuitem"
37
+ forceIsAutosaveable={ hasActiveMetaboxes }
38
+ textContent={
39
+ <>
40
+ { __( 'Preview in new tab' ) }
41
+ <Icon icon={ external } />
42
+ </>
43
+ }
44
+ onPreview={ onClose }
45
+ />
46
+ </div>
47
+ </MenuGroup>
48
+ ) }
48
49
  </PreviewOptions>
49
50
  );
50
51
  ```
@@ -54,7 +54,7 @@ export default function PreviewOptions( {
54
54
  icon={ deviceIcons[ deviceType.toLowerCase() ] }
55
55
  label={ label || __( 'Preview' ) }
56
56
  >
57
- { () => (
57
+ { ( renderProps ) => (
58
58
  <>
59
59
  <MenuGroup>
60
60
  <MenuItem
@@ -79,7 +79,7 @@ export default function PreviewOptions( {
79
79
  { __( 'Mobile' ) }
80
80
  </MenuItem>
81
81
  </MenuGroup>
82
- { children }
82
+ { children( renderProps ) }
83
83
  </>
84
84
  ) }
85
85
  </DropdownMenu>
@@ -2,11 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { RawHTML } from '@wordpress/element';
5
- import {
6
- children as childrenSource,
7
- getSaveElement,
8
- __unstableGetBlockProps as getBlockProps,
9
- } from '@wordpress/blocks';
5
+ import { children as childrenSource } from '@wordpress/blocks';
10
6
  import deprecated from '@wordpress/deprecated';
11
7
 
12
8
  /**
@@ -42,44 +38,3 @@ export const Content = ( { value, tagName: Tag, multiline, ...props } ) => {
42
38
 
43
39
  return content;
44
40
  };
45
-
46
- Content.__unstableIsRichTextContent = {};
47
-
48
- function findContent( blocks, richTextValues = [] ) {
49
- if ( ! Array.isArray( blocks ) ) {
50
- blocks = [ blocks ];
51
- }
52
-
53
- for ( const block of blocks ) {
54
- if (
55
- block?.type?.__unstableIsRichTextContent ===
56
- Content.__unstableIsRichTextContent
57
- ) {
58
- richTextValues.push( block.props.value );
59
- continue;
60
- }
61
-
62
- if ( block?.props?.children ) {
63
- findContent( block.props.children, richTextValues );
64
- }
65
- }
66
-
67
- return richTextValues;
68
- }
69
-
70
- function _getSaveElement( { name, attributes, innerBlocks } ) {
71
- return getSaveElement(
72
- name,
73
- attributes,
74
- innerBlocks.map( _getSaveElement )
75
- );
76
- }
77
-
78
- export function getRichTextValues( blocks = [] ) {
79
- getBlockProps.skipFilters = true;
80
- const values = findContent(
81
- ( Array.isArray( blocks ) ? blocks : [ blocks ] ).map( _getSaveElement )
82
- );
83
- getBlockProps.skipFilters = false;
84
- return values;
85
- }
@@ -2,43 +2,67 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { getActiveFormat, getActiveObject } from '@wordpress/rich-text';
5
+ import { useContext, useMemo } from '@wordpress/element';
5
6
 
6
- export default function FormatEdit( {
7
- formatTypes,
8
- onChange,
9
- onFocus,
10
- value,
11
- forwardedRef,
12
- } ) {
13
- return formatTypes.map( ( settings ) => {
14
- const { name, edit: Edit } = settings;
15
-
16
- if ( ! Edit ) {
17
- return null;
18
- }
19
-
20
- const activeFormat = getActiveFormat( value, name );
21
- const isActive = activeFormat !== undefined;
22
- const activeObject = getActiveObject( value );
23
- const isObjectActive =
24
- activeObject !== undefined && activeObject.type === name;
25
-
26
- return (
27
- <Edit
28
- key={ name }
29
- isActive={ isActive }
30
- activeAttributes={
31
- isActive ? activeFormat.attributes || {} : {}
32
- }
33
- isObjectActive={ isObjectActive }
34
- activeObjectAttributes={
35
- isObjectActive ? activeObject.attributes || {} : {}
36
- }
37
- value={ value }
38
- onChange={ onChange }
39
- onFocus={ onFocus }
40
- contentRef={ forwardedRef }
41
- />
42
- );
43
- } );
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import BlockContext from '../block-context';
11
+
12
+ const DEFAULT_BLOCK_CONTEXT = {};
13
+
14
+ export const usesContextKey = Symbol( 'usesContext' );
15
+
16
+ function Edit( { onChange, onFocus, value, forwardedRef, settings } ) {
17
+ const {
18
+ name,
19
+ edit: EditFunction,
20
+ [ usesContextKey ]: usesContext,
21
+ } = settings;
22
+
23
+ const blockContext = useContext( BlockContext );
24
+
25
+ // Assign context values using the block type's declared context needs.
26
+ const context = useMemo( () => {
27
+ return usesContext
28
+ ? Object.fromEntries(
29
+ Object.entries( blockContext ).filter( ( [ key ] ) =>
30
+ usesContext.includes( key )
31
+ )
32
+ )
33
+ : DEFAULT_BLOCK_CONTEXT;
34
+ }, [ usesContext, blockContext ] );
35
+
36
+ if ( ! EditFunction ) {
37
+ return null;
38
+ }
39
+
40
+ const activeFormat = getActiveFormat( value, name );
41
+ const isActive = activeFormat !== undefined;
42
+ const activeObject = getActiveObject( value );
43
+ const isObjectActive =
44
+ activeObject !== undefined && activeObject.type === name;
45
+
46
+ return (
47
+ <EditFunction
48
+ key={ name }
49
+ isActive={ isActive }
50
+ activeAttributes={ isActive ? activeFormat.attributes || {} : {} }
51
+ isObjectActive={ isObjectActive }
52
+ activeObjectAttributes={
53
+ isObjectActive ? activeObject.attributes || {} : {}
54
+ }
55
+ value={ value }
56
+ onChange={ onChange }
57
+ onFocus={ onFocus }
58
+ contentRef={ forwardedRef }
59
+ context={ context }
60
+ />
61
+ );
62
+ }
63
+
64
+ export default function FormatEdit( { formatTypes, ...props } ) {
65
+ return formatTypes.map( ( settings ) => (
66
+ <Edit settings={ settings } { ...props } key={ settings.name } />
67
+ ) );
44
68
  }
@@ -0,0 +1,99 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { RawHTML, StrictMode, Fragment } from '@wordpress/element';
5
+ import {
6
+ getSaveElement,
7
+ __unstableGetBlockProps as getBlockProps,
8
+ } from '@wordpress/blocks';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import InnerBlocks from '../inner-blocks';
14
+ import { Content } from './content';
15
+
16
+ /*
17
+ * This function is similar to `@wordpress/element`'s `renderToString` function,
18
+ * except that it does not render the elements to a string, but instead collects
19
+ * the values of all rich text `Content` elements.
20
+ */
21
+ function addValuesForElement( element, values, innerBlocks ) {
22
+ if ( null === element || undefined === element || false === element ) {
23
+ return;
24
+ }
25
+
26
+ if ( Array.isArray( element ) ) {
27
+ return addValuesForElements( element, values, innerBlocks );
28
+ }
29
+
30
+ switch ( typeof element ) {
31
+ case 'string':
32
+ case 'number':
33
+ return;
34
+ }
35
+
36
+ const { type, props } = element;
37
+
38
+ switch ( type ) {
39
+ case StrictMode:
40
+ case Fragment:
41
+ return addValuesForElements( props.children, values, innerBlocks );
42
+ case RawHTML:
43
+ return;
44
+ case InnerBlocks.Content:
45
+ return addValuesForBlocks( values, innerBlocks );
46
+ case Content:
47
+ values.push( props.value );
48
+ return;
49
+ }
50
+
51
+ switch ( typeof type ) {
52
+ case 'string':
53
+ if ( typeof props.children !== 'undefined' ) {
54
+ return addValuesForElements(
55
+ props.children,
56
+ values,
57
+ innerBlocks
58
+ );
59
+ }
60
+ return;
61
+ case 'function':
62
+ const el =
63
+ type.prototype && typeof type.prototype.render === 'function'
64
+ ? new type( props ).render()
65
+ : type( props );
66
+ return addValuesForElement( el, values, innerBlocks );
67
+ }
68
+ }
69
+
70
+ function addValuesForElements( children, ...args ) {
71
+ children = Array.isArray( children ) ? children : [ children ];
72
+
73
+ for ( let i = 0; i < children.length; i++ ) {
74
+ addValuesForElement( children[ i ], ...args );
75
+ }
76
+ }
77
+
78
+ function addValuesForBlocks( values, blocks ) {
79
+ for ( let i = 0; i < blocks.length; i++ ) {
80
+ const { name, attributes, innerBlocks } = blocks[ i ];
81
+ const saveElement = getSaveElement(
82
+ name,
83
+ attributes,
84
+ // Instead of letting save elements use `useInnerBlocksProps.save`,
85
+ // force them to use InnerBlocks.Content instead so we can intercept
86
+ // a single component.
87
+ <InnerBlocks.Content />
88
+ );
89
+ addValuesForElement( saveElement, values, innerBlocks );
90
+ }
91
+ }
92
+
93
+ export function getRichTextValues( blocks = [] ) {
94
+ getBlockProps.skipFilters = true;
95
+ const values = [];
96
+ addValuesForBlocks( values, blocks );
97
+ getBlockProps.skipFilters = false;
98
+ return values;
99
+ }
@@ -10,7 +10,7 @@ import useSetting from '../../use-setting';
10
10
 
11
11
  export default function useSpacingSizes() {
12
12
  const spacingSizes = [
13
- { name: 0, slug: '0', side: 0 },
13
+ { name: 0, slug: '0', size: 0 },
14
14
  ...( useSetting( 'spacing.spacingSizes' ) || [] ),
15
15
  ];
16
16
 
@@ -2,7 +2,12 @@
2
2
  * Internal dependencies
3
3
  */
4
4
  import SpacingInputControl from './spacing-input-control';
5
- import { LABELS, ICONS, hasAxisSupport } from '../utils';
5
+ import {
6
+ LABELS,
7
+ ICONS,
8
+ getPresetValueFromCustomValue,
9
+ hasAxisSupport,
10
+ } from '../utils';
6
11
 
7
12
  const groupedSides = [ 'vertical', 'horizontal' ];
8
13
 
@@ -20,7 +25,17 @@ export default function AxialInputControls( {
20
25
  if ( ! onChange ) {
21
26
  return;
22
27
  }
23
- const nextValues = { ...values };
28
+
29
+ // Encode the existing value into the preset value if the passed in value matches the value of one of the spacingSizes.
30
+ const nextValues = {
31
+ ...Object.keys( values ).reduce( ( acc, key ) => {
32
+ acc[ key ] = getPresetValueFromCustomValue(
33
+ values[ key ],
34
+ spacingSizes
35
+ );
36
+ return acc;
37
+ }, {} ),
38
+ };
24
39
 
25
40
  if ( side === 'vertical' ) {
26
41
  nextValues.top = next;
@@ -2,7 +2,12 @@
2
2
  * Internal dependencies
3
3
  */
4
4
  import SpacingInputControl from './spacing-input-control';
5
- import { ALL_SIDES, LABELS, ICONS } from '../utils';
5
+ import {
6
+ ALL_SIDES,
7
+ LABELS,
8
+ ICONS,
9
+ getPresetValueFromCustomValue,
10
+ } from '../utils';
6
11
 
7
12
  export default function SeparatedInputControls( {
8
13
  minimumCustomValue,
@@ -20,7 +25,17 @@ export default function SeparatedInputControls( {
20
25
  : ALL_SIDES;
21
26
 
22
27
  const createHandleOnChange = ( side ) => ( next ) => {
23
- const nextValues = { ...values };
28
+ // Encode the existing value into the preset value if the passed in value matches the value of one of the spacingSizes.
29
+ const nextValues = {
30
+ ...Object.keys( values ).reduce( ( acc, key ) => {
31
+ acc[ key ] = getPresetValueFromCustomValue(
32
+ values[ key ],
33
+ spacingSizes
34
+ );
35
+ return acc;
36
+ }, {} ),
37
+ };
38
+
24
39
  nextValues[ side ] = next;
25
40
 
26
41
  onChange( nextValues );
@@ -2,7 +2,7 @@
2
2
  * Internal dependencies
3
3
  */
4
4
  import SpacingInputControl from './spacing-input-control';
5
- import { LABELS } from '../utils';
5
+ import { LABELS, getPresetValueFromCustomValue } from '../utils';
6
6
 
7
7
  export default function SingleInputControl( {
8
8
  minimumCustomValue,
@@ -16,7 +16,17 @@ export default function SingleInputControl( {
16
16
  values,
17
17
  } ) {
18
18
  const createHandleOnChange = ( currentSide ) => ( next ) => {
19
- const nextValues = { ...values };
19
+ // Encode the existing value into the preset value if the passed in value matches the value of one of the spacingSizes.
20
+ const nextValues = {
21
+ ...Object.keys( values ).reduce( ( acc, key ) => {
22
+ acc[ key ] = getPresetValueFromCustomValue(
23
+ values[ key ],
24
+ spacingSizes
25
+ );
26
+ return acc;
27
+ }, {} ),
28
+ };
29
+
20
30
  nextValues[ currentSide ] = next;
21
31
 
22
32
  onChange( nextValues );
@@ -49,7 +49,15 @@ describe( 'getCustomValueFromPreset', () => {
49
49
  } );
50
50
 
51
51
  describe( 'getPresetValueFromCustomValue', () => {
52
- const spacingSizes = [ { name: 'Small', slug: 20, size: '8px' } ];
52
+ const spacingSizes = [
53
+ { name: 'Default', slug: 'default', size: undefined },
54
+ { name: 'Small', slug: 20, size: '8px' },
55
+ ];
56
+ it( 'should return undefined even if an undefined value exist in spacing sizes as occurs if spacingSizes has > 7 entries', () => {
57
+ expect( getPresetValueFromCustomValue( undefined, spacingSizes ) ).toBe(
58
+ undefined
59
+ );
60
+ } );
53
61
  it( 'should return original value if a string in spacing presets var format', () => {
54
62
  expect(
55
63
  getPresetValueFromCustomValue(
@@ -101,8 +101,8 @@ export function getCustomValueFromPreset( value, spacingSizes ) {
101
101
  * @return {string} The preset value if it can be found.
102
102
  */
103
103
  export function getPresetValueFromCustomValue( value, spacingSizes ) {
104
- // Return value as-is if it is already a preset;
105
- if ( isValueSpacingPreset( value ) ) {
104
+ // Return value as-is if it is undefined or is already a preset, or '0';
105
+ if ( ! value || isValueSpacingPreset( value ) || value === '0' ) {
106
106
  return value;
107
107
  }
108
108
 
@@ -0,0 +1,44 @@
1
+ # TextTransformControl
2
+
3
+ The `TextTransformControl` component is responsible for rendering a control element that allows users to select and apply text transformation options to blocks or elements in the Gutenberg editor. It provides an intuitive interface for changing the text appearance by applying different transformations such as `none`, `uppercase`, `lowercase`, `capitalize`.
4
+
5
+ ![TextTransformConrol Element in Inspector Control](https://raw.githubusercontent.com/WordPress/gutenberg/HEAD/docs/assets/text-transform-component.png?raw=true)
6
+
7
+ ## Table of contents
8
+
9
+ 1. [Development guidelines](#development-guidelines)
10
+
11
+ ## Development guidelines
12
+
13
+ ### Usage
14
+
15
+ Renders the Text Transform Component with `none`, `uppercase`, `lowercase`, `capitalize` options.
16
+
17
+ ```jsx
18
+ import { TextTransformControl } from '@wordpress/block-editor';
19
+
20
+ const MyTextTransformControlComponent = () => (
21
+ <TextTransformControl
22
+ value={ textTransform }
23
+ onChange={ ( value ) => {
24
+ setAttributes( { textTransform: value } );
25
+ } }
26
+ />
27
+ );
28
+ ```
29
+
30
+ ### Props
31
+
32
+ ### `value`
33
+
34
+ - **Type:** `String`
35
+ - **Default:** `none`
36
+ - **Options:** `none`, `uppercase`, `lowercase`, `capitalize`
37
+
38
+ The current value of the Text Transform setting. You may only choose from the `Options` listed above.
39
+
40
+ ### `onChange`
41
+
42
+ - **Type:** `Function`
43
+
44
+ A callback function invoked when the Text Transform value is changed via an interaction with any of the buttons. Called with the Text Transform value (`none`, `uppercase`, `lowercase`, `capitalize`) as the only argument.
@@ -67,8 +67,11 @@ export default function useBlockDisplayInformation( clientId ) {
67
67
  return useSelect(
68
68
  ( select ) => {
69
69
  if ( ! clientId ) return null;
70
- const { getBlockName, getBlockAttributes } =
71
- select( blockEditorStore );
70
+ const {
71
+ getBlockName,
72
+ getBlockAttributes,
73
+ __experimentalGetReusableBlockTitle,
74
+ } = select( blockEditorStore );
72
75
  const { getBlockType, getActiveBlockVariation } =
73
76
  select( blocksStore );
74
77
  const blockName = getBlockName( clientId );
@@ -76,12 +79,16 @@ export default function useBlockDisplayInformation( clientId ) {
76
79
  if ( ! blockType ) return null;
77
80
  const attributes = getBlockAttributes( clientId );
78
81
  const match = getActiveBlockVariation( blockName, attributes );
79
- const isSynced =
80
- isReusableBlock( blockType ) || isTemplatePart( blockType );
82
+ const isReusable = isReusableBlock( blockType );
83
+ const resusableTitle = isReusable
84
+ ? __experimentalGetReusableBlockTitle( attributes.ref )
85
+ : undefined;
86
+ const title = resusableTitle || blockType.title;
87
+ const isSynced = isReusable || isTemplatePart( blockType );
81
88
  const positionLabel = getPositionTypeLabel( attributes );
82
89
  const blockTypeInfo = {
83
90
  isSynced,
84
- title: blockType.title,
91
+ title,
85
92
  icon: blockType.icon,
86
93
  description: blockType.description,
87
94
  anchor: attributes?.anchor,
@@ -1,14 +1,17 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { useSharedValue } from 'react-native-reanimated';
4
+ import {
5
+ runOnJS,
6
+ useDerivedValue,
7
+ useSharedValue,
8
+ } from 'react-native-reanimated';
5
9
 
6
10
  /**
7
11
  * WordPress dependencies
8
12
  */
9
13
  import { useSelect } from '@wordpress/data';
10
14
  import { useCallback } from '@wordpress/element';
11
- import { useThrottle } from '@wordpress/compose';
12
15
 
13
16
  /**
14
17
  * Internal dependencies
@@ -18,6 +21,8 @@ import { useBlockListContext } from '../block-list/block-list-context';
18
21
  import { getDistanceToNearestEdge } from '../../utils/math';
19
22
  import useOnBlockDrop from '../use-on-block-drop';
20
23
 
24
+ const UPDATE_TARGET_BLOCK_INDEX_THRESHOLD = 20; // In pixels
25
+
21
26
  /** @typedef {import('../../utils/math').WPPoint} WPPoint */
22
27
 
23
28
  /**
@@ -111,6 +116,14 @@ export default function useBlockDropZone( {
111
116
  rootClientId: targetRootClientId = '',
112
117
  } = {} ) {
113
118
  const targetBlockIndex = useSharedValue( null );
119
+ const dragPosition = {
120
+ x: useSharedValue( 0 ),
121
+ y: useSharedValue( 0 ),
122
+ };
123
+ const prevDragPosition = {
124
+ x: useSharedValue( 0 ),
125
+ y: useSharedValue( 0 ),
126
+ };
114
127
 
115
128
  const { getBlockListSettings, getSettings } = useSelect( blockEditorStore );
116
129
  const { blocksLayouts, getBlockLayoutsOrderedByYCoord } =
@@ -118,43 +131,67 @@ export default function useBlockDropZone( {
118
131
 
119
132
  const getSortedBlocksLayouts = useCallback( () => {
120
133
  return getBlockLayoutsOrderedByYCoord( blocksLayouts.current );
134
+ // We use the value of `blocksLayouts` as the dependency.
135
+ // eslint-disable-next-line react-hooks/exhaustive-deps
121
136
  }, [ blocksLayouts.current ] );
122
137
 
123
138
  const isRTL = getSettings().isRTL;
124
139
 
125
140
  const onBlockDrop = useOnBlockDrop();
126
141
 
127
- const throttled = useThrottle(
128
- useCallback(
129
- ( event ) => {
130
- const sortedBlockLayouts = getSortedBlocksLayouts();
131
-
132
- const targetIndex = getNearestBlockIndex(
133
- sortedBlockLayouts,
134
- { x: event.x, y: event.y },
135
- getBlockListSettings( targetRootClientId )?.orientation,
136
- isRTL
137
- );
138
- if ( targetIndex !== null ) {
139
- targetBlockIndex.value = targetIndex ?? 0;
140
- }
141
- },
142
- [
143
- getSortedBlocksLayouts,
144
- getNearestBlockIndex,
145
- getBlockListSettings,
146
- targetBlockIndex,
147
- ]
148
- ),
149
- 200
142
+ const updateTargetBlockIndex = useCallback(
143
+ ( event ) => {
144
+ const sortedBlockLayouts = getSortedBlocksLayouts();
145
+
146
+ const targetIndex = getNearestBlockIndex(
147
+ sortedBlockLayouts,
148
+ { x: event.x, y: event.y },
149
+ getBlockListSettings( targetRootClientId )?.orientation,
150
+ isRTL
151
+ );
152
+ if ( targetIndex !== null ) {
153
+ targetBlockIndex.value = targetIndex ?? 0;
154
+ }
155
+ },
156
+ [
157
+ getSortedBlocksLayouts,
158
+ getBlockListSettings,
159
+ targetRootClientId,
160
+ isRTL,
161
+ targetBlockIndex,
162
+ ]
150
163
  );
151
164
 
165
+ useDerivedValue( () => {
166
+ const x = dragPosition.x.value;
167
+ const y = dragPosition.y.value;
168
+ const prevX = prevDragPosition.x.value;
169
+ const prevY = prevDragPosition.y.value;
170
+ // `updateTargetBlockIndex` performs expensive calculations, so we throttle
171
+ // the call using a offset threshold based on the dragging position.
172
+ if (
173
+ Math.abs( x - prevX ) >= UPDATE_TARGET_BLOCK_INDEX_THRESHOLD ||
174
+ Math.abs( y - prevY ) >= UPDATE_TARGET_BLOCK_INDEX_THRESHOLD
175
+ ) {
176
+ runOnJS( updateTargetBlockIndex )( { x, y } );
177
+ prevDragPosition.x.value = x;
178
+ prevDragPosition.y.value = y;
179
+ return true;
180
+ }
181
+ return false;
182
+ } );
183
+
152
184
  return {
153
- onBlockDragOver( event ) {
154
- throttled( event );
185
+ onBlockDragOver( { x, y } ) {
186
+ dragPosition.x.value = x;
187
+ dragPosition.y.value = y;
188
+ },
189
+ onBlockDragOverWorklet( { x, y } ) {
190
+ 'worklet';
191
+ dragPosition.x.value = x;
192
+ dragPosition.y.value = y;
155
193
  },
156
194
  onBlockDragEnd() {
157
- throttled.cancel();
158
195
  targetBlockIndex.value = null;
159
196
  },
160
197
  onBlockDrop: ( event ) => {