@wordpress/block-editor 8.0.16 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/LICENSE.md +1 -1
  3. package/README.md +12 -1
  4. package/build/components/block-caption/index.native.js +14 -3
  5. package/build/components/block-caption/index.native.js.map +1 -1
  6. package/build/components/block-edit/index.js +9 -0
  7. package/build/components/block-edit/index.js.map +1 -1
  8. package/build/components/block-inspector/index.js +8 -20
  9. package/build/components/block-inspector/index.js.map +1 -1
  10. package/build/components/block-list-appender/index.js +3 -11
  11. package/build/components/block-list-appender/index.js.map +1 -1
  12. package/build/components/block-media-update-progress/index.native.js +2 -1
  13. package/build/components/block-media-update-progress/index.native.js.map +1 -1
  14. package/build/components/block-preview/auto.js +10 -2
  15. package/build/components/block-preview/auto.js.map +1 -1
  16. package/build/components/block-settings/container.native.js +2 -1
  17. package/build/components/block-settings/container.native.js.map +1 -1
  18. package/build/components/block-styles/index.js +110 -134
  19. package/build/components/block-styles/index.js.map +1 -1
  20. package/build/components/block-styles/menu-items.js +63 -0
  21. package/build/components/block-styles/menu-items.js.map +1 -0
  22. package/build/components/block-styles/preview-panel.js +45 -0
  23. package/build/components/block-styles/preview-panel.js.map +1 -0
  24. package/build/components/block-styles/preview.native.js +2 -2
  25. package/build/components/block-styles/preview.native.js.map +1 -1
  26. package/build/components/block-styles/use-styles-for-block.js +119 -0
  27. package/build/components/block-styles/use-styles-for-block.js.map +1 -0
  28. package/build/components/block-styles/utils.js +39 -0
  29. package/build/components/block-styles/utils.js.map +1 -1
  30. package/build/components/block-switcher/block-styles-menu.js +3 -23
  31. package/build/components/block-switcher/block-styles-menu.js.map +1 -1
  32. package/build/components/block-tools/back-compat.js +2 -1
  33. package/build/components/block-tools/back-compat.js.map +1 -1
  34. package/build/components/block-tools/block-selection-button.js +5 -1
  35. package/build/components/block-tools/block-selection-button.js.map +1 -1
  36. package/build/components/block-tools/insertion-point.js +11 -1
  37. package/build/components/block-tools/insertion-point.js.map +1 -1
  38. package/build/components/block-types-list/index.native.js +2 -2
  39. package/build/components/block-types-list/index.native.js.map +1 -1
  40. package/build/components/button-block-appender/index.js +2 -1
  41. package/build/components/button-block-appender/index.js.map +1 -1
  42. package/build/components/colors-gradients/dropdown.js +88 -0
  43. package/build/components/colors-gradients/dropdown.js.map +1 -0
  44. package/build/components/colors-gradients/panel-color-gradient-settings.js +6 -5
  45. package/build/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  46. package/build/components/colors-gradients/panel-color-gradient-settings.native.js +6 -3
  47. package/build/components/colors-gradients/panel-color-gradient-settings.native.js.map +1 -1
  48. package/build/components/contrast-checker/index.js +34 -9
  49. package/build/components/contrast-checker/index.js.map +1 -1
  50. package/build/components/contrast-checker/index.native.js +108 -0
  51. package/build/components/contrast-checker/index.native.js.map +1 -0
  52. package/build/components/default-block-appender/index.js +16 -19
  53. package/build/components/default-block-appender/index.js.map +1 -1
  54. package/build/components/default-style-picker/index.js +18 -3
  55. package/build/components/default-style-picker/index.js.map +1 -1
  56. package/build/components/iframe/index.js +4 -5
  57. package/build/components/iframe/index.js.map +1 -1
  58. package/build/components/index.js +18 -9
  59. package/build/components/index.js.map +1 -1
  60. package/build/components/index.native.js +9 -0
  61. package/build/components/index.native.js.map +1 -1
  62. package/build/components/inner-blocks/default-block-appender.js +2 -4
  63. package/build/components/inner-blocks/default-block-appender.js.map +1 -1
  64. package/build/components/inner-blocks/use-nested-settings-update.js +16 -14
  65. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  66. package/build/components/inserter/index.js +61 -3
  67. package/build/components/inserter/index.js.map +1 -1
  68. package/build/components/inserter/index.native.js +1 -1
  69. package/build/components/inserter/index.native.js.map +1 -1
  70. package/build/components/inserter/library.js +5 -3
  71. package/build/components/inserter/library.js.map +1 -1
  72. package/build/components/inserter/menu.js +11 -3
  73. package/build/components/inserter/menu.js.map +1 -1
  74. package/build/components/inserter/tabs.native.js +7 -4
  75. package/build/components/inserter/tabs.native.js.map +1 -1
  76. package/build/components/inspector-controls/block-support-slot-container.js +2 -1
  77. package/build/components/inspector-controls/block-support-slot-container.js.map +1 -1
  78. package/build/components/inspector-controls/block-support-tools-panel.js +11 -43
  79. package/build/components/inspector-controls/block-support-tools-panel.js.map +1 -1
  80. package/build/components/inspector-controls/fill.native.js +3 -5
  81. package/build/components/inspector-controls/fill.native.js.map +1 -1
  82. package/build/components/inspector-controls/groups.js +2 -0
  83. package/build/components/inspector-controls/groups.js.map +1 -1
  84. package/build/components/inspector-controls/slot.js +1 -3
  85. package/build/components/inspector-controls/slot.js.map +1 -1
  86. package/build/components/letter-spacing-control/index.js +6 -6
  87. package/build/components/letter-spacing-control/index.js.map +1 -1
  88. package/build/components/link-control/link-preview.js +1 -1
  89. package/build/components/link-control/link-preview.js.map +1 -1
  90. package/build/components/link-control/search-item.js +11 -1
  91. package/build/components/link-control/search-item.js.map +1 -1
  92. package/build/components/link-control/search-results.js +2 -1
  93. package/build/components/link-control/search-results.js.map +1 -1
  94. package/build/components/link-control/use-search-handler.js +18 -5
  95. package/build/components/link-control/use-search-handler.js.map +1 -1
  96. package/build/components/list-view/block-select-button.js +23 -3
  97. package/build/components/list-view/block-select-button.js.map +1 -1
  98. package/build/components/list-view/block.js +8 -0
  99. package/build/components/list-view/block.js.map +1 -1
  100. package/build/components/media-placeholder/index.js +2 -0
  101. package/build/components/media-placeholder/index.js.map +1 -1
  102. package/build/components/media-replace-flow/index.js +32 -6
  103. package/build/components/media-replace-flow/index.js.map +1 -1
  104. package/build/components/media-upload-progress/index.native.js +2 -1
  105. package/build/components/media-upload-progress/index.native.js.map +1 -1
  106. package/build/components/panel-color-settings/index.js +7 -3
  107. package/build/components/panel-color-settings/index.js.map +1 -1
  108. package/build/components/provider/block-refs-provider.js +4 -1
  109. package/build/components/provider/block-refs-provider.js.map +1 -1
  110. package/build/components/rich-text/file-paste-handler.js +1 -1
  111. package/build/components/rich-text/file-paste-handler.js.map +1 -1
  112. package/build/components/rich-text/prevent-event-discovery.js +33 -0
  113. package/build/components/rich-text/prevent-event-discovery.js.map +1 -0
  114. package/build/components/rich-text/use-input-rules.js +3 -1
  115. package/build/components/rich-text/use-input-rules.js.map +1 -1
  116. package/build/components/selection-scroll-into-view/index.js +2 -1
  117. package/build/components/selection-scroll-into-view/index.js.map +1 -1
  118. package/build/components/use-display-block-controls/index.native.js +45 -0
  119. package/build/components/use-display-block-controls/index.native.js.map +1 -0
  120. package/build/components/use-on-block-drop/index.js +7 -3
  121. package/build/components/use-on-block-drop/index.js.map +1 -1
  122. package/build/components/writing-flow/use-multi-selection.js +3 -1
  123. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  124. package/build/hooks/border-color.js +74 -10
  125. package/build/hooks/border-color.js.map +1 -1
  126. package/build/hooks/border-radius.js +47 -0
  127. package/build/hooks/border-radius.js.map +1 -1
  128. package/build/hooks/border-style.js +41 -0
  129. package/build/hooks/border-style.js.map +1 -1
  130. package/build/hooks/border-width.js +70 -31
  131. package/build/hooks/border-width.js.map +1 -1
  132. package/build/hooks/border.js +81 -11
  133. package/build/hooks/border.js.map +1 -1
  134. package/build/hooks/color-panel.js +4 -1
  135. package/build/hooks/color-panel.js.map +1 -1
  136. package/build/hooks/color-panel.native.js +77 -0
  137. package/build/hooks/color-panel.native.js.map +1 -0
  138. package/build/hooks/color.js +6 -5
  139. package/build/hooks/color.js.map +1 -1
  140. package/build/hooks/index.native.js +2 -0
  141. package/build/hooks/index.native.js.map +1 -1
  142. package/build/hooks/layout.native.js +20 -0
  143. package/build/hooks/layout.native.js.map +1 -0
  144. package/build/hooks/letter-spacing.js +1 -1
  145. package/build/hooks/letter-spacing.js.map +1 -1
  146. package/build/hooks/typography.js +1 -1
  147. package/build/hooks/typography.js.map +1 -1
  148. package/build/store/actions.js +1 -2
  149. package/build/store/actions.js.map +1 -1
  150. package/build/store/defaults.js +5 -1
  151. package/build/store/defaults.js.map +1 -1
  152. package/build/store/defaults.native.js +2 -6
  153. package/build/store/defaults.native.js.map +1 -1
  154. package/build/store/selectors.js +10 -5
  155. package/build/store/selectors.js.map +1 -1
  156. package/build/utils/get-paste-event-data.js +1 -1
  157. package/build/utils/get-paste-event-data.js.map +1 -1
  158. package/build/utils/parse-css-unit-to-px.js +1 -1
  159. package/build/utils/parse-css-unit-to-px.js.map +1 -1
  160. package/build-module/components/block-caption/index.native.js +13 -3
  161. package/build-module/components/block-caption/index.native.js.map +1 -1
  162. package/build-module/components/block-edit/index.js +9 -0
  163. package/build-module/components/block-edit/index.js.map +1 -1
  164. package/build-module/components/block-inspector/index.js +8 -20
  165. package/build-module/components/block-inspector/index.js.map +1 -1
  166. package/build-module/components/block-list-appender/index.js +3 -10
  167. package/build-module/components/block-list-appender/index.js.map +1 -1
  168. package/build-module/components/block-media-update-progress/index.native.js +2 -1
  169. package/build-module/components/block-media-update-progress/index.native.js.map +1 -1
  170. package/build-module/components/block-preview/auto.js +10 -2
  171. package/build-module/components/block-preview/auto.js.map +1 -1
  172. package/build-module/components/block-settings/container.native.js +2 -1
  173. package/build-module/components/block-settings/container.native.js.map +1 -1
  174. package/build-module/components/block-styles/index.js +112 -133
  175. package/build-module/components/block-styles/index.js.map +1 -1
  176. package/build-module/components/block-styles/menu-items.js +50 -0
  177. package/build-module/components/block-styles/menu-items.js.map +1 -0
  178. package/build-module/components/block-styles/preview-panel.js +35 -0
  179. package/build-module/components/block-styles/preview-panel.js.map +1 -0
  180. package/build-module/components/block-styles/preview.native.js +2 -2
  181. package/build-module/components/block-styles/preview.native.js.map +1 -1
  182. package/build-module/components/block-styles/use-styles-for-block.js +107 -0
  183. package/build-module/components/block-styles/use-styles-for-block.js.map +1 -0
  184. package/build-module/components/block-styles/utils.js +34 -0
  185. package/build-module/components/block-styles/utils.js.map +1 -1
  186. package/build-module/components/block-switcher/block-styles-menu.js +3 -21
  187. package/build-module/components/block-switcher/block-styles-menu.js.map +1 -1
  188. package/build-module/components/block-tools/back-compat.js +2 -1
  189. package/build-module/components/block-tools/back-compat.js.map +1 -1
  190. package/build-module/components/block-tools/block-selection-button.js +5 -1
  191. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  192. package/build-module/components/block-tools/insertion-point.js +11 -1
  193. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  194. package/build-module/components/block-types-list/index.native.js +2 -2
  195. package/build-module/components/block-types-list/index.native.js.map +1 -1
  196. package/build-module/components/button-block-appender/index.js +2 -1
  197. package/build-module/components/button-block-appender/index.js.map +1 -1
  198. package/build-module/components/colors-gradients/dropdown.js +75 -0
  199. package/build-module/components/colors-gradients/dropdown.js.map +1 -0
  200. package/build-module/components/colors-gradients/panel-color-gradient-settings.js +8 -7
  201. package/build-module/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  202. package/build-module/components/colors-gradients/panel-color-gradient-settings.native.js +7 -4
  203. package/build-module/components/colors-gradients/panel-color-gradient-settings.native.js.map +1 -1
  204. package/build-module/components/contrast-checker/index.js +34 -9
  205. package/build-module/components/contrast-checker/index.js.map +1 -1
  206. package/build-module/components/contrast-checker/index.native.js +90 -0
  207. package/build-module/components/contrast-checker/index.native.js.map +1 -0
  208. package/build-module/components/default-block-appender/index.js +15 -18
  209. package/build-module/components/default-block-appender/index.js.map +1 -1
  210. package/build-module/components/default-style-picker/index.js +17 -3
  211. package/build-module/components/default-style-picker/index.js.map +1 -1
  212. package/build-module/components/iframe/index.js +4 -5
  213. package/build-module/components/iframe/index.js.map +1 -1
  214. package/build-module/components/index.js +2 -1
  215. package/build-module/components/index.js.map +1 -1
  216. package/build-module/components/index.native.js +1 -0
  217. package/build-module/components/index.native.js.map +1 -1
  218. package/build-module/components/inner-blocks/default-block-appender.js +2 -4
  219. package/build-module/components/inner-blocks/default-block-appender.js.map +1 -1
  220. package/build-module/components/inner-blocks/use-nested-settings-update.js +16 -14
  221. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  222. package/build-module/components/inserter/index.js +61 -3
  223. package/build-module/components/inserter/index.js.map +1 -1
  224. package/build-module/components/inserter/index.native.js +2 -2
  225. package/build-module/components/inserter/index.native.js.map +1 -1
  226. package/build-module/components/inserter/library.js +5 -3
  227. package/build-module/components/inserter/library.js.map +1 -1
  228. package/build-module/components/inserter/menu.js +11 -4
  229. package/build-module/components/inserter/menu.js.map +1 -1
  230. package/build-module/components/inserter/tabs.native.js +7 -4
  231. package/build-module/components/inserter/tabs.native.js.map +1 -1
  232. package/build-module/components/inspector-controls/block-support-slot-container.js +2 -1
  233. package/build-module/components/inspector-controls/block-support-slot-container.js.map +1 -1
  234. package/build-module/components/inspector-controls/block-support-tools-panel.js +12 -43
  235. package/build-module/components/inspector-controls/block-support-tools-panel.js.map +1 -1
  236. package/build-module/components/inspector-controls/fill.native.js +3 -5
  237. package/build-module/components/inspector-controls/fill.native.js.map +1 -1
  238. package/build-module/components/inspector-controls/groups.js +2 -0
  239. package/build-module/components/inspector-controls/groups.js.map +1 -1
  240. package/build-module/components/inspector-controls/slot.js +1 -3
  241. package/build-module/components/inspector-controls/slot.js.map +1 -1
  242. package/build-module/components/letter-spacing-control/index.js +6 -6
  243. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  244. package/build-module/components/link-control/link-preview.js +1 -1
  245. package/build-module/components/link-control/link-preview.js.map +1 -1
  246. package/build-module/components/link-control/search-item.js +11 -1
  247. package/build-module/components/link-control/search-item.js.map +1 -1
  248. package/build-module/components/link-control/search-results.js +2 -1
  249. package/build-module/components/link-control/search-results.js.map +1 -1
  250. package/build-module/components/link-control/use-search-handler.js +18 -5
  251. package/build-module/components/link-control/use-search-handler.js.map +1 -1
  252. package/build-module/components/list-view/block-select-button.js +22 -3
  253. package/build-module/components/list-view/block-select-button.js.map +1 -1
  254. package/build-module/components/list-view/block.js +6 -0
  255. package/build-module/components/list-view/block.js.map +1 -1
  256. package/build-module/components/media-placeholder/index.js +2 -0
  257. package/build-module/components/media-placeholder/index.js.map +1 -1
  258. package/build-module/components/media-replace-flow/index.js +32 -6
  259. package/build-module/components/media-replace-flow/index.js.map +1 -1
  260. package/build-module/components/media-upload-progress/index.native.js +2 -1
  261. package/build-module/components/media-upload-progress/index.native.js.map +1 -1
  262. package/build-module/components/panel-color-settings/index.js +7 -3
  263. package/build-module/components/panel-color-settings/index.js.map +1 -1
  264. package/build-module/components/provider/block-refs-provider.js +4 -1
  265. package/build-module/components/provider/block-refs-provider.js.map +1 -1
  266. package/build-module/components/rich-text/file-paste-handler.js +1 -1
  267. package/build-module/components/rich-text/file-paste-handler.js.map +1 -1
  268. package/build-module/components/rich-text/prevent-event-discovery.js +25 -0
  269. package/build-module/components/rich-text/prevent-event-discovery.js.map +1 -0
  270. package/build-module/components/rich-text/use-input-rules.js +2 -1
  271. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  272. package/build-module/components/selection-scroll-into-view/index.js +2 -1
  273. package/build-module/components/selection-scroll-into-view/index.js.map +1 -1
  274. package/build-module/components/use-display-block-controls/index.native.js +34 -0
  275. package/build-module/components/use-display-block-controls/index.native.js.map +1 -0
  276. package/build-module/components/use-on-block-drop/index.js +7 -3
  277. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  278. package/build-module/components/writing-flow/use-multi-selection.js +3 -4
  279. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  280. package/build-module/hooks/border-color.js +72 -12
  281. package/build-module/hooks/border-color.js.map +1 -1
  282. package/build-module/hooks/border-radius.js +42 -0
  283. package/build-module/hooks/border-radius.js.map +1 -1
  284. package/build-module/hooks/border-style.js +36 -0
  285. package/build-module/hooks/border-style.js.map +1 -1
  286. package/build-module/hooks/border-width.js +66 -32
  287. package/build-module/hooks/border-width.js.map +1 -1
  288. package/build-module/hooks/border.js +80 -12
  289. package/build-module/hooks/border.js.map +1 -1
  290. package/build-module/hooks/color-panel.js +4 -1
  291. package/build-module/hooks/color-panel.js.map +1 -1
  292. package/build-module/hooks/color-panel.native.js +62 -0
  293. package/build-module/hooks/color-panel.native.js.map +1 -0
  294. package/build-module/hooks/color.js +6 -5
  295. package/build-module/hooks/color.js.map +1 -1
  296. package/build-module/hooks/index.native.js +1 -0
  297. package/build-module/hooks/index.native.js.map +1 -1
  298. package/build-module/hooks/layout.native.js +16 -0
  299. package/build-module/hooks/layout.native.js.map +1 -0
  300. package/build-module/hooks/letter-spacing.js +1 -1
  301. package/build-module/hooks/letter-spacing.js.map +1 -1
  302. package/build-module/hooks/typography.js +1 -1
  303. package/build-module/hooks/typography.js.map +1 -1
  304. package/build-module/store/actions.js +1 -2
  305. package/build-module/store/actions.js.map +1 -1
  306. package/build-module/store/defaults.js +5 -1
  307. package/build-module/store/defaults.js.map +1 -1
  308. package/build-module/store/defaults.native.js +2 -5
  309. package/build-module/store/defaults.native.js.map +1 -1
  310. package/build-module/store/selectors.js +10 -5
  311. package/build-module/store/selectors.js.map +1 -1
  312. package/build-module/utils/get-paste-event-data.js +1 -1
  313. package/build-module/utils/get-paste-event-data.js.map +1 -1
  314. package/build-module/utils/parse-css-unit-to-px.js +1 -1
  315. package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
  316. package/build-style/style-rtl.css +226 -181
  317. package/build-style/style.css +226 -181
  318. package/package.json +31 -27
  319. package/src/components/block-caption/index.native.js +22 -4
  320. package/src/components/block-card/README.md +1 -1
  321. package/src/components/block-edit/index.js +8 -0
  322. package/src/components/block-edit/test/edit.native.js +10 -9
  323. package/src/components/block-inspector/index.js +9 -16
  324. package/src/components/block-list-appender/index.js +5 -21
  325. package/src/components/block-media-update-progress/index.native.js +1 -1
  326. package/src/components/block-media-update-progress/test/index.native.js +136 -93
  327. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +108 -47
  328. package/src/components/block-mover/test/index.native.js +5 -5
  329. package/src/components/block-preview/README.md +14 -26
  330. package/src/components/block-preview/auto.js +7 -2
  331. package/src/components/block-preview/test/index.js +2 -0
  332. package/src/components/block-settings/container.native.js +1 -0
  333. package/src/components/block-styles/index.js +125 -145
  334. package/src/components/block-styles/menu-items.js +49 -0
  335. package/src/components/block-styles/preview-panel.js +36 -0
  336. package/src/components/block-styles/preview.native.js +5 -2
  337. package/src/components/block-styles/style.scss +59 -51
  338. package/src/components/block-styles/test/{index.js → utils.js} +60 -1
  339. package/src/components/block-styles/use-styles-for-block.js +99 -0
  340. package/src/components/block-styles/utils.js +39 -0
  341. package/src/components/block-switcher/block-styles-menu.js +3 -38
  342. package/src/components/block-tools/back-compat.js +1 -0
  343. package/src/components/block-tools/block-selection-button.js +7 -1
  344. package/src/components/block-tools/insertion-point.js +10 -1
  345. package/src/components/block-types-list/index.native.js +5 -2
  346. package/src/components/border-radius-control/style.scss +1 -1
  347. package/src/components/border-style-control/style.scss +0 -1
  348. package/src/components/button-block-appender/index.js +1 -0
  349. package/src/components/color-palette/test/__snapshots__/control.js.snap +9 -4
  350. package/src/components/colors-gradients/dropdown.js +96 -0
  351. package/src/components/colors-gradients/panel-color-gradient-settings.js +23 -19
  352. package/src/components/colors-gradients/panel-color-gradient-settings.native.js +13 -2
  353. package/src/components/colors-gradients/style.scss +59 -5
  354. package/src/components/contrast-checker/README.md +3 -1
  355. package/src/components/contrast-checker/index.js +48 -20
  356. package/src/components/contrast-checker/index.native.js +113 -0
  357. package/src/components/contrast-checker/style.native.scss +26 -0
  358. package/src/components/contrast-checker/test/index.js +65 -0
  359. package/src/components/default-block-appender/index.js +17 -24
  360. package/src/components/default-block-appender/style.scss +4 -0
  361. package/src/components/default-block-appender/test/__snapshots__/index.js.snap +12 -24
  362. package/src/components/default-block-appender/test/index.js +4 -14
  363. package/src/components/default-style-picker/index.js +18 -6
  364. package/src/components/iframe/index.js +7 -3
  365. package/src/components/index.js +2 -1
  366. package/src/components/index.native.js +1 -0
  367. package/src/components/inner-blocks/README.md +2 -0
  368. package/src/components/inner-blocks/default-block-appender.js +2 -7
  369. package/src/components/inner-blocks/use-nested-settings-update.js +16 -14
  370. package/src/components/inserter/index.js +77 -5
  371. package/src/components/inserter/index.native.js +2 -2
  372. package/src/components/inserter/library.js +17 -12
  373. package/src/components/inserter/menu.js +31 -13
  374. package/src/components/inserter/tabs.native.js +5 -4
  375. package/src/components/inserter/test/block-types-tab.native.js +9 -10
  376. package/src/components/inserter/test/index.native.js +3 -7
  377. package/src/components/inserter/test/reusable-blocks-tab.native.js +8 -10
  378. package/src/components/inspector-controls/block-support-slot-container.js +3 -1
  379. package/src/components/inspector-controls/block-support-tools-panel.js +39 -58
  380. package/src/components/inspector-controls/fill.native.js +4 -3
  381. package/src/components/inspector-controls/groups.js +2 -0
  382. package/src/components/inspector-controls/slot.js +2 -7
  383. package/src/components/letter-spacing-control/index.js +6 -6
  384. package/src/components/link-control/README.md +1 -1
  385. package/src/components/link-control/link-preview.js +1 -1
  386. package/src/components/link-control/search-item.js +11 -2
  387. package/src/components/link-control/search-results.js +1 -0
  388. package/src/components/link-control/style.scss +2 -1
  389. package/src/components/link-control/test/index.js +4 -0
  390. package/src/components/link-control/use-search-handler.js +25 -4
  391. package/src/components/list-view/block-select-button.js +20 -1
  392. package/src/components/list-view/block.js +10 -0
  393. package/src/components/media-placeholder/index.js +2 -0
  394. package/src/components/media-replace-flow/index.js +35 -5
  395. package/src/components/media-upload/test/index.native.js +28 -47
  396. package/src/components/media-upload-progress/index.native.js +1 -0
  397. package/src/components/media-upload-progress/test/index.native.js +60 -47
  398. package/src/components/panel-color-settings/index.js +8 -4
  399. package/src/components/provider/block-refs-provider.js +4 -1
  400. package/src/components/rich-text/file-paste-handler.js +3 -1
  401. package/src/components/rich-text/prevent-event-discovery.js +23 -0
  402. package/src/components/rich-text/use-input-rules.js +2 -1
  403. package/src/components/selection-scroll-into-view/index.js +1 -0
  404. package/src/components/url-input/README.md +5 -0
  405. package/src/components/use-display-block-controls/index.native.js +38 -0
  406. package/src/components/use-on-block-drop/index.js +7 -3
  407. package/src/components/writing-flow/test/use-multi-selection.js +36 -0
  408. package/src/components/writing-flow/use-multi-selection.js +12 -9
  409. package/src/hooks/border-color.js +69 -9
  410. package/src/hooks/border-radius.js +32 -0
  411. package/src/hooks/border-style.js +26 -0
  412. package/src/hooks/border-width.js +56 -32
  413. package/src/hooks/border.js +115 -20
  414. package/src/hooks/border.scss +3 -17
  415. package/src/hooks/color-panel.js +3 -0
  416. package/src/hooks/color-panel.native.js +63 -0
  417. package/src/hooks/color.js +8 -7
  418. package/src/hooks/dimensions.scss +5 -0
  419. package/src/hooks/index.native.js +1 -0
  420. package/src/hooks/layout.native.js +23 -0
  421. package/src/hooks/letter-spacing.js +1 -1
  422. package/src/hooks/typography.js +1 -1
  423. package/src/store/actions.js +1 -2
  424. package/src/store/defaults.js +2 -0
  425. package/src/store/defaults.native.js +2 -6
  426. package/src/store/selectors.js +10 -5
  427. package/src/style.scss +4 -3
  428. package/src/utils/get-paste-event-data.js +1 -1
  429. package/src/utils/parse-css-unit-to-px.js +1 -1
  430. package/src/utils/test/parse-css-unit-to-px.js +3 -0
  431. package/tsconfig.tsbuildinfo +1 -1
  432. package/build/components/use-canvas-click-redirect/index.js +0 -66
  433. package/build/components/use-canvas-click-redirect/index.js.map +0 -1
  434. package/build-module/components/use-canvas-click-redirect/index.js +0 -54
  435. package/build-module/components/use-canvas-click-redirect/index.js.map +0 -1
  436. package/src/components/use-canvas-click-redirect/index.js +0 -57
@@ -1,12 +1,15 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { shallow } from 'enzyme';
4
+ import { render } from 'test/helpers';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { sendMediaUpload } from '@wordpress/react-native-bridge';
9
+ import {
10
+ subscribeMediaUpload,
11
+ sendMediaUpload,
12
+ } from '@wordpress/react-native-bridge';
10
13
 
11
14
  /**
12
15
  * Internal dependencies
@@ -19,37 +22,27 @@ import {
19
22
  MEDIA_UPLOAD_STATE_RESET,
20
23
  } from '../';
21
24
 
22
- jest.mock( '@wordpress/react-native-bridge', () => {
23
- const callUploadCallback = ( payload ) => {
24
- this.uploadCallBack( payload );
25
- };
26
- const subscribeMediaUpload = ( callback ) => {
27
- this.uploadCallBack = callback;
28
- };
29
- const mediaSources = {
30
- deviceCamera: 'DEVICE_CAMERA',
31
- deviceLibrary: 'DEVICE_MEDIA_LIBRARY',
32
- siteMediaLibrary: 'SITE_MEDIA_LIBRARY',
33
- };
34
- return {
35
- subscribeMediaUpload,
36
- sendMediaUpload: callUploadCallback,
37
- mediaSources,
38
- };
25
+ let uploadCallBack;
26
+ subscribeMediaUpload.mockImplementation( ( callback ) => {
27
+ uploadCallBack = callback;
28
+ } );
29
+ sendMediaUpload.mockImplementation( ( payload ) => {
30
+ uploadCallBack( payload );
39
31
  } );
40
32
 
41
33
  const MEDIA_ID = 123;
42
34
 
43
35
  describe( 'MediaUploadProgress component', () => {
44
36
  it( 'renders without crashing', () => {
45
- const wrapper = shallow(
37
+ const wrapper = render(
46
38
  <MediaUploadProgress renderContent={ () => {} } />
47
39
  );
48
40
  expect( wrapper ).toBeTruthy();
49
41
  } );
50
42
 
51
43
  it( 'listens media upload progress', () => {
52
- const progress = 10;
44
+ const renderContentMock = jest.fn();
45
+ const progress = 0.1;
53
46
  const payload = {
54
47
  state: MEDIA_UPLOAD_STATE_UPLOADING,
55
48
  mediaId: MEDIA_ID,
@@ -58,46 +51,52 @@ describe( 'MediaUploadProgress component', () => {
58
51
 
59
52
  const onUpdateMediaProgress = jest.fn();
60
53
 
61
- const wrapper = shallow(
54
+ const wrapper = render(
62
55
  <MediaUploadProgress
63
56
  onUpdateMediaProgress={ onUpdateMediaProgress }
64
57
  mediaId={ MEDIA_ID }
65
- renderContent={ () => {} }
58
+ renderContent={ renderContentMock }
66
59
  />
67
60
  );
68
61
 
69
62
  sendMediaUpload( payload );
70
63
 
71
- expect( wrapper.instance().state.progress ).toEqual( progress );
72
- expect( wrapper.instance().state.isUploadInProgress ).toEqual( true );
73
- expect( wrapper.instance().state.isUploadFailed ).toEqual( false );
64
+ expect( wrapper.getByTestId( 'spinner' ) ).toBeTruthy();
65
+ expect( renderContentMock ).toHaveBeenCalledWith(
66
+ expect.objectContaining( {
67
+ isUploadInProgress: true,
68
+ isUploadFailed: false,
69
+ } )
70
+ );
74
71
  expect( onUpdateMediaProgress ).toHaveBeenCalledTimes( 1 );
75
72
  expect( onUpdateMediaProgress ).toHaveBeenCalledWith( payload );
76
73
  } );
77
74
 
78
75
  it( 'does not get affected by unrelated media uploads', () => {
76
+ const renderContentMock = jest.fn();
79
77
  const payload = {
80
78
  state: MEDIA_UPLOAD_STATE_UPLOADING,
81
79
  mediaId: 1,
82
- progress: 20,
80
+ progress: 0.2,
83
81
  };
84
82
  const onUpdateMediaProgress = jest.fn();
85
- const wrapper = shallow(
83
+ const wrapper = render(
86
84
  <MediaUploadProgress
87
85
  onUpdateMediaProgress={ onUpdateMediaProgress }
88
86
  mediaId={ MEDIA_ID }
89
- renderContent={ () => {} }
87
+ renderContent={ renderContentMock }
90
88
  />
91
89
  );
92
90
 
93
91
  sendMediaUpload( payload );
94
92
 
95
- expect( wrapper.instance().state.progress ).toEqual( 0 );
93
+ expect( wrapper.queryByTestId( 'spinner' ) ).toBeNull();
96
94
  expect( onUpdateMediaProgress ).toHaveBeenCalledTimes( 0 );
97
95
  } );
98
96
 
99
97
  it( 'listens media upload success', () => {
100
- const progress = 10;
98
+ const renderContentMock = jest.fn();
99
+ const progress = 0.1;
101
100
  const payloadSuccess = {
102
101
  state: MEDIA_UPLOAD_STATE_SUCCEEDED,
103
102
  mediaId: MEDIA_ID,
@@ -110,23 +109,27 @@ describe( 'MediaUploadProgress component', () => {
110
109
 
111
110
  const onFinishMediaUploadWithSuccess = jest.fn();
112
111
 
113
- const wrapper = shallow(
112
+ const wrapper = render(
114
113
  <MediaUploadProgress
115
114
  onFinishMediaUploadWithSuccess={
116
115
  onFinishMediaUploadWithSuccess
117
116
  }
118
117
  mediaId={ MEDIA_ID }
119
- renderContent={ () => {} }
118
+ renderContent={ renderContentMock }
120
119
  />
121
120
  );
122
121
 
123
122
  sendMediaUpload( payloadUploading );
124
123
 
125
- expect( wrapper.instance().state.progress ).toEqual( progress );
124
+ expect( wrapper.getByTestId( 'spinner' ) ).toBeTruthy();
126
125
 
127
126
  sendMediaUpload( payloadSuccess );
128
127
 
129
- expect( wrapper.instance().state.isUploadInProgress ).toEqual( false );
128
+ expect( renderContentMock ).toHaveBeenCalledWith(
129
+ expect.objectContaining( {
130
+ isUploadInProgress: false,
131
+ } )
132
+ );
130
133
  expect( onFinishMediaUploadWithSuccess ).toHaveBeenCalledTimes( 1 );
131
134
  expect( onFinishMediaUploadWithSuccess ).toHaveBeenCalledWith(
132
135
  payloadSuccess
@@ -134,7 +137,8 @@ describe( 'MediaUploadProgress component', () => {
134
137
  } );
135
138
 
136
139
  it( 'listens media upload fail', () => {
137
- const progress = 10;
140
+ const renderContentMock = jest.fn();
141
+ const progress = 0.1;
138
142
  const payloadFail = {
139
143
  state: MEDIA_UPLOAD_STATE_FAILED,
140
144
  mediaId: MEDIA_ID,
@@ -147,24 +151,28 @@ describe( 'MediaUploadProgress component', () => {
147
151
 
148
152
  const onFinishMediaUploadWithFailure = jest.fn();
149
153
 
150
- const wrapper = shallow(
154
+ const wrapper = render(
151
155
  <MediaUploadProgress
152
156
  onFinishMediaUploadWithFailure={
153
157
  onFinishMediaUploadWithFailure
154
158
  }
155
159
  mediaId={ MEDIA_ID }
156
- renderContent={ () => {} }
160
+ renderContent={ renderContentMock }
157
161
  />
158
162
  );
159
163
 
160
164
  sendMediaUpload( payloadUploading );
161
165
 
162
- expect( wrapper.instance().state.progress ).toEqual( progress );
166
+ expect( wrapper.getByTestId( 'spinner' ) ).toBeTruthy();
163
167
 
164
168
  sendMediaUpload( payloadFail );
165
169
 
166
- expect( wrapper.instance().state.isUploadInProgress ).toEqual( false );
167
- expect( wrapper.instance().state.isUploadFailed ).toEqual( true );
170
+ expect( renderContentMock ).toHaveBeenCalledWith(
171
+ expect.objectContaining( {
172
+ isUploadInProgress: false,
173
+ isUploadFailed: true,
174
+ } )
175
+ );
168
176
  expect( onFinishMediaUploadWithFailure ).toHaveBeenCalledTimes( 1 );
169
177
  expect( onFinishMediaUploadWithFailure ).toHaveBeenCalledWith(
170
178
  payloadFail
@@ -172,7 +180,8 @@ describe( 'MediaUploadProgress component', () => {
172
180
  } );
173
181
 
174
182
  it( 'listens media upload reset', () => {
175
- const progress = 10;
183
+ const renderContentMock = jest.fn();
184
+ const progress = 0.1;
176
185
  const payloadReset = {
177
186
  state: MEDIA_UPLOAD_STATE_RESET,
178
187
  mediaId: MEDIA_ID,
@@ -185,22 +194,26 @@ describe( 'MediaUploadProgress component', () => {
185
194
 
186
195
  const onMediaUploadStateReset = jest.fn();
187
196
 
188
- const wrapper = shallow(
197
+ const wrapper = render(
189
198
  <MediaUploadProgress
190
199
  onMediaUploadStateReset={ onMediaUploadStateReset }
191
200
  mediaId={ MEDIA_ID }
192
- renderContent={ () => {} }
201
+ renderContent={ renderContentMock }
193
202
  />
194
203
  );
195
204
 
196
205
  sendMediaUpload( payloadUploading );
197
206
 
198
- expect( wrapper.instance().state.progress ).toEqual( progress );
207
+ expect( wrapper.getByTestId( 'spinner' ) ).toBeTruthy();
199
208
 
200
209
  sendMediaUpload( payloadReset );
201
210
 
202
- expect( wrapper.instance().state.isUploadInProgress ).toEqual( false );
203
- expect( wrapper.instance().state.isUploadFailed ).toEqual( false );
211
+ expect( renderContentMock ).toHaveBeenCalledWith(
212
+ expect.objectContaining( {
213
+ isUploadInProgress: false,
214
+ isUploadFailed: false,
215
+ } )
216
+ );
204
217
  expect( onMediaUploadStateReset ).toHaveBeenCalledTimes( 1 );
205
218
  expect( onMediaUploadStateReset ).toHaveBeenCalledWith( payloadReset );
206
219
  } );
@@ -4,13 +4,17 @@
4
4
  import PanelColorGradientSettings from '../colors-gradients/panel-color-gradient-settings';
5
5
 
6
6
  const PanelColorSettings = ( { colorSettings, ...props } ) => {
7
- const settings = colorSettings.map(
8
- ( { value, onChange, ...otherSettings } ) => ( {
7
+ const settings = colorSettings.map( ( setting ) => {
8
+ if ( ! setting ) {
9
+ return setting;
10
+ }
11
+ const { value, onChange, ...otherSettings } = setting;
12
+ return {
9
13
  ...otherSettings,
10
14
  colorValue: value,
11
15
  onColorChange: onChange,
12
- } )
13
- );
16
+ };
17
+ } );
14
18
  return (
15
19
  <PanelColorGradientSettings
16
20
  settings={ settings }
@@ -3,7 +3,10 @@
3
3
  */
4
4
  import { createContext, useMemo } from '@wordpress/element';
5
5
 
6
- export const BlockRefs = createContext();
6
+ export const BlockRefs = createContext( {
7
+ refs: new Map(),
8
+ callbacks: new Map(),
9
+ } );
7
10
 
8
11
  export function BlockRefsProvider( { children } ) {
9
12
  const value = useMemo(
@@ -5,7 +5,9 @@ import { createBlobURL } from '@wordpress/blob';
5
5
 
6
6
  export function filePasteHandler( files ) {
7
7
  return files
8
- .filter( ( { type } ) => /^image\/(?:jpe?g|png|gif)$/.test( type ) )
8
+ .filter( ( { type } ) =>
9
+ /^image\/(?:jpe?g|png|gif|webp)$/.test( type )
10
+ )
9
11
  .map( ( file ) => `<img src="${ createBlobURL( file ) }">` )
10
12
  .join( '' );
11
13
  }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { insert } from '@wordpress/rich-text';
5
+
6
+ export function preventEventDiscovery( value ) {
7
+ const searchText = 'tales of gutenberg';
8
+ const addText =
9
+ ' 🐡🐢🦀🐤🦋🐘🐧🐹🦁🦄🦍🐼🐿🎃🐴🐝🐆🦕🦔🌱🍇π🍌🐉💧🥨🌌🍂🍠🥦🥚🥝🎟🥥🥒🛵🥖🍒🍯🎾🎲🐺🐚🐮⌛️';
10
+ const { start, text } = value;
11
+
12
+ if ( start < searchText.length ) {
13
+ return value;
14
+ }
15
+
16
+ const charactersBefore = text.slice( start - searchText.length, start );
17
+
18
+ if ( charactersBefore.toLowerCase() !== searchText ) {
19
+ return value;
20
+ }
21
+
22
+ return insert( value, addText );
23
+ }
@@ -11,6 +11,7 @@ import { useDispatch } from '@wordpress/data';
11
11
  * Internal dependencies
12
12
  */
13
13
  import { store as blockEditorStore } from '../../store';
14
+ import { preventEventDiscovery } from './prevent-event-discovery';
14
15
 
15
16
  export function useInputRules( props ) {
16
17
  const {
@@ -85,7 +86,7 @@ export function useInputRules( props ) {
85
86
 
86
87
  return accumlator;
87
88
  },
88
- value
89
+ preventEventDiscovery( value )
89
90
  );
90
91
 
91
92
  if ( transformed !== value ) {
@@ -12,6 +12,7 @@ import deprecated from '@wordpress/deprecated';
12
12
  export function MultiSelectScrollIntoView() {
13
13
  deprecated( 'wp.blockEditor.MultiSelectScrollIntoView', {
14
14
  hint: 'This behaviour is now built-in.',
15
+ since: '5.8',
15
16
  } );
16
17
  return null;
17
18
  }
@@ -147,6 +147,11 @@ _Optional._ If this property is added, a label will be generated using label pro
147
147
 
148
148
  _Optional._ Adds and optional class to the parent `div` that wraps the URLInput field and popover
149
149
 
150
+ ### `placeholder: String`
151
+
152
+ _Optional._ Placeholder text to show when the field is empty, similar to the
153
+ [`input` and `textarea` attribute of the same name](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/HTML5_updates#The_placeholder_attribute).
154
+
150
155
  ### `disableSuggestions: Boolean`
151
156
 
152
157
  _Optional._ Provides additional control over whether suggestions are disabled.
@@ -0,0 +1,38 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect } from '@wordpress/data';
5
+ import { hasBlockSupport } from '@wordpress/blocks';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { useBlockEditContext } from '../block-edit/context';
11
+ import { store as blockEditorStore } from '../../store';
12
+
13
+ export default function useDisplayBlockControls() {
14
+ const { isSelected, clientId, name } = useBlockEditContext();
15
+ return useSelect(
16
+ ( select ) => {
17
+ const { getBlockName, getBlockRootClientId } = select(
18
+ blockEditorStore
19
+ );
20
+
21
+ const parentId = getBlockRootClientId( clientId );
22
+ const parentBlockName = getBlockName( parentId );
23
+
24
+ const hideControls = hasBlockSupport(
25
+ parentBlockName,
26
+ '__experimentalHideChildBlockControls',
27
+ false
28
+ );
29
+
30
+ if ( ! hideControls && isSelected ) {
31
+ return true;
32
+ }
33
+
34
+ return false;
35
+ },
36
+ [ clientId, isSelected, name ]
37
+ );
38
+ }
@@ -256,10 +256,14 @@ export default function useOnBlockDrop( targetRootClientId, targetBlockIndex ) {
256
256
  const files = getFilesFromDataTransfer( event.dataTransfer );
257
257
  const html = event.dataTransfer.getData( 'text/html' );
258
258
 
259
- if ( files.length ) {
260
- _onFilesDrop( files );
261
- } else if ( html ) {
259
+ /**
260
+ * From Windows Chrome 96, the `event.dataTransfer` returns both file object and HTML.
261
+ * The order of the checks is important to recognise the HTML drop.
262
+ */
263
+ if ( html ) {
262
264
  _onHTMLDrop( html );
265
+ } else if ( files.length ) {
266
+ _onFilesDrop( files );
263
267
  } else {
264
268
  _onDrop( event );
265
269
  }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { toggleRichText } from '../use-multi-selection';
5
+
6
+ describe( 'toggleRichText', () => {
7
+ function getContainer( isContentEditible ) {
8
+ const container = document.createDocumentFragment();
9
+ [
10
+ 'rich-text',
11
+ 'rich-text editor-post-title__input',
12
+ 'some-other-class',
13
+ ].forEach( ( className ) => {
14
+ const element = document.createElement( 'div' );
15
+ element.setAttribute( 'class', className );
16
+ if ( isContentEditible ) {
17
+ element.setAttribute( 'contenteditable', true );
18
+ }
19
+ container.appendChild( element );
20
+ } );
21
+ return container;
22
+ }
23
+
24
+ it( 'should set the `contenteditable` attribute on eligible rich text nodes', () => {
25
+ const container = getContainer();
26
+ toggleRichText( container, true );
27
+ let nodes = container.querySelectorAll( '[contenteditable=true]' );
28
+
29
+ expect( nodes ).toHaveLength( 1 );
30
+ expect( nodes[ 0 ].className ).toBe( 'rich-text' );
31
+
32
+ toggleRichText( container, false );
33
+ nodes = container.querySelectorAll( '[contenteditable=true]' );
34
+ expect( nodes ).toHaveLength( 0 );
35
+ } );
36
+ } );
@@ -15,16 +15,19 @@ import { useSelect } from '@wordpress/data';
15
15
  import { store as blockEditorStore } from '../../store';
16
16
  import { __unstableUseBlockRef as useBlockRef } from '../block-list/use-block-props/use-block-refs';
17
17
 
18
- function toggleRichText( container, toggle ) {
19
- Array.from( container.querySelectorAll( '.rich-text' ) ).forEach(
20
- ( node ) => {
21
- if ( toggle ) {
22
- node.setAttribute( 'contenteditable', true );
23
- } else {
24
- node.removeAttribute( 'contenteditable' );
25
- }
18
+ export function toggleRichText( container, toggle ) {
19
+ Array.from(
20
+ container.querySelectorAll(
21
+ // Exclude the Post Title from multi-select disable.
22
+ '.rich-text:not( .editor-post-title__input )'
23
+ )
24
+ ).forEach( ( node ) => {
25
+ if ( toggle ) {
26
+ node.setAttribute( 'contenteditable', true );
27
+ } else {
28
+ node.removeAttribute( 'contenteditable' );
26
29
  }
27
- );
30
+ } );
28
31
  }
29
32
 
30
33
  /**
@@ -9,12 +9,12 @@ import classnames from 'classnames';
9
9
  import { addFilter } from '@wordpress/hooks';
10
10
  import { __ } from '@wordpress/i18n';
11
11
  import { createHigherOrderComponent } from '@wordpress/compose';
12
- import { useState } from '@wordpress/element';
12
+ import { useEffect, useState } from '@wordpress/element';
13
13
 
14
14
  /**
15
15
  * Internal dependencies
16
16
  */
17
- import ColorGradientControl from '../components/colors-gradients/control';
17
+ import ColorGradientSettingsDropdown from '../components/colors-gradients/dropdown';
18
18
  import useMultipleOriginColorsAndGradients from '../components/colors-gradients/use-multiple-origin-colors-and-gradients';
19
19
  import {
20
20
  getColorClassName,
@@ -22,7 +22,11 @@ import {
22
22
  getColorObjectByAttributeValues,
23
23
  } from '../components/colors';
24
24
  import useSetting from '../components/use-setting';
25
- import { hasBorderSupport, shouldSkipSerialization } from './border';
25
+ import {
26
+ hasBorderSupport,
27
+ removeBorderAttribute,
28
+ shouldSkipSerialization,
29
+ } from './border';
26
30
  import { cleanEmptyObject } from './utils';
27
31
 
28
32
  // Defining empty array here instead of inline avoids unnecessary re-renders of
@@ -52,15 +56,30 @@ export function BorderColorEdit( props ) {
52
56
  ( colors, origin ) => colors.concat( origin.colors ),
53
57
  []
54
58
  );
59
+ const { color: customBorderColor } = style?.border || {};
55
60
  const [ colorValue, setColorValue ] = useState(
56
61
  () =>
57
62
  getColorObjectByAttributeValues(
58
63
  availableColors,
59
64
  borderColor,
60
- style?.border?.color
65
+ customBorderColor
61
66
  )?.color
62
67
  );
63
68
 
69
+ // Detect changes in the color attributes and update the colorValue to keep the
70
+ // UI in sync. This is necessary for situations when border controls interact with
71
+ // eachother: eg, setting the border width to zero causes the color and style
72
+ // selections to be cleared.
73
+ useEffect( () => {
74
+ setColorValue(
75
+ getColorObjectByAttributeValues(
76
+ availableColors,
77
+ borderColor,
78
+ customBorderColor
79
+ )?.color
80
+ );
81
+ }, [ borderColor, customBorderColor, availableColors ] );
82
+
64
83
  const onChangeColor = ( value ) => {
65
84
  setColorValue( value );
66
85
 
@@ -85,19 +104,60 @@ export function BorderColorEdit( props ) {
85
104
  } );
86
105
  };
87
106
 
107
+ const settings = [
108
+ {
109
+ label: __( 'Color' ),
110
+ onColorChange: onChangeColor,
111
+ colorValue,
112
+ clearable: false,
113
+ },
114
+ ];
88
115
  return (
89
- <ColorGradientControl
90
- label={ __( 'Color' ) }
91
- colorValue={ colorValue }
92
- onColorChange={ onChangeColor }
93
- clearable={ false }
116
+ <ColorGradientSettingsDropdown
117
+ settings={ settings }
118
+ disableCustomColors
119
+ disableCustomGradients
94
120
  __experimentalHasMultipleOrigins
95
121
  __experimentalIsRenderedInSidebar
122
+ enableAlpha
96
123
  { ...colorGradientSettings }
97
124
  />
98
125
  );
99
126
  }
100
127
 
128
+ /**
129
+ * Checks if there is a current value in the border color block support
130
+ * attributes.
131
+ *
132
+ * @param {Object} props Block props.
133
+ * @return {boolean} Whether or not the block has a border color value set.
134
+ */
135
+ export function hasBorderColorValue( props ) {
136
+ const {
137
+ attributes: { borderColor, style },
138
+ } = props;
139
+
140
+ return !! borderColor || !! style?.border?.color;
141
+ }
142
+
143
+ /**
144
+ * Resets the border color block support attributes. This can be used when
145
+ * disabling the border color support controls for a block via a progressive
146
+ * discovery panel.
147
+ *
148
+ * @param {Object} props Block props.
149
+ * @param {Object} props.attributes Block's attributes.
150
+ * @param {Object} props.setAttributes Function to set block's attributes.
151
+ */
152
+ export function resetBorderColor( { attributes = {}, setAttributes } ) {
153
+ const { style } = attributes;
154
+
155
+ setAttributes( {
156
+ borderColor: undefined,
157
+ style: removeBorderAttribute( style, 'color' ),
158
+ } );
159
+ }
160
+
101
161
  /**
102
162
  * Filters registered block settings, extending attributes to include
103
163
  * `borderColor` if needed.
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import BorderRadiusControl from '../components/border-radius-control';
5
5
  import { cleanEmptyObject } from './utils';
6
+ import { removeBorderAttribute } from './border';
6
7
 
7
8
  /**
8
9
  * Inspector control panel containing the border radius related configuration.
@@ -40,3 +41,34 @@ export function BorderRadiusEdit( props ) {
40
41
  />
41
42
  );
42
43
  }
44
+
45
+ /**
46
+ * Checks if there is a current value in the border radius block support
47
+ * attributes.
48
+ *
49
+ * @param {Object} props Block props.
50
+ * @return {boolean} Whether or not the block has a border radius value set.
51
+ */
52
+ export function hasBorderRadiusValue( props ) {
53
+ const borderRadius = props.attributes.style?.border?.radius;
54
+
55
+ if ( typeof borderRadius === 'object' ) {
56
+ return Object.entries( borderRadius ).some( Boolean );
57
+ }
58
+
59
+ return !! borderRadius;
60
+ }
61
+
62
+ /**
63
+ * Resets the border radius block support attributes. This can be used when
64
+ * disabling the border radius support controls for a block via a progressive
65
+ * discovery panel.
66
+ *
67
+ * @param {Object} props Block props.
68
+ * @param {Object} props.attributes Block's attributes.
69
+ * @param {Object} props.setAttributes Function to set block's attributes.
70
+ */
71
+ export function resetBorderRadius( { attributes = {}, setAttributes } ) {
72
+ const { style } = attributes;
73
+ setAttributes( { style: removeBorderAttribute( style, 'radius' ) } );
74
+ }
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import BorderStyleControl from '../components/border-style-control';
5
5
  import { cleanEmptyObject } from './utils';
6
+ import { removeBorderAttribute } from './border';
6
7
 
7
8
  /**
8
9
  * Inspector control for configuring border style property.
@@ -36,3 +37,28 @@ export const BorderStyleEdit = ( props ) => {
36
37
  />
37
38
  );
38
39
  };
40
+
41
+ /**
42
+ * Checks if there is a current value in the border style block support
43
+ * attributes.
44
+ *
45
+ * @param {Object} props Block props.
46
+ * @return {boolean} Whether or not the block has a border style value set.
47
+ */
48
+ export function hasBorderStyleValue( props ) {
49
+ return !! props.attributes.style?.border?.style;
50
+ }
51
+
52
+ /**
53
+ * Resets the border style block support attribute. This can be used when
54
+ * disabling the border style support control for a block via a progressive
55
+ * discovery panel.
56
+ *
57
+ * @param {Object} props Block props.
58
+ * @param {Object} props.attributes Block's attributes.
59
+ * @param {Object} props.setAttributes Function to set block's attributes.
60
+ */
61
+ export function resetBorderStyle( { attributes = {}, setAttributes } ) {
62
+ const { style } = attributes;
63
+ setAttributes( { style: removeBorderAttribute( style, 'style' ) } );
64
+ }