@wordpress/block-editor 10.3.0 → 10.5.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 (460) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +0 -1
  3. package/build/components/alignment-control/ui.js +1 -1
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-alignment-control/constants.js +1 -1
  6. package/build/components/block-alignment-control/constants.js.map +1 -1
  7. package/build/components/block-alignment-matrix-control/index.js +1 -1
  8. package/build/components/block-alignment-matrix-control/index.js.map +1 -1
  9. package/build/components/block-compare/index.js +1 -3
  10. package/build/components/block-compare/index.js.map +1 -1
  11. package/build/components/block-edit/index.js +4 -2
  12. package/build/components/block-edit/index.js.map +1 -1
  13. package/build/components/block-list/block.js +3 -1
  14. package/build/components/block-list/block.js.map +1 -1
  15. package/build/components/block-lock/menu-item.js +1 -1
  16. package/build/components/block-lock/menu-item.js.map +1 -1
  17. package/build/components/block-lock/modal.js +16 -9
  18. package/build/components/block-lock/modal.js.map +1 -1
  19. package/build/components/block-popover/inbetween.js +2 -1
  20. package/build/components/block-popover/inbetween.js.map +1 -1
  21. package/build/components/block-popover/index.js +2 -1
  22. package/build/components/block-popover/index.js.map +1 -1
  23. package/build/components/block-preview/index.js +2 -4
  24. package/build/components/block-preview/index.js.map +1 -1
  25. package/build/components/block-settings-menu/block-settings-dropdown.js +2 -8
  26. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  27. package/build/components/block-styles/utils.js +3 -3
  28. package/build/components/block-styles/utils.js.map +1 -1
  29. package/build/components/block-switcher/index.js +21 -12
  30. package/build/components/block-switcher/index.js.map +1 -1
  31. package/build/components/block-switcher/preview-block-popover.js +1 -1
  32. package/build/components/block-switcher/preview-block-popover.js.map +1 -1
  33. package/build/components/block-tools/insertion-point.js +12 -2
  34. package/build/components/block-tools/insertion-point.js.map +1 -1
  35. package/build/components/block-tools/selected-block-popover.js +27 -4
  36. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  37. package/build/components/block-vertical-alignment-control/ui.js +1 -1
  38. package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
  39. package/build/components/border-radius-control/all-input-control.js +2 -1
  40. package/build/components/border-radius-control/all-input-control.js.map +1 -1
  41. package/build/components/border-radius-control/index.js +2 -1
  42. package/build/components/border-radius-control/index.js.map +1 -1
  43. package/build/components/border-radius-control/input-controls.js +2 -1
  44. package/build/components/border-radius-control/input-controls.js.map +1 -1
  45. package/build/components/colors/with-colors.js +4 -3
  46. package/build/components/colors/with-colors.js.map +1 -1
  47. package/build/components/duotone-control/index.js +1 -1
  48. package/build/components/duotone-control/index.js.map +1 -1
  49. package/build/components/font-sizes/fluid-utils.js +24 -40
  50. package/build/components/font-sizes/fluid-utils.js.map +1 -1
  51. package/build/components/font-sizes/with-font-sizes.js +8 -6
  52. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  53. package/build/components/iframe/index.js +1 -1
  54. package/build/components/iframe/index.js.map +1 -1
  55. package/build/components/image-editor/constants.js +1 -1
  56. package/build/components/image-editor/constants.js.map +1 -1
  57. package/build/components/index.js +9 -0
  58. package/build/components/index.js.map +1 -1
  59. package/build/components/inner-blocks/index.js +10 -4
  60. package/build/components/inner-blocks/index.js.map +1 -1
  61. package/build/components/inserter/hooks/use-insertion-point.js +2 -7
  62. package/build/components/inserter/hooks/use-insertion-point.js.map +1 -1
  63. package/build/components/inserter/reusable-blocks-tab.js +4 -1
  64. package/build/components/inserter/reusable-blocks-tab.js.map +1 -1
  65. package/build/components/inserter/search-items.js +23 -2
  66. package/build/components/inserter/search-items.js.map +1 -1
  67. package/build/components/line-height-control/index.js +2 -1
  68. package/build/components/line-height-control/index.js.map +1 -1
  69. package/build/components/link-control/index.js +18 -34
  70. package/build/components/link-control/index.js.map +1 -1
  71. package/build/components/link-control/search-input.js +1 -1
  72. package/build/components/link-control/search-input.js.map +1 -1
  73. package/build/components/link-control/use-internal-input-value.js +26 -0
  74. package/build/components/link-control/use-internal-input-value.js.map +1 -0
  75. package/build/components/list-view/block.js +5 -3
  76. package/build/components/list-view/block.js.map +1 -1
  77. package/build/components/list-view/branch.js +9 -3
  78. package/build/components/list-view/branch.js.map +1 -1
  79. package/build/components/list-view/drop-indicator.js +2 -1
  80. package/build/components/list-view/drop-indicator.js.map +1 -1
  81. package/build/components/media-replace-flow/index.js +1 -1
  82. package/build/components/media-replace-flow/index.js.map +1 -1
  83. package/build/components/off-canvas-editor/block-contents.js +100 -0
  84. package/build/components/off-canvas-editor/block-contents.js.map +1 -0
  85. package/build/components/off-canvas-editor/block-select-button.js +119 -0
  86. package/build/components/off-canvas-editor/block-select-button.js.map +1 -0
  87. package/build/components/off-canvas-editor/block.js +292 -0
  88. package/build/components/off-canvas-editor/block.js.map +1 -0
  89. package/build/components/off-canvas-editor/branch.js +181 -0
  90. package/build/components/off-canvas-editor/branch.js.map +1 -0
  91. package/build/components/off-canvas-editor/context.js +19 -0
  92. package/build/components/off-canvas-editor/context.js.map +1 -0
  93. package/build/components/off-canvas-editor/drop-indicator.js +118 -0
  94. package/build/components/off-canvas-editor/drop-indicator.js.map +1 -0
  95. package/build/components/off-canvas-editor/expander.js +41 -0
  96. package/build/components/off-canvas-editor/expander.js.map +1 -0
  97. package/build/components/off-canvas-editor/index.js +204 -0
  98. package/build/components/off-canvas-editor/index.js.map +1 -0
  99. package/build/components/off-canvas-editor/leaf.js +60 -0
  100. package/build/components/off-canvas-editor/leaf.js.map +1 -0
  101. package/build/components/off-canvas-editor/use-block-selection.js +139 -0
  102. package/build/components/off-canvas-editor/use-block-selection.js.map +1 -0
  103. package/build/components/off-canvas-editor/use-list-view-client-ids.js +33 -0
  104. package/build/components/off-canvas-editor/use-list-view-client-ids.js.map +1 -0
  105. package/build/components/off-canvas-editor/use-list-view-drop-zone.js +235 -0
  106. package/build/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -0
  107. package/build/components/off-canvas-editor/use-list-view-expand-selected-item.js +60 -0
  108. package/build/components/off-canvas-editor/use-list-view-expand-selected-item.js.map +1 -0
  109. package/build/components/off-canvas-editor/utils.js +60 -0
  110. package/build/components/off-canvas-editor/utils.js.map +1 -0
  111. package/build/components/rich-text/format-toolbar/index.js +1 -1
  112. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  113. package/build/components/rich-text/format-toolbar-container.js +1 -1
  114. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  115. package/build/components/rich-text/use-paste-handler.js +1 -1
  116. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  117. package/build/components/spacing-sizes-control/all-input-control.js +6 -2
  118. package/build/components/spacing-sizes-control/all-input-control.js.map +1 -1
  119. package/build/components/spacing-sizes-control/axial-input-controls.js +6 -2
  120. package/build/components/spacing-sizes-control/axial-input-controls.js.map +1 -1
  121. package/build/components/spacing-sizes-control/index.js +6 -2
  122. package/build/components/spacing-sizes-control/index.js.map +1 -1
  123. package/build/components/spacing-sizes-control/input-controls.js +6 -2
  124. package/build/components/spacing-sizes-control/input-controls.js.map +1 -1
  125. package/build/components/spacing-sizes-control/spacing-input-control.js +12 -5
  126. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  127. package/build/components/url-input/index.js +1 -1
  128. package/build/components/url-input/index.js.map +1 -1
  129. package/build/components/url-popover/index.js +31 -2
  130. package/build/components/url-popover/index.js.map +1 -1
  131. package/build/components/use-setting/index.js +1 -1
  132. package/build/components/use-setting/index.js.map +1 -1
  133. package/build/hooks/border.js +1 -0
  134. package/build/hooks/border.js.map +1 -1
  135. package/build/hooks/color-panel.js +17 -1
  136. package/build/hooks/color-panel.js.map +1 -1
  137. package/build/hooks/color.js +1 -1
  138. package/build/hooks/color.js.map +1 -1
  139. package/build/hooks/content-lock-ui.js +13 -6
  140. package/build/hooks/content-lock-ui.js.map +1 -1
  141. package/build/hooks/dimensions.js +72 -13
  142. package/build/hooks/dimensions.js.map +1 -1
  143. package/build/hooks/font-size.js +1 -0
  144. package/build/hooks/font-size.js.map +1 -1
  145. package/build/hooks/layout.js +5 -4
  146. package/build/hooks/layout.js.map +1 -1
  147. package/build/hooks/margin.js +26 -18
  148. package/build/hooks/margin.js.map +1 -1
  149. package/build/hooks/min-height.js +145 -0
  150. package/build/hooks/min-height.js.map +1 -0
  151. package/build/hooks/padding.js +22 -13
  152. package/build/hooks/padding.js.map +1 -1
  153. package/build/hooks/style.js +3 -2
  154. package/build/hooks/style.js.map +1 -1
  155. package/build/hooks/utils.js +7 -6
  156. package/build/hooks/utils.js.map +1 -1
  157. package/build/layouts/constrained.js +0 -1
  158. package/build/layouts/constrained.js.map +1 -1
  159. package/build/layouts/flex.js +23 -22
  160. package/build/layouts/flex.js.map +1 -1
  161. package/build/store/actions.js +30 -0
  162. package/build/store/actions.js.map +1 -1
  163. package/build/store/array.js +1 -7
  164. package/build/store/array.js.map +1 -1
  165. package/build/store/reducer.js +46 -14
  166. package/build/store/reducer.js.map +1 -1
  167. package/build/store/selectors.js +62 -31
  168. package/build/store/selectors.js.map +1 -1
  169. package/build-module/components/alignment-control/ui.js +1 -1
  170. package/build-module/components/alignment-control/ui.js.map +1 -1
  171. package/build-module/components/block-alignment-control/constants.js +1 -1
  172. package/build-module/components/block-alignment-control/constants.js.map +1 -1
  173. package/build-module/components/block-alignment-matrix-control/index.js +1 -1
  174. package/build-module/components/block-alignment-matrix-control/index.js.map +1 -1
  175. package/build-module/components/block-compare/index.js +2 -3
  176. package/build-module/components/block-compare/index.js.map +1 -1
  177. package/build-module/components/block-edit/index.js +4 -2
  178. package/build-module/components/block-edit/index.js.map +1 -1
  179. package/build-module/components/block-list/block.js +3 -1
  180. package/build-module/components/block-list/block.js.map +1 -1
  181. package/build-module/components/block-lock/menu-item.js +2 -2
  182. package/build-module/components/block-lock/menu-item.js.map +1 -1
  183. package/build-module/components/block-lock/modal.js +17 -10
  184. package/build-module/components/block-lock/modal.js.map +1 -1
  185. package/build-module/components/block-popover/inbetween.js +2 -1
  186. package/build-module/components/block-popover/inbetween.js.map +1 -1
  187. package/build-module/components/block-popover/index.js +2 -1
  188. package/build-module/components/block-popover/index.js.map +1 -1
  189. package/build-module/components/block-preview/index.js +2 -3
  190. package/build-module/components/block-preview/index.js.map +1 -1
  191. package/build-module/components/block-settings-menu/block-settings-dropdown.js +2 -7
  192. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  193. package/build-module/components/block-styles/utils.js +3 -3
  194. package/build-module/components/block-styles/utils.js.map +1 -1
  195. package/build-module/components/block-switcher/index.js +21 -11
  196. package/build-module/components/block-switcher/index.js.map +1 -1
  197. package/build-module/components/block-switcher/preview-block-popover.js +1 -1
  198. package/build-module/components/block-switcher/preview-block-popover.js.map +1 -1
  199. package/build-module/components/block-tools/insertion-point.js +12 -2
  200. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  201. package/build-module/components/block-tools/selected-block-popover.js +27 -5
  202. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  203. package/build-module/components/block-vertical-alignment-control/ui.js +1 -1
  204. package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
  205. package/build-module/components/border-radius-control/all-input-control.js +2 -1
  206. package/build-module/components/border-radius-control/all-input-control.js.map +1 -1
  207. package/build-module/components/border-radius-control/index.js +2 -1
  208. package/build-module/components/border-radius-control/index.js.map +1 -1
  209. package/build-module/components/border-radius-control/input-controls.js +2 -1
  210. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  211. package/build-module/components/colors/with-colors.js +5 -4
  212. package/build-module/components/colors/with-colors.js.map +1 -1
  213. package/build-module/components/duotone-control/index.js +1 -1
  214. package/build-module/components/duotone-control/index.js.map +1 -1
  215. package/build-module/components/font-sizes/fluid-utils.js +24 -40
  216. package/build-module/components/font-sizes/fluid-utils.js.map +1 -1
  217. package/build-module/components/font-sizes/with-font-sizes.js +9 -7
  218. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  219. package/build-module/components/iframe/index.js +1 -1
  220. package/build-module/components/iframe/index.js.map +1 -1
  221. package/build-module/components/image-editor/constants.js +1 -1
  222. package/build-module/components/image-editor/constants.js.map +1 -1
  223. package/build-module/components/index.js +1 -0
  224. package/build-module/components/index.js.map +1 -1
  225. package/build-module/components/inner-blocks/index.js +10 -4
  226. package/build-module/components/inner-blocks/index.js.map +1 -1
  227. package/build-module/components/inserter/hooks/use-insertion-point.js +2 -6
  228. package/build-module/components/inserter/hooks/use-insertion-point.js.map +1 -1
  229. package/build-module/components/inserter/reusable-blocks-tab.js +3 -1
  230. package/build-module/components/inserter/reusable-blocks-tab.js.map +1 -1
  231. package/build-module/components/inserter/search-items.js +23 -3
  232. package/build-module/components/inserter/search-items.js.map +1 -1
  233. package/build-module/components/line-height-control/index.js +2 -1
  234. package/build-module/components/line-height-control/index.js.map +1 -1
  235. package/build-module/components/link-control/index.js +17 -34
  236. package/build-module/components/link-control/index.js.map +1 -1
  237. package/build-module/components/link-control/search-input.js +1 -1
  238. package/build-module/components/link-control/search-input.js.map +1 -1
  239. package/build-module/components/link-control/use-internal-input-value.js +18 -0
  240. package/build-module/components/link-control/use-internal-input-value.js.map +1 -0
  241. package/build-module/components/list-view/block.js +5 -3
  242. package/build-module/components/list-view/block.js.map +1 -1
  243. package/build-module/components/list-view/branch.js +9 -3
  244. package/build-module/components/list-view/branch.js.map +1 -1
  245. package/build-module/components/list-view/drop-indicator.js +2 -1
  246. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  247. package/build-module/components/media-replace-flow/index.js +1 -1
  248. package/build-module/components/media-replace-flow/index.js.map +1 -1
  249. package/build-module/components/off-canvas-editor/block-contents.js +85 -0
  250. package/build-module/components/off-canvas-editor/block-contents.js.map +1 -0
  251. package/build-module/components/off-canvas-editor/block-select-button.js +101 -0
  252. package/build-module/components/off-canvas-editor/block-select-button.js.map +1 -0
  253. package/build-module/components/off-canvas-editor/block.js +268 -0
  254. package/build-module/components/off-canvas-editor/block.js.map +1 -0
  255. package/build-module/components/off-canvas-editor/branch.js +165 -0
  256. package/build-module/components/off-canvas-editor/branch.js.map +1 -0
  257. package/build-module/components/off-canvas-editor/context.js +7 -0
  258. package/build-module/components/off-canvas-editor/context.js.map +1 -0
  259. package/build-module/components/off-canvas-editor/drop-indicator.js +111 -0
  260. package/build-module/components/off-canvas-editor/drop-indicator.js.map +1 -0
  261. package/build-module/components/off-canvas-editor/expander.js +32 -0
  262. package/build-module/components/off-canvas-editor/expander.js.map +1 -0
  263. package/build-module/components/off-canvas-editor/index.js +181 -0
  264. package/build-module/components/off-canvas-editor/index.js.map +1 -0
  265. package/build-module/components/off-canvas-editor/leaf.js +45 -0
  266. package/build-module/components/off-canvas-editor/leaf.js.map +1 -0
  267. package/build-module/components/off-canvas-editor/use-block-selection.js +124 -0
  268. package/build-module/components/off-canvas-editor/use-block-selection.js.map +1 -0
  269. package/build-module/components/off-canvas-editor/use-list-view-client-ids.js +24 -0
  270. package/build-module/components/off-canvas-editor/use-list-view-client-ids.js.map +1 -0
  271. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js +220 -0
  272. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -0
  273. package/build-module/components/off-canvas-editor/use-list-view-expand-selected-item.js +50 -0
  274. package/build-module/components/off-canvas-editor/use-list-view-expand-selected-item.js.map +1 -0
  275. package/build-module/components/off-canvas-editor/utils.js +44 -0
  276. package/build-module/components/off-canvas-editor/utils.js.map +1 -0
  277. package/build-module/components/rich-text/format-toolbar/index.js +1 -1
  278. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  279. package/build-module/components/rich-text/format-toolbar-container.js +1 -1
  280. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  281. package/build-module/components/rich-text/use-paste-handler.js +1 -1
  282. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  283. package/build-module/components/spacing-sizes-control/all-input-control.js +6 -2
  284. package/build-module/components/spacing-sizes-control/all-input-control.js.map +1 -1
  285. package/build-module/components/spacing-sizes-control/axial-input-controls.js +6 -2
  286. package/build-module/components/spacing-sizes-control/axial-input-controls.js.map +1 -1
  287. package/build-module/components/spacing-sizes-control/index.js +6 -2
  288. package/build-module/components/spacing-sizes-control/index.js.map +1 -1
  289. package/build-module/components/spacing-sizes-control/input-controls.js +6 -2
  290. package/build-module/components/spacing-sizes-control/input-controls.js.map +1 -1
  291. package/build-module/components/spacing-sizes-control/spacing-input-control.js +12 -5
  292. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  293. package/build-module/components/url-input/index.js +1 -1
  294. package/build-module/components/url-input/index.js.map +1 -1
  295. package/build-module/components/url-popover/index.js +30 -3
  296. package/build-module/components/url-popover/index.js.map +1 -1
  297. package/build-module/components/use-setting/index.js +1 -1
  298. package/build-module/components/use-setting/index.js.map +1 -1
  299. package/build-module/hooks/border.js +1 -0
  300. package/build-module/hooks/border.js.map +1 -1
  301. package/build-module/hooks/color-panel.js +17 -1
  302. package/build-module/hooks/color-panel.js.map +1 -1
  303. package/build-module/hooks/color.js +1 -1
  304. package/build-module/hooks/color.js.map +1 -1
  305. package/build-module/hooks/content-lock-ui.js +15 -8
  306. package/build-module/hooks/content-lock-ui.js.map +1 -1
  307. package/build-module/hooks/dimensions.js +67 -12
  308. package/build-module/hooks/dimensions.js.map +1 -1
  309. package/build-module/hooks/font-size.js +1 -0
  310. package/build-module/hooks/font-size.js.map +1 -1
  311. package/build-module/hooks/layout.js +6 -5
  312. package/build-module/hooks/layout.js.map +1 -1
  313. package/build-module/hooks/margin.js +27 -19
  314. package/build-module/hooks/margin.js.map +1 -1
  315. package/build-module/hooks/min-height.js +122 -0
  316. package/build-module/hooks/min-height.js.map +1 -0
  317. package/build-module/hooks/padding.js +23 -14
  318. package/build-module/hooks/padding.js.map +1 -1
  319. package/build-module/hooks/style.js +4 -3
  320. package/build-module/hooks/style.js.map +1 -1
  321. package/build-module/hooks/utils.js +7 -7
  322. package/build-module/hooks/utils.js.map +1 -1
  323. package/build-module/layouts/constrained.js +0 -1
  324. package/build-module/layouts/constrained.js.map +1 -1
  325. package/build-module/layouts/flex.js +24 -23
  326. package/build-module/layouts/flex.js.map +1 -1
  327. package/build-module/store/actions.js +26 -0
  328. package/build-module/store/actions.js.map +1 -1
  329. package/build-module/store/array.js +1 -6
  330. package/build-module/store/array.js.map +1 -1
  331. package/build-module/store/reducer.js +44 -14
  332. package/build-module/store/reducer.js.map +1 -1
  333. package/build-module/store/selectors.js +59 -31
  334. package/build-module/store/selectors.js.map +1 -1
  335. package/build-style/style-rtl.css +88 -88
  336. package/build-style/style.css +84 -84
  337. package/package.json +29 -28
  338. package/src/components/alignment-control/README.md +1 -1
  339. package/src/components/alignment-control/ui.js +1 -1
  340. package/src/components/block-alignment-control/constants.js +1 -1
  341. package/src/components/block-alignment-control/test/index.native.js +4 -4
  342. package/src/components/block-alignment-matrix-control/index.js +1 -1
  343. package/src/components/block-breadcrumb/test/__snapshots__/index.js.snap +13 -11
  344. package/src/components/block-breadcrumb/test/index.js +1 -1
  345. package/src/components/block-compare/index.js +3 -2
  346. package/src/components/block-draggable/test/helpers.native.js +3 -3
  347. package/src/components/block-draggable/test/index.native.js +27 -27
  348. package/src/components/block-edit/index.js +2 -1
  349. package/src/components/block-list/block.js +2 -0
  350. package/src/components/block-list/style.scss +11 -6
  351. package/src/components/block-lock/menu-item.js +5 -2
  352. package/src/components/block-lock/modal.js +19 -36
  353. package/src/components/block-lock/style.scss +8 -17
  354. package/src/components/block-mover/stories/index.js +1 -1
  355. package/src/components/block-mover/style.scss +35 -1
  356. package/src/components/block-popover/inbetween.js +1 -0
  357. package/src/components/block-popover/index.js +1 -0
  358. package/src/components/block-popover/style.scss +1 -5
  359. package/src/components/block-preview/index.js +8 -3
  360. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -7
  361. package/src/components/block-styles/utils.js +3 -3
  362. package/src/components/block-switcher/index.js +21 -11
  363. package/src/components/block-switcher/preview-block-popover.js +1 -1
  364. package/src/components/block-tools/insertion-point.js +10 -1
  365. package/src/components/block-tools/selected-block-popover.js +80 -34
  366. package/src/components/block-tools/style.scss +15 -0
  367. package/src/components/block-variation-picker/README.md +1 -1
  368. package/src/components/block-vertical-alignment-control/ui.js +1 -1
  369. package/src/components/border-radius-control/all-input-control.js +1 -0
  370. package/src/components/border-radius-control/index.js +1 -0
  371. package/src/components/border-radius-control/input-controls.js +1 -0
  372. package/src/components/border-radius-control/style.scss +15 -24
  373. package/src/components/color-palette/test/__snapshots__/control.js.snap +85 -83
  374. package/src/components/color-palette/test/control.js +1 -1
  375. package/src/components/colors/with-colors.js +13 -23
  376. package/src/components/default-block-appender/style.scss +1 -0
  377. package/src/components/duotone-control/index.js +1 -1
  378. package/src/components/font-sizes/fluid-utils.js +37 -64
  379. package/src/components/font-sizes/test/fluid-utils.js +5 -5
  380. package/src/components/font-sizes/with-font-sizes.js +15 -13
  381. package/src/components/iframe/index.js +1 -1
  382. package/src/components/image-editor/constants.js +1 -1
  383. package/src/components/index.js +1 -0
  384. package/src/components/inner-blocks/index.js +11 -4
  385. package/src/components/inner-blocks/test/index.js +4 -0
  386. package/src/components/inserter/hooks/use-insertion-point.js +3 -11
  387. package/src/components/inserter/reusable-blocks-tab.js +4 -2
  388. package/src/components/inserter/search-items.js +23 -3
  389. package/src/components/inserter/style.scss +8 -7
  390. package/src/components/inserter/test/reusable-blocks-tab.js +14 -57
  391. package/src/components/inserter/test/search-items.js +6 -0
  392. package/src/components/inserter-list-item/style.scss +2 -0
  393. package/src/components/letter-spacing-control/README.md +55 -0
  394. package/src/components/line-height-control/index.js +1 -0
  395. package/src/components/link-control/README.md +3 -3
  396. package/src/components/link-control/index.js +23 -39
  397. package/src/components/link-control/search-input.js +1 -1
  398. package/src/components/link-control/test/index.js +272 -241
  399. package/src/components/link-control/use-internal-input-value.js +22 -0
  400. package/src/components/list-view/block.js +4 -3
  401. package/src/components/list-view/branch.js +11 -6
  402. package/src/components/list-view/drop-indicator.js +1 -0
  403. package/src/components/list-view/style.scss +1 -36
  404. package/src/components/media-replace-flow/index.js +1 -1
  405. package/src/components/media-replace-flow/test/index.js +69 -51
  406. package/src/components/off-canvas-editor/README.md +5 -0
  407. package/src/components/off-canvas-editor/block-contents.js +89 -0
  408. package/src/components/off-canvas-editor/block-select-button.js +113 -0
  409. package/src/components/off-canvas-editor/block.js +335 -0
  410. package/src/components/off-canvas-editor/branch.js +210 -0
  411. package/src/components/off-canvas-editor/context.js +8 -0
  412. package/src/components/off-canvas-editor/drop-indicator.js +126 -0
  413. package/src/components/off-canvas-editor/expander.js +26 -0
  414. package/src/components/off-canvas-editor/index.js +216 -0
  415. package/src/components/off-canvas-editor/leaf.js +48 -0
  416. package/src/components/off-canvas-editor/style.scss +397 -0
  417. package/src/components/off-canvas-editor/test/utils.js +50 -0
  418. package/src/components/off-canvas-editor/use-block-selection.js +169 -0
  419. package/src/components/off-canvas-editor/use-list-view-client-ids.js +29 -0
  420. package/src/components/off-canvas-editor/use-list-view-drop-zone.js +260 -0
  421. package/src/components/off-canvas-editor/use-list-view-expand-selected-item.js +58 -0
  422. package/src/components/off-canvas-editor/utils.js +58 -0
  423. package/src/components/responsive-block-control/test/index.js +69 -92
  424. package/src/components/rich-text/format-toolbar/index.js +1 -1
  425. package/src/components/rich-text/format-toolbar-container.js +1 -1
  426. package/src/components/rich-text/use-paste-handler.js +1 -1
  427. package/src/components/spacing-sizes-control/all-input-control.js +4 -0
  428. package/src/components/spacing-sizes-control/axial-input-controls.js +4 -0
  429. package/src/components/spacing-sizes-control/index.js +4 -0
  430. package/src/components/spacing-sizes-control/input-controls.js +4 -0
  431. package/src/components/spacing-sizes-control/spacing-input-control.js +10 -1
  432. package/src/components/spacing-sizes-control/style.scss +1 -0
  433. package/src/components/url-input/index.js +1 -1
  434. package/src/components/url-popover/README.md +12 -3
  435. package/src/components/url-popover/index.js +33 -3
  436. package/src/components/use-setting/index.js +7 -1
  437. package/src/hooks/border.js +1 -0
  438. package/src/hooks/color-panel.js +13 -1
  439. package/src/hooks/color.js +2 -0
  440. package/src/hooks/content-lock-ui.js +46 -34
  441. package/src/hooks/dimensions.js +106 -19
  442. package/src/hooks/font-size.js +1 -0
  443. package/src/hooks/layout.js +8 -11
  444. package/src/hooks/margin.js +23 -17
  445. package/src/hooks/min-height.js +121 -0
  446. package/src/hooks/padding.js +23 -19
  447. package/src/hooks/style.js +10 -2
  448. package/src/hooks/test/align.js +96 -72
  449. package/src/hooks/test/style.js +4 -0
  450. package/src/hooks/test/use-typography-props.js +1 -1
  451. package/src/hooks/utils.js +5 -6
  452. package/src/layouts/constrained.js +0 -1
  453. package/src/layouts/flex.js +44 -39
  454. package/src/store/actions.js +26 -0
  455. package/src/store/array.js +1 -6
  456. package/src/store/reducer.js +50 -40
  457. package/src/store/selectors.js +43 -29
  458. package/src/store/test/actions.js +18 -0
  459. package/src/store/test/reducer.js +40 -0
  460. package/src/store/test/selectors.js +20 -1
@@ -0,0 +1,335 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import classnames from 'classnames';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { hasBlockSupport } from '@wordpress/blocks';
10
+ import {
11
+ __experimentalTreeGridCell as TreeGridCell,
12
+ __experimentalTreeGridItem as TreeGridItem,
13
+ } from '@wordpress/components';
14
+ import { useInstanceId } from '@wordpress/compose';
15
+ import { moreVertical } from '@wordpress/icons';
16
+ import {
17
+ useState,
18
+ useRef,
19
+ useEffect,
20
+ useCallback,
21
+ memo,
22
+ } from '@wordpress/element';
23
+ import { useDispatch, useSelect } from '@wordpress/data';
24
+ import { sprintf, __ } from '@wordpress/i18n';
25
+
26
+ /**
27
+ * Internal dependencies
28
+ */
29
+ import ListViewLeaf from './leaf';
30
+ import {
31
+ BlockMoverUpButton,
32
+ BlockMoverDownButton,
33
+ } from '../block-mover/button';
34
+ import ListViewBlockContents from './block-contents';
35
+ import BlockSettingsDropdown from '../block-settings-menu/block-settings-dropdown';
36
+ import { useListViewContext } from './context';
37
+ import { getBlockPositionDescription } from './utils';
38
+ import { store as blockEditorStore } from '../../store';
39
+ import useBlockDisplayInformation from '../use-block-display-information';
40
+ import { useBlockLock } from '../block-lock';
41
+
42
+ function ListViewBlock( {
43
+ block,
44
+ isDragged,
45
+ isSelected,
46
+ isBranchSelected,
47
+ selectBlock,
48
+ position,
49
+ level,
50
+ rowCount,
51
+ siblingBlockCount,
52
+ showBlockMovers,
53
+ path,
54
+ isExpanded,
55
+ selectedClientIds,
56
+ preventAnnouncement,
57
+ selectBlockInCanvas,
58
+ } ) {
59
+ const cellRef = useRef( null );
60
+ const [ isHovered, setIsHovered ] = useState( false );
61
+ const { clientId } = block;
62
+
63
+ const { isLocked, isContentLocked } = useBlockLock( clientId );
64
+ const forceSelectionContentLock = useSelect(
65
+ ( select ) => {
66
+ if ( isSelected ) {
67
+ return false;
68
+ }
69
+ if ( ! isContentLocked ) {
70
+ return false;
71
+ }
72
+ return select( blockEditorStore ).hasSelectedInnerBlock(
73
+ clientId,
74
+ true
75
+ );
76
+ },
77
+ [ isContentLocked, clientId, isSelected ]
78
+ );
79
+
80
+ const isFirstSelectedBlock =
81
+ forceSelectionContentLock ||
82
+ ( isSelected && selectedClientIds[ 0 ] === clientId );
83
+ const isLastSelectedBlock =
84
+ forceSelectionContentLock ||
85
+ ( isSelected &&
86
+ selectedClientIds[ selectedClientIds.length - 1 ] === clientId );
87
+
88
+ const { toggleBlockHighlight } = useDispatch( blockEditorStore );
89
+
90
+ const blockInformation = useBlockDisplayInformation( clientId );
91
+ const blockName = useSelect(
92
+ ( select ) => select( blockEditorStore ).getBlockName( clientId ),
93
+ [ clientId ]
94
+ );
95
+
96
+ // When a block hides its toolbar it also hides the block settings menu,
97
+ // since that menu is part of the toolbar in the editor canvas.
98
+ // List View respects this by also hiding the block settings menu.
99
+ const showBlockActions = hasBlockSupport(
100
+ blockName,
101
+ '__experimentalToolbar',
102
+ true
103
+ );
104
+ const instanceId = useInstanceId( ListViewBlock );
105
+ const descriptionId = `list-view-block-select-button__${ instanceId }`;
106
+ const blockPositionDescription = getBlockPositionDescription(
107
+ position,
108
+ siblingBlockCount,
109
+ level
110
+ );
111
+
112
+ let blockAriaLabel = __( 'Link' );
113
+ if ( blockInformation ) {
114
+ blockAriaLabel = isLocked
115
+ ? sprintf(
116
+ // translators: %s: The title of the block. This string indicates a link to select the locked block.
117
+ __( '%s link (locked)' ),
118
+ blockInformation.title
119
+ )
120
+ : sprintf(
121
+ // translators: %s: The title of the block. This string indicates a link to select the block.
122
+ __( '%s link' ),
123
+ blockInformation.title
124
+ );
125
+ }
126
+
127
+ const settingsAriaLabel = blockInformation
128
+ ? sprintf(
129
+ // translators: %s: The title of the block.
130
+ __( 'Options for %s block' ),
131
+ blockInformation.title
132
+ )
133
+ : __( 'Options' );
134
+
135
+ const { isTreeGridMounted, expand, collapse } = useListViewContext();
136
+
137
+ const hasSiblings = siblingBlockCount > 0;
138
+ const hasRenderedMovers = showBlockMovers && hasSiblings;
139
+ const moverCellClassName = classnames(
140
+ 'block-editor-list-view-block__mover-cell',
141
+ { 'is-visible': isHovered || isSelected }
142
+ );
143
+
144
+ const listViewBlockSettingsClassName = classnames(
145
+ 'block-editor-list-view-block__menu-cell',
146
+ { 'is-visible': isHovered || isFirstSelectedBlock }
147
+ );
148
+
149
+ // If ListView has experimental features related to the Persistent List View,
150
+ // only focus the selected list item on mount; otherwise the list would always
151
+ // try to steal the focus from the editor canvas.
152
+ useEffect( () => {
153
+ if ( ! isTreeGridMounted && isSelected ) {
154
+ cellRef.current.focus();
155
+ }
156
+ }, [] );
157
+
158
+ const onMouseEnter = useCallback( () => {
159
+ setIsHovered( true );
160
+ toggleBlockHighlight( clientId, true );
161
+ }, [ clientId, setIsHovered, toggleBlockHighlight ] );
162
+ const onMouseLeave = useCallback( () => {
163
+ setIsHovered( false );
164
+ toggleBlockHighlight( clientId, false );
165
+ }, [ clientId, setIsHovered, toggleBlockHighlight ] );
166
+
167
+ const selectEditorBlock = useCallback(
168
+ ( event ) => {
169
+ selectBlock( event, clientId );
170
+ event.preventDefault();
171
+ },
172
+ [ clientId, selectBlock ]
173
+ );
174
+
175
+ const updateSelection = useCallback(
176
+ ( newClientId ) => {
177
+ selectBlock( undefined, newClientId );
178
+ },
179
+ [ selectBlock ]
180
+ );
181
+
182
+ const toggleExpanded = useCallback(
183
+ ( event ) => {
184
+ // Prevent shift+click from opening link in a new window when toggling.
185
+ event.preventDefault();
186
+ event.stopPropagation();
187
+ if ( isExpanded === true ) {
188
+ collapse( clientId );
189
+ } else if ( isExpanded === false ) {
190
+ expand( clientId );
191
+ }
192
+ },
193
+ [ clientId, expand, collapse, isExpanded ]
194
+ );
195
+
196
+ let colSpan;
197
+ if ( hasRenderedMovers ) {
198
+ colSpan = 2;
199
+ } else if ( ! showBlockActions ) {
200
+ colSpan = 3;
201
+ }
202
+
203
+ const classes = classnames( {
204
+ 'is-selected': isSelected || forceSelectionContentLock,
205
+ 'is-first-selected': isFirstSelectedBlock,
206
+ 'is-last-selected': isLastSelectedBlock,
207
+ 'is-branch-selected': isBranchSelected,
208
+ 'is-dragging': isDragged,
209
+ 'has-single-cell': ! showBlockActions,
210
+ } );
211
+
212
+ // Only include all selected blocks if the currently clicked on block
213
+ // is one of the selected blocks. This ensures that if a user attempts
214
+ // to alter a block that isn't part of the selection, they're still able
215
+ // to do so.
216
+ const dropdownClientIds = selectedClientIds.includes( clientId )
217
+ ? selectedClientIds
218
+ : [ clientId ];
219
+
220
+ return (
221
+ <ListViewLeaf
222
+ className={ classes }
223
+ onMouseEnter={ onMouseEnter }
224
+ onMouseLeave={ onMouseLeave }
225
+ onFocus={ onMouseEnter }
226
+ onBlur={ onMouseLeave }
227
+ level={ level }
228
+ position={ position }
229
+ rowCount={ rowCount }
230
+ path={ path }
231
+ id={ `list-view-block-${ clientId }` }
232
+ data-block={ clientId }
233
+ isExpanded={ isContentLocked ? undefined : isExpanded }
234
+ aria-selected={ !! isSelected || forceSelectionContentLock }
235
+ >
236
+ <TreeGridCell
237
+ className="block-editor-list-view-block__contents-cell"
238
+ colSpan={ colSpan }
239
+ ref={ cellRef }
240
+ aria-label={ blockAriaLabel }
241
+ aria-selected={ !! isSelected || forceSelectionContentLock }
242
+ aria-expanded={ isContentLocked ? undefined : isExpanded }
243
+ aria-describedby={ descriptionId }
244
+ >
245
+ { ( { ref, tabIndex, onFocus } ) => (
246
+ <div className="block-editor-list-view-block__contents-container">
247
+ <ListViewBlockContents
248
+ block={ block }
249
+ onClick={
250
+ selectBlockInCanvas
251
+ ? selectEditorBlock
252
+ : ( event ) => {
253
+ event.preventDefault();
254
+ }
255
+ }
256
+ onToggleExpanded={ toggleExpanded }
257
+ isSelected={ isSelected }
258
+ position={ position }
259
+ siblingBlockCount={ siblingBlockCount }
260
+ level={ level }
261
+ ref={ ref }
262
+ tabIndex={ tabIndex }
263
+ onFocus={ onFocus }
264
+ isExpanded={ isExpanded }
265
+ selectedClientIds={ selectedClientIds }
266
+ preventAnnouncement={ preventAnnouncement }
267
+ />
268
+ <div
269
+ className="block-editor-list-view-block-select-button__description"
270
+ id={ descriptionId }
271
+ >
272
+ { blockPositionDescription }
273
+ </div>
274
+ </div>
275
+ ) }
276
+ </TreeGridCell>
277
+ { hasRenderedMovers && (
278
+ <>
279
+ <TreeGridCell
280
+ className={ moverCellClassName }
281
+ withoutGridItem
282
+ >
283
+ <TreeGridItem>
284
+ { ( { ref, tabIndex, onFocus } ) => (
285
+ <BlockMoverUpButton
286
+ orientation="vertical"
287
+ clientIds={ [ clientId ] }
288
+ ref={ ref }
289
+ tabIndex={ tabIndex }
290
+ onFocus={ onFocus }
291
+ />
292
+ ) }
293
+ </TreeGridItem>
294
+ <TreeGridItem>
295
+ { ( { ref, tabIndex, onFocus } ) => (
296
+ <BlockMoverDownButton
297
+ orientation="vertical"
298
+ clientIds={ [ clientId ] }
299
+ ref={ ref }
300
+ tabIndex={ tabIndex }
301
+ onFocus={ onFocus }
302
+ />
303
+ ) }
304
+ </TreeGridItem>
305
+ </TreeGridCell>
306
+ </>
307
+ ) }
308
+
309
+ { showBlockActions && (
310
+ <TreeGridCell
311
+ className={ listViewBlockSettingsClassName }
312
+ aria-selected={ !! isSelected || forceSelectionContentLock }
313
+ >
314
+ { ( { ref, tabIndex, onFocus } ) => (
315
+ <BlockSettingsDropdown
316
+ clientIds={ dropdownClientIds }
317
+ icon={ moreVertical }
318
+ label={ settingsAriaLabel }
319
+ toggleProps={ {
320
+ ref,
321
+ className: 'block-editor-list-view-block__menu',
322
+ tabIndex,
323
+ onFocus,
324
+ } }
325
+ disableOpenOnArrowDown
326
+ __experimentalSelectBlock={ updateSelection }
327
+ />
328
+ ) }
329
+ </TreeGridCell>
330
+ ) }
331
+ </ListViewLeaf>
332
+ );
333
+ }
334
+
335
+ export default memo( ListViewBlock );
@@ -0,0 +1,210 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { memo } from '@wordpress/element';
5
+ import { AsyncModeProvider, useSelect } from '@wordpress/data';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import ListViewBlock from './block';
11
+ import { useListViewContext } from './context';
12
+ import { isClientIdSelected } from './utils';
13
+ import { store as blockEditorStore } from '../../store';
14
+
15
+ /**
16
+ * Given a block, returns the total number of blocks in that subtree. This is used to help determine
17
+ * the list position of a block.
18
+ *
19
+ * When a block is collapsed, we do not count their children as part of that total. In the current drag
20
+ * implementation dragged blocks and their children are not counted.
21
+ *
22
+ * @param {Object} block block tree
23
+ * @param {Object} expandedState state that notes which branches are collapsed
24
+ * @param {Array} draggedClientIds a list of dragged client ids
25
+ * @param {boolean} isExpandedByDefault flag to determine the default fallback expanded state.
26
+ * @return {number} block count
27
+ */
28
+ function countBlocks(
29
+ block,
30
+ expandedState,
31
+ draggedClientIds,
32
+ isExpandedByDefault
33
+ ) {
34
+ const isDragged = draggedClientIds?.includes( block.clientId );
35
+ if ( isDragged ) {
36
+ return 0;
37
+ }
38
+ const isExpanded = expandedState[ block.clientId ] ?? isExpandedByDefault;
39
+
40
+ if ( isExpanded ) {
41
+ return (
42
+ 1 +
43
+ block.innerBlocks.reduce(
44
+ countReducer(
45
+ expandedState,
46
+ draggedClientIds,
47
+ isExpandedByDefault
48
+ ),
49
+ 0
50
+ )
51
+ );
52
+ }
53
+ return 1;
54
+ }
55
+ const countReducer =
56
+ ( expandedState, draggedClientIds, isExpandedByDefault ) =>
57
+ ( count, block ) => {
58
+ const isDragged = draggedClientIds?.includes( block.clientId );
59
+ if ( isDragged ) {
60
+ return count;
61
+ }
62
+ const isExpanded =
63
+ expandedState[ block.clientId ] ?? isExpandedByDefault;
64
+ if ( isExpanded && block.innerBlocks.length > 0 ) {
65
+ return (
66
+ count +
67
+ countBlocks(
68
+ block,
69
+ expandedState,
70
+ draggedClientIds,
71
+ isExpandedByDefault
72
+ )
73
+ );
74
+ }
75
+ return count + 1;
76
+ };
77
+
78
+ function ListViewBranch( props ) {
79
+ const {
80
+ blocks,
81
+ selectBlock,
82
+ showBlockMovers,
83
+ selectedClientIds,
84
+ level = 1,
85
+ path = '',
86
+ isBranchSelected = false,
87
+ listPosition = 0,
88
+ fixedListWindow,
89
+ isExpanded,
90
+ parentId,
91
+ shouldShowInnerBlocks = true,
92
+ selectBlockInCanvas,
93
+ } = props;
94
+
95
+ const isContentLocked = useSelect(
96
+ ( select ) => {
97
+ return !! (
98
+ parentId &&
99
+ select( blockEditorStore ).getTemplateLock( parentId ) ===
100
+ 'contentOnly'
101
+ );
102
+ },
103
+ [ parentId ]
104
+ );
105
+
106
+ const { expandedState, draggedClientIds } = useListViewContext();
107
+
108
+ if ( isContentLocked ) {
109
+ return null;
110
+ }
111
+
112
+ const filteredBlocks = blocks.filter( Boolean );
113
+ const blockCount = filteredBlocks.length;
114
+ let nextPosition = listPosition;
115
+
116
+ return (
117
+ <>
118
+ { filteredBlocks.map( ( block, index ) => {
119
+ const { clientId, innerBlocks } = block;
120
+
121
+ if ( index > 0 ) {
122
+ nextPosition += countBlocks(
123
+ filteredBlocks[ index - 1 ],
124
+ expandedState,
125
+ draggedClientIds,
126
+ isExpanded
127
+ );
128
+ }
129
+
130
+ const { itemInView } = fixedListWindow;
131
+ const blockInView = itemInView( nextPosition );
132
+
133
+ const position = index + 1;
134
+ const updatedPath =
135
+ path.length > 0
136
+ ? `${ path }_${ position }`
137
+ : `${ position }`;
138
+ const hasNestedBlocks = !! innerBlocks?.length;
139
+
140
+ const shouldExpand =
141
+ hasNestedBlocks && shouldShowInnerBlocks
142
+ ? expandedState[ clientId ] ?? isExpanded
143
+ : undefined;
144
+
145
+ const isDragged = !! draggedClientIds?.includes( clientId );
146
+
147
+ const showBlock = isDragged || blockInView;
148
+
149
+ // Make updates to the selected or dragged blocks synchronous,
150
+ // but asynchronous for any other block.
151
+ const isSelected = isClientIdSelected(
152
+ clientId,
153
+ selectedClientIds
154
+ );
155
+ const isSelectedBranch =
156
+ isBranchSelected || ( isSelected && hasNestedBlocks );
157
+ return (
158
+ <AsyncModeProvider key={ clientId } value={ ! isSelected }>
159
+ { showBlock && (
160
+ <ListViewBlock
161
+ block={ block }
162
+ selectBlock={ selectBlock }
163
+ isSelected={ isSelected }
164
+ isBranchSelected={ isSelectedBranch }
165
+ isDragged={ isDragged }
166
+ level={ level }
167
+ position={ position }
168
+ rowCount={ blockCount }
169
+ siblingBlockCount={ blockCount }
170
+ showBlockMovers={ showBlockMovers }
171
+ path={ updatedPath }
172
+ isExpanded={ shouldExpand }
173
+ listPosition={ nextPosition }
174
+ selectedClientIds={ selectedClientIds }
175
+ selectBlockInCanvas={ selectBlockInCanvas }
176
+ />
177
+ ) }
178
+ { ! showBlock && (
179
+ <tr>
180
+ <td className="block-editor-list-view-placeholder" />
181
+ </tr>
182
+ ) }
183
+ { hasNestedBlocks && shouldExpand && ! isDragged && (
184
+ <ListViewBranch
185
+ parentId={ clientId }
186
+ blocks={ innerBlocks }
187
+ selectBlock={ selectBlock }
188
+ showBlockMovers={ showBlockMovers }
189
+ level={ level + 1 }
190
+ path={ updatedPath }
191
+ listPosition={ nextPosition + 1 }
192
+ fixedListWindow={ fixedListWindow }
193
+ isBranchSelected={ isSelectedBranch }
194
+ selectedClientIds={ selectedClientIds }
195
+ isExpanded={ isExpanded }
196
+ selectBlockInCanvas={ selectBlockInCanvas }
197
+ />
198
+ ) }
199
+ </AsyncModeProvider>
200
+ );
201
+ } ) }
202
+ </>
203
+ );
204
+ }
205
+
206
+ ListViewBranch.defaultProps = {
207
+ selectBlock: () => {},
208
+ };
209
+
210
+ export default memo( ListViewBranch );
@@ -0,0 +1,8 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { createContext, useContext } from '@wordpress/element';
5
+
6
+ export const ListViewContext = createContext( {} );
7
+
8
+ export const useListViewContext = () => useContext( ListViewContext );
@@ -0,0 +1,126 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Popover } from '@wordpress/components';
5
+ import { useCallback, useMemo } from '@wordpress/element';
6
+
7
+ export default function ListViewDropIndicator( {
8
+ listViewRef,
9
+ blockDropTarget,
10
+ } ) {
11
+ const { rootClientId, clientId, dropPosition } = blockDropTarget || {};
12
+
13
+ const [ rootBlockElement, blockElement ] = useMemo( () => {
14
+ if ( ! listViewRef.current ) {
15
+ return [];
16
+ }
17
+
18
+ // The rootClientId will be defined whenever dropping into inner
19
+ // block lists, but is undefined when dropping at the root level.
20
+ const _rootBlockElement = rootClientId
21
+ ? listViewRef.current.querySelector(
22
+ `[data-block="${ rootClientId }"]`
23
+ )
24
+ : undefined;
25
+
26
+ // The clientId represents the sibling block, the dragged block will
27
+ // usually be inserted adjacent to it. It will be undefined when
28
+ // dropping a block into an empty block list.
29
+ const _blockElement = clientId
30
+ ? listViewRef.current.querySelector(
31
+ `[data-block="${ clientId }"]`
32
+ )
33
+ : undefined;
34
+
35
+ return [ _rootBlockElement, _blockElement ];
36
+ }, [ rootClientId, clientId ] );
37
+
38
+ // The targetElement is the element that the drop indicator will appear
39
+ // before or after. When dropping into an empty block list, blockElement
40
+ // is undefined, so the indicator will appear after the rootBlockElement.
41
+ const targetElement = blockElement || rootBlockElement;
42
+
43
+ const getDropIndicatorIndent = useCallback( () => {
44
+ if ( ! rootBlockElement ) {
45
+ return 0;
46
+ }
47
+
48
+ // Calculate the indent using the block icon of the root block.
49
+ // Using a classname selector here might be flaky and could be
50
+ // improved.
51
+ const targetElementRect = targetElement.getBoundingClientRect();
52
+ const rootBlockIconElement = rootBlockElement.querySelector(
53
+ '.block-editor-block-icon'
54
+ );
55
+ const rootBlockIconRect = rootBlockIconElement.getBoundingClientRect();
56
+ return rootBlockIconRect.right - targetElementRect.left;
57
+ }, [ rootBlockElement, targetElement ] );
58
+
59
+ const style = useMemo( () => {
60
+ if ( ! targetElement ) {
61
+ return {};
62
+ }
63
+
64
+ const indent = getDropIndicatorIndent();
65
+
66
+ return {
67
+ width: targetElement.offsetWidth - indent,
68
+ };
69
+ }, [ getDropIndicatorIndent, targetElement ] );
70
+
71
+ const popoverAnchor = useMemo( () => {
72
+ const isValidDropPosition =
73
+ dropPosition === 'top' ||
74
+ dropPosition === 'bottom' ||
75
+ dropPosition === 'inside';
76
+ if ( ! targetElement || ! isValidDropPosition ) {
77
+ return undefined;
78
+ }
79
+
80
+ return {
81
+ ownerDocument: targetElement.ownerDocument,
82
+ getBoundingClientRect() {
83
+ const rect = targetElement.getBoundingClientRect();
84
+ const indent = getDropIndicatorIndent();
85
+
86
+ const left = rect.left + indent;
87
+ const right = rect.right;
88
+ let top = 0;
89
+ let bottom = 0;
90
+
91
+ if ( dropPosition === 'top' ) {
92
+ top = rect.top;
93
+ bottom = rect.top;
94
+ } else {
95
+ // `dropPosition` is either `bottom` or `inside`
96
+ top = rect.bottom;
97
+ bottom = rect.bottom;
98
+ }
99
+
100
+ const width = right - left;
101
+ const height = bottom - top;
102
+
103
+ return new window.DOMRect( left, top, width, height );
104
+ },
105
+ };
106
+ }, [ targetElement, dropPosition, getDropIndicatorIndent ] );
107
+
108
+ if ( ! targetElement ) {
109
+ return null;
110
+ }
111
+
112
+ return (
113
+ <Popover
114
+ animate={ false }
115
+ anchor={ popoverAnchor }
116
+ focusOnMount={ false }
117
+ className="block-editor-list-view-drop-indicator"
118
+ variant="unstyled"
119
+ >
120
+ <div
121
+ style={ style }
122
+ className="block-editor-list-view-drop-indicator__line"
123
+ />
124
+ </Popover>
125
+ );
126
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { chevronRightSmall, chevronLeftSmall, Icon } from '@wordpress/icons';
5
+ import { isRTL } from '@wordpress/i18n';
6
+
7
+ export default function ListViewExpander( { onClick } ) {
8
+ return (
9
+ // Keyboard events are handled by TreeGrid see: components/src/tree-grid/index.js
10
+ //
11
+ // The expander component is implemented as a pseudo element in the w3 example
12
+ // https://www.w3.org/TR/wai-aria-practices/examples/treegrid/treegrid-1.html
13
+ //
14
+ // We've mimicked this by adding an icon with aria-hidden set to true to hide this from the accessibility tree.
15
+ // For the current tree grid implementation, please do not try to make this a button.
16
+ //
17
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
18
+ <span
19
+ className="block-editor-list-view__expander"
20
+ onClick={ ( event ) => onClick( event, { forceToggle: true } ) }
21
+ aria-hidden="true"
22
+ >
23
+ <Icon icon={ isRTL() ? chevronLeftSmall : chevronRightSmall } />
24
+ </span>
25
+ );
26
+ }