@wordpress/block-editor 11.5.0 → 11.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +4 -0
  3. package/build/components/block-list/block-html.js +1 -3
  4. package/build/components/block-list/block-html.js.map +1 -1
  5. package/build/components/block-list/block-invalid-warning.js +63 -80
  6. package/build/components/block-list/block-invalid-warning.js.map +1 -1
  7. package/build/components/block-preview/auto.js +6 -23
  8. package/build/components/block-preview/auto.js.map +1 -1
  9. package/build/components/block-settings-menu-controls/index.js +1 -1
  10. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  11. package/build/components/block-switcher/block-transformations-menu.native.js +1 -0
  12. package/build/components/block-switcher/block-transformations-menu.native.js.map +1 -1
  13. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js +6 -3
  14. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  15. package/build/components/editor-styles/index.js +20 -2
  16. package/build/components/editor-styles/index.js.map +1 -1
  17. package/build/components/global-styles/border-panel.js +306 -0
  18. package/build/components/global-styles/border-panel.js.map +1 -0
  19. package/build/components/global-styles/color-panel.js +583 -0
  20. package/build/components/global-styles/color-panel.js.map +1 -0
  21. package/build/components/global-styles/dimensions-panel.js +8 -30
  22. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  23. package/build/components/global-styles/get-block-css-selector.js +129 -0
  24. package/build/components/global-styles/get-block-css-selector.js.map +1 -0
  25. package/build/components/global-styles/hooks.js +109 -3
  26. package/build/components/global-styles/hooks.js.map +1 -1
  27. package/build/components/global-styles/index.js +36 -0
  28. package/build/components/global-styles/index.js.map +1 -1
  29. package/build/components/global-styles/typography-panel.js +66 -45
  30. package/build/components/global-styles/typography-panel.js.map +1 -1
  31. package/build/components/global-styles/use-global-styles-output.js +180 -99
  32. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  33. package/build/components/global-styles/utils.js +2 -1
  34. package/build/components/global-styles/utils.js.map +1 -1
  35. package/build/components/image-size-control/index.js +8 -5
  36. package/build/components/image-size-control/index.js.map +1 -1
  37. package/build/components/inserter/index.js +29 -17
  38. package/build/components/inserter/index.js.map +1 -1
  39. package/build/components/inserter/menu.js +1 -1
  40. package/build/components/inserter/menu.js.map +1 -1
  41. package/build/components/inserter/quick-inserter.js +4 -2
  42. package/build/components/inserter/quick-inserter.js.map +1 -1
  43. package/build/components/inserter/search-results.js +10 -3
  44. package/build/components/inserter/search-results.js.map +1 -1
  45. package/build/components/inserter/tabs.js +1 -1
  46. package/build/components/inserter/tabs.js.map +1 -1
  47. package/build/components/inspector-controls-tabs/position-controls-panel.js +43 -7
  48. package/build/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
  49. package/build/components/line-height-control/index.js +15 -1
  50. package/build/components/line-height-control/index.js.map +1 -1
  51. package/build/components/link-control/index.js +1 -1
  52. package/build/components/link-control/index.js.map +1 -1
  53. package/build/components/link-control/search-item.js +5 -2
  54. package/build/components/link-control/search-item.js.map +1 -1
  55. package/build/components/list-view/appender.js +105 -0
  56. package/build/components/list-view/appender.js.map +1 -0
  57. package/build/components/list-view/block.js +5 -5
  58. package/build/components/list-view/block.js.map +1 -1
  59. package/build/components/list-view/branch.js +25 -5
  60. package/build/components/list-view/branch.js.map +1 -1
  61. package/build/components/list-view/index.js +37 -13
  62. package/build/components/list-view/index.js.map +1 -1
  63. package/build/components/list-view/use-block-selection.js +1 -2
  64. package/build/components/list-view/use-block-selection.js.map +1 -1
  65. package/build/components/media-replace-flow/index.js +13 -4
  66. package/build/components/media-replace-flow/index.js.map +1 -1
  67. package/build/components/off-canvas-editor/appender.js +28 -3
  68. package/build/components/off-canvas-editor/appender.js.map +1 -1
  69. package/build/components/off-canvas-editor/branch.js +5 -3
  70. package/build/components/off-canvas-editor/branch.js.map +1 -1
  71. package/build/components/off-canvas-editor/index.js +9 -7
  72. package/build/components/off-canvas-editor/index.js.map +1 -1
  73. package/build/components/off-canvas-editor/link-ui.js +0 -1
  74. package/build/components/off-canvas-editor/link-ui.js.map +1 -1
  75. package/build/components/provider/use-block-sync.js +17 -3
  76. package/build/components/provider/use-block-sync.js.map +1 -1
  77. package/build/components/rich-text/format-edit.js +2 -30
  78. package/build/components/rich-text/format-edit.js.map +1 -1
  79. package/build/components/rich-text/format-toolbar-container.js +0 -3
  80. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  81. package/build/components/writing-flow/use-input.js +4 -8
  82. package/build/components/writing-flow/use-input.js.map +1 -1
  83. package/build/hooks/border.js +90 -240
  84. package/build/hooks/border.js.map +1 -1
  85. package/build/hooks/color.js +92 -229
  86. package/build/hooks/color.js.map +1 -1
  87. package/build/hooks/content-lock-ui.js +4 -2
  88. package/build/hooks/content-lock-ui.js.map +1 -1
  89. package/build/hooks/{color-panel.js → contrast-checker.js} +11 -49
  90. package/build/hooks/contrast-checker.js.map +1 -0
  91. package/build/hooks/custom-class-name.js +4 -4
  92. package/build/hooks/custom-class-name.js.map +1 -1
  93. package/build/hooks/custom-class-name.native.js +3 -4
  94. package/build/hooks/custom-class-name.native.js.map +1 -1
  95. package/build/hooks/dimensions.js +0 -1
  96. package/build/hooks/dimensions.js.map +1 -1
  97. package/build/hooks/duotone.js +3 -1
  98. package/build/hooks/duotone.js.map +1 -1
  99. package/build/hooks/layout.js +19 -22
  100. package/build/hooks/layout.js.map +1 -1
  101. package/build/hooks/position.js +2 -2
  102. package/build/hooks/position.js.map +1 -1
  103. package/build/hooks/style.js +23 -26
  104. package/build/hooks/style.js.map +1 -1
  105. package/build/hooks/supports.js +7 -1
  106. package/build/hooks/supports.js.map +1 -1
  107. package/build/hooks/typography.js +2 -2
  108. package/build/hooks/typography.js.map +1 -1
  109. package/build/hooks/utils.js +50 -75
  110. package/build/hooks/utils.js.map +1 -1
  111. package/build/layouts/constrained.js +6 -2
  112. package/build/layouts/constrained.js.map +1 -1
  113. package/build/layouts/grid.js +165 -0
  114. package/build/layouts/grid.js.map +1 -0
  115. package/build/layouts/index.js +3 -1
  116. package/build/layouts/index.js.map +1 -1
  117. package/build/private-apis.js +7 -1
  118. package/build/private-apis.js.map +1 -1
  119. package/build/store/actions.js +10 -8
  120. package/build/store/actions.js.map +1 -1
  121. package/build/store/selectors.js +19 -3
  122. package/build/store/selectors.js.map +1 -1
  123. package/build/utils/object.js +76 -0
  124. package/build/utils/object.js.map +1 -0
  125. package/build/utils/parse-css-unit-to-px.js +15 -9
  126. package/build/utils/parse-css-unit-to-px.js.map +1 -1
  127. package/build-module/components/block-list/block-html.js +1 -3
  128. package/build-module/components/block-list/block-html.js.map +1 -1
  129. package/build-module/components/block-list/block-invalid-warning.js +66 -78
  130. package/build-module/components/block-list/block-invalid-warning.js.map +1 -1
  131. package/build-module/components/block-preview/auto.js +6 -22
  132. package/build-module/components/block-preview/auto.js.map +1 -1
  133. package/build-module/components/block-settings-menu-controls/index.js +1 -1
  134. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  135. package/build-module/components/block-switcher/block-transformations-menu.native.js +1 -0
  136. package/build-module/components/block-switcher/block-transformations-menu.native.js.map +1 -1
  137. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js +6 -3
  138. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  139. package/build-module/components/editor-styles/index.js +19 -2
  140. package/build-module/components/editor-styles/index.js.map +1 -1
  141. package/build-module/components/global-styles/border-panel.js +291 -0
  142. package/build-module/components/global-styles/border-panel.js.map +1 -0
  143. package/build-module/components/global-styles/color-panel.js +554 -0
  144. package/build-module/components/global-styles/color-panel.js.map +1 -0
  145. package/build-module/components/global-styles/dimensions-panel.js +7 -30
  146. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  147. package/build-module/components/global-styles/get-block-css-selector.js +120 -0
  148. package/build-module/components/global-styles/get-block-css-selector.js.map +1 -0
  149. package/build-module/components/global-styles/hooks.js +104 -3
  150. package/build-module/components/global-styles/hooks.js.map +1 -1
  151. package/build-module/components/global-styles/index.js +3 -0
  152. package/build-module/components/global-styles/index.js.map +1 -1
  153. package/build-module/components/global-styles/typography-panel.js +65 -46
  154. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  155. package/build-module/components/global-styles/use-global-styles-output.js +181 -100
  156. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  157. package/build-module/components/global-styles/utils.js +2 -1
  158. package/build-module/components/global-styles/utils.js.map +1 -1
  159. package/build-module/components/image-size-control/index.js +8 -5
  160. package/build-module/components/image-size-control/index.js.map +1 -1
  161. package/build-module/components/inserter/index.js +28 -16
  162. package/build-module/components/inserter/index.js.map +1 -1
  163. package/build-module/components/inserter/menu.js +1 -1
  164. package/build-module/components/inserter/menu.js.map +1 -1
  165. package/build-module/components/inserter/quick-inserter.js +4 -2
  166. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  167. package/build-module/components/inserter/search-results.js +10 -3
  168. package/build-module/components/inserter/search-results.js.map +1 -1
  169. package/build-module/components/inserter/tabs.js +1 -1
  170. package/build-module/components/inserter/tabs.js.map +1 -1
  171. package/build-module/components/inspector-controls-tabs/position-controls-panel.js +42 -7
  172. package/build-module/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
  173. package/build-module/components/line-height-control/index.js +15 -1
  174. package/build-module/components/line-height-control/index.js.map +1 -1
  175. package/build-module/components/link-control/index.js +1 -1
  176. package/build-module/components/link-control/index.js.map +1 -1
  177. package/build-module/components/link-control/search-item.js +4 -2
  178. package/build-module/components/link-control/search-item.js.map +1 -1
  179. package/build-module/components/list-view/appender.js +88 -0
  180. package/build-module/components/list-view/appender.js.map +1 -0
  181. package/build-module/components/list-view/block.js +5 -4
  182. package/build-module/components/list-view/block.js.map +1 -1
  183. package/build-module/components/list-view/branch.js +22 -5
  184. package/build-module/components/list-view/branch.js.map +1 -1
  185. package/build-module/components/list-view/index.js +32 -12
  186. package/build-module/components/list-view/index.js.map +1 -1
  187. package/build-module/components/list-view/use-block-selection.js +1 -2
  188. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  189. package/build-module/components/media-replace-flow/index.js +12 -4
  190. package/build-module/components/media-replace-flow/index.js.map +1 -1
  191. package/build-module/components/off-canvas-editor/appender.js +28 -4
  192. package/build-module/components/off-canvas-editor/appender.js.map +1 -1
  193. package/build-module/components/off-canvas-editor/branch.js +5 -3
  194. package/build-module/components/off-canvas-editor/branch.js.map +1 -1
  195. package/build-module/components/off-canvas-editor/index.js +9 -7
  196. package/build-module/components/off-canvas-editor/index.js.map +1 -1
  197. package/build-module/components/off-canvas-editor/link-ui.js +0 -1
  198. package/build-module/components/off-canvas-editor/link-ui.js.map +1 -1
  199. package/build-module/components/provider/use-block-sync.js +17 -3
  200. package/build-module/components/provider/use-block-sync.js.map +1 -1
  201. package/build-module/components/rich-text/format-edit.js +3 -31
  202. package/build-module/components/rich-text/format-edit.js.map +1 -1
  203. package/build-module/components/rich-text/format-toolbar-container.js +0 -3
  204. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  205. package/build-module/components/writing-flow/use-input.js +4 -8
  206. package/build-module/components/writing-flow/use-input.js.map +1 -1
  207. package/build-module/hooks/border.js +92 -240
  208. package/build-module/hooks/border.js.map +1 -1
  209. package/build-module/hooks/color.js +90 -232
  210. package/build-module/hooks/color.js.map +1 -1
  211. package/build-module/hooks/content-lock-ui.js +4 -2
  212. package/build-module/hooks/content-lock-ui.js.map +1 -1
  213. package/build-module/hooks/{color-panel.js → contrast-checker.js} +10 -44
  214. package/build-module/hooks/contrast-checker.js.map +1 -0
  215. package/build-module/hooks/custom-class-name.js +4 -4
  216. package/build-module/hooks/custom-class-name.js.map +1 -1
  217. package/build-module/hooks/custom-class-name.native.js +3 -4
  218. package/build-module/hooks/custom-class-name.native.js.map +1 -1
  219. package/build-module/hooks/dimensions.js +0 -1
  220. package/build-module/hooks/dimensions.js.map +1 -1
  221. package/build-module/hooks/duotone.js +4 -2
  222. package/build-module/hooks/duotone.js.map +1 -1
  223. package/build-module/hooks/layout.js +19 -22
  224. package/build-module/hooks/layout.js.map +1 -1
  225. package/build-module/hooks/position.js +3 -3
  226. package/build-module/hooks/position.js.map +1 -1
  227. package/build-module/hooks/style.js +23 -26
  228. package/build-module/hooks/style.js.map +1 -1
  229. package/build-module/hooks/supports.js +7 -1
  230. package/build-module/hooks/supports.js.map +1 -1
  231. package/build-module/hooks/typography.js +2 -2
  232. package/build-module/hooks/typography.js.map +1 -1
  233. package/build-module/hooks/utils.js +48 -72
  234. package/build-module/hooks/utils.js.map +1 -1
  235. package/build-module/layouts/constrained.js +6 -2
  236. package/build-module/layouts/constrained.js.map +1 -1
  237. package/build-module/layouts/grid.js +151 -0
  238. package/build-module/layouts/grid.js.map +1 -0
  239. package/build-module/layouts/index.js +2 -1
  240. package/build-module/layouts/index.js.map +1 -1
  241. package/build-module/private-apis.js +5 -1
  242. package/build-module/private-apis.js.map +1 -1
  243. package/build-module/store/actions.js +10 -8
  244. package/build-module/store/actions.js.map +1 -1
  245. package/build-module/store/selectors.js +17 -3
  246. package/build-module/store/selectors.js.map +1 -1
  247. package/build-module/utils/object.js +69 -0
  248. package/build-module/utils/object.js.map +1 -0
  249. package/build-module/utils/parse-css-unit-to-px.js +15 -9
  250. package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
  251. package/build-style/style-rtl.css +32 -12
  252. package/build-style/style.css +32 -12
  253. package/package.json +31 -31
  254. package/src/components/block-draggable/content.scss +1 -1
  255. package/src/components/block-inspector/style.scss +3 -0
  256. package/src/components/block-list/block-html.js +1 -1
  257. package/src/components/block-list/block-invalid-warning.js +72 -64
  258. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +20 -2
  259. package/src/components/block-preview/auto.js +2 -17
  260. package/src/components/block-preview/test/index.js +0 -2
  261. package/src/components/block-settings-menu-controls/index.js +2 -1
  262. package/src/components/block-styles/style.scss +2 -2
  263. package/src/components/block-switcher/block-transformations-menu.native.js +1 -0
  264. package/src/components/color-palette/test/__snapshots__/control.js.snap +16 -14
  265. package/src/components/colors-gradients/style.scss +8 -8
  266. package/src/components/convert-to-group-buttons/use-convert-to-group-button-props.js +48 -38
  267. package/src/components/editor-styles/index.js +29 -1
  268. package/src/components/global-styles/border-panel.js +285 -0
  269. package/src/components/global-styles/color-panel.js +706 -0
  270. package/src/components/global-styles/dimensions-panel.js +13 -42
  271. package/src/components/global-styles/get-block-css-selector.js +129 -0
  272. package/src/components/global-styles/hooks.js +154 -1
  273. package/src/components/global-styles/index.js +3 -0
  274. package/src/components/global-styles/test/use-global-styles-output.js +31 -2
  275. package/src/components/global-styles/typography-panel.js +67 -45
  276. package/src/components/global-styles/use-global-styles-output.js +176 -93
  277. package/src/components/global-styles/utils.js +3 -0
  278. package/src/components/image-size-control/index.js +4 -3
  279. package/src/components/image-size-control/test/index.js +2 -2
  280. package/src/components/inner-blocks/README.md +1 -1
  281. package/src/components/inserter/index.js +30 -11
  282. package/src/components/inserter/menu.js +0 -1
  283. package/src/components/inserter/quick-inserter.js +2 -0
  284. package/src/components/inserter/search-results.js +7 -1
  285. package/src/components/inserter/style.scss +3 -0
  286. package/src/components/inserter/tabs.js +1 -9
  287. package/src/components/inspector-controls-tabs/position-controls-panel.js +40 -9
  288. package/src/components/line-height-control/index.js +10 -1
  289. package/src/components/link-control/index.js +1 -1
  290. package/src/components/link-control/search-item.js +3 -1
  291. package/src/components/link-control/style.scss +0 -4
  292. package/src/components/link-control/test/index.js +0 -2
  293. package/src/components/list-view/appender.js +101 -0
  294. package/src/components/list-view/block.js +5 -4
  295. package/src/components/list-view/branch.js +30 -1
  296. package/src/components/list-view/index.js +43 -10
  297. package/src/components/list-view/style.scss +19 -0
  298. package/src/components/list-view/use-block-selection.js +0 -2
  299. package/src/components/media-replace-flow/index.js +36 -24
  300. package/src/components/media-replace-flow/style.scss +5 -2
  301. package/src/components/off-canvas-editor/appender.js +31 -5
  302. package/src/components/off-canvas-editor/branch.js +3 -1
  303. package/src/components/off-canvas-editor/index.js +7 -7
  304. package/src/components/off-canvas-editor/link-ui.js +0 -1
  305. package/src/components/provider/use-block-sync.js +21 -4
  306. package/src/components/rich-text/format-edit.js +2 -32
  307. package/src/components/rich-text/format-toolbar-container.js +1 -7
  308. package/src/components/url-popover/test/index.js +0 -2
  309. package/src/components/writing-flow/use-input.js +4 -5
  310. package/src/hooks/border.js +93 -225
  311. package/src/hooks/color.js +120 -296
  312. package/src/hooks/content-lock-ui.js +6 -2
  313. package/src/hooks/{color-panel.js → contrast-checker.js} +10 -46
  314. package/src/hooks/custom-class-name.js +4 -4
  315. package/src/hooks/custom-class-name.native.js +3 -4
  316. package/src/hooks/dimensions.js +0 -1
  317. package/src/hooks/duotone.js +8 -5
  318. package/src/hooks/layout.js +19 -16
  319. package/src/hooks/position.js +3 -3
  320. package/src/hooks/style.js +29 -28
  321. package/src/hooks/supports.js +6 -0
  322. package/src/hooks/test/style.js +2 -1
  323. package/src/hooks/test/use-typography-props.js +2 -0
  324. package/src/hooks/test/utils.js +0 -104
  325. package/src/hooks/typography.js +2 -1
  326. package/src/hooks/utils.js +63 -70
  327. package/src/layouts/constrained.js +23 -17
  328. package/src/layouts/grid.js +172 -0
  329. package/src/layouts/index.js +2 -1
  330. package/src/layouts/test/grid.js +21 -0
  331. package/src/private-apis.js +4 -0
  332. package/src/store/actions.js +10 -8
  333. package/src/store/selectors.js +20 -3
  334. package/src/utils/object.js +69 -0
  335. package/src/utils/parse-css-unit-to-px.js +14 -9
  336. package/src/utils/test/object.js +107 -0
  337. package/src/utils/test/parse-css-unit-to-px.js +1 -2
  338. package/tsconfig.tsbuildinfo +1 -1
  339. package/build/hooks/border-radius.js +0 -100
  340. package/build/hooks/border-radius.js.map +0 -1
  341. package/build/hooks/color-panel.js.map +0 -1
  342. package/build-module/hooks/border-radius.js +0 -84
  343. package/build-module/hooks/border-radius.js.map +0 -1
  344. package/build-module/hooks/color-panel.js.map +0 -1
  345. package/src/hooks/border-radius.js +0 -70
@@ -7,66 +7,29 @@ import classnames from 'classnames';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { getBlockSupport } from '@wordpress/blocks';
10
- import {
11
- __experimentalBorderBoxControl as BorderBoxControl,
12
- __experimentalHasSplitBorders as hasSplitBorders,
13
- __experimentalIsDefinedBorder as isDefinedBorder,
14
- __experimentalToolsPanelItem as ToolsPanelItem,
15
- } from '@wordpress/components';
10
+ import { __experimentalHasSplitBorders as hasSplitBorders } from '@wordpress/components';
16
11
  import { createHigherOrderComponent } from '@wordpress/compose';
17
- import { Platform } from '@wordpress/element';
12
+ import { Platform, useCallback, useMemo } from '@wordpress/element';
18
13
  import { addFilter } from '@wordpress/hooks';
19
- import { __ } from '@wordpress/i18n';
20
14
 
21
15
  /**
22
16
  * Internal dependencies
23
17
  */
24
- import {
25
- BorderRadiusEdit,
26
- hasBorderRadiusValue,
27
- resetBorderRadius,
28
- } from './border-radius';
29
18
  import { getColorClassName } from '../components/colors';
30
19
  import InspectorControls from '../components/inspector-controls';
31
20
  import useMultipleOriginColorsAndGradients from '../components/colors-gradients/use-multiple-origin-colors-and-gradients';
32
- import useSetting from '../components/use-setting';
33
- import { cleanEmptyObject, shouldSkipSerialization } from './utils';
21
+ import {
22
+ cleanEmptyObject,
23
+ shouldSkipSerialization,
24
+ useBlockSettings,
25
+ } from './utils';
26
+ import {
27
+ useHasBorderPanel,
28
+ BorderPanel as StylesBorderPanel,
29
+ } from '../components/global-styles';
34
30
 
35
31
  export const BORDER_SUPPORT_KEY = '__experimentalBorder';
36
32
 
37
- const borderSides = [ 'top', 'right', 'bottom', 'left' ];
38
-
39
- const hasBorderValue = ( props ) => {
40
- const { borderColor, style } = props.attributes;
41
- return isDefinedBorder( style?.border ) || !! borderColor;
42
- };
43
-
44
- // The border color, style, and width are omitted so they get undefined. The
45
- // border radius is separate and must retain its selection.
46
- const resetBorder = ( { attributes = {}, setAttributes } ) => {
47
- const { style } = attributes;
48
- setAttributes( {
49
- borderColor: undefined,
50
- style: {
51
- ...style,
52
- border: cleanEmptyObject( {
53
- radius: style?.border?.radius,
54
- } ),
55
- },
56
- } );
57
- };
58
-
59
- const resetBorderFilter = ( newAttributes ) => ( {
60
- ...newAttributes,
61
- borderColor: undefined,
62
- style: {
63
- ...newAttributes.style,
64
- border: {
65
- radius: newAttributes.style?.border?.radius,
66
- },
67
- },
68
- } );
69
-
70
33
  const getColorByProperty = ( colors, property, value ) => {
71
34
  let matchedColor;
72
35
 
@@ -103,51 +66,6 @@ export const getMultiOriginColor = ( { colors, namedColor, customColor } ) => {
103
66
  return colorObject ? colorObject : { color: customColor };
104
67
  };
105
68
 
106
- const getBorderObject = ( attributes, colors ) => {
107
- const { borderColor, style } = attributes;
108
- const { border: borderStyles } = style || {};
109
-
110
- // If we have a named color for a flat border. Fetch that color object and
111
- // apply that color's value to the color property within the style object.
112
- if ( borderColor ) {
113
- const { color } = getMultiOriginColor( {
114
- colors,
115
- namedColor: borderColor,
116
- } );
117
-
118
- return color ? { ...borderStyles, color } : borderStyles;
119
- }
120
-
121
- // Individual side border color slugs are stored within the border style
122
- // object. If we don't have a border styles object we have nothing further
123
- // to hydrate.
124
- if ( ! borderStyles ) {
125
- return borderStyles;
126
- }
127
-
128
- // If we have named colors for the individual side borders, retrieve their
129
- // related color objects and apply the real color values to the split
130
- // border objects.
131
- const hydratedBorderStyles = { ...borderStyles };
132
- borderSides.forEach( ( side ) => {
133
- const colorSlug = getColorSlugFromVariable(
134
- hydratedBorderStyles[ side ]?.color
135
- );
136
- if ( colorSlug ) {
137
- const { color } = getMultiOriginColor( {
138
- colors,
139
- namedColor: colorSlug,
140
- } );
141
- hydratedBorderStyles[ side ] = {
142
- ...hydratedBorderStyles[ side ],
143
- color,
144
- };
145
- }
146
- } );
147
-
148
- return hydratedBorderStyles;
149
- };
150
-
151
69
  function getColorSlugFromVariable( value ) {
152
70
  const namedColor = /var:preset\|color\|(.+)/.exec( value );
153
71
  if ( namedColor && namedColor[ 1 ] ) {
@@ -156,150 +74,100 @@ function getColorSlugFromVariable( value ) {
156
74
  return null;
157
75
  }
158
76
 
159
- export function BorderPanel( props ) {
160
- const { attributes, clientId, setAttributes } = props;
161
- const { style } = attributes;
162
- const { colors } = useMultipleOriginColorsAndGradients();
163
-
164
- const isSupported = hasBorderSupport( props.name );
165
- const isColorSupported =
166
- useSetting( 'border.color' ) && hasBorderSupport( props.name, 'color' );
167
- const isRadiusSupported =
168
- useSetting( 'border.radius' ) &&
169
- hasBorderSupport( props.name, 'radius' );
170
- const isStyleSupported =
171
- useSetting( 'border.style' ) && hasBorderSupport( props.name, 'style' );
172
- const isWidthSupported =
173
- useSetting( 'border.width' ) && hasBorderSupport( props.name, 'width' );
174
-
175
- const isDisabled = [
176
- ! isColorSupported,
177
- ! isRadiusSupported,
178
- ! isStyleSupported,
179
- ! isWidthSupported,
180
- ].every( Boolean );
181
-
182
- if ( isDisabled || ! isSupported ) {
183
- return null;
77
+ function styleToAttributes( style ) {
78
+ if ( hasSplitBorders( style?.border ) ) {
79
+ return {
80
+ style,
81
+ borderColor: undefined,
82
+ };
184
83
  }
185
84
 
186
- const defaultBorderControls = getBlockSupport( props.name, [
187
- BORDER_SUPPORT_KEY,
188
- '__experimentalDefaultControls',
189
- ] );
85
+ const borderColorValue = style?.border?.color;
86
+ const borderColorSlug = borderColorValue?.startsWith( 'var:preset|color|' )
87
+ ? borderColorSlug.substring( 'var:preset|color|'.length )
88
+ : undefined;
89
+ const updatedStyle = { ...style };
90
+ updatedStyle.border = {
91
+ ...updatedStyle.border,
92
+ color: borderColorSlug ? undefined : borderColorValue,
93
+ };
94
+ return {
95
+ style: cleanEmptyObject( updatedStyle ),
96
+ borderColor: borderColorSlug,
97
+ };
98
+ }
190
99
 
191
- const showBorderByDefault =
192
- defaultBorderControls?.color || defaultBorderControls?.width;
193
-
194
- const onBorderChange = ( newBorder ) => {
195
- // Filter out named colors and apply them to appropriate block
196
- // attributes so that CSS classes can be used to apply those colors.
197
- // e.g. has-primary-border-top-color.
198
-
199
- let newBorderStyles = { ...newBorder };
200
- let newBorderColor;
201
-
202
- if ( hasSplitBorders( newBorder ) ) {
203
- // For each side check if the side has a color value set
204
- // If so, determine if it belongs to a named color, in which case
205
- // we update the color property.
206
- //
207
- // This deliberately overwrites `newBorderStyles` to avoid mutating
208
- // the passed object which causes problems otherwise.
209
- newBorderStyles = {
210
- top: { ...newBorder.top },
211
- right: { ...newBorder.right },
212
- bottom: { ...newBorder.bottom },
213
- left: { ...newBorder.left },
100
+ function attributesToStyle( attributes ) {
101
+ if ( hasSplitBorders( attributes.style?.border ) ) {
102
+ return attributes.style;
103
+ }
104
+ return {
105
+ ...attributes.style,
106
+ border: {
107
+ ...attributes.style?.border,
108
+ color: attributes.borderColor
109
+ ? 'var:preset|color|' + attributes.borderColor
110
+ : attributes.style?.border?.color,
111
+ },
112
+ };
113
+ }
114
+
115
+ function BordersInspectorControl( { children, resetAllFilter } ) {
116
+ const attributesResetAllFilter = useCallback(
117
+ ( attributes ) => {
118
+ const existingStyle = attributesToStyle( attributes );
119
+ const updatedStyle = resetAllFilter( existingStyle );
120
+ return {
121
+ ...attributes,
122
+ ...styleToAttributes( updatedStyle ),
214
123
  };
124
+ },
125
+ [ resetAllFilter ]
126
+ );
215
127
 
216
- borderSides.forEach( ( side ) => {
217
- if ( newBorder[ side ]?.color ) {
218
- const colorObject = getMultiOriginColor( {
219
- colors,
220
- customColor: newBorder[ side ]?.color,
221
- } );
222
-
223
- if ( colorObject.slug ) {
224
- newBorderStyles[
225
- side
226
- ].color = `var:preset|color|${ colorObject.slug }`;
227
- }
228
- }
229
- } );
230
- } else if ( newBorder?.color ) {
231
- // We have a flat border configuration. Apply named color slug to
232
- // `borderColor` attribute and clear color style property if found.
233
- const customColor = newBorder?.color;
234
- const colorObject = getMultiOriginColor( { colors, customColor } );
235
-
236
- if ( colorObject.slug ) {
237
- newBorderColor = colorObject.slug;
238
- newBorderStyles.color = undefined;
239
- }
240
- }
128
+ return (
129
+ <InspectorControls
130
+ group="border"
131
+ resetAllFilter={ attributesResetAllFilter }
132
+ >
133
+ { children }
134
+ </InspectorControls>
135
+ );
136
+ }
241
137
 
242
- // Ensure previous border radius styles are maintained and clean
243
- // overall result for empty objects or properties.
244
- const newStyle = cleanEmptyObject( {
245
- ...style,
246
- border: { radius: style?.border?.radius, ...newBorderStyles },
138
+ export function BorderPanel( props ) {
139
+ const { clientId, name, attributes, setAttributes } = props;
140
+ const settings = useBlockSettings( name );
141
+ const isEnabled = useHasBorderPanel( settings );
142
+ const value = useMemo( () => {
143
+ return attributesToStyle( {
144
+ style: attributes.style,
145
+ borderColor: attributes.borderColor,
247
146
  } );
147
+ }, [ attributes.style, attributes.borderColor ] );
248
148
 
249
- setAttributes( {
250
- style: newStyle,
251
- borderColor: newBorderColor,
252
- } );
149
+ const onChange = ( newStyle ) => {
150
+ setAttributes( styleToAttributes( newStyle ) );
253
151
  };
254
152
 
255
- const hydratedBorder = getBorderObject( attributes, colors );
153
+ if ( ! isEnabled ) {
154
+ return null;
155
+ }
156
+
157
+ const defaultControls = getBlockSupport( props.name, [
158
+ BORDER_SUPPORT_KEY,
159
+ '__experimentalDefaultControls',
160
+ ] );
256
161
 
257
162
  return (
258
- <InspectorControls group="border">
259
- { ( isWidthSupported || isColorSupported ) && (
260
- <ToolsPanelItem
261
- hasValue={ () => hasBorderValue( props ) }
262
- label={ __( 'Border' ) }
263
- onDeselect={ () => resetBorder( props ) }
264
- isShownByDefault={ showBorderByDefault }
265
- resetAllFilter={ resetBorderFilter }
266
- panelId={ clientId }
267
- >
268
- <BorderBoxControl
269
- colors={ colors }
270
- enableAlpha={ true }
271
- enableStyle={ isStyleSupported }
272
- onChange={ onBorderChange }
273
- popoverOffset={ 40 }
274
- popoverPlacement="left-start"
275
- size="__unstable-large"
276
- value={ hydratedBorder }
277
- __experimentalIsRenderedInSidebar={ true }
278
- />
279
- </ToolsPanelItem>
280
- ) }
281
- { isRadiusSupported && (
282
- <ToolsPanelItem
283
- hasValue={ () => hasBorderRadiusValue( props ) }
284
- label={ __( 'Radius' ) }
285
- onDeselect={ () => resetBorderRadius( props ) }
286
- isShownByDefault={ defaultBorderControls?.radius }
287
- resetAllFilter={ ( newAttributes ) => ( {
288
- ...newAttributes,
289
- style: {
290
- ...newAttributes.style,
291
- border: {
292
- ...newAttributes.style?.border,
293
- radius: undefined,
294
- },
295
- },
296
- } ) }
297
- panelId={ clientId }
298
- >
299
- <BorderRadiusEdit { ...props } />
300
- </ToolsPanelItem>
301
- ) }
302
- </InspectorControls>
163
+ <StylesBorderPanel
164
+ as={ BordersInspectorControl }
165
+ panelId={ clientId }
166
+ settings={ settings }
167
+ value={ value }
168
+ onChange={ onChange }
169
+ defaultControls={ defaultControls }
170
+ />
303
171
  );
304
172
  }
305
173