@wordpress/block-editor 8.4.0 → 8.5.2

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 (421) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +56 -19
  3. package/build/components/alignment-control/index.js +13 -6
  4. package/build/components/alignment-control/index.js.map +1 -1
  5. package/build/components/block-alignment-control/index.js +13 -6
  6. package/build/components/block-alignment-control/index.js.map +1 -1
  7. package/build/components/block-alignment-control/ui.js +1 -1
  8. package/build/components/block-alignment-control/ui.js.map +1 -1
  9. package/build/components/block-content-overlay/index.js +13 -4
  10. package/build/components/block-content-overlay/index.js.map +1 -1
  11. package/build/components/block-draggable/index.js +2 -3
  12. package/build/components/block-draggable/index.js.map +1 -1
  13. package/build/components/block-icon/index.js +4 -0
  14. package/build/components/block-icon/index.js.map +1 -1
  15. package/build/components/block-inspector/index.js +6 -1
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/use-block-props/index.js +1 -6
  18. package/build/components/block-list/use-block-props/index.js.map +1 -1
  19. package/build/components/block-list/use-block-props/use-focus-first-element.js +14 -17
  20. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  21. package/build/components/block-list/use-block-props/use-focus-handler.js +7 -1
  22. package/build/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  23. package/build/components/block-list-appender/index.js +6 -1
  24. package/build/components/block-list-appender/index.js.map +1 -1
  25. package/build/components/block-lock/index.js +8 -0
  26. package/build/components/block-lock/index.js.map +1 -1
  27. package/build/components/block-lock/menu-item.js +9 -15
  28. package/build/components/block-lock/menu-item.js.map +1 -1
  29. package/build/components/block-lock/modal.js +35 -23
  30. package/build/components/block-lock/modal.js.map +1 -1
  31. package/build/components/block-lock/toolbar.js +11 -16
  32. package/build/components/block-lock/toolbar.js.map +1 -1
  33. package/build/components/block-lock/use-block-lock.js +50 -0
  34. package/build/components/block-lock/use-block-lock.js.map +1 -0
  35. package/build/components/block-mover/index.js +4 -0
  36. package/build/components/block-mover/index.js.map +1 -1
  37. package/build/components/block-pattern-setup/index.js +37 -22
  38. package/build/components/block-pattern-setup/index.js.map +1 -1
  39. package/build/components/block-pattern-setup/setup-toolbar.js +1 -1
  40. package/build/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  41. package/build/components/block-preview/auto.js +6 -3
  42. package/build/components/block-preview/auto.js.map +1 -1
  43. package/build/components/block-preview/index.js +4 -2
  44. package/build/components/block-preview/index.js.map +1 -1
  45. package/build/components/block-settings-menu/block-settings-dropdown.js +50 -5
  46. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  47. package/build/components/block-switcher/index.js +8 -3
  48. package/build/components/block-switcher/index.js.map +1 -1
  49. package/build/components/block-title/index.js +2 -2
  50. package/build/components/block-title/index.js.map +1 -1
  51. package/build/components/block-title/use-block-display-title.js +1 -1
  52. package/build/components/block-title/use-block-display-title.js.map +1 -1
  53. package/build/components/block-toolbar/block-name-context.js +17 -0
  54. package/build/components/block-toolbar/block-name-context.js.map +1 -0
  55. package/build/components/block-toolbar/block-toolbar-last-item.js +20 -0
  56. package/build/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  57. package/build/components/block-toolbar/index.js +20 -5
  58. package/build/components/block-toolbar/index.js.map +1 -1
  59. package/build/components/block-tools/index.js +0 -16
  60. package/build/components/block-tools/index.js.map +1 -1
  61. package/build/components/block-variation-transforms/index.js +92 -47
  62. package/build/components/block-variation-transforms/index.js.map +1 -1
  63. package/build/components/block-vertical-alignment-control/index.js +13 -6
  64. package/build/components/block-vertical-alignment-control/index.js.map +1 -1
  65. package/build/components/contrast-checker/index.js +4 -0
  66. package/build/components/contrast-checker/index.js.map +1 -1
  67. package/build/components/convert-to-group-buttons/index.js +8 -0
  68. package/build/components/convert-to-group-buttons/index.js.map +1 -1
  69. package/build/components/convert-to-group-buttons/toolbar.js +105 -0
  70. package/build/components/convert-to-group-buttons/toolbar.js.map +1 -0
  71. package/build/components/copy-handler/index.js +48 -9
  72. package/build/components/copy-handler/index.js.map +1 -1
  73. package/build/components/font-sizes/font-size-picker.js +4 -0
  74. package/build/components/font-sizes/font-size-picker.js.map +1 -1
  75. package/build/components/iframe/index.js +6 -9
  76. package/build/components/iframe/index.js.map +1 -1
  77. package/build/components/index.js +18 -0
  78. package/build/components/index.js.map +1 -1
  79. package/build/components/justify-content-control/index.js +13 -6
  80. package/build/components/justify-content-control/index.js.map +1 -1
  81. package/build/components/keyboard-shortcuts/index.js +1 -1
  82. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  83. package/build/components/line-height-control/index.js +10 -3
  84. package/build/components/line-height-control/index.js.map +1 -1
  85. package/build/components/link-control/index.js +6 -7
  86. package/build/components/link-control/index.js.map +1 -1
  87. package/build/components/list-view/block-select-button.js +19 -6
  88. package/build/components/list-view/block-select-button.js.map +1 -1
  89. package/build/components/list-view/block.js +18 -3
  90. package/build/components/list-view/block.js.map +1 -1
  91. package/build/components/list-view/branch.js +1 -1
  92. package/build/components/list-view/branch.js.map +1 -1
  93. package/build/components/media-replace-flow/index.js +4 -0
  94. package/build/components/media-replace-flow/index.js.map +1 -1
  95. package/build/components/multi-selection-inspector/index.js +1 -1
  96. package/build/components/multi-selection-inspector/index.js.map +1 -1
  97. package/build/components/rich-text/index.js +26 -4
  98. package/build/components/rich-text/index.js.map +1 -1
  99. package/build/components/rich-text/split-value.js +12 -2
  100. package/build/components/rich-text/split-value.js.map +1 -1
  101. package/build/components/rich-text/use-firefox-compat.js +49 -0
  102. package/build/components/rich-text/use-firefox-compat.js.map +1 -0
  103. package/build/components/rich-text/use-input-rules.js +34 -2
  104. package/build/components/rich-text/use-input-rules.js.map +1 -1
  105. package/build/components/skip-to-selected-block/index.js +4 -0
  106. package/build/components/skip-to-selected-block/index.js.map +1 -1
  107. package/build/components/writing-flow/index.js +9 -1
  108. package/build/components/writing-flow/index.js.map +1 -1
  109. package/build/components/writing-flow/use-arrow-nav.js +3 -44
  110. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  111. package/build/components/writing-flow/use-click-selection.js +68 -0
  112. package/build/components/writing-flow/use-click-selection.js.map +1 -0
  113. package/build/components/writing-flow/use-drag-selection.js +134 -0
  114. package/build/components/writing-flow/use-drag-selection.js.map +1 -0
  115. package/build/components/writing-flow/use-input.js +116 -0
  116. package/build/components/writing-flow/use-input.js.map +1 -0
  117. package/build/components/writing-flow/use-multi-selection.js +18 -38
  118. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  119. package/build/components/writing-flow/use-selection-observer.js +161 -0
  120. package/build/components/writing-flow/use-selection-observer.js.map +1 -0
  121. package/build/components/writing-flow/use-tab-nav.js +1 -8
  122. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  123. package/build/hooks/border-color.js +3 -3
  124. package/build/hooks/border-color.js.map +1 -1
  125. package/build/hooks/border.js +0 -14
  126. package/build/hooks/border.js.map +1 -1
  127. package/build/hooks/color.js +20 -17
  128. package/build/hooks/color.js.map +1 -1
  129. package/build/hooks/font-family.js +5 -1
  130. package/build/hooks/font-family.js.map +1 -1
  131. package/build/hooks/font-size.js +4 -2
  132. package/build/hooks/font-size.js.map +1 -1
  133. package/build/hooks/gap.js +23 -16
  134. package/build/hooks/gap.js.map +1 -1
  135. package/build/hooks/layout.js +7 -2
  136. package/build/hooks/layout.js.map +1 -1
  137. package/build/hooks/style.js +34 -3
  138. package/build/hooks/style.js.map +1 -1
  139. package/build/hooks/utils.js +29 -0
  140. package/build/hooks/utils.js.map +1 -1
  141. package/build/layouts/flex.js +76 -12
  142. package/build/layouts/flex.js.map +1 -1
  143. package/build/layouts/flow.js +9 -4
  144. package/build/layouts/flow.js.map +1 -1
  145. package/build/store/actions.js +290 -51
  146. package/build/store/actions.js.map +1 -1
  147. package/build/store/defaults.js +5 -2
  148. package/build/store/defaults.js.map +1 -1
  149. package/build/store/reducer.js +25 -13
  150. package/build/store/reducer.js.map +1 -1
  151. package/build/store/selectors.js +264 -21
  152. package/build/store/selectors.js.map +1 -1
  153. package/build/store/utils.js +27 -0
  154. package/build/store/utils.js.map +1 -0
  155. package/build/utils/dom.js +2 -1
  156. package/build/utils/dom.js.map +1 -1
  157. package/build-module/components/alignment-control/index.js +12 -4
  158. package/build-module/components/alignment-control/index.js.map +1 -1
  159. package/build-module/components/block-alignment-control/index.js +12 -4
  160. package/build-module/components/block-alignment-control/index.js.map +1 -1
  161. package/build-module/components/block-alignment-control/ui.js +2 -2
  162. package/build-module/components/block-alignment-control/ui.js.map +1 -1
  163. package/build-module/components/block-content-overlay/index.js +13 -4
  164. package/build-module/components/block-content-overlay/index.js.map +1 -1
  165. package/build-module/components/block-draggable/index.js +2 -3
  166. package/build-module/components/block-draggable/index.js.map +1 -1
  167. package/build-module/components/block-icon/index.js +4 -0
  168. package/build-module/components/block-icon/index.js.map +1 -1
  169. package/build-module/components/block-inspector/index.js +6 -1
  170. package/build-module/components/block-inspector/index.js.map +1 -1
  171. package/build-module/components/block-list/use-block-props/index.js +1 -4
  172. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  173. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +15 -17
  174. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  175. package/build-module/components/block-list/use-block-props/use-focus-handler.js +7 -1
  176. package/build-module/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  177. package/build-module/components/block-list-appender/index.js +6 -1
  178. package/build-module/components/block-list-appender/index.js.map +1 -1
  179. package/build-module/components/block-lock/index.js +1 -0
  180. package/build-module/components/block-lock/index.js.map +1 -1
  181. package/build-module/components/block-lock/menu-item.js +8 -13
  182. package/build-module/components/block-lock/menu-item.js.map +1 -1
  183. package/build-module/components/block-lock/modal.js +34 -24
  184. package/build-module/components/block-lock/modal.js.map +1 -1
  185. package/build-module/components/block-lock/toolbar.js +10 -14
  186. package/build-module/components/block-lock/toolbar.js.map +1 -1
  187. package/build-module/components/block-lock/use-block-lock.js +41 -0
  188. package/build-module/components/block-lock/use-block-lock.js.map +1 -0
  189. package/build-module/components/block-mover/index.js +4 -0
  190. package/build-module/components/block-mover/index.js.map +1 -1
  191. package/build-module/components/block-pattern-setup/index.js +39 -24
  192. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  193. package/build-module/components/block-pattern-setup/setup-toolbar.js +1 -1
  194. package/build-module/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  195. package/build-module/components/block-preview/auto.js +6 -3
  196. package/build-module/components/block-preview/auto.js.map +1 -1
  197. package/build-module/components/block-preview/index.js +4 -2
  198. package/build-module/components/block-preview/index.js.map +1 -1
  199. package/build-module/components/block-settings-menu/block-settings-dropdown.js +50 -7
  200. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  201. package/build-module/components/block-switcher/index.js +9 -4
  202. package/build-module/components/block-switcher/index.js.map +1 -1
  203. package/build-module/components/block-title/index.js +2 -2
  204. package/build-module/components/block-title/index.js.map +1 -1
  205. package/build-module/components/block-title/use-block-display-title.js +1 -1
  206. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  207. package/build-module/components/block-toolbar/block-name-context.js +9 -0
  208. package/build-module/components/block-toolbar/block-name-context.js.map +1 -0
  209. package/build-module/components/block-toolbar/block-toolbar-last-item.js +11 -0
  210. package/build-module/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  211. package/build-module/components/block-toolbar/index.js +16 -4
  212. package/build-module/components/block-toolbar/index.js.map +1 -1
  213. package/build-module/components/block-tools/index.js +0 -16
  214. package/build-module/components/block-tools/index.js.map +1 -1
  215. package/build-module/components/block-variation-transforms/index.js +95 -49
  216. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  217. package/build-module/components/block-vertical-alignment-control/index.js +12 -4
  218. package/build-module/components/block-vertical-alignment-control/index.js.map +1 -1
  219. package/build-module/components/contrast-checker/index.js +4 -0
  220. package/build-module/components/contrast-checker/index.js.map +1 -1
  221. package/build-module/components/convert-to-group-buttons/index.js +2 -1
  222. package/build-module/components/convert-to-group-buttons/index.js.map +1 -1
  223. package/build-module/components/convert-to-group-buttons/toolbar.js +90 -0
  224. package/build-module/components/convert-to-group-buttons/toolbar.js.map +1 -0
  225. package/build-module/components/copy-handler/index.js +48 -9
  226. package/build-module/components/copy-handler/index.js.map +1 -1
  227. package/build-module/components/font-sizes/font-size-picker.js +4 -0
  228. package/build-module/components/font-sizes/font-size-picker.js.map +1 -1
  229. package/build-module/components/iframe/index.js +6 -9
  230. package/build-module/components/iframe/index.js.map +1 -1
  231. package/build-module/components/index.js +2 -0
  232. package/build-module/components/index.js.map +1 -1
  233. package/build-module/components/justify-content-control/index.js +12 -4
  234. package/build-module/components/justify-content-control/index.js.map +1 -1
  235. package/build-module/components/keyboard-shortcuts/index.js +1 -1
  236. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  237. package/build-module/components/line-height-control/index.js +9 -2
  238. package/build-module/components/line-height-control/index.js.map +1 -1
  239. package/build-module/components/link-control/index.js +6 -7
  240. package/build-module/components/link-control/index.js.map +1 -1
  241. package/build-module/components/list-view/block-select-button.js +17 -6
  242. package/build-module/components/list-view/block-select-button.js.map +1 -1
  243. package/build-module/components/list-view/block.js +18 -3
  244. package/build-module/components/list-view/block.js.map +1 -1
  245. package/build-module/components/list-view/branch.js +1 -1
  246. package/build-module/components/list-view/branch.js.map +1 -1
  247. package/build-module/components/media-replace-flow/index.js +4 -0
  248. package/build-module/components/media-replace-flow/index.js.map +1 -1
  249. package/build-module/components/multi-selection-inspector/index.js +2 -2
  250. package/build-module/components/multi-selection-inspector/index.js.map +1 -1
  251. package/build-module/components/rich-text/index.js +25 -4
  252. package/build-module/components/rich-text/index.js.map +1 -1
  253. package/build-module/components/rich-text/split-value.js +12 -2
  254. package/build-module/components/rich-text/split-value.js.map +1 -1
  255. package/build-module/components/rich-text/use-firefox-compat.js +39 -0
  256. package/build-module/components/rich-text/use-firefox-compat.js.map +1 -0
  257. package/build-module/components/rich-text/use-input-rules.js +35 -4
  258. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  259. package/build-module/components/skip-to-selected-block/index.js +4 -0
  260. package/build-module/components/skip-to-selected-block/index.js.map +1 -1
  261. package/build-module/components/writing-flow/index.js +5 -1
  262. package/build-module/components/writing-flow/index.js.map +1 -1
  263. package/build-module/components/writing-flow/use-arrow-nav.js +4 -45
  264. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  265. package/build-module/components/writing-flow/use-click-selection.js +57 -0
  266. package/build-module/components/writing-flow/use-click-selection.js.map +1 -0
  267. package/build-module/components/writing-flow/use-drag-selection.js +124 -0
  268. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -0
  269. package/build-module/components/writing-flow/use-input.js +104 -0
  270. package/build-module/components/writing-flow/use-input.js.map +1 -0
  271. package/build-module/components/writing-flow/use-multi-selection.js +18 -37
  272. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  273. package/build-module/components/writing-flow/use-selection-observer.js +150 -0
  274. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -0
  275. package/build-module/components/writing-flow/use-tab-nav.js +1 -9
  276. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  277. package/build-module/hooks/border-color.js +5 -5
  278. package/build-module/hooks/border-color.js.map +1 -1
  279. package/build-module/hooks/border.js +0 -12
  280. package/build-module/hooks/border.js.map +1 -1
  281. package/build-module/hooks/color.js +19 -18
  282. package/build-module/hooks/color.js.map +1 -1
  283. package/build-module/hooks/font-family.js +3 -1
  284. package/build-module/hooks/font-family.js.map +1 -1
  285. package/build-module/hooks/font-size.js +4 -3
  286. package/build-module/hooks/font-size.js.map +1 -1
  287. package/build-module/hooks/gap.js +22 -15
  288. package/build-module/hooks/gap.js.map +1 -1
  289. package/build-module/hooks/layout.js +7 -2
  290. package/build-module/hooks/layout.js.map +1 -1
  291. package/build-module/hooks/style.js +33 -3
  292. package/build-module/hooks/style.js.map +1 -1
  293. package/build-module/hooks/utils.js +26 -0
  294. package/build-module/hooks/utils.js.map +1 -1
  295. package/build-module/layouts/flex.js +76 -13
  296. package/build-module/layouts/flex.js.map +1 -1
  297. package/build-module/layouts/flow.js +9 -5
  298. package/build-module/layouts/flow.js.map +1 -1
  299. package/build-module/store/actions.js +277 -49
  300. package/build-module/store/actions.js.map +1 -1
  301. package/build-module/store/defaults.js +5 -2
  302. package/build-module/store/defaults.js.map +1 -1
  303. package/build-module/store/reducer.js +25 -13
  304. package/build-module/store/reducer.js.map +1 -1
  305. package/build-module/store/selectors.js +250 -21
  306. package/build-module/store/selectors.js.map +1 -1
  307. package/build-module/store/utils.js +20 -0
  308. package/build-module/store/utils.js.map +1 -0
  309. package/build-module/utils/dom.js +2 -1
  310. package/build-module/utils/dom.js.map +1 -1
  311. package/build-style/style-rtl.css +142 -101
  312. package/build-style/style.css +142 -101
  313. package/build-types/utils/dom.d.ts.map +1 -1
  314. package/package.json +28 -28
  315. package/src/components/alignment-control/index.js +9 -4
  316. package/src/components/block-alignment-control/index.js +9 -4
  317. package/src/components/block-alignment-control/ui.js +2 -2
  318. package/src/components/block-content-overlay/index.js +19 -2
  319. package/src/components/block-draggable/index.js +2 -5
  320. package/src/components/block-icon/index.js +3 -0
  321. package/src/components/block-inspector/index.js +4 -0
  322. package/src/components/block-list/style.scss +4 -5
  323. package/src/components/block-list/use-block-props/index.js +0 -5
  324. package/src/components/block-list/use-block-props/use-focus-first-element.js +19 -26
  325. package/src/components/block-list/use-block-props/use-focus-handler.js +8 -0
  326. package/src/components/block-list-appender/index.js +5 -0
  327. package/src/components/block-lock/index.js +1 -0
  328. package/src/components/block-lock/menu-item.js +6 -19
  329. package/src/components/block-lock/modal.js +52 -23
  330. package/src/components/block-lock/style.scss +7 -5
  331. package/src/components/block-lock/toolbar.js +7 -14
  332. package/src/components/block-lock/use-block-lock.js +45 -0
  333. package/src/components/block-mover/index.js +3 -0
  334. package/src/components/block-mover/style.scss +4 -0
  335. package/src/components/block-pattern-setup/index.js +84 -59
  336. package/src/components/block-pattern-setup/setup-toolbar.js +3 -1
  337. package/src/components/block-pattern-setup/style.scss +32 -26
  338. package/src/components/block-preview/auto.js +10 -1
  339. package/src/components/block-preview/index.js +2 -0
  340. package/src/components/block-settings-menu/block-settings-dropdown.js +62 -4
  341. package/src/components/block-switcher/index.js +15 -3
  342. package/src/components/block-switcher/style.scss +15 -4
  343. package/src/components/block-switcher/test/__snapshots__/index.js.snap +15 -13
  344. package/src/components/block-switcher/test/index.js +2 -2
  345. package/src/components/block-title/index.js +2 -2
  346. package/src/components/block-title/use-block-display-title.js +1 -1
  347. package/src/components/block-toolbar/block-name-context.js +8 -0
  348. package/src/components/block-toolbar/block-toolbar-last-item.js +12 -0
  349. package/src/components/block-toolbar/index.js +18 -2
  350. package/src/components/block-toolbar/style.scss +6 -0
  351. package/src/components/block-tools/index.js +0 -19
  352. package/src/components/block-tools/style.scss +3 -5
  353. package/src/components/block-variation-transforms/index.js +105 -36
  354. package/src/components/block-variation-transforms/style.scss +1 -1
  355. package/src/components/block-vertical-alignment-control/index.js +9 -4
  356. package/src/components/button-block-appender/style.scss +5 -1
  357. package/src/components/contrast-checker/index.js +3 -0
  358. package/src/components/convert-to-group-buttons/index.js +6 -1
  359. package/src/components/convert-to-group-buttons/toolbar.js +87 -0
  360. package/src/components/copy-handler/index.js +55 -10
  361. package/src/components/font-sizes/font-size-picker.js +3 -0
  362. package/src/components/iframe/index.js +5 -7
  363. package/src/components/index.js +2 -0
  364. package/src/components/justify-content-control/index.js +9 -4
  365. package/src/components/keyboard-shortcuts/index.js +1 -1
  366. package/src/components/line-height-control/index.js +8 -3
  367. package/src/components/link-control/index.js +5 -5
  368. package/src/components/list-view/block-select-button.js +13 -3
  369. package/src/components/list-view/block.js +24 -8
  370. package/src/components/list-view/branch.js +1 -1
  371. package/src/components/list-view/style.scss +56 -14
  372. package/src/components/media-placeholder/README.md +8 -0
  373. package/src/components/media-replace-flow/index.js +3 -0
  374. package/src/components/multi-selection-inspector/index.js +2 -2
  375. package/src/components/rich-text/index.js +24 -1
  376. package/src/components/rich-text/split-value.js +5 -1
  377. package/src/components/rich-text/use-firefox-compat.js +39 -0
  378. package/src/components/rich-text/use-input-rules.js +40 -3
  379. package/src/components/skip-to-selected-block/index.js +3 -0
  380. package/src/components/url-input/style.scss +3 -2
  381. package/src/components/writing-flow/index.js +8 -0
  382. package/src/components/writing-flow/readme.md +28 -0
  383. package/src/components/writing-flow/use-arrow-nav.js +4 -53
  384. package/src/components/writing-flow/use-click-selection.js +65 -0
  385. package/src/components/writing-flow/use-drag-selection.js +126 -0
  386. package/src/components/writing-flow/use-input.js +112 -0
  387. package/src/components/writing-flow/use-multi-selection.js +13 -36
  388. package/src/components/writing-flow/use-selection-observer.js +153 -0
  389. package/src/components/writing-flow/use-tab-nav.js +1 -11
  390. package/src/hooks/border-color.js +5 -5
  391. package/src/hooks/border.js +0 -13
  392. package/src/hooks/color.js +51 -24
  393. package/src/hooks/font-family.js +5 -2
  394. package/src/hooks/font-size.js +10 -7
  395. package/src/hooks/gap.js +25 -17
  396. package/src/hooks/layout.js +11 -1
  397. package/src/hooks/style.js +40 -4
  398. package/src/hooks/test/gap.js +25 -1
  399. package/src/hooks/test/style.js +94 -0
  400. package/src/hooks/test/utils.js +1 -1
  401. package/src/hooks/utils.js +26 -0
  402. package/src/layouts/flex.js +89 -5
  403. package/src/layouts/flow.js +15 -4
  404. package/src/store/actions.js +341 -32
  405. package/src/store/defaults.js +7 -2
  406. package/src/store/reducer.js +25 -10
  407. package/src/store/selectors.js +329 -26
  408. package/src/store/test/selectors.js +242 -5
  409. package/src/store/utils.js +19 -0
  410. package/src/utils/dom.js +2 -1
  411. package/tsconfig.tsbuildinfo +1 -1
  412. package/build/components/block-list/use-block-props/use-multi-selection.js +0 -205
  413. package/build/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  414. package/build/components/block-list/use-block-props/use-scroll-into-view.js +0 -77
  415. package/build/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  416. package/build-module/components/block-list/use-block-props/use-multi-selection.js +0 -192
  417. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  418. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js +0 -63
  419. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  420. package/src/components/block-list/use-block-props/use-multi-selection.js +0 -227
  421. package/src/components/block-list/use-block-props/use-scroll-into-view.js +0 -73
@@ -7,7 +7,7 @@ import { first, last } from 'lodash';
7
7
  */
8
8
 
9
9
  import { useEffect, useRef } from '@wordpress/element';
10
- import { focus, isTextField, placeCaretAtHorizontalEdge } from '@wordpress/dom';
10
+ import { focus, isFormElement, isTextField, placeCaretAtHorizontalEdge } from '@wordpress/dom';
11
11
  import { useSelect } from '@wordpress/data';
12
12
  /**
13
13
  * Internal dependencies
@@ -15,7 +15,6 @@ import { useSelect } from '@wordpress/data';
15
15
 
16
16
  import { isInsideRootBlock } from '../../../utils/dom';
17
17
  import { store as blockEditorStore } from '../../../store';
18
- import { setContentEditableWrapper } from './use-multi-selection';
19
18
  /** @typedef {import('@wordpress/element').RefObject} RefObject */
20
19
 
21
20
  /**
@@ -31,7 +30,6 @@ function useInitialPosition(clientId) {
31
30
  return useSelect(select => {
32
31
  const {
33
32
  getSelectedBlocksInitialCaretPosition,
34
- isMultiSelecting,
35
33
  isNavigationMode,
36
34
  isBlockSelected
37
35
  } = select(blockEditorStore);
@@ -40,7 +38,7 @@ function useInitialPosition(clientId) {
40
38
  return;
41
39
  }
42
40
 
43
- if (isMultiSelecting() || isNavigationMode()) {
41
+ if (isNavigationMode()) {
44
42
  return;
45
43
  } // If there's no initial position, return 0 to focus the start.
46
44
 
@@ -48,13 +46,6 @@ function useInitialPosition(clientId) {
48
46
  return getSelectedBlocksInitialCaretPosition();
49
47
  }, [clientId]);
50
48
  }
51
-
52
- function isFormElement(element) {
53
- const {
54
- tagName
55
- } = element;
56
- return tagName === 'INPUT' || tagName === 'BUTTON' || tagName === 'SELECT' || tagName === 'TEXTAREA';
57
- }
58
49
  /**
59
50
  * Transitions focus to the block or inner tabbable when the block becomes
60
51
  * selected and an initial position is set.
@@ -68,7 +59,16 @@ function isFormElement(element) {
68
59
  export function useFocusFirstElement(clientId) {
69
60
  const ref = useRef();
70
61
  const initialPosition = useInitialPosition(clientId);
62
+ const {
63
+ isBlockSelected,
64
+ isMultiSelecting
65
+ } = useSelect(blockEditorStore);
71
66
  useEffect(() => {
67
+ // Check if the block is still selected at the time this effect runs.
68
+ if (!isBlockSelected(clientId) || isMultiSelecting()) {
69
+ return;
70
+ }
71
+
72
72
  if (initialPosition === undefined || initialPosition === null) {
73
73
  return;
74
74
  }
@@ -98,19 +98,17 @@ export function useFocusFirstElement(clientId) {
98
98
  } // Check to see if element is focussable before a generic caret insert.
99
99
 
100
100
 
101
- if (!target.getAttribute('contenteditable')) {
102
- const focusElement = focus.tabbable.findNext(target); // Make sure focusElement is valid, form field, and within the current target element.
103
- // Ensure is not block inserter trigger, don't want to focus that in the event of the group block which doesn't contain any other focussable elements.
101
+ if (!ref.current.getAttribute('contenteditable')) {
102
+ const focusElement = focus.tabbable.findNext(ref.current); // Make sure focusElement is valid, contained in the same block, and a form field.
104
103
 
105
- if (focusElement && isFormElement(focusElement) && target.contains(focusElement) && !focusElement.classList.contains('block-editor-button-block-appender')) {
104
+ if (focusElement && isInsideRootBlock(ref.current, focusElement) && isFormElement(focusElement)) {
106
105
  focusElement.focus();
107
106
  return;
108
107
  }
109
108
  }
110
109
 
111
- setContentEditableWrapper(ref.current, false);
112
110
  placeCaretAtHorizontalEdge(target, isReverse);
113
- }, [initialPosition]);
111
+ }, [initialPosition, clientId]);
114
112
  return ref;
115
113
  }
116
114
  //# sourceMappingURL=use-focus-first-element.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/use-block-props/use-focus-first-element.js"],"names":["first","last","useEffect","useRef","focus","isTextField","placeCaretAtHorizontalEdge","useSelect","isInsideRootBlock","store","blockEditorStore","setContentEditableWrapper","useInitialPosition","clientId","select","getSelectedBlocksInitialCaretPosition","isMultiSelecting","isNavigationMode","isBlockSelected","isFormElement","element","tagName","useFocusFirstElement","ref","initialPosition","undefined","current","ownerDocument","contains","activeElement","textInputs","tabbable","find","filter","node","isReverse","target","getAttribute","focusElement","findNext","classList"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { first, last } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useRef } from '@wordpress/element';\nimport { focus, isTextField, placeCaretAtHorizontalEdge } from '@wordpress/dom';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { isInsideRootBlock } from '../../../utils/dom';\nimport { store as blockEditorStore } from '../../../store';\nimport { setContentEditableWrapper } from './use-multi-selection';\n\n/** @typedef {import('@wordpress/element').RefObject} RefObject */\n\n/**\n * Returns the initial position if the block needs to be focussed, `undefined`\n * otherwise. The initial position is either 0 (start) or -1 (end).\n *\n * @param {string} clientId Block client ID.\n *\n * @return {number} The initial position, either 0 (start) or -1 (end).\n */\nfunction useInitialPosition( clientId ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetSelectedBlocksInitialCaretPosition,\n\t\t\t\tisMultiSelecting,\n\t\t\t\tisNavigationMode,\n\t\t\t\tisBlockSelected,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tif ( ! isBlockSelected( clientId ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isMultiSelecting() || isNavigationMode() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there's no initial position, return 0 to focus the start.\n\t\t\treturn getSelectedBlocksInitialCaretPosition();\n\t\t},\n\t\t[ clientId ]\n\t);\n}\n\nfunction isFormElement( element ) {\n\tconst { tagName } = element;\n\treturn (\n\t\ttagName === 'INPUT' ||\n\t\ttagName === 'BUTTON' ||\n\t\ttagName === 'SELECT' ||\n\t\ttagName === 'TEXTAREA'\n\t);\n}\n\n/**\n * Transitions focus to the block or inner tabbable when the block becomes\n * selected and an initial position is set.\n *\n * @param {string} clientId Block client ID.\n *\n * @return {RefObject} React ref with the block element.\n */\nexport function useFocusFirstElement( clientId ) {\n\tconst ref = useRef();\n\tconst initialPosition = useInitialPosition( clientId );\n\n\tuseEffect( () => {\n\t\tif ( initialPosition === undefined || initialPosition === null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! ref.current ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { ownerDocument } = ref.current;\n\n\t\t// Do not focus the block if it already contains the active element.\n\t\tif ( ref.current.contains( ownerDocument.activeElement ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find all tabbables within node.\n\t\tconst textInputs = focus.tabbable\n\t\t\t.find( ref.current )\n\t\t\t.filter( ( node ) => isTextField( node ) );\n\n\t\t// If reversed (e.g. merge via backspace), use the last in the set of\n\t\t// tabbables.\n\t\tconst isReverse = -1 === initialPosition;\n\t\tconst target =\n\t\t\t( isReverse ? last : first )( textInputs ) || ref.current;\n\n\t\tif ( ! isInsideRootBlock( ref.current, target ) ) {\n\t\t\tref.current.focus();\n\t\t\treturn;\n\t\t}\n\n\t\t// Check to see if element is focussable before a generic caret insert.\n\t\tif ( ! target.getAttribute( 'contenteditable' ) ) {\n\t\t\tconst focusElement = focus.tabbable.findNext( target );\n\t\t\t// Make sure focusElement is valid, form field, and within the current target element.\n\t\t\t// Ensure is not block inserter trigger, don't want to focus that in the event of the group block which doesn't contain any other focussable elements.\n\t\t\tif (\n\t\t\t\tfocusElement &&\n\t\t\t\tisFormElement( focusElement ) &&\n\t\t\t\ttarget.contains( focusElement ) &&\n\t\t\t\t! focusElement.classList.contains(\n\t\t\t\t\t'block-editor-button-block-appender'\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tfocusElement.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tsetContentEditableWrapper( ref.current, false );\n\n\t\tplaceCaretAtHorizontalEdge( target, isReverse );\n\t}, [ initialPosition ] );\n\n\treturn ref;\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/use-block-props/use-focus-first-element.js"],"names":["first","last","useEffect","useRef","focus","isFormElement","isTextField","placeCaretAtHorizontalEdge","useSelect","isInsideRootBlock","store","blockEditorStore","useInitialPosition","clientId","select","getSelectedBlocksInitialCaretPosition","isNavigationMode","isBlockSelected","useFocusFirstElement","ref","initialPosition","isMultiSelecting","undefined","current","ownerDocument","contains","activeElement","textInputs","tabbable","find","filter","node","isReverse","target","getAttribute","focusElement","findNext"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { first, last } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useRef } from '@wordpress/element';\nimport {\n\tfocus,\n\tisFormElement,\n\tisTextField,\n\tplaceCaretAtHorizontalEdge,\n} from '@wordpress/dom';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { isInsideRootBlock } from '../../../utils/dom';\nimport { store as blockEditorStore } from '../../../store';\n\n/** @typedef {import('@wordpress/element').RefObject} RefObject */\n\n/**\n * Returns the initial position if the block needs to be focussed, `undefined`\n * otherwise. The initial position is either 0 (start) or -1 (end).\n *\n * @param {string} clientId Block client ID.\n *\n * @return {number} The initial position, either 0 (start) or -1 (end).\n */\nfunction useInitialPosition( clientId ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetSelectedBlocksInitialCaretPosition,\n\t\t\t\tisNavigationMode,\n\t\t\t\tisBlockSelected,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tif ( ! isBlockSelected( clientId ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isNavigationMode() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there's no initial position, return 0 to focus the start.\n\t\t\treturn getSelectedBlocksInitialCaretPosition();\n\t\t},\n\t\t[ clientId ]\n\t);\n}\n\n/**\n * Transitions focus to the block or inner tabbable when the block becomes\n * selected and an initial position is set.\n *\n * @param {string} clientId Block client ID.\n *\n * @return {RefObject} React ref with the block element.\n */\nexport function useFocusFirstElement( clientId ) {\n\tconst ref = useRef();\n\tconst initialPosition = useInitialPosition( clientId );\n\tconst { isBlockSelected, isMultiSelecting } = useSelect( blockEditorStore );\n\n\tuseEffect( () => {\n\t\t// Check if the block is still selected at the time this effect runs.\n\t\tif ( ! isBlockSelected( clientId ) || isMultiSelecting() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( initialPosition === undefined || initialPosition === null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! ref.current ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { ownerDocument } = ref.current;\n\n\t\t// Do not focus the block if it already contains the active element.\n\t\tif ( ref.current.contains( ownerDocument.activeElement ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find all tabbables within node.\n\t\tconst textInputs = focus.tabbable\n\t\t\t.find( ref.current )\n\t\t\t.filter( ( node ) => isTextField( node ) );\n\n\t\t// If reversed (e.g. merge via backspace), use the last in the set of\n\t\t// tabbables.\n\t\tconst isReverse = -1 === initialPosition;\n\t\tconst target =\n\t\t\t( isReverse ? last : first )( textInputs ) || ref.current;\n\n\t\tif ( ! isInsideRootBlock( ref.current, target ) ) {\n\t\t\tref.current.focus();\n\t\t\treturn;\n\t\t}\n\n\t\t// Check to see if element is focussable before a generic caret insert.\n\t\tif ( ! ref.current.getAttribute( 'contenteditable' ) ) {\n\t\t\tconst focusElement = focus.tabbable.findNext( ref.current );\n\t\t\t// Make sure focusElement is valid, contained in the same block, and a form field.\n\t\t\tif (\n\t\t\t\tfocusElement &&\n\t\t\t\tisInsideRootBlock( ref.current, focusElement ) &&\n\t\t\t\tisFormElement( focusElement )\n\t\t\t) {\n\t\t\t\tfocusElement.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tplaceCaretAtHorizontalEdge( target, isReverse );\n\t}, [ initialPosition, clientId ] );\n\n\treturn ref;\n}\n"]}
@@ -33,8 +33,14 @@ export function useFocusHandler(clientId) {
33
33
  * @param {FocusEvent} event Focus event.
34
34
  */
35
35
  function onFocus(event) {
36
- // Check synchronously because a non-selected block might be
36
+ // When the whole editor is editable, let writing flow handle
37
+ // selection.
38
+ if (node.parentElement.closest('[contenteditable="true"]')) {
39
+ return;
40
+ } // Check synchronously because a non-selected block might be
37
41
  // getting data through `useSelect` asynchronously.
42
+
43
+
38
44
  if (isBlockSelected(clientId)) {
39
45
  // Potentially change selection away from rich text.
40
46
  if (!event.target.isContentEditable) {
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/use-block-props/use-focus-handler.js"],"names":["useSelect","useDispatch","useRefEffect","isInsideRootBlock","store","blockEditorStore","useFocusHandler","clientId","isBlockSelected","selectBlock","selectionChange","node","onFocus","event","target","isContentEditable","addEventListener","removeEventListener"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,SAAT,EAAoBC,WAApB,QAAuC,iBAAvC;AACA,SAASC,YAAT,QAA6B,oBAA7B;AAEA;AACA;AACA;;AACA,SAASC,iBAAT,QAAkC,oBAAlC;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,gBAA1C;AAEA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASC,eAAT,CAA0BC,QAA1B,EAAqC;AAC3C,QAAM;AAAEC,IAAAA;AAAF,MAAsBR,SAAS,CAAEK,gBAAF,CAArC;AACA,QAAM;AAAEI,IAAAA,WAAF;AAAeC,IAAAA;AAAf,MAAmCT,WAAW,CAAEI,gBAAF,CAApD;AAEA,SAAOH,YAAY,CAChBS,IAAF,IAAY;AACX;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACG,aAASC,OAAT,CAAkBC,KAAlB,EAA0B;AACzB;AACA;AACA,UAAKL,eAAe,CAAED,QAAF,CAApB,EAAmC;AAClC;AACA,YAAK,CAAEM,KAAK,CAACC,MAAN,CAAaC,iBAApB,EAAwC;AACvCL,UAAAA,eAAe,CAAEH,QAAF,CAAf;AACA;;AACD;AACA,OATwB,CAWzB;AACA;;;AACA,UAAK,CAAEJ,iBAAiB,CAAEQ,IAAF,EAAQE,KAAK,CAACC,MAAd,CAAxB,EAAiD;AAChD;AACA;;AAEDL,MAAAA,WAAW,CAAEF,QAAF,CAAX;AACA;;AAEDI,IAAAA,IAAI,CAACK,gBAAL,CAAuB,SAAvB,EAAkCJ,OAAlC;AAEA,WAAO,MAAM;AACZD,MAAAA,IAAI,CAACM,mBAAL,CAA0B,SAA1B,EAAqCL,OAArC;AACA,KAFD;AAGA,GAnCiB,EAoClB,CAAEJ,eAAF,EAAmBC,WAAnB,CApCkB,CAAnB;AAsCA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { isInsideRootBlock } from '../../../utils/dom';\nimport { store as blockEditorStore } from '../../../store';\n\n/**\n * Selects the block if it receives focus.\n *\n * @param {string} clientId Block client ID.\n */\nexport function useFocusHandler( clientId ) {\n\tconst { isBlockSelected } = useSelect( blockEditorStore );\n\tconst { selectBlock, selectionChange } = useDispatch( blockEditorStore );\n\n\treturn useRefEffect(\n\t\t( node ) => {\n\t\t\t/**\n\t\t\t * Marks the block as selected when focused and not already\n\t\t\t * selected. This specifically handles the case where block does not\n\t\t\t * set focus on its own (via `setFocus`), typically if there is no\n\t\t\t * focusable input in the block.\n\t\t\t *\n\t\t\t * @param {FocusEvent} event Focus event.\n\t\t\t */\n\t\t\tfunction onFocus( event ) {\n\t\t\t\t// Check synchronously because a non-selected block might be\n\t\t\t\t// getting data through `useSelect` asynchronously.\n\t\t\t\tif ( isBlockSelected( clientId ) ) {\n\t\t\t\t\t// Potentially change selection away from rich text.\n\t\t\t\t\tif ( ! event.target.isContentEditable ) {\n\t\t\t\t\t\tselectionChange( clientId );\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If an inner block is focussed, that block is resposible for\n\t\t\t\t// setting the selected block.\n\t\t\t\tif ( ! isInsideRootBlock( node, event.target ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tselectBlock( clientId );\n\t\t\t}\n\n\t\t\tnode.addEventListener( 'focusin', onFocus );\n\n\t\t\treturn () => {\n\t\t\t\tnode.removeEventListener( 'focusin', onFocus );\n\t\t\t};\n\t\t},\n\t\t[ isBlockSelected, selectBlock ]\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/use-block-props/use-focus-handler.js"],"names":["useSelect","useDispatch","useRefEffect","isInsideRootBlock","store","blockEditorStore","useFocusHandler","clientId","isBlockSelected","selectBlock","selectionChange","node","onFocus","event","parentElement","closest","target","isContentEditable","addEventListener","removeEventListener"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,SAAT,EAAoBC,WAApB,QAAuC,iBAAvC;AACA,SAASC,YAAT,QAA6B,oBAA7B;AAEA;AACA;AACA;;AACA,SAASC,iBAAT,QAAkC,oBAAlC;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,gBAA1C;AAEA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASC,eAAT,CAA0BC,QAA1B,EAAqC;AAC3C,QAAM;AAAEC,IAAAA;AAAF,MAAsBR,SAAS,CAAEK,gBAAF,CAArC;AACA,QAAM;AAAEI,IAAAA,WAAF;AAAeC,IAAAA;AAAf,MAAmCT,WAAW,CAAEI,gBAAF,CAApD;AAEA,SAAOH,YAAY,CAChBS,IAAF,IAAY;AACX;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACG,aAASC,OAAT,CAAkBC,KAAlB,EAA0B;AACzB;AACA;AACA,UACCF,IAAI,CAACG,aAAL,CAAmBC,OAAnB,CAA4B,0BAA5B,CADD,EAEE;AACD;AACA,OAPwB,CASzB;AACA;;;AACA,UAAKP,eAAe,CAAED,QAAF,CAApB,EAAmC;AAClC;AACA,YAAK,CAAEM,KAAK,CAACG,MAAN,CAAaC,iBAApB,EAAwC;AACvCP,UAAAA,eAAe,CAAEH,QAAF,CAAf;AACA;;AACD;AACA,OAjBwB,CAmBzB;AACA;;;AACA,UAAK,CAAEJ,iBAAiB,CAAEQ,IAAF,EAAQE,KAAK,CAACG,MAAd,CAAxB,EAAiD;AAChD;AACA;;AAEDP,MAAAA,WAAW,CAAEF,QAAF,CAAX;AACA;;AAEDI,IAAAA,IAAI,CAACO,gBAAL,CAAuB,SAAvB,EAAkCN,OAAlC;AAEA,WAAO,MAAM;AACZD,MAAAA,IAAI,CAACQ,mBAAL,CAA0B,SAA1B,EAAqCP,OAArC;AACA,KAFD;AAGA,GA3CiB,EA4ClB,CAAEJ,eAAF,EAAmBC,WAAnB,CA5CkB,CAAnB;AA8CA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { isInsideRootBlock } from '../../../utils/dom';\nimport { store as blockEditorStore } from '../../../store';\n\n/**\n * Selects the block if it receives focus.\n *\n * @param {string} clientId Block client ID.\n */\nexport function useFocusHandler( clientId ) {\n\tconst { isBlockSelected } = useSelect( blockEditorStore );\n\tconst { selectBlock, selectionChange } = useDispatch( blockEditorStore );\n\n\treturn useRefEffect(\n\t\t( node ) => {\n\t\t\t/**\n\t\t\t * Marks the block as selected when focused and not already\n\t\t\t * selected. This specifically handles the case where block does not\n\t\t\t * set focus on its own (via `setFocus`), typically if there is no\n\t\t\t * focusable input in the block.\n\t\t\t *\n\t\t\t * @param {FocusEvent} event Focus event.\n\t\t\t */\n\t\t\tfunction onFocus( event ) {\n\t\t\t\t// When the whole editor is editable, let writing flow handle\n\t\t\t\t// selection.\n\t\t\t\tif (\n\t\t\t\t\tnode.parentElement.closest( '[contenteditable=\"true\"]' )\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check synchronously because a non-selected block might be\n\t\t\t\t// getting data through `useSelect` asynchronously.\n\t\t\t\tif ( isBlockSelected( clientId ) ) {\n\t\t\t\t\t// Potentially change selection away from rich text.\n\t\t\t\t\tif ( ! event.target.isContentEditable ) {\n\t\t\t\t\t\tselectionChange( clientId );\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If an inner block is focussed, that block is resposible for\n\t\t\t\t// setting the selected block.\n\t\t\t\tif ( ! isInsideRootBlock( node, event.target ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tselectBlock( clientId );\n\t\t\t}\n\n\t\t\tnode.addEventListener( 'focusin', onFocus );\n\n\t\t\treturn () => {\n\t\t\t\tnode.removeEventListener( 'focusin', onFocus );\n\t\t\t};\n\t\t},\n\t\t[ isBlockSelected, selectBlock ]\n\t);\n}\n"]}
@@ -71,7 +71,12 @@ function BlockListAppender(_ref) {
71
71
  // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus
72
72
  , {
73
73
  tabIndex: -1,
74
- className: classnames('block-list-appender wp-block', className) // The appender exists to let you add the first Paragraph before
74
+ className: classnames('block-list-appender wp-block', className) // Needed in case the whole editor is content editable (for multi
75
+ // selection). It fixes an edge case where ArrowDown and ArrowRight
76
+ // should collapse the selection to the end of that selection and
77
+ // not into the appender.
78
+ ,
79
+ contentEditable: false // The appender exists to let you add the first Paragraph before
75
80
  // any is inserted. To that end, this appender should visually be
76
81
  // presented as a block. That means theme CSS should style it as if
77
82
  // it were an empty paragraph block. That means a `wp-block` class to
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-list-appender/index.js"],"names":["classnames","withSelect","getDefaultBlockName","DefaultBlockAppender","ButtonBlockAppender","store","blockEditorStore","BlockListAppender","rootClientId","canInsertDefaultBlock","isLocked","renderAppender","CustomAppender","className","selectedBlockClientId","tagName","TagName","appender","isParentSelected","select","canInsertBlockType","getTemplateLock","getSelectedBlockClientId"],"mappings":";;AAAA;AACA;AACA;AACA,OAAOA,UAAP,MAAuB,YAAvB;AAEA;AACA;AACA;;AACA,SAASC,UAAT,QAA2B,iBAA3B;AACA,SAASC,mBAAT,QAAoC,mBAApC;AAEA;AACA;AACA;;AACA,OAAOC,oBAAP,MAAiC,2BAAjC;AACA,OAAOC,mBAAP,MAAgC,0BAAhC;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;;AAEA,SAASC,iBAAT,OAQI;AAAA,MARwB;AAC3BC,IAAAA,YAD2B;AAE3BC,IAAAA,qBAF2B;AAG3BC,IAAAA,QAH2B;AAI3BC,IAAAA,cAAc,EAAEC,cAJW;AAK3BC,IAAAA,SAL2B;AAM3BC,IAAAA,qBAN2B;AAO3BC,IAAAA,OAAO,EAAEC,OAAO,GAAG;AAPQ,GAQxB;;AACH,MAAKN,QAAQ,IAAIE,cAAc,KAAK,KAApC,EAA4C;AAC3C,WAAO,IAAP;AACA;;AAED,MAAIK,QAAJ;;AACA,MAAKL,cAAL,EAAsB;AACrB;AACAK,IAAAA,QAAQ,GAAG,cAAC,cAAD,OAAX;AACA,GAHD,MAGO;AACN,UAAMC,gBAAgB,GACrBJ,qBAAqB,KAAKN,YAA1B,IACE,CAAEA,YAAF,IAAkB,CAAEM,qBAFvB;;AAIA,QAAK,CAAEI,gBAAP,EAA0B;AACzB,aAAO,IAAP;AACA;;AAED,QAAKT,qBAAL,EAA6B;AAC5B;AACA;AACAQ,MAAAA,QAAQ,GAAG,cAAC,oBAAD;AAAsB,QAAA,YAAY,EAAGT;AAArC,QAAX;AACA,KAJD,MAIO;AACN;AACA;AACAS,MAAAA,QAAQ,GACP,cAAC,mBAAD;AACC,QAAA,YAAY,EAAGT,YADhB;AAEC,QAAA,SAAS,EAAC;AAFX,QADD;AAMA;AACD;;AAED,SACC,cAAC,OAAD,CACC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARD;AASC,IAAA,QAAQ,EAAG,CAAC,CATb;AAUC,IAAA,SAAS,EAAGR,UAAU,CACrB,8BADqB,EAErBa,SAFqB,CAVvB,CAcC;AACA;AACA;AACA;AACA;AACA;AACA;AApBD;AAqBC;AArBD,KAuBGI,QAvBH,CADD;AA2BA;;AAED,eAAehB,UAAU,CAAE,CAAEkB,MAAF,YAAgC;AAAA,MAAtB;AAAEX,IAAAA;AAAF,GAAsB;AAC1D,QAAM;AACLY,IAAAA,kBADK;AAELC,IAAAA,eAFK;AAGLC,IAAAA;AAHK,MAIFH,MAAM,CAAEb,gBAAF,CAJV;AAMA,SAAO;AACNI,IAAAA,QAAQ,EAAE,CAAC,CAAEW,eAAe,CAAEb,YAAF,CADtB;AAENC,IAAAA,qBAAqB,EAAEW,kBAAkB,CACxClB,mBAAmB,EADqB,EAExCM,YAFwC,CAFnC;AAMNM,IAAAA,qBAAqB,EAAEQ,wBAAwB;AANzC,GAAP;AAQA,CAfwB,CAAV,CAeVf,iBAfU,CAAf","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { withSelect } from '@wordpress/data';\nimport { getDefaultBlockName } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport DefaultBlockAppender from '../default-block-appender';\nimport ButtonBlockAppender from '../button-block-appender';\nimport { store as blockEditorStore } from '../../store';\n\nfunction BlockListAppender( {\n\trootClientId,\n\tcanInsertDefaultBlock,\n\tisLocked,\n\trenderAppender: CustomAppender,\n\tclassName,\n\tselectedBlockClientId,\n\ttagName: TagName = 'div',\n} ) {\n\tif ( isLocked || CustomAppender === false ) {\n\t\treturn null;\n\t}\n\n\tlet appender;\n\tif ( CustomAppender ) {\n\t\t// Prefer custom render prop if provided.\n\t\tappender = <CustomAppender />;\n\t} else {\n\t\tconst isParentSelected =\n\t\t\tselectedBlockClientId === rootClientId ||\n\t\t\t( ! rootClientId && ! selectedBlockClientId );\n\n\t\tif ( ! isParentSelected ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( canInsertDefaultBlock ) {\n\t\t\t// Render the default block appender when renderAppender has not been\n\t\t\t// provided and the context supports use of the default appender.\n\t\t\tappender = <DefaultBlockAppender rootClientId={ rootClientId } />;\n\t\t} else {\n\t\t\t// Fallback in the case no renderAppender has been provided and the\n\t\t\t// default block can't be inserted.\n\t\t\tappender = (\n\t\t\t\t<ButtonBlockAppender\n\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\tclassName=\"block-list-appender__toggle\"\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\t<TagName\n\t\t\t// A `tabIndex` is used on the wrapping `div` element in order to\n\t\t\t// force a focus event to occur when an appender `button` element\n\t\t\t// is clicked. In some browsers (Firefox, Safari), button clicks do\n\t\t\t// not emit a focus event, which could cause this event to propagate\n\t\t\t// unexpectedly. The `tabIndex` ensures that the interaction is\n\t\t\t// captured as a focus, without also adding an extra tab stop.\n\t\t\t//\n\t\t\t// See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus\n\t\t\ttabIndex={ -1 }\n\t\t\tclassName={ classnames(\n\t\t\t\t'block-list-appender wp-block',\n\t\t\t\tclassName\n\t\t\t) }\n\t\t\t// The appender exists to let you add the first Paragraph before\n\t\t\t// any is inserted. To that end, this appender should visually be\n\t\t\t// presented as a block. That means theme CSS should style it as if\n\t\t\t// it were an empty paragraph block. That means a `wp-block` class to\n\t\t\t// ensure the width is correct, and a [data-block] attribute to ensure\n\t\t\t// the correct margin is applied, especially for classic themes which\n\t\t\t// have commonly targeted that attribute for margins.\n\t\t\tdata-block\n\t\t>\n\t\t\t{ appender }\n\t\t</TagName>\n\t);\n}\n\nexport default withSelect( ( select, { rootClientId } ) => {\n\tconst {\n\t\tcanInsertBlockType,\n\t\tgetTemplateLock,\n\t\tgetSelectedBlockClientId,\n\t} = select( blockEditorStore );\n\n\treturn {\n\t\tisLocked: !! getTemplateLock( rootClientId ),\n\t\tcanInsertDefaultBlock: canInsertBlockType(\n\t\t\tgetDefaultBlockName(),\n\t\t\trootClientId\n\t\t),\n\t\tselectedBlockClientId: getSelectedBlockClientId(),\n\t};\n} )( BlockListAppender );\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-list-appender/index.js"],"names":["classnames","withSelect","getDefaultBlockName","DefaultBlockAppender","ButtonBlockAppender","store","blockEditorStore","BlockListAppender","rootClientId","canInsertDefaultBlock","isLocked","renderAppender","CustomAppender","className","selectedBlockClientId","tagName","TagName","appender","isParentSelected","select","canInsertBlockType","getTemplateLock","getSelectedBlockClientId"],"mappings":";;AAAA;AACA;AACA;AACA,OAAOA,UAAP,MAAuB,YAAvB;AAEA;AACA;AACA;;AACA,SAASC,UAAT,QAA2B,iBAA3B;AACA,SAASC,mBAAT,QAAoC,mBAApC;AAEA;AACA;AACA;;AACA,OAAOC,oBAAP,MAAiC,2BAAjC;AACA,OAAOC,mBAAP,MAAgC,0BAAhC;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;;AAEA,SAASC,iBAAT,OAQI;AAAA,MARwB;AAC3BC,IAAAA,YAD2B;AAE3BC,IAAAA,qBAF2B;AAG3BC,IAAAA,QAH2B;AAI3BC,IAAAA,cAAc,EAAEC,cAJW;AAK3BC,IAAAA,SAL2B;AAM3BC,IAAAA,qBAN2B;AAO3BC,IAAAA,OAAO,EAAEC,OAAO,GAAG;AAPQ,GAQxB;;AACH,MAAKN,QAAQ,IAAIE,cAAc,KAAK,KAApC,EAA4C;AAC3C,WAAO,IAAP;AACA;;AAED,MAAIK,QAAJ;;AACA,MAAKL,cAAL,EAAsB;AACrB;AACAK,IAAAA,QAAQ,GAAG,cAAC,cAAD,OAAX;AACA,GAHD,MAGO;AACN,UAAMC,gBAAgB,GACrBJ,qBAAqB,KAAKN,YAA1B,IACE,CAAEA,YAAF,IAAkB,CAAEM,qBAFvB;;AAIA,QAAK,CAAEI,gBAAP,EAA0B;AACzB,aAAO,IAAP;AACA;;AAED,QAAKT,qBAAL,EAA6B;AAC5B;AACA;AACAQ,MAAAA,QAAQ,GAAG,cAAC,oBAAD;AAAsB,QAAA,YAAY,EAAGT;AAArC,QAAX;AACA,KAJD,MAIO;AACN;AACA;AACAS,MAAAA,QAAQ,GACP,cAAC,mBAAD;AACC,QAAA,YAAY,EAAGT,YADhB;AAEC,QAAA,SAAS,EAAC;AAFX,QADD;AAMA;AACD;;AAED,SACC,cAAC,OAAD,CACC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARD;AASC,IAAA,QAAQ,EAAG,CAAC,CATb;AAUC,IAAA,SAAS,EAAGR,UAAU,CACrB,8BADqB,EAErBa,SAFqB,CAVvB,CAcC;AACA;AACA;AACA;AAjBD;AAkBC,IAAA,eAAe,EAAG,KAlBnB,CAmBC;AACA;AACA;AACA;AACA;AACA;AACA;AAzBD;AA0BC;AA1BD,KA4BGI,QA5BH,CADD;AAgCA;;AAED,eAAehB,UAAU,CAAE,CAAEkB,MAAF,YAAgC;AAAA,MAAtB;AAAEX,IAAAA;AAAF,GAAsB;AAC1D,QAAM;AACLY,IAAAA,kBADK;AAELC,IAAAA,eAFK;AAGLC,IAAAA;AAHK,MAIFH,MAAM,CAAEb,gBAAF,CAJV;AAMA,SAAO;AACNI,IAAAA,QAAQ,EAAE,CAAC,CAAEW,eAAe,CAAEb,YAAF,CADtB;AAENC,IAAAA,qBAAqB,EAAEW,kBAAkB,CACxClB,mBAAmB,EADqB,EAExCM,YAFwC,CAFnC;AAMNM,IAAAA,qBAAqB,EAAEQ,wBAAwB;AANzC,GAAP;AAQA,CAfwB,CAAV,CAeVf,iBAfU,CAAf","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { withSelect } from '@wordpress/data';\nimport { getDefaultBlockName } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport DefaultBlockAppender from '../default-block-appender';\nimport ButtonBlockAppender from '../button-block-appender';\nimport { store as blockEditorStore } from '../../store';\n\nfunction BlockListAppender( {\n\trootClientId,\n\tcanInsertDefaultBlock,\n\tisLocked,\n\trenderAppender: CustomAppender,\n\tclassName,\n\tselectedBlockClientId,\n\ttagName: TagName = 'div',\n} ) {\n\tif ( isLocked || CustomAppender === false ) {\n\t\treturn null;\n\t}\n\n\tlet appender;\n\tif ( CustomAppender ) {\n\t\t// Prefer custom render prop if provided.\n\t\tappender = <CustomAppender />;\n\t} else {\n\t\tconst isParentSelected =\n\t\t\tselectedBlockClientId === rootClientId ||\n\t\t\t( ! rootClientId && ! selectedBlockClientId );\n\n\t\tif ( ! isParentSelected ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( canInsertDefaultBlock ) {\n\t\t\t// Render the default block appender when renderAppender has not been\n\t\t\t// provided and the context supports use of the default appender.\n\t\t\tappender = <DefaultBlockAppender rootClientId={ rootClientId } />;\n\t\t} else {\n\t\t\t// Fallback in the case no renderAppender has been provided and the\n\t\t\t// default block can't be inserted.\n\t\t\tappender = (\n\t\t\t\t<ButtonBlockAppender\n\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\tclassName=\"block-list-appender__toggle\"\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\t<TagName\n\t\t\t// A `tabIndex` is used on the wrapping `div` element in order to\n\t\t\t// force a focus event to occur when an appender `button` element\n\t\t\t// is clicked. In some browsers (Firefox, Safari), button clicks do\n\t\t\t// not emit a focus event, which could cause this event to propagate\n\t\t\t// unexpectedly. The `tabIndex` ensures that the interaction is\n\t\t\t// captured as a focus, without also adding an extra tab stop.\n\t\t\t//\n\t\t\t// See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus\n\t\t\ttabIndex={ -1 }\n\t\t\tclassName={ classnames(\n\t\t\t\t'block-list-appender wp-block',\n\t\t\t\tclassName\n\t\t\t) }\n\t\t\t// Needed in case the whole editor is content editable (for multi\n\t\t\t// selection). It fixes an edge case where ArrowDown and ArrowRight\n\t\t\t// should collapse the selection to the end of that selection and\n\t\t\t// not into the appender.\n\t\t\tcontentEditable={ false }\n\t\t\t// The appender exists to let you add the first Paragraph before\n\t\t\t// any is inserted. To that end, this appender should visually be\n\t\t\t// presented as a block. That means theme CSS should style it as if\n\t\t\t// it were an empty paragraph block. That means a `wp-block` class to\n\t\t\t// ensure the width is correct, and a [data-block] attribute to ensure\n\t\t\t// the correct margin is applied, especially for classic themes which\n\t\t\t// have commonly targeted that attribute for margins.\n\t\t\tdata-block\n\t\t>\n\t\t\t{ appender }\n\t\t</TagName>\n\t);\n}\n\nexport default withSelect( ( select, { rootClientId } ) => {\n\tconst {\n\t\tcanInsertBlockType,\n\t\tgetTemplateLock,\n\t\tgetSelectedBlockClientId,\n\t} = select( blockEditorStore );\n\n\treturn {\n\t\tisLocked: !! getTemplateLock( rootClientId ),\n\t\tcanInsertDefaultBlock: canInsertBlockType(\n\t\t\tgetDefaultBlockName(),\n\t\t\trootClientId\n\t\t),\n\t\tselectedBlockClientId: getSelectedBlockClientId(),\n\t};\n} )( BlockListAppender );\n"]}
@@ -1,4 +1,5 @@
1
1
  export { default as BlockLockMenuItem } from './menu-item';
2
2
  export { default as BlockLockModal } from './modal';
3
3
  export { default as BlockLockToolbar } from './toolbar';
4
+ export { default as useBlockLock } from './use-block-lock';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/index.js"],"names":["default","BlockLockMenuItem","BlockLockModal","BlockLockToolbar"],"mappings":"AAAA,SAASA,OAAO,IAAIC,iBAApB,QAA6C,aAA7C;AACA,SAASD,OAAO,IAAIE,cAApB,QAA0C,SAA1C;AACA,SAASF,OAAO,IAAIG,gBAApB,QAA4C,WAA5C","sourcesContent":["export { default as BlockLockMenuItem } from './menu-item';\nexport { default as BlockLockModal } from './modal';\nexport { default as BlockLockToolbar } from './toolbar';\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/index.js"],"names":["default","BlockLockMenuItem","BlockLockModal","BlockLockToolbar","useBlockLock"],"mappings":"AAAA,SAASA,OAAO,IAAIC,iBAApB,QAA6C,aAA7C;AACA,SAASD,OAAO,IAAIE,cAApB,QAA0C,SAA1C;AACA,SAASF,OAAO,IAAIG,gBAApB,QAA4C,WAA5C;AACA,SAASH,OAAO,IAAII,YAApB,QAAwC,kBAAxC","sourcesContent":["export { default as BlockLockMenuItem } from './menu-item';\nexport { default as BlockLockModal } from './modal';\nexport { default as BlockLockToolbar } from './toolbar';\nexport { default as useBlockLock } from './use-block-lock';\n"]}
@@ -6,32 +6,27 @@ import { createElement, Fragment } from "@wordpress/element";
6
6
  import { __ } from '@wordpress/i18n';
7
7
  import { useReducer } from '@wordpress/element';
8
8
  import { MenuItem } from '@wordpress/components';
9
- import { useSelect } from '@wordpress/data';
10
9
  import { lock, unlock } from '@wordpress/icons';
11
10
  /**
12
11
  * Internal dependencies
13
12
  */
14
13
 
14
+ import useBlockLock from './use-block-lock';
15
15
  import BlockLockModal from './modal';
16
- import { store as blockEditorStore } from '../../store';
17
16
  export default function BlockLockMenuItem(_ref) {
18
17
  let {
19
18
  clientId
20
19
  } = _ref;
21
20
  const {
21
+ canLock,
22
22
  isLocked
23
- } = useSelect(select => {
24
- const {
25
- canMoveBlock,
26
- canRemoveBlock,
27
- getBlockRootClientId
28
- } = select(blockEditorStore);
29
- const rootClientId = getBlockRootClientId(clientId);
30
- return {
31
- isLocked: !canMoveBlock(clientId, rootClientId) || !canRemoveBlock(clientId, rootClientId)
32
- };
33
- }, [clientId]);
23
+ } = useBlockLock(clientId);
34
24
  const [isModalOpen, toggleModal] = useReducer(isActive => !isActive, false);
25
+
26
+ if (!canLock) {
27
+ return null;
28
+ }
29
+
35
30
  const label = isLocked ? __('Unlock') : __('Lock');
36
31
  return createElement(Fragment, null, createElement(MenuItem, {
37
32
  icon: isLocked ? unlock : lock,
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/menu-item.js"],"names":["__","useReducer","MenuItem","useSelect","lock","unlock","BlockLockModal","store","blockEditorStore","BlockLockMenuItem","clientId","isLocked","select","canMoveBlock","canRemoveBlock","getBlockRootClientId","rootClientId","isModalOpen","toggleModal","isActive","label"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,QAAmB,iBAAnB;AACA,SAASC,UAAT,QAA2B,oBAA3B;AACA,SAASC,QAAT,QAAyB,uBAAzB;AACA,SAASC,SAAT,QAA0B,iBAA1B;AACA,SAASC,IAAT,EAAeC,MAAf,QAA6B,kBAA7B;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,SAA3B;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AAEA,eAAe,SAASC,iBAAT,OAA2C;AAAA,MAAf;AAAEC,IAAAA;AAAF,GAAe;AACzD,QAAM;AAAEC,IAAAA;AAAF,MAAeR,SAAS,CAC3BS,MAAF,IAAc;AACb,UAAM;AACLC,MAAAA,YADK;AAELC,MAAAA,cAFK;AAGLC,MAAAA;AAHK,QAIFH,MAAM,CAAEJ,gBAAF,CAJV;AAKA,UAAMQ,YAAY,GAAGD,oBAAoB,CAAEL,QAAF,CAAzC;AAEA,WAAO;AACNC,MAAAA,QAAQ,EACP,CAAEE,YAAY,CAAEH,QAAF,EAAYM,YAAZ,CAAd,IACA,CAAEF,cAAc,CAAEJ,QAAF,EAAYM,YAAZ;AAHX,KAAP;AAKA,GAd4B,EAe7B,CAAEN,QAAF,CAf6B,CAA9B;AAkBA,QAAM,CAAEO,WAAF,EAAeC,WAAf,IAA+BjB,UAAU,CAC5CkB,QAAF,IAAgB,CAAEA,QAD4B,EAE9C,KAF8C,CAA/C;AAKA,QAAMC,KAAK,GAAGT,QAAQ,GAAGX,EAAE,CAAE,QAAF,CAAL,GAAoBA,EAAE,CAAE,MAAF,CAA5C;AAEA,SACC,8BACC,cAAC,QAAD;AAAU,IAAA,IAAI,EAAGW,QAAQ,GAAGN,MAAH,GAAYD,IAArC;AAA4C,IAAA,OAAO,EAAGc;AAAtD,KACGE,KADH,CADD,EAIGH,WAAW,IACZ,cAAC,cAAD;AAAgB,IAAA,QAAQ,EAAGP,QAA3B;AAAsC,IAAA,OAAO,EAAGQ;AAAhD,IALF,CADD;AAUA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useReducer } from '@wordpress/element';\nimport { MenuItem } from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { lock, unlock } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport BlockLockModal from './modal';\nimport { store as blockEditorStore } from '../../store';\n\nexport default function BlockLockMenuItem( { clientId } ) {\n\tconst { isLocked } = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tcanMoveBlock,\n\t\t\t\tcanRemoveBlock,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\n\t\t\treturn {\n\t\t\t\tisLocked:\n\t\t\t\t\t! canMoveBlock( clientId, rootClientId ) ||\n\t\t\t\t\t! canRemoveBlock( clientId, rootClientId ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst [ isModalOpen, toggleModal ] = useReducer(\n\t\t( isActive ) => ! isActive,\n\t\tfalse\n\t);\n\n\tconst label = isLocked ? __( 'Unlock' ) : __( 'Lock' );\n\n\treturn (\n\t\t<>\n\t\t\t<MenuItem icon={ isLocked ? unlock : lock } onClick={ toggleModal }>\n\t\t\t\t{ label }\n\t\t\t</MenuItem>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<BlockLockModal clientId={ clientId } onClose={ toggleModal } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/menu-item.js"],"names":["__","useReducer","MenuItem","lock","unlock","useBlockLock","BlockLockModal","BlockLockMenuItem","clientId","canLock","isLocked","isModalOpen","toggleModal","isActive","label"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,QAAmB,iBAAnB;AACA,SAASC,UAAT,QAA2B,oBAA3B;AACA,SAASC,QAAT,QAAyB,uBAAzB;AACA,SAASC,IAAT,EAAeC,MAAf,QAA6B,kBAA7B;AAEA;AACA;AACA;;AACA,OAAOC,YAAP,MAAyB,kBAAzB;AACA,OAAOC,cAAP,MAA2B,SAA3B;AAEA,eAAe,SAASC,iBAAT,OAA2C;AAAA,MAAf;AAAEC,IAAAA;AAAF,GAAe;AACzD,QAAM;AAAEC,IAAAA,OAAF;AAAWC,IAAAA;AAAX,MAAwBL,YAAY,CAAEG,QAAF,CAA1C;AAEA,QAAM,CAAEG,WAAF,EAAeC,WAAf,IAA+BX,UAAU,CAC5CY,QAAF,IAAgB,CAAEA,QAD4B,EAE9C,KAF8C,CAA/C;;AAKA,MAAK,CAAEJ,OAAP,EAAiB;AAChB,WAAO,IAAP;AACA;;AAED,QAAMK,KAAK,GAAGJ,QAAQ,GAAGV,EAAE,CAAE,QAAF,CAAL,GAAoBA,EAAE,CAAE,MAAF,CAA5C;AAEA,SACC,8BACC,cAAC,QAAD;AAAU,IAAA,IAAI,EAAGU,QAAQ,GAAGN,MAAH,GAAYD,IAArC;AAA4C,IAAA,OAAO,EAAGS;AAAtD,KACGE,KADH,CADD,EAIGH,WAAW,IACZ,cAAC,cAAD;AAAgB,IAAA,QAAQ,EAAGH,QAA3B;AAAsC,IAAA,OAAO,EAAGI;AAAhD,IALF,CADD;AAUA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useReducer } from '@wordpress/element';\nimport { MenuItem } from '@wordpress/components';\nimport { lock, unlock } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport useBlockLock from './use-block-lock';\nimport BlockLockModal from './modal';\n\nexport default function BlockLockMenuItem( { clientId } ) {\n\tconst { canLock, isLocked } = useBlockLock( clientId );\n\n\tconst [ isModalOpen, toggleModal ] = useReducer(\n\t\t( isActive ) => ! isActive,\n\t\tfalse\n\t);\n\n\tif ( ! canLock ) {\n\t\treturn null;\n\t}\n\n\tconst label = isLocked ? __( 'Unlock' ) : __( 'Lock' );\n\n\treturn (\n\t\t<>\n\t\t\t<MenuItem icon={ isLocked ? unlock : lock } onClick={ toggleModal }>\n\t\t\t\t{ label }\n\t\t\t</MenuItem>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<BlockLockModal clientId={ clientId } onClose={ toggleModal } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
@@ -6,13 +6,15 @@ import { createElement, Fragment } from "@wordpress/element";
6
6
  import { __, sprintf } from '@wordpress/i18n';
7
7
  import { useEffect, useState } from '@wordpress/element';
8
8
  import { Button, CheckboxControl, Flex, FlexItem, Icon, Modal } from '@wordpress/components';
9
- import { dragHandle, trash } from '@wordpress/icons';
9
+ import { lock as lockIcon, unlock as unlockIcon } from '@wordpress/icons';
10
10
  import { useInstanceId } from '@wordpress/compose';
11
11
  import { useDispatch, useSelect } from '@wordpress/data';
12
+ import { isReusableBlock, getBlockType } from '@wordpress/blocks';
12
13
  /**
13
14
  * Internal dependencies
14
15
  */
15
16
 
17
+ import useBlockLock from './use-block-lock';
16
18
  import useBlockDisplayInformation from '../use-block-display-information';
17
19
  import { store as blockEditorStore } from '../../store';
18
20
  export default function BlockLockModal(_ref) {
@@ -25,18 +27,19 @@ export default function BlockLockModal(_ref) {
25
27
  remove: false
26
28
  });
27
29
  const {
30
+ canEdit,
28
31
  canMove,
29
32
  canRemove
33
+ } = useBlockLock(clientId);
34
+ const {
35
+ isReusable
30
36
  } = useSelect(select => {
31
37
  const {
32
- canMoveBlock,
33
- canRemoveBlock,
34
- getBlockRootClientId
38
+ getBlockName
35
39
  } = select(blockEditorStore);
36
- const rootClientId = getBlockRootClientId(clientId);
40
+ const blockName = getBlockName(clientId);
37
41
  return {
38
- canMove: canMoveBlock(clientId, rootClientId),
39
- canRemove: canRemoveBlock(clientId, rootClientId)
42
+ isReusable: isReusableBlock(getBlockType(blockName))
40
43
  };
41
44
  }, [clientId]);
42
45
  const {
@@ -47,20 +50,14 @@ export default function BlockLockModal(_ref) {
47
50
  useEffect(() => {
48
51
  setLock({
49
52
  move: !canMove,
50
- remove: !canRemove
53
+ remove: !canRemove,
54
+ ...(isReusable ? {
55
+ edit: !canEdit
56
+ } : {})
51
57
  });
52
- }, [canMove, canRemove]);
58
+ }, [canEdit, canMove, canRemove, isReusable]);
53
59
  const isAllChecked = Object.values(lock).every(Boolean);
54
- let ariaChecked;
55
-
56
- if (isAllChecked) {
57
- ariaChecked = 'true';
58
- } else if (Object.values(lock).some(Boolean)) {
59
- ariaChecked = 'mixed';
60
- } else {
61
- ariaChecked = 'false';
62
- }
63
-
60
+ const isMixed = Object.values(lock).some(Boolean) && !isAllChecked;
64
61
  return createElement(Modal, {
65
62
  title: sprintf(
66
63
  /* translators: %s: Name of the block. */
@@ -86,18 +83,31 @@ export default function BlockLockModal(_ref) {
86
83
  id: instanceId
87
84
  }, __('Lock all')),
88
85
  checked: isAllChecked,
89
- "aria-checked": ariaChecked,
86
+ indeterminate: isMixed,
90
87
  onChange: newValue => setLock({
91
88
  move: newValue,
92
- remove: newValue
89
+ remove: newValue,
90
+ ...(isReusable ? {
91
+ edit: newValue
92
+ } : {})
93
93
  })
94
94
  }), createElement("ul", {
95
95
  className: "block-editor-block-lock-modal__checklist"
96
- }, createElement("li", {
96
+ }, isReusable && createElement("li", {
97
+ className: "block-editor-block-lock-modal__checklist-item"
98
+ }, createElement(CheckboxControl, {
99
+ label: createElement(Fragment, null, __('Restrict editing'), createElement(Icon, {
100
+ icon: lock.edit ? lockIcon : unlockIcon
101
+ })),
102
+ checked: !!lock.edit,
103
+ onChange: edit => setLock(prevLock => ({ ...prevLock,
104
+ edit
105
+ }))
106
+ })), createElement("li", {
97
107
  className: "block-editor-block-lock-modal__checklist-item"
98
108
  }, createElement(CheckboxControl, {
99
109
  label: createElement(Fragment, null, __('Disable movement'), createElement(Icon, {
100
- icon: dragHandle
110
+ icon: lock.move ? lockIcon : unlockIcon
101
111
  })),
102
112
  checked: lock.move,
103
113
  onChange: move => setLock(prevLock => ({ ...prevLock,
@@ -107,7 +117,7 @@ export default function BlockLockModal(_ref) {
107
117
  className: "block-editor-block-lock-modal__checklist-item"
108
118
  }, createElement(CheckboxControl, {
109
119
  label: createElement(Fragment, null, __('Prevent removal'), createElement(Icon, {
110
- icon: trash
120
+ icon: lock.remove ? lockIcon : unlockIcon
111
121
  })),
112
122
  checked: lock.remove,
113
123
  onChange: remove => setLock(prevLock => ({ ...prevLock,
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/modal.js"],"names":["__","sprintf","useEffect","useState","Button","CheckboxControl","Flex","FlexItem","Icon","Modal","dragHandle","trash","useInstanceId","useDispatch","useSelect","useBlockDisplayInformation","store","blockEditorStore","BlockLockModal","clientId","onClose","lock","setLock","move","remove","canMove","canRemove","select","canMoveBlock","canRemoveBlock","getBlockRootClientId","rootClientId","updateBlockAttributes","blockInformation","instanceId","isAllChecked","Object","values","every","Boolean","ariaChecked","some","title","event","preventDefault","newValue","prevLock"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { useEffect, useState } from '@wordpress/element';\nimport {\n\tButton,\n\tCheckboxControl,\n\tFlex,\n\tFlexItem,\n\tIcon,\n\tModal,\n} from '@wordpress/components';\nimport { dragHandle, trash } from '@wordpress/icons';\nimport { useInstanceId } from '@wordpress/compose';\nimport { useDispatch, useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport useBlockDisplayInformation from '../use-block-display-information';\nimport { store as blockEditorStore } from '../../store';\n\nexport default function BlockLockModal( { clientId, onClose } ) {\n\tconst [ lock, setLock ] = useState( { move: false, remove: false } );\n\tconst { canMove, canRemove } = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tcanMoveBlock,\n\t\t\t\tcanRemoveBlock,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\n\t\t\treturn {\n\t\t\t\tcanMove: canMoveBlock( clientId, rootClientId ),\n\t\t\t\tcanRemove: canRemoveBlock( clientId, rootClientId ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\tconst blockInformation = useBlockDisplayInformation( clientId );\n\tconst instanceId = useInstanceId(\n\t\tBlockLockModal,\n\t\t'block-editor-block-lock-modal__options-title'\n\t);\n\n\tuseEffect( () => {\n\t\tsetLock( {\n\t\t\tmove: ! canMove,\n\t\t\tremove: ! canRemove,\n\t\t} );\n\t}, [ canMove, canRemove ] );\n\n\tconst isAllChecked = Object.values( lock ).every( Boolean );\n\n\tlet ariaChecked;\n\tif ( isAllChecked ) {\n\t\tariaChecked = 'true';\n\t} else if ( Object.values( lock ).some( Boolean ) ) {\n\t\tariaChecked = 'mixed';\n\t} else {\n\t\tariaChecked = 'false';\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\ttitle={ sprintf(\n\t\t\t\t/* translators: %s: Name of the block. */\n\t\t\t\t__( 'Lock %s' ),\n\t\t\t\tblockInformation.title\n\t\t\t) }\n\t\t\toverlayClassName=\"block-editor-block-lock-modal\"\n\t\t\tcloseLabel={ __( 'Close' ) }\n\t\t\tonRequestClose={ onClose }\n\t\t>\n\t\t\t<form\n\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tupdateBlockAttributes( [ clientId ], { lock } );\n\t\t\t\t\tonClose();\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<p>\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'Choose specific attributes to restrict or lock all available options.'\n\t\t\t\t\t) }\n\t\t\t\t</p>\n\t\t\t\t<div\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\taria-labelledby={ instanceId }\n\t\t\t\t\tclassName=\"block-editor-block-lock-modal__options\"\n\t\t\t\t>\n\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\tclassName=\"block-editor-block-lock-modal__options-title\"\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t<span id={ instanceId }>{ __( 'Lock all' ) }</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchecked={ isAllChecked }\n\t\t\t\t\t\taria-checked={ ariaChecked }\n\t\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\t\tsetLock( {\n\t\t\t\t\t\t\t\tmove: newValue,\n\t\t\t\t\t\t\t\tremove: newValue,\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<ul className=\"block-editor-block-lock-modal__checklist\">\n\t\t\t\t\t\t<li className=\"block-editor-block-lock-modal__checklist-item\">\n\t\t\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Disable movement' ) }\n\t\t\t\t\t\t\t\t\t\t<Icon icon={ dragHandle } />\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tchecked={ lock.move }\n\t\t\t\t\t\t\t\tonChange={ ( move ) =>\n\t\t\t\t\t\t\t\t\tsetLock( ( prevLock ) => ( {\n\t\t\t\t\t\t\t\t\t\t...prevLock,\n\t\t\t\t\t\t\t\t\t\tmove,\n\t\t\t\t\t\t\t\t\t} ) )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"block-editor-block-lock-modal__checklist-item\">\n\t\t\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Prevent removal' ) }\n\t\t\t\t\t\t\t\t\t\t<Icon icon={ trash } />\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tchecked={ lock.remove }\n\t\t\t\t\t\t\t\tonChange={ ( remove ) =>\n\t\t\t\t\t\t\t\t\tsetLock( ( prevLock ) => ( {\n\t\t\t\t\t\t\t\t\t\t...prevLock,\n\t\t\t\t\t\t\t\t\t\tremove,\n\t\t\t\t\t\t\t\t\t} ) )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<Flex\n\t\t\t\t\tclassName=\"block-editor-block-lock-modal__actions\"\n\t\t\t\t\tjustify=\"flex-end\"\n\t\t\t\t\texpanded={ false }\n\t\t\t\t>\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<Button variant=\"tertiary\" onClick={ onClose }>\n\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<Button variant=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t{ __( 'Apply' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t</Flex>\n\t\t\t</form>\n\t\t</Modal>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/modal.js"],"names":["__","sprintf","useEffect","useState","Button","CheckboxControl","Flex","FlexItem","Icon","Modal","lock","lockIcon","unlock","unlockIcon","useInstanceId","useDispatch","useSelect","isReusableBlock","getBlockType","useBlockLock","useBlockDisplayInformation","store","blockEditorStore","BlockLockModal","clientId","onClose","setLock","move","remove","canEdit","canMove","canRemove","isReusable","select","getBlockName","blockName","updateBlockAttributes","blockInformation","instanceId","edit","isAllChecked","Object","values","every","Boolean","isMixed","some","title","event","preventDefault","newValue","prevLock"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { useEffect, useState } from '@wordpress/element';\nimport {\n\tButton,\n\tCheckboxControl,\n\tFlex,\n\tFlexItem,\n\tIcon,\n\tModal,\n} from '@wordpress/components';\nimport { lock as lockIcon, unlock as unlockIcon } from '@wordpress/icons';\nimport { useInstanceId } from '@wordpress/compose';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { isReusableBlock, getBlockType } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport useBlockLock from './use-block-lock';\nimport useBlockDisplayInformation from '../use-block-display-information';\nimport { store as blockEditorStore } from '../../store';\n\nexport default function BlockLockModal( { clientId, onClose } ) {\n\tconst [ lock, setLock ] = useState( { move: false, remove: false } );\n\tconst { canEdit, canMove, canRemove } = useBlockLock( clientId );\n\tconst { isReusable } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlockName } = select( blockEditorStore );\n\t\t\tconst blockName = getBlockName( clientId );\n\n\t\t\treturn {\n\t\t\t\tisReusable: isReusableBlock( getBlockType( blockName ) ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\tconst blockInformation = useBlockDisplayInformation( clientId );\n\tconst instanceId = useInstanceId(\n\t\tBlockLockModal,\n\t\t'block-editor-block-lock-modal__options-title'\n\t);\n\n\tuseEffect( () => {\n\t\tsetLock( {\n\t\t\tmove: ! canMove,\n\t\t\tremove: ! canRemove,\n\t\t\t...( isReusable ? { edit: ! canEdit } : {} ),\n\t\t} );\n\t}, [ canEdit, canMove, canRemove, isReusable ] );\n\n\tconst isAllChecked = Object.values( lock ).every( Boolean );\n\tconst isMixed = Object.values( lock ).some( Boolean ) && ! isAllChecked;\n\n\treturn (\n\t\t<Modal\n\t\t\ttitle={ sprintf(\n\t\t\t\t/* translators: %s: Name of the block. */\n\t\t\t\t__( 'Lock %s' ),\n\t\t\t\tblockInformation.title\n\t\t\t) }\n\t\t\toverlayClassName=\"block-editor-block-lock-modal\"\n\t\t\tcloseLabel={ __( 'Close' ) }\n\t\t\tonRequestClose={ onClose }\n\t\t>\n\t\t\t<form\n\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tupdateBlockAttributes( [ clientId ], { lock } );\n\t\t\t\t\tonClose();\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<p>\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'Choose specific attributes to restrict or lock all available options.'\n\t\t\t\t\t) }\n\t\t\t\t</p>\n\t\t\t\t<div\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\taria-labelledby={ instanceId }\n\t\t\t\t\tclassName=\"block-editor-block-lock-modal__options\"\n\t\t\t\t>\n\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\tclassName=\"block-editor-block-lock-modal__options-title\"\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t<span id={ instanceId }>{ __( 'Lock all' ) }</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchecked={ isAllChecked }\n\t\t\t\t\t\tindeterminate={ isMixed }\n\t\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\t\tsetLock( {\n\t\t\t\t\t\t\t\tmove: newValue,\n\t\t\t\t\t\t\t\tremove: newValue,\n\t\t\t\t\t\t\t\t...( isReusable ? { edit: newValue } : {} ),\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<ul className=\"block-editor-block-lock-modal__checklist\">\n\t\t\t\t\t\t{ isReusable && (\n\t\t\t\t\t\t\t<li className=\"block-editor-block-lock-modal__checklist-item\">\n\t\t\t\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Restrict editing' ) }\n\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t\t\t\tlock.edit\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? lockIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: unlockIcon\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tchecked={ !! lock.edit }\n\t\t\t\t\t\t\t\t\tonChange={ ( edit ) =>\n\t\t\t\t\t\t\t\t\t\tsetLock( ( prevLock ) => ( {\n\t\t\t\t\t\t\t\t\t\t\t...prevLock,\n\t\t\t\t\t\t\t\t\t\t\tedit,\n\t\t\t\t\t\t\t\t\t\t} ) )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t<li className=\"block-editor-block-lock-modal__checklist-item\">\n\t\t\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Disable movement' ) }\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t\t\tlock.move\n\t\t\t\t\t\t\t\t\t\t\t\t\t? lockIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t: unlockIcon\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tchecked={ lock.move }\n\t\t\t\t\t\t\t\tonChange={ ( move ) =>\n\t\t\t\t\t\t\t\t\tsetLock( ( prevLock ) => ( {\n\t\t\t\t\t\t\t\t\t\t...prevLock,\n\t\t\t\t\t\t\t\t\t\tmove,\n\t\t\t\t\t\t\t\t\t} ) )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"block-editor-block-lock-modal__checklist-item\">\n\t\t\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Prevent removal' ) }\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t\t\tlock.remove\n\t\t\t\t\t\t\t\t\t\t\t\t\t? lockIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t: unlockIcon\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tchecked={ lock.remove }\n\t\t\t\t\t\t\t\tonChange={ ( remove ) =>\n\t\t\t\t\t\t\t\t\tsetLock( ( prevLock ) => ( {\n\t\t\t\t\t\t\t\t\t\t...prevLock,\n\t\t\t\t\t\t\t\t\t\tremove,\n\t\t\t\t\t\t\t\t\t} ) )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<Flex\n\t\t\t\t\tclassName=\"block-editor-block-lock-modal__actions\"\n\t\t\t\t\tjustify=\"flex-end\"\n\t\t\t\t\texpanded={ false }\n\t\t\t\t>\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<Button variant=\"tertiary\" onClick={ onClose }>\n\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<Button variant=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t{ __( 'Apply' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t</Flex>\n\t\t\t</form>\n\t\t</Modal>\n\t);\n}\n"]}
@@ -7,35 +7,31 @@ import { __, sprintf } from '@wordpress/i18n';
7
7
  import { ToolbarButton, ToolbarGroup } from '@wordpress/components';
8
8
  import { useReducer } from '@wordpress/element';
9
9
  import { lock } from '@wordpress/icons';
10
- import { useSelect } from '@wordpress/data';
11
10
  /**
12
11
  * Internal dependencies
13
12
  */
14
13
 
15
14
  import BlockLockModal from './modal';
15
+ import useBlockLock from './use-block-lock';
16
16
  import useBlockDisplayInformation from '../use-block-display-information';
17
- import { store as blockEditorStore } from '../../store';
18
17
  export default function BlockLockToolbar(_ref) {
19
18
  let {
20
19
  clientId
21
20
  } = _ref;
22
21
  const blockInformation = useBlockDisplayInformation(clientId);
23
22
  const {
23
+ canEdit,
24
24
  canMove,
25
- canRemove
26
- } = useSelect(select => {
27
- const {
28
- canMoveBlock,
29
- canRemoveBlock
30
- } = select(blockEditorStore);
31
- return {
32
- canMove: canMoveBlock(clientId),
33
- canRemove: canRemoveBlock(clientId)
34
- };
35
- }, [clientId]);
25
+ canRemove,
26
+ canLock
27
+ } = useBlockLock(clientId);
36
28
  const [isModalOpen, toggleModal] = useReducer(isActive => !isActive, false);
37
29
 
38
- if (canMove && canRemove) {
30
+ if (!canLock) {
31
+ return null;
32
+ }
33
+
34
+ if (canEdit && canMove && canRemove) {
39
35
  return null;
40
36
  }
41
37
 
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/toolbar.js"],"names":["__","sprintf","ToolbarButton","ToolbarGroup","useReducer","lock","useSelect","BlockLockModal","useBlockDisplayInformation","store","blockEditorStore","BlockLockToolbar","clientId","blockInformation","canMove","canRemove","select","canMoveBlock","canRemoveBlock","isModalOpen","toggleModal","isActive","title"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,EAAaC,OAAb,QAA4B,iBAA5B;AACA,SAASC,aAAT,EAAwBC,YAAxB,QAA4C,uBAA5C;AACA,SAASC,UAAT,QAA2B,oBAA3B;AACA,SAASC,IAAT,QAAqB,kBAArB;AACA,SAASC,SAAT,QAA0B,iBAA1B;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,SAA3B;AACA,OAAOC,0BAAP,MAAuC,kCAAvC;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AAEA,eAAe,SAASC,gBAAT,OAA0C;AAAA,MAAf;AAAEC,IAAAA;AAAF,GAAe;AACxD,QAAMC,gBAAgB,GAAGL,0BAA0B,CAAEI,QAAF,CAAnD;AACA,QAAM;AAAEE,IAAAA,OAAF;AAAWC,IAAAA;AAAX,MAAyBT,SAAS,CACrCU,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,YAAF;AAAgBC,MAAAA;AAAhB,QAAmCF,MAAM,CAAEN,gBAAF,CAA/C;AAEA,WAAO;AACNI,MAAAA,OAAO,EAAEG,YAAY,CAAEL,QAAF,CADf;AAENG,MAAAA,SAAS,EAAEG,cAAc,CAAEN,QAAF;AAFnB,KAAP;AAIA,GARsC,EASvC,CAAEA,QAAF,CATuC,CAAxC;AAYA,QAAM,CAAEO,WAAF,EAAeC,WAAf,IAA+BhB,UAAU,CAC5CiB,QAAF,IAAgB,CAAEA,QAD4B,EAE9C,KAF8C,CAA/C;;AAKA,MAAKP,OAAO,IAAIC,SAAhB,EAA4B;AAC3B,WAAO,IAAP;AACA;;AAED,SACC,8BACC,cAAC,YAAD;AAAc,IAAA,SAAS,EAAC;AAAxB,KACC,cAAC,aAAD;AACC,IAAA,IAAI,EAAGV,IADR;AAEC,IAAA,KAAK,EAAGJ,OAAO;AACd;AACAD,IAAAA,EAAE,CAAE,WAAF,CAFY,EAGda,gBAAgB,CAACS,KAHH,CAFhB;AAOC,IAAA,OAAO,EAAGF;AAPX,IADD,CADD,EAYGD,WAAW,IACZ,cAAC,cAAD;AAAgB,IAAA,QAAQ,EAAGP,QAA3B;AAAsC,IAAA,OAAO,EAAGQ;AAAhD,IAbF,CADD;AAkBA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { ToolbarButton, ToolbarGroup } from '@wordpress/components';\nimport { useReducer } from '@wordpress/element';\nimport { lock } from '@wordpress/icons';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport BlockLockModal from './modal';\nimport useBlockDisplayInformation from '../use-block-display-information';\nimport { store as blockEditorStore } from '../../store';\n\nexport default function BlockLockToolbar( { clientId } ) {\n\tconst blockInformation = useBlockDisplayInformation( clientId );\n\tconst { canMove, canRemove } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canMoveBlock, canRemoveBlock } = select( blockEditorStore );\n\n\t\t\treturn {\n\t\t\t\tcanMove: canMoveBlock( clientId ),\n\t\t\t\tcanRemove: canRemoveBlock( clientId ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst [ isModalOpen, toggleModal ] = useReducer(\n\t\t( isActive ) => ! isActive,\n\t\tfalse\n\t);\n\n\tif ( canMove && canRemove ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<ToolbarGroup className=\"block-editor-block-lock-toolbar\">\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ticon={ lock }\n\t\t\t\t\tlabel={ sprintf(\n\t\t\t\t\t\t/* translators: %s: block name */\n\t\t\t\t\t\t__( 'Unlock %s' ),\n\t\t\t\t\t\tblockInformation.title\n\t\t\t\t\t) }\n\t\t\t\t\tonClick={ toggleModal }\n\t\t\t\t/>\n\t\t\t</ToolbarGroup>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<BlockLockModal clientId={ clientId } onClose={ toggleModal } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/toolbar.js"],"names":["__","sprintf","ToolbarButton","ToolbarGroup","useReducer","lock","BlockLockModal","useBlockLock","useBlockDisplayInformation","BlockLockToolbar","clientId","blockInformation","canEdit","canMove","canRemove","canLock","isModalOpen","toggleModal","isActive","title"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,EAAaC,OAAb,QAA4B,iBAA5B;AACA,SAASC,aAAT,EAAwBC,YAAxB,QAA4C,uBAA5C;AACA,SAASC,UAAT,QAA2B,oBAA3B;AACA,SAASC,IAAT,QAAqB,kBAArB;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,SAA3B;AACA,OAAOC,YAAP,MAAyB,kBAAzB;AACA,OAAOC,0BAAP,MAAuC,kCAAvC;AAEA,eAAe,SAASC,gBAAT,OAA0C;AAAA,MAAf;AAAEC,IAAAA;AAAF,GAAe;AACxD,QAAMC,gBAAgB,GAAGH,0BAA0B,CAAEE,QAAF,CAAnD;AACA,QAAM;AAAEE,IAAAA,OAAF;AAAWC,IAAAA,OAAX;AAAoBC,IAAAA,SAApB;AAA+BC,IAAAA;AAA/B,MAA2CR,YAAY,CAAEG,QAAF,CAA7D;AAEA,QAAM,CAAEM,WAAF,EAAeC,WAAf,IAA+Bb,UAAU,CAC5Cc,QAAF,IAAgB,CAAEA,QAD4B,EAE9C,KAF8C,CAA/C;;AAKA,MAAK,CAAEH,OAAP,EAAiB;AAChB,WAAO,IAAP;AACA;;AAED,MAAKH,OAAO,IAAIC,OAAX,IAAsBC,SAA3B,EAAuC;AACtC,WAAO,IAAP;AACA;;AAED,SACC,8BACC,cAAC,YAAD;AAAc,IAAA,SAAS,EAAC;AAAxB,KACC,cAAC,aAAD;AACC,IAAA,IAAI,EAAGT,IADR;AAEC,IAAA,KAAK,EAAGJ,OAAO;AACd;AACAD,IAAAA,EAAE,CAAE,WAAF,CAFY,EAGdW,gBAAgB,CAACQ,KAHH,CAFhB;AAOC,IAAA,OAAO,EAAGF;AAPX,IADD,CADD,EAYGD,WAAW,IACZ,cAAC,cAAD;AAAgB,IAAA,QAAQ,EAAGN,QAA3B;AAAsC,IAAA,OAAO,EAAGO;AAAhD,IAbF,CADD;AAkBA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { ToolbarButton, ToolbarGroup } from '@wordpress/components';\nimport { useReducer } from '@wordpress/element';\nimport { lock } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport BlockLockModal from './modal';\nimport useBlockLock from './use-block-lock';\nimport useBlockDisplayInformation from '../use-block-display-information';\n\nexport default function BlockLockToolbar( { clientId } ) {\n\tconst blockInformation = useBlockDisplayInformation( clientId );\n\tconst { canEdit, canMove, canRemove, canLock } = useBlockLock( clientId );\n\n\tconst [ isModalOpen, toggleModal ] = useReducer(\n\t\t( isActive ) => ! isActive,\n\t\tfalse\n\t);\n\n\tif ( ! canLock ) {\n\t\treturn null;\n\t}\n\n\tif ( canEdit && canMove && canRemove ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<ToolbarGroup className=\"block-editor-block-lock-toolbar\">\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ticon={ lock }\n\t\t\t\t\tlabel={ sprintf(\n\t\t\t\t\t\t/* translators: %s: block name */\n\t\t\t\t\t\t__( 'Unlock %s' ),\n\t\t\t\t\t\tblockInformation.title\n\t\t\t\t\t) }\n\t\t\t\t\tonClick={ toggleModal }\n\t\t\t\t/>\n\t\t\t</ToolbarGroup>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<BlockLockModal clientId={ clientId } onClose={ toggleModal } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect } from '@wordpress/data';
5
+ /**
6
+ * Internal dependencies
7
+ */
8
+
9
+ import { store as blockEditorStore } from '../../store';
10
+ /**
11
+ * Return details about the block lock status.
12
+ *
13
+ * @param {string} clientId The block client Id.
14
+ *
15
+ * @return {Object} Block lock status
16
+ */
17
+
18
+ export default function useBlockLock(clientId) {
19
+ return useSelect(select => {
20
+ const {
21
+ canEditBlock,
22
+ canMoveBlock,
23
+ canRemoveBlock,
24
+ canLockBlockType,
25
+ getBlockName,
26
+ getBlockRootClientId
27
+ } = select(blockEditorStore);
28
+ const rootClientId = getBlockRootClientId(clientId);
29
+ const canEdit = canEditBlock(clientId);
30
+ const canMove = canMoveBlock(clientId, rootClientId);
31
+ const canRemove = canRemoveBlock(clientId, rootClientId);
32
+ return {
33
+ canEdit,
34
+ canMove,
35
+ canRemove,
36
+ canLock: canLockBlockType(getBlockName(clientId)),
37
+ isLocked: !canEdit || !canMove || !canRemove
38
+ };
39
+ }, [clientId]);
40
+ }
41
+ //# sourceMappingURL=use-block-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/use-block-lock.js"],"names":["useSelect","store","blockEditorStore","useBlockLock","clientId","select","canEditBlock","canMoveBlock","canRemoveBlock","canLockBlockType","getBlockName","getBlockRootClientId","rootClientId","canEdit","canMove","canRemove","canLock","isLocked"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,SAAT,QAA0B,iBAA1B;AAEA;AACA;AACA;;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,YAAT,CAAuBC,QAAvB,EAAkC;AAChD,SAAOJ,SAAS,CACbK,MAAF,IAAc;AACb,UAAM;AACLC,MAAAA,YADK;AAELC,MAAAA,YAFK;AAGLC,MAAAA,cAHK;AAILC,MAAAA,gBAJK;AAKLC,MAAAA,YALK;AAMLC,MAAAA;AANK,QAOFN,MAAM,CAAEH,gBAAF,CAPV;AAQA,UAAMU,YAAY,GAAGD,oBAAoB,CAAEP,QAAF,CAAzC;AAEA,UAAMS,OAAO,GAAGP,YAAY,CAAEF,QAAF,CAA5B;AACA,UAAMU,OAAO,GAAGP,YAAY,CAAEH,QAAF,EAAYQ,YAAZ,CAA5B;AACA,UAAMG,SAAS,GAAGP,cAAc,CAAEJ,QAAF,EAAYQ,YAAZ,CAAhC;AAEA,WAAO;AACNC,MAAAA,OADM;AAENC,MAAAA,OAFM;AAGNC,MAAAA,SAHM;AAINC,MAAAA,OAAO,EAAEP,gBAAgB,CAAEC,YAAY,CAAEN,QAAF,CAAd,CAJnB;AAKNa,MAAAA,QAAQ,EAAE,CAAEJ,OAAF,IAAa,CAAEC,OAAf,IAA0B,CAAEC;AALhC,KAAP;AAOA,GAvBc,EAwBf,CAAEX,QAAF,CAxBe,CAAhB;AA0BA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\n/**\n * Return details about the block lock status.\n *\n * @param {string} clientId The block client Id.\n *\n * @return {Object} Block lock status\n */\nexport default function useBlockLock( clientId ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tcanEditBlock,\n\t\t\t\tcanMoveBlock,\n\t\t\t\tcanRemoveBlock,\n\t\t\t\tcanLockBlockType,\n\t\t\t\tgetBlockName,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\n\t\t\tconst canEdit = canEditBlock( clientId );\n\t\t\tconst canMove = canMoveBlock( clientId, rootClientId );\n\t\t\tconst canRemove = canRemoveBlock( clientId, rootClientId );\n\n\t\t\treturn {\n\t\t\t\tcanEdit,\n\t\t\t\tcanMove,\n\t\t\t\tcanRemove,\n\t\t\t\tcanLock: canLockBlockType( getBlockName( clientId ) ),\n\t\t\t\tisLocked: ! canEdit || ! canMove || ! canRemove,\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n}\n"]}
@@ -81,6 +81,10 @@ function BlockMover(_ref) {
81
81
  clientIds: clientIds
82
82
  }, itemProps)))));
83
83
  }
84
+ /**
85
+ * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-mover/README.md
86
+ */
87
+
84
88
 
85
89
  export default withSelect((select, _ref2) => {
86
90
  var _getBlockListSettings;