@wordpress/block-editor 8.3.1 → 8.5.1

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 (475) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +56 -18
  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-content-overlay/index.js +13 -4
  8. package/build/components/block-content-overlay/index.js.map +1 -1
  9. package/build/components/block-draggable/index.js +2 -3
  10. package/build/components/block-draggable/index.js.map +1 -1
  11. package/build/components/block-icon/index.js +4 -0
  12. package/build/components/block-icon/index.js.map +1 -1
  13. package/build/components/block-inspector/index.js +6 -1
  14. package/build/components/block-inspector/index.js.map +1 -1
  15. package/build/components/block-list/block-html.js +4 -1
  16. package/build/components/block-list/block-html.js.map +1 -1
  17. package/build/components/block-list/block.js +4 -1
  18. package/build/components/block-list/block.js.map +1 -1
  19. package/build/components/block-list/use-block-props/index.js +1 -6
  20. package/build/components/block-list/use-block-props/index.js.map +1 -1
  21. package/build/components/block-list/use-block-props/use-focus-first-element.js +22 -6
  22. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  23. package/build/components/block-list/use-block-props/use-focus-handler.js +7 -1
  24. package/build/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  25. package/build/components/block-list-appender/index.js +6 -1
  26. package/build/components/block-list-appender/index.js.map +1 -1
  27. package/build/components/block-lock/index.js +40 -0
  28. package/build/components/block-lock/index.js.map +1 -0
  29. package/build/components/block-lock/menu-item.js +52 -0
  30. package/build/components/block-lock/menu-item.js.map +1 -0
  31. package/build/components/block-lock/modal.js +155 -0
  32. package/build/components/block-lock/modal.js.map +1 -0
  33. package/build/components/block-lock/toolbar.js +65 -0
  34. package/build/components/block-lock/toolbar.js.map +1 -0
  35. package/build/components/block-lock/use-block-lock.js +53 -0
  36. package/build/components/block-lock/use-block-lock.js.map +1 -0
  37. package/build/components/block-mover/index.js +4 -0
  38. package/build/components/block-mover/index.js.map +1 -1
  39. package/build/components/block-pattern-setup/index.js +37 -22
  40. package/build/components/block-pattern-setup/index.js.map +1 -1
  41. package/build/components/block-pattern-setup/setup-toolbar.js +1 -1
  42. package/build/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  43. package/build/components/block-preview/auto.js +6 -3
  44. package/build/components/block-preview/auto.js.map +1 -1
  45. package/build/components/block-preview/index.js +4 -2
  46. package/build/components/block-preview/index.js.map +1 -1
  47. package/build/components/block-settings-menu/block-settings-dropdown.js +75 -10
  48. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  49. package/build/components/block-settings-menu-controls/index.js +19 -9
  50. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  51. package/build/components/block-switcher/index.js +8 -3
  52. package/build/components/block-switcher/index.js.map +1 -1
  53. package/build/components/block-title/index.js +2 -2
  54. package/build/components/block-title/index.js.map +1 -1
  55. package/build/components/block-title/use-block-display-title.js +8 -6
  56. package/build/components/block-title/use-block-display-title.js.map +1 -1
  57. package/build/components/block-toolbar/block-name-context.js +17 -0
  58. package/build/components/block-toolbar/block-name-context.js.map +1 -0
  59. package/build/components/block-toolbar/block-toolbar-last-item.js +20 -0
  60. package/build/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  61. package/build/components/block-toolbar/index.js +24 -5
  62. package/build/components/block-toolbar/index.js.map +1 -1
  63. package/build/components/block-tools/index.js +0 -16
  64. package/build/components/block-tools/index.js.map +1 -1
  65. package/build/components/block-variation-transforms/index.js +92 -47
  66. package/build/components/block-variation-transforms/index.js.map +1 -1
  67. package/build/components/block-vertical-alignment-control/index.js +13 -6
  68. package/build/components/block-vertical-alignment-control/index.js.map +1 -1
  69. package/build/components/border-radius-control/index.js +0 -1
  70. package/build/components/border-radius-control/index.js.map +1 -1
  71. package/build/components/border-radius-control/utils.js +1 -1
  72. package/build/components/border-radius-control/utils.js.map +1 -1
  73. package/build/components/colors-gradients/control.js +3 -1
  74. package/build/components/colors-gradients/control.js.map +1 -1
  75. package/build/components/contrast-checker/index.js +4 -0
  76. package/build/components/contrast-checker/index.js.map +1 -1
  77. package/build/components/convert-to-group-buttons/index.js +8 -0
  78. package/build/components/convert-to-group-buttons/index.js.map +1 -1
  79. package/build/components/convert-to-group-buttons/toolbar.js +105 -0
  80. package/build/components/convert-to-group-buttons/toolbar.js.map +1 -0
  81. package/build/components/copy-handler/index.js +4 -0
  82. package/build/components/copy-handler/index.js.map +1 -1
  83. package/build/components/date-format-picker/index.js +132 -0
  84. package/build/components/date-format-picker/index.js.map +1 -0
  85. package/build/components/font-sizes/font-size-picker.js +4 -0
  86. package/build/components/font-sizes/font-size-picker.js.map +1 -1
  87. package/build/components/iframe/index.js +6 -9
  88. package/build/components/iframe/index.js.map +1 -1
  89. package/build/components/index.js +27 -0
  90. package/build/components/index.js.map +1 -1
  91. package/build/components/justify-content-control/index.js +13 -6
  92. package/build/components/justify-content-control/index.js.map +1 -1
  93. package/build/components/keyboard-shortcuts/index.js +1 -1
  94. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  95. package/build/components/line-height-control/index.js +15 -6
  96. package/build/components/line-height-control/index.js.map +1 -1
  97. package/build/components/list-view/block-select-button.js +18 -23
  98. package/build/components/list-view/block-select-button.js.map +1 -1
  99. package/build/components/list-view/block.js +38 -13
  100. package/build/components/list-view/block.js.map +1 -1
  101. package/build/components/list-view/branch.js +16 -13
  102. package/build/components/list-view/branch.js.map +1 -1
  103. package/build/components/list-view/index.js +7 -1
  104. package/build/components/list-view/index.js.map +1 -1
  105. package/build/components/list-view/use-block-selection.js +9 -2
  106. package/build/components/list-view/use-block-selection.js.map +1 -1
  107. package/build/components/media-replace-flow/index.js +4 -0
  108. package/build/components/media-replace-flow/index.js.map +1 -1
  109. package/build/components/multi-selection-inspector/index.js +1 -1
  110. package/build/components/multi-selection-inspector/index.js.map +1 -1
  111. package/build/components/rich-text/index.js +27 -5
  112. package/build/components/rich-text/index.js.map +1 -1
  113. package/build/components/rich-text/index.native.js +13 -9
  114. package/build/components/rich-text/index.native.js.map +1 -1
  115. package/build/components/rich-text/split-value.js +12 -2
  116. package/build/components/rich-text/split-value.js.map +1 -1
  117. package/build/components/rich-text/use-firefox-compat.js +49 -0
  118. package/build/components/rich-text/use-firefox-compat.js.map +1 -0
  119. package/build/components/rich-text/use-input-rules.js +34 -2
  120. package/build/components/rich-text/use-input-rules.js.map +1 -1
  121. package/build/components/skip-to-selected-block/index.js +4 -0
  122. package/build/components/skip-to-selected-block/index.js.map +1 -1
  123. package/build/components/url-popover/image-url-input-ui.js +11 -27
  124. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  125. package/build/components/writing-flow/index.js +9 -1
  126. package/build/components/writing-flow/index.js.map +1 -1
  127. package/build/components/writing-flow/use-arrow-nav.js +3 -44
  128. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  129. package/build/components/writing-flow/use-click-selection.js +68 -0
  130. package/build/components/writing-flow/use-click-selection.js.map +1 -0
  131. package/build/components/writing-flow/use-drag-selection.js +134 -0
  132. package/build/components/writing-flow/use-drag-selection.js.map +1 -0
  133. package/build/components/writing-flow/use-input.js +116 -0
  134. package/build/components/writing-flow/use-input.js.map +1 -0
  135. package/build/components/writing-flow/use-multi-selection.js +18 -38
  136. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  137. package/build/components/writing-flow/use-selection-observer.js +161 -0
  138. package/build/components/writing-flow/use-selection-observer.js.map +1 -0
  139. package/build/components/writing-flow/use-tab-nav.js +1 -8
  140. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  141. package/build/hooks/anchor.js +7 -6
  142. package/build/hooks/anchor.js.map +1 -1
  143. package/build/hooks/border-color.js +3 -3
  144. package/build/hooks/border-color.js.map +1 -1
  145. package/build/hooks/border.js +0 -14
  146. package/build/hooks/border.js.map +1 -1
  147. package/build/hooks/color.js +20 -17
  148. package/build/hooks/color.js.map +1 -1
  149. package/build/hooks/font-family.js +5 -1
  150. package/build/hooks/font-family.js.map +1 -1
  151. package/build/hooks/font-size.js +4 -2
  152. package/build/hooks/font-size.js.map +1 -1
  153. package/build/hooks/gap.js +77 -5
  154. package/build/hooks/gap.js.map +1 -1
  155. package/build/hooks/layout.js +7 -2
  156. package/build/hooks/layout.js.map +1 -1
  157. package/build/hooks/style.js +34 -3
  158. package/build/hooks/style.js.map +1 -1
  159. package/build/hooks/utils.js +29 -0
  160. package/build/hooks/utils.js.map +1 -1
  161. package/build/layouts/flex.js +82 -15
  162. package/build/layouts/flex.js.map +1 -1
  163. package/build/layouts/flow.js +22 -13
  164. package/build/layouts/flow.js.map +1 -1
  165. package/build/store/actions.js +297 -51
  166. package/build/store/actions.js.map +1 -1
  167. package/build/store/defaults.js +5 -1
  168. package/build/store/defaults.js.map +1 -1
  169. package/build/store/reducer.js +25 -13
  170. package/build/store/reducer.js.map +1 -1
  171. package/build/store/selectors.js +197 -23
  172. package/build/store/selectors.js.map +1 -1
  173. package/build/utils/dom.js +2 -1
  174. package/build/utils/dom.js.map +1 -1
  175. package/build-module/components/alignment-control/index.js +12 -4
  176. package/build-module/components/alignment-control/index.js.map +1 -1
  177. package/build-module/components/block-alignment-control/index.js +12 -4
  178. package/build-module/components/block-alignment-control/index.js.map +1 -1
  179. package/build-module/components/block-content-overlay/index.js +13 -4
  180. package/build-module/components/block-content-overlay/index.js.map +1 -1
  181. package/build-module/components/block-draggable/index.js +2 -3
  182. package/build-module/components/block-draggable/index.js.map +1 -1
  183. package/build-module/components/block-icon/index.js +4 -0
  184. package/build-module/components/block-icon/index.js.map +1 -1
  185. package/build-module/components/block-inspector/index.js +6 -1
  186. package/build-module/components/block-inspector/index.js.map +1 -1
  187. package/build-module/components/block-list/block-html.js +5 -2
  188. package/build-module/components/block-list/block-html.js.map +1 -1
  189. package/build-module/components/block-list/block.js +5 -2
  190. package/build-module/components/block-list/block.js.map +1 -1
  191. package/build-module/components/block-list/use-block-props/index.js +1 -4
  192. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  193. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +22 -6
  194. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  195. package/build-module/components/block-list/use-block-props/use-focus-handler.js +7 -1
  196. package/build-module/components/block-list/use-block-props/use-focus-handler.js.map +1 -1
  197. package/build-module/components/block-list-appender/index.js +6 -1
  198. package/build-module/components/block-list-appender/index.js.map +1 -1
  199. package/build-module/components/block-lock/index.js +5 -0
  200. package/build-module/components/block-lock/index.js.map +1 -0
  201. package/build-module/components/block-lock/menu-item.js +39 -0
  202. package/build-module/components/block-lock/menu-item.js.map +1 -0
  203. package/build-module/components/block-lock/modal.js +138 -0
  204. package/build-module/components/block-lock/modal.js.map +1 -0
  205. package/build-module/components/block-lock/toolbar.js +51 -0
  206. package/build-module/components/block-lock/toolbar.js.map +1 -0
  207. package/build-module/components/block-lock/use-block-lock.js +44 -0
  208. package/build-module/components/block-lock/use-block-lock.js.map +1 -0
  209. package/build-module/components/block-mover/index.js +4 -0
  210. package/build-module/components/block-mover/index.js.map +1 -1
  211. package/build-module/components/block-pattern-setup/index.js +39 -24
  212. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  213. package/build-module/components/block-pattern-setup/setup-toolbar.js +1 -1
  214. package/build-module/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  215. package/build-module/components/block-preview/auto.js +6 -3
  216. package/build-module/components/block-preview/auto.js.map +1 -1
  217. package/build-module/components/block-preview/index.js +4 -2
  218. package/build-module/components/block-preview/index.js.map +1 -1
  219. package/build-module/components/block-settings-menu/block-settings-dropdown.js +75 -12
  220. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  221. package/build-module/components/block-settings-menu-controls/index.js +18 -9
  222. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  223. package/build-module/components/block-switcher/index.js +9 -4
  224. package/build-module/components/block-switcher/index.js.map +1 -1
  225. package/build-module/components/block-title/index.js +2 -2
  226. package/build-module/components/block-title/index.js.map +1 -1
  227. package/build-module/components/block-title/use-block-display-title.js +8 -6
  228. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  229. package/build-module/components/block-toolbar/block-name-context.js +9 -0
  230. package/build-module/components/block-toolbar/block-name-context.js.map +1 -0
  231. package/build-module/components/block-toolbar/block-toolbar-last-item.js +11 -0
  232. package/build-module/components/block-toolbar/block-toolbar-last-item.js.map +1 -0
  233. package/build-module/components/block-toolbar/index.js +19 -4
  234. package/build-module/components/block-toolbar/index.js.map +1 -1
  235. package/build-module/components/block-tools/index.js +0 -16
  236. package/build-module/components/block-tools/index.js.map +1 -1
  237. package/build-module/components/block-variation-transforms/index.js +95 -49
  238. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  239. package/build-module/components/block-vertical-alignment-control/index.js +12 -4
  240. package/build-module/components/block-vertical-alignment-control/index.js.map +1 -1
  241. package/build-module/components/border-radius-control/index.js +0 -1
  242. package/build-module/components/border-radius-control/index.js.map +1 -1
  243. package/build-module/components/border-radius-control/utils.js +1 -1
  244. package/build-module/components/border-radius-control/utils.js.map +1 -1
  245. package/build-module/components/colors-gradients/control.js +3 -1
  246. package/build-module/components/colors-gradients/control.js.map +1 -1
  247. package/build-module/components/contrast-checker/index.js +4 -0
  248. package/build-module/components/contrast-checker/index.js.map +1 -1
  249. package/build-module/components/convert-to-group-buttons/index.js +2 -1
  250. package/build-module/components/convert-to-group-buttons/index.js.map +1 -1
  251. package/build-module/components/convert-to-group-buttons/toolbar.js +90 -0
  252. package/build-module/components/convert-to-group-buttons/toolbar.js.map +1 -0
  253. package/build-module/components/copy-handler/index.js +4 -0
  254. package/build-module/components/copy-handler/index.js.map +1 -1
  255. package/build-module/components/date-format-picker/index.js +122 -0
  256. package/build-module/components/date-format-picker/index.js.map +1 -0
  257. package/build-module/components/font-sizes/font-size-picker.js +4 -0
  258. package/build-module/components/font-sizes/font-size-picker.js.map +1 -1
  259. package/build-module/components/iframe/index.js +6 -9
  260. package/build-module/components/iframe/index.js.map +1 -1
  261. package/build-module/components/index.js +3 -0
  262. package/build-module/components/index.js.map +1 -1
  263. package/build-module/components/justify-content-control/index.js +12 -4
  264. package/build-module/components/justify-content-control/index.js.map +1 -1
  265. package/build-module/components/keyboard-shortcuts/index.js +1 -1
  266. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  267. package/build-module/components/line-height-control/index.js +14 -5
  268. package/build-module/components/line-height-control/index.js.map +1 -1
  269. package/build-module/components/list-view/block-select-button.js +19 -23
  270. package/build-module/components/list-view/block-select-button.js.map +1 -1
  271. package/build-module/components/list-view/block.js +36 -13
  272. package/build-module/components/list-view/block.js.map +1 -1
  273. package/build-module/components/list-view/branch.js +16 -13
  274. package/build-module/components/list-view/branch.js.map +1 -1
  275. package/build-module/components/list-view/index.js +7 -1
  276. package/build-module/components/list-view/index.js.map +1 -1
  277. package/build-module/components/list-view/use-block-selection.js +10 -3
  278. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  279. package/build-module/components/media-replace-flow/index.js +4 -0
  280. package/build-module/components/media-replace-flow/index.js.map +1 -1
  281. package/build-module/components/multi-selection-inspector/index.js +2 -2
  282. package/build-module/components/multi-selection-inspector/index.js.map +1 -1
  283. package/build-module/components/rich-text/index.js +26 -5
  284. package/build-module/components/rich-text/index.js.map +1 -1
  285. package/build-module/components/rich-text/index.native.js +13 -9
  286. package/build-module/components/rich-text/index.native.js.map +1 -1
  287. package/build-module/components/rich-text/split-value.js +12 -2
  288. package/build-module/components/rich-text/split-value.js.map +1 -1
  289. package/build-module/components/rich-text/use-firefox-compat.js +39 -0
  290. package/build-module/components/rich-text/use-firefox-compat.js.map +1 -0
  291. package/build-module/components/rich-text/use-input-rules.js +35 -4
  292. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  293. package/build-module/components/skip-to-selected-block/index.js +4 -0
  294. package/build-module/components/skip-to-selected-block/index.js.map +1 -1
  295. package/build-module/components/url-popover/image-url-input-ui.js +12 -28
  296. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  297. package/build-module/components/writing-flow/index.js +5 -1
  298. package/build-module/components/writing-flow/index.js.map +1 -1
  299. package/build-module/components/writing-flow/use-arrow-nav.js +4 -45
  300. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  301. package/build-module/components/writing-flow/use-click-selection.js +57 -0
  302. package/build-module/components/writing-flow/use-click-selection.js.map +1 -0
  303. package/build-module/components/writing-flow/use-drag-selection.js +124 -0
  304. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -0
  305. package/build-module/components/writing-flow/use-input.js +104 -0
  306. package/build-module/components/writing-flow/use-input.js.map +1 -0
  307. package/build-module/components/writing-flow/use-multi-selection.js +18 -37
  308. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  309. package/build-module/components/writing-flow/use-selection-observer.js +150 -0
  310. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -0
  311. package/build-module/components/writing-flow/use-tab-nav.js +1 -9
  312. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  313. package/build-module/hooks/anchor.js +7 -6
  314. package/build-module/hooks/anchor.js.map +1 -1
  315. package/build-module/hooks/border-color.js +5 -5
  316. package/build-module/hooks/border-color.js.map +1 -1
  317. package/build-module/hooks/border.js +0 -12
  318. package/build-module/hooks/border.js.map +1 -1
  319. package/build-module/hooks/color.js +19 -18
  320. package/build-module/hooks/color.js.map +1 -1
  321. package/build-module/hooks/font-family.js +3 -1
  322. package/build-module/hooks/font-family.js.map +1 -1
  323. package/build-module/hooks/font-size.js +4 -3
  324. package/build-module/hooks/font-size.js.map +1 -1
  325. package/build-module/hooks/gap.js +75 -7
  326. package/build-module/hooks/gap.js.map +1 -1
  327. package/build-module/hooks/layout.js +7 -2
  328. package/build-module/hooks/layout.js.map +1 -1
  329. package/build-module/hooks/style.js +33 -3
  330. package/build-module/hooks/style.js.map +1 -1
  331. package/build-module/hooks/utils.js +26 -0
  332. package/build-module/hooks/utils.js.map +1 -1
  333. package/build-module/layouts/flex.js +81 -16
  334. package/build-module/layouts/flex.js.map +1 -1
  335. package/build-module/layouts/flow.js +20 -13
  336. package/build-module/layouts/flow.js.map +1 -1
  337. package/build-module/store/actions.js +286 -49
  338. package/build-module/store/actions.js.map +1 -1
  339. package/build-module/store/defaults.js +5 -1
  340. package/build-module/store/defaults.js.map +1 -1
  341. package/build-module/store/reducer.js +25 -13
  342. package/build-module/store/reducer.js.map +1 -1
  343. package/build-module/store/selectors.js +186 -22
  344. package/build-module/store/selectors.js.map +1 -1
  345. package/build-module/utils/dom.js +2 -1
  346. package/build-module/utils/dom.js.map +1 -1
  347. package/build-style/style-rtl.css +248 -49
  348. package/build-style/style.css +248 -49
  349. package/build-types/utils/dom.d.ts.map +1 -1
  350. package/package.json +28 -27
  351. package/src/components/alignment-control/index.js +9 -4
  352. package/src/components/block-alignment-control/index.js +9 -4
  353. package/src/components/block-content-overlay/index.js +19 -2
  354. package/src/components/block-draggable/index.js +2 -5
  355. package/src/components/block-icon/index.js +3 -0
  356. package/src/components/block-inspector/index.js +4 -0
  357. package/src/components/block-list/block-html.js +8 -4
  358. package/src/components/block-list/block.js +5 -1
  359. package/src/components/block-list/style.scss +4 -5
  360. package/src/components/block-list/use-block-props/index.js +0 -5
  361. package/src/components/block-list/use-block-props/use-focus-first-element.js +27 -6
  362. package/src/components/block-list/use-block-props/use-focus-handler.js +8 -0
  363. package/src/components/block-list-appender/index.js +5 -0
  364. package/src/components/block-lock/index.js +4 -0
  365. package/src/components/block-lock/menu-item.js +39 -0
  366. package/src/components/block-lock/modal.js +194 -0
  367. package/src/components/block-lock/style.scss +70 -0
  368. package/src/components/block-lock/toolbar.js +51 -0
  369. package/src/components/block-lock/use-block-lock.js +49 -0
  370. package/src/components/block-mover/index.js +3 -0
  371. package/src/components/block-mover/style.scss +4 -0
  372. package/src/components/block-pattern-setup/index.js +84 -59
  373. package/src/components/block-pattern-setup/setup-toolbar.js +3 -1
  374. package/src/components/block-pattern-setup/style.scss +32 -26
  375. package/src/components/block-preview/auto.js +10 -1
  376. package/src/components/block-preview/index.js +2 -0
  377. package/src/components/block-settings-menu/block-settings-dropdown.js +109 -9
  378. package/src/components/block-settings-menu-controls/index.js +33 -12
  379. package/src/components/block-switcher/index.js +15 -3
  380. package/src/components/block-switcher/style.scss +15 -4
  381. package/src/components/block-switcher/test/__snapshots__/index.js.snap +15 -13
  382. package/src/components/block-switcher/test/index.js +2 -2
  383. package/src/components/block-title/README.md +6 -1
  384. package/src/components/block-title/index.js +2 -2
  385. package/src/components/block-title/test/index.js +43 -1
  386. package/src/components/block-title/use-block-display-title.js +10 -7
  387. package/src/components/block-toolbar/block-name-context.js +8 -0
  388. package/src/components/block-toolbar/block-toolbar-last-item.js +12 -0
  389. package/src/components/block-toolbar/index.js +24 -2
  390. package/src/components/block-toolbar/style.scss +10 -0
  391. package/src/components/block-tools/index.js +0 -19
  392. package/src/components/block-tools/style.scss +27 -0
  393. package/src/components/block-variation-transforms/index.js +105 -36
  394. package/src/components/block-variation-transforms/style.scss +1 -1
  395. package/src/components/block-vertical-alignment-control/index.js +9 -4
  396. package/src/components/border-radius-control/index.js +0 -1
  397. package/src/components/border-radius-control/test/utils.js +4 -0
  398. package/src/components/border-radius-control/utils.js +2 -1
  399. package/src/components/button-block-appender/style.scss +5 -1
  400. package/src/components/color-palette/test/__snapshots__/control.js.snap +70 -4
  401. package/src/components/colors-gradients/control.js +1 -1
  402. package/src/components/colors-gradients/style.scss +6 -0
  403. package/src/components/contrast-checker/index.js +3 -0
  404. package/src/components/convert-to-group-buttons/index.js +6 -1
  405. package/src/components/convert-to-group-buttons/toolbar.js +87 -0
  406. package/src/components/copy-handler/index.js +3 -0
  407. package/src/components/date-format-picker/README.md +58 -0
  408. package/src/components/date-format-picker/index.js +161 -0
  409. package/src/components/date-format-picker/style.scss +31 -0
  410. package/src/components/font-sizes/font-size-picker.js +3 -0
  411. package/src/components/iframe/index.js +5 -7
  412. package/src/components/index.js +3 -0
  413. package/src/components/justify-content-control/index.js +9 -4
  414. package/src/components/keyboard-shortcuts/index.js +1 -1
  415. package/src/components/line-height-control/index.js +11 -6
  416. package/src/components/link-control/README.md +1 -1
  417. package/src/components/list-view/block-select-button.js +14 -31
  418. package/src/components/list-view/block.js +55 -13
  419. package/src/components/list-view/branch.js +37 -15
  420. package/src/components/list-view/index.js +6 -0
  421. package/src/components/list-view/style.scss +56 -14
  422. package/src/components/list-view/use-block-selection.js +15 -2
  423. package/src/components/media-placeholder/README.md +8 -0
  424. package/src/components/media-replace-flow/index.js +3 -0
  425. package/src/components/multi-selection-inspector/index.js +2 -2
  426. package/src/components/rich-text/index.js +25 -2
  427. package/src/components/rich-text/index.native.js +24 -8
  428. package/src/components/rich-text/split-value.js +5 -1
  429. package/src/components/rich-text/use-firefox-compat.js +39 -0
  430. package/src/components/rich-text/use-input-rules.js +40 -3
  431. package/src/components/skip-to-selected-block/index.js +3 -0
  432. package/src/components/url-input/style.scss +3 -2
  433. package/src/components/url-popover/image-url-input-ui.js +16 -29
  434. package/src/components/writing-flow/index.js +8 -0
  435. package/src/components/writing-flow/readme.md +28 -0
  436. package/src/components/writing-flow/use-arrow-nav.js +4 -53
  437. package/src/components/writing-flow/use-click-selection.js +65 -0
  438. package/src/components/writing-flow/use-drag-selection.js +126 -0
  439. package/src/components/writing-flow/use-input.js +112 -0
  440. package/src/components/writing-flow/use-multi-selection.js +13 -36
  441. package/src/components/writing-flow/use-selection-observer.js +153 -0
  442. package/src/components/writing-flow/use-tab-nav.js +1 -11
  443. package/src/hooks/anchor.js +8 -6
  444. package/src/hooks/border-color.js +5 -5
  445. package/src/hooks/border.js +0 -13
  446. package/src/hooks/color.js +51 -24
  447. package/src/hooks/font-family.js +5 -2
  448. package/src/hooks/font-size.js +10 -7
  449. package/src/hooks/gap.js +91 -12
  450. package/src/hooks/layout.js +11 -1
  451. package/src/hooks/style.js +40 -4
  452. package/src/hooks/test/gap.js +66 -0
  453. package/src/hooks/test/style.js +94 -0
  454. package/src/hooks/test/utils.js +1 -1
  455. package/src/hooks/utils.js +26 -0
  456. package/src/layouts/flex.js +93 -6
  457. package/src/layouts/flow.js +28 -12
  458. package/src/store/actions.js +349 -32
  459. package/src/store/defaults.js +7 -1
  460. package/src/store/reducer.js +25 -10
  461. package/src/store/selectors.js +229 -27
  462. package/src/store/test/selectors.js +305 -5
  463. package/src/style.scss +2 -0
  464. package/src/utils/dom.js +2 -1
  465. package/tsconfig.tsbuildinfo +1 -1
  466. package/build/components/block-list/use-block-props/use-multi-selection.js +0 -205
  467. package/build/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  468. package/build/components/block-list/use-block-props/use-scroll-into-view.js +0 -77
  469. package/build/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  470. package/build-module/components/block-list/use-block-props/use-multi-selection.js +0 -192
  471. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +0 -1
  472. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js +0 -63
  473. package/build-module/components/block-list/use-block-props/use-scroll-into-view.js.map +0 -1
  474. package/src/components/block-list/use-block-props/use-multi-selection.js +0 -227
  475. package/src/components/block-list/use-block-props/use-scroll-into-view.js +0 -73
@@ -25,6 +25,7 @@ export default function BlockContentOverlay( {
25
25
  const [ isHovered, setIsHovered ] = useState( false );
26
26
 
27
27
  const {
28
+ canEdit,
28
29
  isParentSelected,
29
30
  hasChildSelected,
30
31
  isDraggingBlocks,
@@ -36,8 +37,10 @@ export default function BlockContentOverlay( {
36
37
  hasSelectedInnerBlock,
37
38
  isDraggingBlocks: _isDraggingBlocks,
38
39
  isBlockHighlighted,
40
+ canEditBlock,
39
41
  } = select( blockEditorStore );
40
42
  return {
43
+ canEdit: canEditBlock( clientId ),
41
44
  isParentSelected: isBlockSelected( clientId ),
42
45
  hasChildSelected: hasSelectedInnerBlock( clientId, true ),
43
46
  isDraggingBlocks: _isDraggingBlocks(),
@@ -59,6 +62,12 @@ export default function BlockContentOverlay( {
59
62
  );
60
63
 
61
64
  useEffect( () => {
65
+ // The overlay is always active when editing is locked.
66
+ if ( ! canEdit ) {
67
+ setIsOverlayActive( true );
68
+ return;
69
+ }
70
+
62
71
  // Reenable when blocks are not in use.
63
72
  if ( ! isParentSelected && ! hasChildSelected && ! isOverlayActive ) {
64
73
  setIsOverlayActive( true );
@@ -75,7 +84,13 @@ export default function BlockContentOverlay( {
75
84
  if ( hasChildSelected && isOverlayActive ) {
76
85
  setIsOverlayActive( false );
77
86
  }
78
- }, [ isParentSelected, hasChildSelected, isOverlayActive, isHovered ] );
87
+ }, [
88
+ isParentSelected,
89
+ hasChildSelected,
90
+ isOverlayActive,
91
+ isHovered,
92
+ canEdit,
93
+ ] );
79
94
 
80
95
  // Disabled because the overlay div doesn't actually have a role or functionality
81
96
  // as far as the a11y is concerned. We're just catching the first click so that
@@ -88,7 +103,9 @@ export default function BlockContentOverlay( {
88
103
  onMouseEnter={ () => setIsHovered( true ) }
89
104
  onMouseLeave={ () => setIsHovered( false ) }
90
105
  onMouseUp={
91
- isOverlayActive ? () => setIsOverlayActive( false ) : undefined
106
+ isOverlayActive && canEdit
107
+ ? () => setIsOverlayActive( false )
108
+ : undefined
92
109
  }
93
110
  >
94
111
  { wrapperProps?.children }
@@ -23,19 +23,16 @@ const BlockDraggable = ( {
23
23
  const { srcRootClientId, isDraggable, icon } = useSelect(
24
24
  ( select ) => {
25
25
  const {
26
+ canMoveBlocks,
26
27
  getBlockRootClientId,
27
- getTemplateLock,
28
28
  getBlockName,
29
29
  } = select( blockEditorStore );
30
30
  const rootClientId = getBlockRootClientId( clientIds[ 0 ] );
31
- const templateLock = rootClientId
32
- ? getTemplateLock( rootClientId )
33
- : null;
34
31
  const blockName = getBlockName( clientIds[ 0 ] );
35
32
 
36
33
  return {
37
34
  srcRootClientId: rootClientId,
38
- isDraggable: 'all' !== templateLock,
35
+ isDraggable: canMoveBlocks( clientIds, rootClientId ),
39
36
  icon: getBlockType( blockName )?.icon,
40
37
  };
41
38
  },
@@ -37,4 +37,7 @@ function BlockIcon( { icon, showColors = false, className } ) {
37
37
  );
38
38
  }
39
39
 
40
+ /**
41
+ * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-icon/README.md
42
+ */
40
43
  export default memo( BlockIcon );
@@ -70,6 +70,7 @@ const BlockInspector = ( { showNoBlockSelectedMessage = true } ) => {
70
70
  <InspectorControls.Slot
71
71
  __experimentalGroup="color"
72
72
  label={ __( 'Color' ) }
73
+ className="color-block-support-panel__inner-wrapper"
73
74
  />
74
75
  <InspectorControls.Slot
75
76
  __experimentalGroup="typography"
@@ -187,4 +188,7 @@ const AdvancedControls = () => {
187
188
  );
188
189
  };
189
190
 
191
+ /**
192
+ * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-inspector/README.md
193
+ */
190
194
  export default BlockInspector;
@@ -12,8 +12,8 @@ import {
12
12
  getBlockAttributes,
13
13
  getBlockContent,
14
14
  getBlockType,
15
- isValidBlockContent,
16
15
  getSaveContent,
16
+ validateBlock,
17
17
  } from '@wordpress/blocks';
18
18
 
19
19
  /**
@@ -43,9 +43,13 @@ function BlockHTML( { clientId } ) {
43
43
 
44
44
  // If html is empty we reset the block to the default HTML and mark it as valid to avoid triggering an error
45
45
  const content = html ? html : getSaveContent( blockType, attributes );
46
- const isValid = html
47
- ? isValidBlockContent( blockType, attributes, content )
48
- : true;
46
+ const [ isValid ] = html
47
+ ? validateBlock( {
48
+ ...block,
49
+ attributes,
50
+ originalContent: content,
51
+ } )
52
+ : [ true ];
49
53
 
50
54
  updateBlock( clientId, {
51
55
  attributes,
@@ -17,6 +17,7 @@ import {
17
17
  getBlockType,
18
18
  getSaveContent,
19
19
  isUnmodifiedDefaultBlock,
20
+ serializeRawBlock,
20
21
  } from '@wordpress/blocks';
21
22
  import { withFilters } from '@wordpress/components';
22
23
  import {
@@ -74,6 +75,7 @@ function Block( { children, isHtml, ...props } ) {
74
75
  }
75
76
 
76
77
  function BlockListBlock( {
78
+ block: { __unstableBlockSource },
77
79
  mode,
78
80
  isLocked,
79
81
  canRemove,
@@ -155,7 +157,9 @@ function BlockListBlock( {
155
157
  let block;
156
158
 
157
159
  if ( ! isValid ) {
158
- const saveContent = getSaveContent( blockType, attributes );
160
+ const saveContent = __unstableBlockSource
161
+ ? serializeRawBlock( __unstableBlockSource )
162
+ : getSaveContent( blockType, attributes );
159
163
 
160
164
  block = (
161
165
  <Block className="has-warning">
@@ -26,9 +26,9 @@
26
26
  // When selecting multiple blocks, we provide an additional selection indicator.
27
27
  &.is-navigate-mode .block-editor-block-list__block.is-selected,
28
28
  &.is-navigate-mode .block-editor-block-list__block.is-hovered,
29
+ .block-editor-block-list__block.is-multi-selected:not([contenteditable]),
29
30
  .block-editor-block-list__block.is-highlighted,
30
- .block-editor-block-list__block.is-multi-selected {
31
-
31
+ .block-editor-block-list__block.is-highlighted ~ .is-multi-selected {
32
32
  &::after {
33
33
  // Show selection borders around every non-nested block's actual footprint.
34
34
  position: absolute;
@@ -41,7 +41,7 @@
41
41
  right: $border-width;
42
42
 
43
43
  // Everything else.
44
- box-shadow: 0 0 0 $border-width var(--wp-admin-theme-color);
44
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
45
45
  border-radius: $radius-block-ui - $border-width; // Border is outset, so subtract the width to achieve correct radius.
46
46
 
47
47
  // Windows High Contrast mode will show this outline.
@@ -66,11 +66,10 @@
66
66
  }
67
67
 
68
68
  .block-editor-block-list__block.is-highlighted::after {
69
- box-shadow: 0 0 0 $border-width var(--wp-admin-theme-color);
69
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
70
70
  outline: $border-width solid transparent;
71
71
  }
72
72
 
73
- .block-editor-block-list__block.is-multi-selected::after,
74
73
  &.is-navigate-mode .block-editor-block-list__block.is-selected::after,
75
74
  & .is-block-moving-mode.block-editor-block-list__block.has-child-selected {
76
75
  box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
@@ -31,9 +31,7 @@ import { useBlockMovingModeClassNames } from './use-block-moving-mode-class-name
31
31
  import { useFocusHandler } from './use-focus-handler';
32
32
  import { useEventHandlers } from './use-selected-block-event-handlers';
33
33
  import { useNavModeExit } from './use-nav-mode-exit';
34
- import { useScrollIntoView } from './use-scroll-into-view';
35
34
  import { useBlockRefProvider } from './use-block-refs';
36
- import { useMultiSelection } from './use-multi-selection';
37
35
  import { useIntersectionObserver } from './use-intersection-observer';
38
36
  import { store as blockEditorStore } from '../../../store';
39
37
 
@@ -115,11 +113,8 @@ export function useBlockProps( props = {}, { __unstableIsHtml } = {} ) {
115
113
  const mergedRefs = useMergeRefs( [
116
114
  props.ref,
117
115
  useFocusFirstElement( clientId ),
118
- // Must happen after focus because we check for focus in the block.
119
- useScrollIntoView( clientId ),
120
116
  useBlockRefProvider( clientId ),
121
117
  useFocusHandler( clientId ),
122
- useMultiSelection( clientId ),
123
118
  useEventHandlers( clientId ),
124
119
  useNavModeExit( clientId ),
125
120
  useIsHovered(),
@@ -7,7 +7,12 @@ import { first, last } from 'lodash';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { useEffect, useRef } from '@wordpress/element';
10
- import { focus, isTextField, placeCaretAtHorizontalEdge } from '@wordpress/dom';
10
+ import {
11
+ focus,
12
+ isFormElement,
13
+ isTextField,
14
+ placeCaretAtHorizontalEdge,
15
+ } from '@wordpress/dom';
11
16
  import { useSelect } from '@wordpress/data';
12
17
 
13
18
  /**
@@ -15,7 +20,6 @@ import { useSelect } from '@wordpress/data';
15
20
  */
16
21
  import { isInsideRootBlock } from '../../../utils/dom';
17
22
  import { store as blockEditorStore } from '../../../store';
18
- import { setContentEditableWrapper } from './use-multi-selection';
19
23
 
20
24
  /** @typedef {import('@wordpress/element').RefObject} RefObject */
21
25
 
@@ -32,7 +36,6 @@ function useInitialPosition( clientId ) {
32
36
  ( select ) => {
33
37
  const {
34
38
  getSelectedBlocksInitialCaretPosition,
35
- isMultiSelecting,
36
39
  isNavigationMode,
37
40
  isBlockSelected,
38
41
  } = select( blockEditorStore );
@@ -41,7 +44,7 @@ function useInitialPosition( clientId ) {
41
44
  return;
42
45
  }
43
46
 
44
- if ( isMultiSelecting() || isNavigationMode() ) {
47
+ if ( isNavigationMode() ) {
45
48
  return;
46
49
  }
47
50
 
@@ -63,8 +66,14 @@ function useInitialPosition( clientId ) {
63
66
  export function useFocusFirstElement( clientId ) {
64
67
  const ref = useRef();
65
68
  const initialPosition = useInitialPosition( clientId );
69
+ const { isBlockSelected, isMultiSelecting } = useSelect( blockEditorStore );
66
70
 
67
71
  useEffect( () => {
72
+ // Check if the block is still selected at the time this effect runs.
73
+ if ( ! isBlockSelected( clientId ) || isMultiSelecting() ) {
74
+ return;
75
+ }
76
+
68
77
  if ( initialPosition === undefined || initialPosition === null ) {
69
78
  return;
70
79
  }
@@ -96,10 +105,22 @@ export function useFocusFirstElement( clientId ) {
96
105
  return;
97
106
  }
98
107
 
99
- setContentEditableWrapper( ref.current, false );
108
+ // Check to see if element is focussable before a generic caret insert.
109
+ if ( ! ref.current.getAttribute( 'contenteditable' ) ) {
110
+ const focusElement = focus.tabbable.findNext( ref.current );
111
+ // Make sure focusElement is valid, contained in the same block, and a form field.
112
+ if (
113
+ focusElement &&
114
+ isInsideRootBlock( ref.current, focusElement ) &&
115
+ isFormElement( focusElement )
116
+ ) {
117
+ focusElement.focus();
118
+ return;
119
+ }
120
+ }
100
121
 
101
122
  placeCaretAtHorizontalEdge( target, isReverse );
102
- }, [ initialPosition ] );
123
+ }, [ initialPosition, clientId ] );
103
124
 
104
125
  return ref;
105
126
  }
@@ -30,6 +30,14 @@ export function useFocusHandler( clientId ) {
30
30
  * @param {FocusEvent} event Focus event.
31
31
  */
32
32
  function onFocus( event ) {
33
+ // When the whole editor is editable, let writing flow handle
34
+ // selection.
35
+ if (
36
+ node.parentElement.closest( '[contenteditable="true"]' )
37
+ ) {
38
+ return;
39
+ }
40
+
33
41
  // Check synchronously because a non-selected block might be
34
42
  // getting data through `useSelect` asynchronously.
35
43
  if ( isBlockSelected( clientId ) ) {
@@ -73,6 +73,11 @@ function BlockListAppender( {
73
73
  'block-list-appender wp-block',
74
74
  className
75
75
  ) }
76
+ // Needed in case the whole editor is content editable (for multi
77
+ // selection). It fixes an edge case where ArrowDown and ArrowRight
78
+ // should collapse the selection to the end of that selection and
79
+ // not into the appender.
80
+ contentEditable={ false }
76
81
  // The appender exists to let you add the first Paragraph before
77
82
  // any is inserted. To that end, this appender should visually be
78
83
  // presented as a block. That means theme CSS should style it as if
@@ -0,0 +1,4 @@
1
+ export { default as BlockLockMenuItem } from './menu-item';
2
+ export { default as BlockLockModal } from './modal';
3
+ export { default as BlockLockToolbar } from './toolbar';
4
+ export { default as useBlockLock } from './use-block-lock';
@@ -0,0 +1,39 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useReducer } from '@wordpress/element';
6
+ import { MenuItem } from '@wordpress/components';
7
+ import { lock, unlock } from '@wordpress/icons';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import useBlockLock from './use-block-lock';
13
+ import BlockLockModal from './modal';
14
+
15
+ export default function BlockLockMenuItem( { clientId } ) {
16
+ const { canLock, isLocked } = useBlockLock( clientId, true );
17
+
18
+ const [ isModalOpen, toggleModal ] = useReducer(
19
+ ( isActive ) => ! isActive,
20
+ false
21
+ );
22
+
23
+ if ( ! canLock ) {
24
+ return null;
25
+ }
26
+
27
+ const label = isLocked ? __( 'Unlock' ) : __( 'Lock' );
28
+
29
+ return (
30
+ <>
31
+ <MenuItem icon={ isLocked ? unlock : lock } onClick={ toggleModal }>
32
+ { label }
33
+ </MenuItem>
34
+ { isModalOpen && (
35
+ <BlockLockModal clientId={ clientId } onClose={ toggleModal } />
36
+ ) }
37
+ </>
38
+ );
39
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __, sprintf } from '@wordpress/i18n';
5
+ import { useEffect, useState } from '@wordpress/element';
6
+ import {
7
+ Button,
8
+ CheckboxControl,
9
+ Flex,
10
+ FlexItem,
11
+ Icon,
12
+ Modal,
13
+ } from '@wordpress/components';
14
+ import { lock as lockIcon, unlock as unlockIcon } from '@wordpress/icons';
15
+ import { useInstanceId } from '@wordpress/compose';
16
+ import { useDispatch, useSelect } from '@wordpress/data';
17
+ import { isReusableBlock, getBlockType } from '@wordpress/blocks';
18
+
19
+ /**
20
+ * Internal dependencies
21
+ */
22
+ import useBlockLock from './use-block-lock';
23
+ import useBlockDisplayInformation from '../use-block-display-information';
24
+ import { store as blockEditorStore } from '../../store';
25
+
26
+ export default function BlockLockModal( { clientId, onClose } ) {
27
+ const [ lock, setLock ] = useState( { move: false, remove: false } );
28
+ const { canEdit, canMove, canRemove } = useBlockLock( clientId, true );
29
+ const { isReusable } = useSelect(
30
+ ( select ) => {
31
+ const { getBlockName } = select( blockEditorStore );
32
+ const blockName = getBlockName( clientId );
33
+
34
+ return {
35
+ isReusable: isReusableBlock( getBlockType( blockName ) ),
36
+ };
37
+ },
38
+ [ clientId ]
39
+ );
40
+ const { updateBlockAttributes } = useDispatch( blockEditorStore );
41
+ const blockInformation = useBlockDisplayInformation( clientId );
42
+ const instanceId = useInstanceId(
43
+ BlockLockModal,
44
+ 'block-editor-block-lock-modal__options-title'
45
+ );
46
+
47
+ useEffect( () => {
48
+ setLock( {
49
+ move: ! canMove,
50
+ remove: ! canRemove,
51
+ ...( isReusable ? { edit: ! canEdit } : {} ),
52
+ } );
53
+ }, [ canEdit, canMove, canRemove, isReusable ] );
54
+
55
+ const isAllChecked = Object.values( lock ).every( Boolean );
56
+ const isMixed = Object.values( lock ).some( Boolean ) && ! isAllChecked;
57
+
58
+ return (
59
+ <Modal
60
+ title={ sprintf(
61
+ /* translators: %s: Name of the block. */
62
+ __( 'Lock %s' ),
63
+ blockInformation.title
64
+ ) }
65
+ overlayClassName="block-editor-block-lock-modal"
66
+ closeLabel={ __( 'Close' ) }
67
+ onRequestClose={ onClose }
68
+ >
69
+ <form
70
+ onSubmit={ ( event ) => {
71
+ event.preventDefault();
72
+ updateBlockAttributes( [ clientId ], { lock } );
73
+ onClose();
74
+ } }
75
+ >
76
+ <p>
77
+ { __(
78
+ 'Choose specific attributes to restrict or lock all available options.'
79
+ ) }
80
+ </p>
81
+ <div
82
+ role="group"
83
+ aria-labelledby={ instanceId }
84
+ className="block-editor-block-lock-modal__options"
85
+ >
86
+ <CheckboxControl
87
+ className="block-editor-block-lock-modal__options-title"
88
+ label={
89
+ <span id={ instanceId }>{ __( 'Lock all' ) }</span>
90
+ }
91
+ checked={ isAllChecked }
92
+ indeterminate={ isMixed }
93
+ onChange={ ( newValue ) =>
94
+ setLock( {
95
+ move: newValue,
96
+ remove: newValue,
97
+ ...( isReusable ? { edit: newValue } : {} ),
98
+ } )
99
+ }
100
+ />
101
+ <ul className="block-editor-block-lock-modal__checklist">
102
+ { isReusable && (
103
+ <li className="block-editor-block-lock-modal__checklist-item">
104
+ <CheckboxControl
105
+ label={
106
+ <>
107
+ { __( 'Restrict editing' ) }
108
+ <Icon
109
+ icon={
110
+ lock.edit
111
+ ? lockIcon
112
+ : unlockIcon
113
+ }
114
+ />
115
+ </>
116
+ }
117
+ checked={ !! lock.edit }
118
+ onChange={ ( edit ) =>
119
+ setLock( ( prevLock ) => ( {
120
+ ...prevLock,
121
+ edit,
122
+ } ) )
123
+ }
124
+ />
125
+ </li>
126
+ ) }
127
+ <li className="block-editor-block-lock-modal__checklist-item">
128
+ <CheckboxControl
129
+ label={
130
+ <>
131
+ { __( 'Disable movement' ) }
132
+ <Icon
133
+ icon={
134
+ lock.move
135
+ ? lockIcon
136
+ : unlockIcon
137
+ }
138
+ />
139
+ </>
140
+ }
141
+ checked={ lock.move }
142
+ onChange={ ( move ) =>
143
+ setLock( ( prevLock ) => ( {
144
+ ...prevLock,
145
+ move,
146
+ } ) )
147
+ }
148
+ />
149
+ </li>
150
+ <li className="block-editor-block-lock-modal__checklist-item">
151
+ <CheckboxControl
152
+ label={
153
+ <>
154
+ { __( 'Prevent removal' ) }
155
+ <Icon
156
+ icon={
157
+ lock.remove
158
+ ? lockIcon
159
+ : unlockIcon
160
+ }
161
+ />
162
+ </>
163
+ }
164
+ checked={ lock.remove }
165
+ onChange={ ( remove ) =>
166
+ setLock( ( prevLock ) => ( {
167
+ ...prevLock,
168
+ remove,
169
+ } ) )
170
+ }
171
+ />
172
+ </li>
173
+ </ul>
174
+ </div>
175
+ <Flex
176
+ className="block-editor-block-lock-modal__actions"
177
+ justify="flex-end"
178
+ expanded={ false }
179
+ >
180
+ <FlexItem>
181
+ <Button variant="tertiary" onClick={ onClose }>
182
+ { __( 'Cancel' ) }
183
+ </Button>
184
+ </FlexItem>
185
+ <FlexItem>
186
+ <Button variant="primary" type="submit">
187
+ { __( 'Apply' ) }
188
+ </Button>
189
+ </FlexItem>
190
+ </Flex>
191
+ </form>
192
+ </Modal>
193
+ );
194
+ }
@@ -0,0 +1,70 @@
1
+ .block-editor-block-lock-modal {
2
+ z-index: z-index(".block-editor-block-lock-modal");
3
+
4
+ .components-modal__frame {
5
+ @include break-small() {
6
+ max-width: $break-mobile;
7
+ }
8
+ }
9
+ }
10
+
11
+ .block-editor-block-lock-modal__checklist {
12
+ margin: 0;
13
+ }
14
+
15
+ .block-editor-block-lock-modal__options-title {
16
+ padding: $grid-unit-15 0;
17
+
18
+ .components-checkbox-control__label {
19
+ font-weight: 600;
20
+ }
21
+
22
+ .components-base-control__field {
23
+ align-items: center;
24
+ display: flex;
25
+ margin: 0;
26
+ }
27
+ }
28
+ .block-editor-block-lock-modal__checklist-item {
29
+ margin-bottom: 0;
30
+ padding: $grid-unit-15 0 $grid-unit-15 $grid-unit-40;
31
+
32
+ .components-base-control__field {
33
+ align-items: center;
34
+ display: flex;
35
+ margin: 0;
36
+ }
37
+
38
+ .components-checkbox-control__label {
39
+ display: flex;
40
+ align-items: center;
41
+ justify-content: space-between;
42
+ flex-grow: 1;
43
+
44
+ svg {
45
+ margin-right: $grid-unit-15;
46
+ fill: $gray-900;
47
+ }
48
+ }
49
+
50
+ &:hover {
51
+ background-color: $gray-100;
52
+ border-radius: $radius-block-ui;
53
+ }
54
+ }
55
+
56
+ .block-editor-block-lock-modal__actions {
57
+ margin-top: $grid-unit-30;
58
+ }
59
+
60
+ .block-editor-block-lock-toolbar {
61
+ .components-button.has-icon {
62
+ min-width: $button-size-small + $grid-unit-15 !important;
63
+ padding-left: 0 !important;
64
+
65
+ &:focus::before {
66
+ left: 0 !important;
67
+ right: $grid-unit-15 !important;
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __, sprintf } from '@wordpress/i18n';
5
+ import { ToolbarButton, ToolbarGroup } from '@wordpress/components';
6
+ import { useReducer } from '@wordpress/element';
7
+ import { lock } from '@wordpress/icons';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import BlockLockModal from './modal';
13
+ import useBlockLock from './use-block-lock';
14
+ import useBlockDisplayInformation from '../use-block-display-information';
15
+
16
+ export default function BlockLockToolbar( { clientId } ) {
17
+ const blockInformation = useBlockDisplayInformation( clientId );
18
+ const { canEdit, canMove, canRemove, canLock } = useBlockLock( clientId );
19
+
20
+ const [ isModalOpen, toggleModal ] = useReducer(
21
+ ( isActive ) => ! isActive,
22
+ false
23
+ );
24
+
25
+ if ( ! canLock ) {
26
+ return null;
27
+ }
28
+
29
+ if ( canEdit && canMove && canRemove ) {
30
+ return null;
31
+ }
32
+
33
+ return (
34
+ <>
35
+ <ToolbarGroup className="block-editor-block-lock-toolbar">
36
+ <ToolbarButton
37
+ icon={ lock }
38
+ label={ sprintf(
39
+ /* translators: %s: block name */
40
+ __( 'Unlock %s' ),
41
+ blockInformation.title
42
+ ) }
43
+ onClick={ toggleModal }
44
+ />
45
+ </ToolbarGroup>
46
+ { isModalOpen && (
47
+ <BlockLockModal clientId={ clientId } onClose={ toggleModal } />
48
+ ) }
49
+ </>
50
+ );
51
+ }