@wordpress/block-editor 9.6.0 → 9.8.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 (462) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/components/block-alignment-control/use-available-alignments.js +1 -1
  3. package/build/components/block-alignment-control/use-available-alignments.js.map +1 -1
  4. package/build/components/block-edit-visually-button/index.js +46 -0
  5. package/build/components/block-edit-visually-button/index.js.map +1 -0
  6. package/build/components/block-list/block.js +12 -2
  7. package/build/components/block-list/block.js.map +1 -1
  8. package/build/components/block-list/index.native.js +1 -1
  9. package/build/components/block-list/index.native.js.map +1 -1
  10. package/build/components/block-popover/inbetween.js +5 -3
  11. package/build/components/block-popover/inbetween.js.map +1 -1
  12. package/build/components/block-popover/index.js +10 -4
  13. package/build/components/block-popover/index.js.map +1 -1
  14. package/build/components/block-settings-menu/index.js +2 -6
  15. package/build/components/block-settings-menu/index.js.map +1 -1
  16. package/build/components/block-styles/index.js +3 -6
  17. package/build/components/block-styles/index.js.map +1 -1
  18. package/build/components/block-switcher/index.js +10 -16
  19. package/build/components/block-switcher/index.js.map +1 -1
  20. package/build/components/block-toolbar/index.js +5 -1
  21. package/build/components/block-toolbar/index.js.map +1 -1
  22. package/build/components/block-tools/selected-block-popover.js +10 -2
  23. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  24. package/build/components/block-tools/use-block-toolbar-popover-props.js +126 -0
  25. package/build/components/block-tools/use-block-toolbar-popover-props.js.map +1 -0
  26. package/build/components/block-types-list/index.js +1 -1
  27. package/build/components/block-types-list/index.js.map +1 -1
  28. package/build/components/border-radius-control/all-input-control.js +31 -3
  29. package/build/components/border-radius-control/all-input-control.js.map +1 -1
  30. package/build/components/border-radius-control/index.js +23 -7
  31. package/build/components/border-radius-control/index.js.map +1 -1
  32. package/build/components/border-radius-control/input-controls.js +21 -6
  33. package/build/components/border-radius-control/input-controls.js.map +1 -1
  34. package/build/components/border-radius-control/utils.js +13 -16
  35. package/build/components/border-radius-control/utils.js.map +1 -1
  36. package/build/components/colors/utils.js +6 -2
  37. package/build/components/colors/utils.js.map +1 -1
  38. package/build/components/colors/with-colors.js +17 -4
  39. package/build/components/colors/with-colors.js.map +1 -1
  40. package/build/components/colors-gradients/control.js +7 -4
  41. package/build/components/colors-gradients/control.js.map +1 -1
  42. package/build/components/colors-gradients/dropdown.js +5 -2
  43. package/build/components/colors-gradients/dropdown.js.map +1 -1
  44. package/build/components/copy-handler/index.js +6 -0
  45. package/build/components/copy-handler/index.js.map +1 -1
  46. package/build/components/date-format-picker/index.js +2 -7
  47. package/build/components/date-format-picker/index.js.map +1 -1
  48. package/build/components/duotone/components.js +5 -5
  49. package/build/components/duotone/components.js.map +1 -1
  50. package/build/components/font-appearance-control/index.js +10 -4
  51. package/build/components/font-appearance-control/index.js.map +1 -1
  52. package/build/components/font-family/index.js +1 -1
  53. package/build/components/font-family/index.js.map +1 -1
  54. package/build/components/font-sizes/with-font-sizes.js +17 -4
  55. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  56. package/build/components/image-size-control/index.js +3 -1
  57. package/build/components/image-size-control/index.js.map +1 -1
  58. package/build/components/index.js +22 -6
  59. package/build/components/index.js.map +1 -1
  60. package/build/components/index.native.js +11 -4
  61. package/build/components/index.native.js.map +1 -1
  62. package/build/components/inserter/index.native.js +8 -3
  63. package/build/components/inserter/index.native.js.map +1 -1
  64. package/build/components/inserter/search-items.js +22 -4
  65. package/build/components/inserter/search-items.js.map +1 -1
  66. package/build/components/inserter-list-item/index.js +2 -19
  67. package/build/components/inserter-list-item/index.js.map +1 -1
  68. package/build/components/letter-spacing-control/index.js +6 -3
  69. package/build/components/letter-spacing-control/index.js.map +1 -1
  70. package/build/components/line-height-control/index.js +6 -3
  71. package/build/components/line-height-control/index.js.map +1 -1
  72. package/build/components/link-control/is-url-like.js +1 -7
  73. package/build/components/link-control/is-url-like.js.map +1 -1
  74. package/build/components/link-control/link-preview.js +0 -1
  75. package/build/components/link-control/link-preview.js.map +1 -1
  76. package/build/components/link-control/use-search-handler.js +1 -7
  77. package/build/components/link-control/use-search-handler.js.map +1 -1
  78. package/build/components/list-view/block-select-button.js +5 -2
  79. package/build/components/list-view/block-select-button.js.map +1 -1
  80. package/build/components/list-view/expander.js +3 -1
  81. package/build/components/list-view/expander.js.map +1 -1
  82. package/build/components/list-view/use-block-selection.js +1 -7
  83. package/build/components/list-view/use-block-selection.js.map +1 -1
  84. package/build/components/media-upload/index.native.js +8 -3
  85. package/build/components/media-upload/index.native.js.map +1 -1
  86. package/build/components/preview-options/index.js +2 -2
  87. package/build/components/preview-options/index.js.map +1 -1
  88. package/build/components/{use-no-recursive-renders → recursion-provider}/index.js +40 -18
  89. package/build/components/recursion-provider/index.js.map +1 -0
  90. package/build/components/rich-text/index.js +6 -1
  91. package/build/components/rich-text/index.js.map +1 -1
  92. package/build/components/rich-text/index.native.js +3 -1
  93. package/build/components/rich-text/index.native.js.map +1 -1
  94. package/build/components/rich-text/use-before-input-rules.js +110 -0
  95. package/build/components/rich-text/use-before-input-rules.js.map +1 -0
  96. package/build/components/rich-text/use-enter.js +0 -4
  97. package/build/components/rich-text/use-enter.js.map +1 -1
  98. package/build/components/rich-text/use-format-types.js +8 -11
  99. package/build/components/rich-text/use-format-types.js.map +1 -1
  100. package/build/components/spacing-sizes-control/all-input-control.js +53 -0
  101. package/build/components/spacing-sizes-control/all-input-control.js.map +1 -0
  102. package/build/components/spacing-sizes-control/axial-input-controls.js +69 -0
  103. package/build/components/spacing-sizes-control/axial-input-controls.js.map +1 -0
  104. package/build/components/spacing-sizes-control/index.js +100 -0
  105. package/build/components/spacing-sizes-control/index.js.map +1 -0
  106. package/build/components/spacing-sizes-control/input-controls.js +52 -0
  107. package/build/components/spacing-sizes-control/input-controls.js.map +1 -0
  108. package/build/components/spacing-sizes-control/linked-button.js +38 -0
  109. package/build/components/spacing-sizes-control/linked-button.js.map +1 -0
  110. package/build/components/spacing-sizes-control/spacing-input-control.js +208 -0
  111. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -0
  112. package/build/components/spacing-sizes-control/utils.js +202 -0
  113. package/build/components/spacing-sizes-control/utils.js.map +1 -0
  114. package/build/components/text-decoration-control/index.js +3 -1
  115. package/build/components/text-decoration-control/index.js.map +1 -1
  116. package/build/components/text-transform-control/index.js +3 -1
  117. package/build/components/text-transform-control/index.js.map +1 -1
  118. package/build/components/url-input/index.js +1 -1
  119. package/build/components/url-input/index.js.map +1 -1
  120. package/build/components/url-popover/image-url-input-ui.js +4 -1
  121. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  122. package/build/components/writing-flow/use-arrow-nav.js +4 -25
  123. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  124. package/build/components/writing-flow/use-drag-selection.js +9 -2
  125. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  126. package/build/components/writing-flow/use-multi-selection.js +4 -2
  127. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  128. package/build/components/writing-flow/use-select-all.js +3 -1
  129. package/build/components/writing-flow/use-select-all.js.map +1 -1
  130. package/build/components/writing-flow/use-selection-observer.js +10 -2
  131. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  132. package/build/hooks/border-radius.js +2 -7
  133. package/build/hooks/border-radius.js.map +1 -1
  134. package/build/hooks/border.js +2 -2
  135. package/build/hooks/border.js.map +1 -1
  136. package/build/hooks/color.js +4 -1
  137. package/build/hooks/color.js.map +1 -1
  138. package/build/hooks/dimensions.js +15 -0
  139. package/build/hooks/dimensions.js.map +1 -1
  140. package/build/hooks/duotone.js +4 -4
  141. package/build/hooks/duotone.js.map +1 -1
  142. package/build/hooks/gap.js +6 -4
  143. package/build/hooks/gap.js.map +1 -1
  144. package/build/hooks/generated-class-name.js +1 -7
  145. package/build/hooks/generated-class-name.js.map +1 -1
  146. package/build/hooks/layout.js +29 -14
  147. package/build/hooks/layout.js.map +1 -1
  148. package/build/hooks/margin.js +28 -12
  149. package/build/hooks/margin.js.map +1 -1
  150. package/build/hooks/padding.js +19 -8
  151. package/build/hooks/padding.js.map +1 -1
  152. package/build/hooks/style.js +4 -50
  153. package/build/hooks/style.js.map +1 -1
  154. package/build/layouts/constrained.js +215 -0
  155. package/build/layouts/constrained.js.map +1 -0
  156. package/build/layouts/flex.js +1 -1
  157. package/build/layouts/flex.js.map +1 -1
  158. package/build/layouts/flow.js +7 -151
  159. package/build/layouts/flow.js.map +1 -1
  160. package/build/layouts/index.js +3 -1
  161. package/build/layouts/index.js.map +1 -1
  162. package/build/layouts/utils.js +43 -0
  163. package/build/layouts/utils.js.map +1 -1
  164. package/build/store/actions.js +25 -3
  165. package/build/store/actions.js.map +1 -1
  166. package/build/store/selectors.js +4 -6
  167. package/build/store/selectors.js.map +1 -1
  168. package/build/utils/block-variation-transforms.js +15 -9
  169. package/build/utils/block-variation-transforms.js.map +1 -1
  170. package/build/utils/pasting.js +9 -1
  171. package/build/utils/pasting.js.map +1 -1
  172. package/build-module/components/block-alignment-control/use-available-alignments.js +1 -1
  173. package/build-module/components/block-alignment-control/use-available-alignments.js.map +1 -1
  174. package/build-module/components/block-edit-visually-button/index.js +35 -0
  175. package/build-module/components/block-edit-visually-button/index.js.map +1 -0
  176. package/build-module/components/block-list/block.js +13 -3
  177. package/build-module/components/block-list/block.js.map +1 -1
  178. package/build-module/components/block-list/index.native.js +1 -1
  179. package/build-module/components/block-list/index.native.js.map +1 -1
  180. package/build-module/components/block-popover/inbetween.js +5 -3
  181. package/build-module/components/block-popover/inbetween.js.map +1 -1
  182. package/build-module/components/block-popover/index.js +8 -4
  183. package/build-module/components/block-popover/index.js.map +1 -1
  184. package/build-module/components/block-settings-menu/index.js +3 -6
  185. package/build-module/components/block-settings-menu/index.js.map +1 -1
  186. package/build-module/components/block-styles/index.js +4 -7
  187. package/build-module/components/block-styles/index.js.map +1 -1
  188. package/build-module/components/block-switcher/index.js +10 -16
  189. package/build-module/components/block-switcher/index.js.map +1 -1
  190. package/build-module/components/block-toolbar/index.js +4 -1
  191. package/build-module/components/block-toolbar/index.js.map +1 -1
  192. package/build-module/components/block-tools/selected-block-popover.js +8 -2
  193. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  194. package/build-module/components/block-tools/use-block-toolbar-popover-props.js +114 -0
  195. package/build-module/components/block-tools/use-block-toolbar-popover-props.js.map +1 -0
  196. package/build-module/components/block-types-list/index.js +1 -1
  197. package/build-module/components/block-types-list/index.js.map +1 -1
  198. package/build-module/components/border-radius-control/all-input-control.js +32 -4
  199. package/build-module/components/border-radius-control/all-input-control.js.map +1 -1
  200. package/build-module/components/border-radius-control/index.js +24 -8
  201. package/build-module/components/border-radius-control/index.js.map +1 -1
  202. package/build-module/components/border-radius-control/input-controls.js +22 -7
  203. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  204. package/build-module/components/border-radius-control/utils.js +13 -16
  205. package/build-module/components/border-radius-control/utils.js.map +1 -1
  206. package/build-module/components/colors/utils.js +7 -3
  207. package/build-module/components/colors/utils.js.map +1 -1
  208. package/build-module/components/colors/with-colors.js +16 -3
  209. package/build-module/components/colors/with-colors.js.map +1 -1
  210. package/build-module/components/colors-gradients/control.js +7 -4
  211. package/build-module/components/colors-gradients/control.js.map +1 -1
  212. package/build-module/components/colors-gradients/dropdown.js +5 -2
  213. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  214. package/build-module/components/copy-handler/index.js +7 -1
  215. package/build-module/components/copy-handler/index.js.map +1 -1
  216. package/build-module/components/date-format-picker/index.js +2 -6
  217. package/build-module/components/date-format-picker/index.js.map +1 -1
  218. package/build-module/components/duotone/components.js +5 -5
  219. package/build-module/components/duotone/components.js.map +1 -1
  220. package/build-module/components/font-appearance-control/index.js +7 -4
  221. package/build-module/components/font-appearance-control/index.js.map +1 -1
  222. package/build-module/components/font-family/index.js +1 -1
  223. package/build-module/components/font-family/index.js.map +1 -1
  224. package/build-module/components/font-sizes/with-font-sizes.js +16 -3
  225. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  226. package/build-module/components/image-size-control/index.js +3 -1
  227. package/build-module/components/image-size-control/index.js.map +1 -1
  228. package/build-module/components/index.js +2 -1
  229. package/build-module/components/index.js.map +1 -1
  230. package/build-module/components/index.native.js +1 -1
  231. package/build-module/components/index.native.js.map +1 -1
  232. package/build-module/components/inserter/index.native.js +9 -2
  233. package/build-module/components/inserter/index.native.js.map +1 -1
  234. package/build-module/components/inserter/search-items.js +19 -5
  235. package/build-module/components/inserter/search-items.js.map +1 -1
  236. package/build-module/components/inserter-list-item/index.js +1 -17
  237. package/build-module/components/inserter-list-item/index.js.map +1 -1
  238. package/build-module/components/letter-spacing-control/index.js +5 -3
  239. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  240. package/build-module/components/line-height-control/index.js +5 -3
  241. package/build-module/components/line-height-control/index.js.map +1 -1
  242. package/build-module/components/link-control/is-url-like.js +1 -6
  243. package/build-module/components/link-control/is-url-like.js.map +1 -1
  244. package/build-module/components/link-control/link-preview.js +0 -1
  245. package/build-module/components/link-control/link-preview.js.map +1 -1
  246. package/build-module/components/link-control/use-search-handler.js +1 -6
  247. package/build-module/components/link-control/use-search-handler.js.map +1 -1
  248. package/build-module/components/list-view/block-select-button.js +5 -2
  249. package/build-module/components/list-view/block-select-button.js.map +1 -1
  250. package/build-module/components/list-view/expander.js +3 -2
  251. package/build-module/components/list-view/expander.js.map +1 -1
  252. package/build-module/components/list-view/use-block-selection.js +1 -6
  253. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  254. package/build-module/components/media-upload/index.native.js +9 -2
  255. package/build-module/components/media-upload/index.native.js.map +1 -1
  256. package/build-module/components/preview-options/index.js +2 -2
  257. package/build-module/components/preview-options/index.js.map +1 -1
  258. package/build-module/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -19
  259. package/build-module/components/recursion-provider/index.js.map +1 -0
  260. package/build-module/components/rich-text/index.js +5 -1
  261. package/build-module/components/rich-text/index.js.map +1 -1
  262. package/build-module/components/rich-text/index.native.js +3 -1
  263. package/build-module/components/rich-text/index.native.js.map +1 -1
  264. package/build-module/components/rich-text/use-before-input-rules.js +96 -0
  265. package/build-module/components/rich-text/use-before-input-rules.js.map +1 -0
  266. package/build-module/components/rich-text/use-enter.js +0 -4
  267. package/build-module/components/rich-text/use-enter.js.map +1 -1
  268. package/build-module/components/rich-text/use-format-types.js +8 -10
  269. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  270. package/build-module/components/spacing-sizes-control/all-input-control.js +41 -0
  271. package/build-module/components/spacing-sizes-control/all-input-control.js.map +1 -0
  272. package/build-module/components/spacing-sizes-control/axial-input-controls.js +57 -0
  273. package/build-module/components/spacing-sizes-control/axial-input-controls.js.map +1 -0
  274. package/build-module/components/spacing-sizes-control/index.js +83 -0
  275. package/build-module/components/spacing-sizes-control/index.js.map +1 -0
  276. package/build-module/components/spacing-sizes-control/input-controls.js +41 -0
  277. package/build-module/components/spacing-sizes-control/input-controls.js.map +1 -0
  278. package/build-module/components/spacing-sizes-control/linked-button.js +28 -0
  279. package/build-module/components/spacing-sizes-control/linked-button.js.map +1 -0
  280. package/build-module/components/spacing-sizes-control/spacing-input-control.js +192 -0
  281. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -0
  282. package/build-module/components/spacing-sizes-control/utils.js +174 -0
  283. package/build-module/components/spacing-sizes-control/utils.js.map +1 -0
  284. package/build-module/components/text-decoration-control/index.js +4 -2
  285. package/build-module/components/text-decoration-control/index.js.map +1 -1
  286. package/build-module/components/text-transform-control/index.js +4 -2
  287. package/build-module/components/text-transform-control/index.js.map +1 -1
  288. package/build-module/components/url-input/index.js +1 -1
  289. package/build-module/components/url-input/index.js.map +1 -1
  290. package/build-module/components/url-popover/image-url-input-ui.js +4 -1
  291. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  292. package/build-module/components/writing-flow/use-arrow-nav.js +5 -26
  293. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  294. package/build-module/components/writing-flow/use-drag-selection.js +9 -2
  295. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  296. package/build-module/components/writing-flow/use-multi-selection.js +4 -2
  297. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  298. package/build-module/components/writing-flow/use-select-all.js +3 -1
  299. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  300. package/build-module/components/writing-flow/use-selection-observer.js +10 -2
  301. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  302. package/build-module/hooks/border-radius.js +2 -7
  303. package/build-module/hooks/border-radius.js.map +1 -1
  304. package/build-module/hooks/border.js +2 -2
  305. package/build-module/hooks/border.js.map +1 -1
  306. package/build-module/hooks/color.js +4 -1
  307. package/build-module/hooks/color.js.map +1 -1
  308. package/build-module/hooks/dimensions.js +13 -0
  309. package/build-module/hooks/dimensions.js.map +1 -1
  310. package/build-module/hooks/duotone.js +4 -4
  311. package/build-module/hooks/duotone.js.map +1 -1
  312. package/build-module/hooks/gap.js +3 -2
  313. package/build-module/hooks/gap.js.map +1 -1
  314. package/build-module/hooks/generated-class-name.js +1 -6
  315. package/build-module/hooks/generated-class-name.js.map +1 -1
  316. package/build-module/hooks/layout.js +29 -14
  317. package/build-module/hooks/layout.js.map +1 -1
  318. package/build-module/hooks/margin.js +26 -12
  319. package/build-module/hooks/margin.js.map +1 -1
  320. package/build-module/hooks/padding.js +17 -8
  321. package/build-module/hooks/padding.js.map +1 -1
  322. package/build-module/hooks/style.js +7 -53
  323. package/build-module/hooks/style.js.map +1 -1
  324. package/build-module/layouts/constrained.js +197 -0
  325. package/build-module/layouts/constrained.js.map +1 -0
  326. package/build-module/layouts/flex.js +1 -1
  327. package/build-module/layouts/flex.js.map +1 -1
  328. package/build-module/layouts/flow.js +8 -145
  329. package/build-module/layouts/flow.js.map +1 -1
  330. package/build-module/layouts/index.js +2 -1
  331. package/build-module/layouts/index.js.map +1 -1
  332. package/build-module/layouts/utils.js +40 -0
  333. package/build-module/layouts/utils.js.map +1 -1
  334. package/build-module/store/actions.js +25 -3
  335. package/build-module/store/actions.js.map +1 -1
  336. package/build-module/store/selectors.js +5 -7
  337. package/build-module/store/selectors.js.map +1 -1
  338. package/build-module/utils/block-variation-transforms.js +14 -7
  339. package/build-module/utils/block-variation-transforms.js.map +1 -1
  340. package/build-module/utils/pasting.js +9 -1
  341. package/build-module/utils/pasting.js.map +1 -1
  342. package/build-style/style-rtl.css +154 -27
  343. package/build-style/style.css +154 -27
  344. package/package.json +30 -28
  345. package/src/components/block-alignment-control/use-available-alignments.js +1 -1
  346. package/src/components/block-edit-visually-button/index.js +39 -0
  347. package/src/components/block-list/block.js +13 -2
  348. package/src/components/block-list/index.native.js +1 -1
  349. package/src/components/block-popover/inbetween.js +5 -1
  350. package/src/components/block-popover/index.js +22 -13
  351. package/src/components/block-popover/style.scss +25 -2
  352. package/src/components/block-settings-menu/index.js +11 -15
  353. package/src/components/block-styles/index.js +4 -7
  354. package/src/components/block-styles/style.scss +10 -0
  355. package/src/components/block-switcher/index.js +9 -13
  356. package/src/components/block-switcher/test/index.js +1 -0
  357. package/src/components/block-toolbar/index.js +2 -0
  358. package/src/components/block-tools/selected-block-popover.js +7 -0
  359. package/src/components/block-tools/use-block-toolbar-popover-props.js +123 -0
  360. package/src/components/block-types-list/index.js +1 -1
  361. package/src/components/border-radius-control/all-input-control.js +41 -4
  362. package/src/components/border-radius-control/index.js +29 -6
  363. package/src/components/border-radius-control/input-controls.js +40 -13
  364. package/src/components/border-radius-control/test/utils.js +22 -60
  365. package/src/components/border-radius-control/utils.js +12 -16
  366. package/src/components/color-palette/test/__snapshots__/control.js.snap +93 -77
  367. package/src/components/colors/utils.js +5 -2
  368. package/src/components/colors/with-colors.js +11 -1
  369. package/src/components/colors-gradients/control.js +12 -8
  370. package/src/components/colors-gradients/dropdown.js +7 -2
  371. package/src/components/colors-gradients/style.scss +27 -5
  372. package/src/components/colors-gradients/test/control.js +3 -3
  373. package/src/components/copy-handler/index.js +18 -0
  374. package/src/components/date-format-picker/index.js +12 -14
  375. package/src/components/date-format-picker/style.scss +0 -4
  376. package/src/components/duotone/components.js +5 -5
  377. package/src/components/duotone-control/style.scss +0 -4
  378. package/src/components/font-appearance-control/index.js +3 -0
  379. package/src/components/font-appearance-control/style.scss +0 -2
  380. package/src/components/font-family/index.js +1 -1
  381. package/src/components/font-sizes/with-font-sizes.js +11 -1
  382. package/src/components/image-size-control/README.md +7 -0
  383. package/src/components/image-size-control/index.js +2 -0
  384. package/src/components/index.js +5 -1
  385. package/src/components/index.native.js +4 -1
  386. package/src/components/inserter/index.native.js +7 -2
  387. package/src/components/inserter/search-items.js +17 -5
  388. package/src/components/inserter-list-item/index.js +1 -17
  389. package/src/components/letter-spacing-control/index.js +2 -0
  390. package/src/components/line-height-control/index.js +2 -0
  391. package/src/components/link-control/is-url-like.js +1 -6
  392. package/src/components/link-control/link-preview.js +0 -1
  393. package/src/components/link-control/test/index.js +540 -893
  394. package/src/components/link-control/use-search-handler.js +1 -6
  395. package/src/components/list-view/block-select-button.js +7 -2
  396. package/src/components/list-view/expander.js +4 -2
  397. package/src/components/list-view/style.scss +11 -4
  398. package/src/components/list-view/use-block-selection.js +2 -8
  399. package/src/components/media-replace-flow/style.scss +1 -0
  400. package/src/components/media-upload/index.native.js +7 -3
  401. package/src/components/preview-options/index.js +2 -2
  402. package/src/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -28
  403. package/src/components/{use-no-recursive-renders/test/use-no-recursive-renders.js → recursion-provider/test/index.js} +5 -6
  404. package/src/components/rich-text/README.md +13 -1
  405. package/src/components/rich-text/index.js +2 -0
  406. package/src/components/rich-text/index.native.js +2 -0
  407. package/src/components/rich-text/use-before-input-rules.js +91 -0
  408. package/src/components/rich-text/use-enter.js +0 -3
  409. package/src/components/rich-text/use-format-types.js +6 -6
  410. package/src/components/spacing-sizes-control/all-input-control.js +40 -0
  411. package/src/components/spacing-sizes-control/axial-input-controls.js +62 -0
  412. package/src/components/spacing-sizes-control/index.js +91 -0
  413. package/src/components/spacing-sizes-control/input-controls.js +46 -0
  414. package/src/components/spacing-sizes-control/linked-button.js +25 -0
  415. package/src/components/spacing-sizes-control/spacing-input-control.js +280 -0
  416. package/src/components/spacing-sizes-control/style.scss +122 -0
  417. package/src/components/spacing-sizes-control/test/utils.js +156 -0
  418. package/src/components/spacing-sizes-control/utils.js +195 -0
  419. package/src/components/text-decoration-control/index.js +4 -2
  420. package/src/components/text-transform-control/index.js +4 -2
  421. package/src/components/url-input/index.js +1 -1
  422. package/src/components/url-input/style.scss +2 -2
  423. package/src/components/url-popover/image-url-input-ui.js +3 -0
  424. package/src/components/url-popover/style.scss +0 -3
  425. package/src/components/writing-flow/use-arrow-nav.js +4 -33
  426. package/src/components/writing-flow/use-drag-selection.js +7 -1
  427. package/src/components/writing-flow/use-multi-selection.js +4 -1
  428. package/src/components/writing-flow/use-select-all.js +2 -1
  429. package/src/components/writing-flow/use-selection-observer.js +10 -2
  430. package/src/hooks/border-radius.js +2 -6
  431. package/src/hooks/border.js +2 -2
  432. package/src/hooks/color.js +13 -3
  433. package/src/hooks/dimensions.js +15 -0
  434. package/src/hooks/duotone.js +4 -4
  435. package/src/hooks/gap.js +7 -2
  436. package/src/hooks/generated-class-name.js +6 -9
  437. package/src/hooks/layout.js +53 -16
  438. package/src/hooks/margin.js +49 -17
  439. package/src/hooks/padding.js +41 -14
  440. package/src/hooks/style.js +5 -56
  441. package/src/hooks/test/gap.js +22 -0
  442. package/src/hooks/typography.scss +0 -1
  443. package/src/layouts/constrained.js +217 -0
  444. package/src/layouts/flex.js +1 -1
  445. package/src/layouts/flow.js +6 -164
  446. package/src/layouts/index.js +2 -1
  447. package/src/layouts/test/constrained.js +21 -0
  448. package/src/layouts/utils.js +34 -0
  449. package/src/store/actions.js +32 -4
  450. package/src/store/selectors.js +5 -4
  451. package/src/style.scss +1 -0
  452. package/src/utils/block-variation-transforms.js +13 -6
  453. package/src/utils/pasting.js +10 -1
  454. package/src/utils/test/block-variation-transforms.js +24 -0
  455. package/src/utils/test/pasting.js +10 -0
  456. package/build/components/block-settings-menu/block-edit-visually-button.js +0 -70
  457. package/build/components/block-settings-menu/block-edit-visually-button.js.map +0 -1
  458. package/build/components/use-no-recursive-renders/index.js.map +0 -1
  459. package/build-module/components/block-settings-menu/block-edit-visually-button.js +0 -56
  460. package/build-module/components/block-settings-menu/block-edit-visually-button.js.map +0 -1
  461. package/build-module/components/use-no-recursive-renders/index.js.map +0 -1
  462. package/src/components/block-settings-menu/block-edit-visually-button.js +0 -52
@@ -5,11 +5,6 @@ import { getProtocol, prependHTTP } from '@wordpress/url';
5
5
  import { useCallback } from '@wordpress/element';
6
6
  import { useSelect } from '@wordpress/data';
7
7
 
8
- /**
9
- * External dependencies
10
- */
11
- import { startsWith } from 'lodash';
12
-
13
8
  /**
14
9
  * Internal dependencies
15
10
  */
@@ -38,7 +33,7 @@ export const handleDirectEntry = ( val ) => {
38
33
  type = TEL_TYPE;
39
34
  }
40
35
 
41
- if ( startsWith( val, '#' ) ) {
36
+ if ( val?.startsWith( '#' ) ) {
42
37
  type = INTERNAL_TYPE;
43
38
  }
44
39
 
@@ -90,8 +90,13 @@ function ListViewBlockSelectButton(
90
90
  <Truncate ellipsizeMode="auto">{ blockTitle }</Truncate>
91
91
  </span>
92
92
  { blockInformation?.anchor && (
93
- <span className="block-editor-list-view-block-select-button__anchor">
94
- { blockInformation.anchor }
93
+ <span className="block-editor-list-view-block-select-button__anchor-wrapper">
94
+ <Truncate
95
+ className="block-editor-list-view-block-select-button__anchor"
96
+ ellipsizeMode="auto"
97
+ >
98
+ { blockInformation.anchor }
99
+ </Truncate>
95
100
  </span>
96
101
  ) }
97
102
  { isLocked && (
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { chevronRightSmall, Icon } from '@wordpress/icons';
4
+ import { chevronRightSmall, chevronLeftSmall, Icon } from '@wordpress/icons';
5
+ import { isRTL } from '@wordpress/i18n';
6
+
5
7
  export default function ListViewExpander( { onClick } ) {
6
8
  return (
7
9
  // Keyboard events are handled by TreeGrid see: components/src/tree-grid/index.js
@@ -18,7 +20,7 @@ export default function ListViewExpander( { onClick } ) {
18
20
  onClick={ ( event ) => onClick( event, { forceToggle: true } ) }
19
21
  aria-hidden="true"
20
22
  >
21
- <Icon icon={ chevronRightSmall } />
23
+ <Icon icon={ isRTL() ? chevronLeftSmall : chevronRightSmall } />
22
24
  </span>
23
25
  );
24
26
  }
@@ -312,14 +312,21 @@
312
312
  }
313
313
  }
314
314
 
315
+ .block-editor-list-view-block-select-button__anchor-wrapper {
316
+ position: relative;
317
+ max-width: min(110px, 40%);
318
+ width: 100%;
319
+ }
320
+
315
321
  .block-editor-list-view-block-select-button__anchor {
322
+ position: absolute;
323
+ right: 0;
324
+ transform: translateY(-50%);
316
325
  background: rgba($black, 0.1);
317
326
  border-radius: $radius-block-ui;
318
- display: inline-block;
319
327
  padding: 2px 6px;
320
- max-width: min(100px, 40%);
321
- overflow: hidden;
322
- text-overflow: ellipsis;
328
+ max-width: 100%;
329
+ box-sizing: border-box;
323
330
  }
324
331
 
325
332
  &.is-selected .block-editor-list-view-block-select-button__anchor {
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { difference } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -126,9 +121,8 @@ export default function useBlockSelection() {
126
121
  return;
127
122
  }
128
123
 
129
- const selectionDiff = difference(
130
- selectedBlocks,
131
- updatedSelectedBlocks
124
+ const selectionDiff = selectedBlocks.filter(
125
+ ( blockId ) => ! updatedSelectedBlocks.includes( blockId )
132
126
  );
133
127
 
134
128
  let label;
@@ -27,6 +27,7 @@
27
27
 
28
28
  .block-editor-url-input {
29
29
  padding: 0; // Cancel unnecessary default 1px padding in this case.
30
+ margin: 0; // Reset default LinkControl margins.
30
31
  }
31
32
 
32
33
  .components-base-control .components-base-control__field {
@@ -3,8 +3,6 @@
3
3
  */
4
4
  import { Platform } from 'react-native';
5
5
 
6
- import { delay } from 'lodash';
7
-
8
6
  import prompt from 'react-native-prompt-android';
9
7
 
10
8
  /**
@@ -46,6 +44,8 @@ const URL_MEDIA_SOURCE = 'URL';
46
44
  const PICKER_OPENING_DELAY = 200;
47
45
 
48
46
  export class MediaUpload extends Component {
47
+ pickerTimeout;
48
+
49
49
  constructor( props ) {
50
50
  super( props );
51
51
  this.onPickerPresent = this.onPickerPresent.bind( this );
@@ -78,6 +78,10 @@ export class MediaUpload extends Component {
78
78
  }
79
79
  }
80
80
 
81
+ componentWillUnmount() {
82
+ clearTimeout( this.pickerTimeout );
83
+ }
84
+
81
85
  getAllSources() {
82
86
  const { onSelectURL } = this.props;
83
87
 
@@ -189,7 +193,7 @@ export class MediaUpload extends Component {
189
193
  // the delay below is required because on iOS this action sheet gets dismissed by the close event of the Inserter
190
194
  // so this delay allows the Inserter to be closed fully before presenting action sheet.
191
195
  if ( autoOpen && isIOS ) {
192
- delay(
196
+ this.pickerTimeout = setTimeout(
193
197
  () => this.picker.presentPicker(),
194
198
  PICKER_OPENING_DELAY
195
199
  );
@@ -33,10 +33,10 @@ export default function PreviewOptions( {
33
33
  className: 'block-editor-post-preview__button-toggle',
34
34
  disabled: ! isEnabled,
35
35
  /* translators: button label text should, if possible, be under 16 characters. */
36
- children: __( 'Preview' ),
36
+ children: __( 'View' ),
37
37
  };
38
38
  const menuProps = {
39
- 'aria-label': __( 'Preview options' ),
39
+ 'aria-label': __( 'View options' ),
40
40
  };
41
41
  return (
42
42
  <DropdownMenu
@@ -1,12 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import {
5
- createContext,
6
- useCallback,
7
- useContext,
8
- useMemo,
9
- } from '@wordpress/element';
4
+ import { createContext, useContext, useMemo } from '@wordpress/element';
10
5
 
11
6
  /**
12
7
  * Internal dependencies
@@ -37,37 +32,53 @@ function addToBlockType( renderedBlocks, blockName, uniqueId ) {
37
32
  }
38
33
 
39
34
  /**
40
- * A React hook for keeping track of blocks previously rendered up in the block
41
- * tree. Blocks susceptible to recursion can use this hook in their `Edit`
42
- * function to prevent said recursion.
35
+ * A React context provider for use with the `useHasRecursion` hook to prevent recursive
36
+ * renders.
43
37
  *
44
- * @param {*} uniqueId Any value that acts as a unique identifier for a block instance.
45
- * @param {string} blockName Optional block name.
38
+ * Wrap block content with this provider and provide the same `uniqueId` prop as used
39
+ * with `useHasRecursion`.
40
+ *
41
+ * @param {Object} props
42
+ * @param {*} props.uniqueId Any value that acts as a unique identifier for a block instance.
43
+ * @param {string} props.blockName Optional block name.
44
+ * @param {JSX.Element} props.children React children.
46
45
  *
47
- * @return {[boolean, Function]} A tuple of:
48
- * - a boolean describing whether the provided id
49
- * has already been rendered;
50
- * - a React context provider to be used to wrap
51
- * other elements.
46
+ * @return {JSX.Element} A React element.
52
47
  */
53
- export default function useNoRecursiveRenders( uniqueId, blockName = '' ) {
48
+ export function RecursionProvider( { children, uniqueId, blockName = '' } ) {
54
49
  const previouslyRenderedBlocks = useContext( RenderedRefsContext );
55
50
  const { name } = useBlockEditContext();
51
+
56
52
  blockName = blockName || name;
57
- const hasAlreadyRendered = Boolean(
58
- previouslyRenderedBlocks[ blockName ]?.has( uniqueId )
59
- );
53
+
60
54
  const newRenderedBlocks = useMemo(
61
55
  () => addToBlockType( previouslyRenderedBlocks, blockName, uniqueId ),
62
56
  [ previouslyRenderedBlocks, blockName, uniqueId ]
63
57
  );
64
- const Provider = useCallback(
65
- ( { children } ) => (
66
- <RenderedRefsContext.Provider value={ newRenderedBlocks }>
67
- { children }
68
- </RenderedRefsContext.Provider>
69
- ),
70
- [ newRenderedBlocks ]
58
+
59
+ return (
60
+ <RenderedRefsContext.Provider value={ newRenderedBlocks }>
61
+ { children }
62
+ </RenderedRefsContext.Provider>
71
63
  );
72
- return [ hasAlreadyRendered, Provider ];
64
+ }
65
+
66
+ /**
67
+ * A React hook for keeping track of blocks previously rendered up in the block
68
+ * tree. Blocks susceptible to recursion can use this hook in their `Edit`
69
+ * function to prevent said recursion.
70
+ *
71
+ * Use this with the `RecursionProvider` component, using the same `uniqueId` value
72
+ * for both the hook and the provider.
73
+ *
74
+ * @param {*} uniqueId Any value that acts as a unique identifier for a block instance.
75
+ * @param {string} blockName Optional block name.
76
+ *
77
+ * @return {boolean} A boolean describing whether the provided id has already been rendered.
78
+ */
79
+ export function useHasRecursion( uniqueId, blockName = '' ) {
80
+ const previouslyRenderedBlocks = useContext( RenderedRefsContext );
81
+ const { name } = useBlockEditContext();
82
+ blockName = blockName || name;
83
+ return Boolean( previouslyRenderedBlocks[ blockName ]?.has( uniqueId ) );
73
84
  }
@@ -6,7 +6,7 @@ import { render } from '@testing-library/react';
6
6
  /**
7
7
  * Internal dependencies
8
8
  */
9
- import useNoRecursiveRenders from '../';
9
+ import { useHasRecursion, RecursionProvider } from '..';
10
10
  import {
11
11
  BlockEditContextProvider,
12
12
  useBlockEditContext,
@@ -16,15 +16,14 @@ import {
16
16
  // of calling itself depending on its `uniqueId` attribute.
17
17
  function Edit( { attributes: { uniqueId } } ) {
18
18
  const { name } = useBlockEditContext();
19
- const [ hasAlreadyRendered, RecursionProvider ] =
20
- useNoRecursiveRenders( uniqueId );
19
+ const hasRecursion = useHasRecursion( uniqueId );
21
20
 
22
- if ( hasAlreadyRendered ) {
21
+ if ( hasRecursion ) {
23
22
  return <div className={ `wp-block__${ name }--halted` }>Halt</div>;
24
23
  }
25
24
 
26
25
  return (
27
- <RecursionProvider>
26
+ <RecursionProvider uniqueId={ uniqueId }>
28
27
  <div className={ `wp-block__${ name }` }>
29
28
  { uniqueId === 'SIMPLE' && <p>Done</p> }
30
29
  { uniqueId === 'SINGLY-RECURSIVE' && (
@@ -48,7 +47,7 @@ function Edit( { attributes: { uniqueId } } ) {
48
47
  );
49
48
  }
50
49
 
51
- describe( 'useNoRecursiveRenders', () => {
50
+ describe( 'useHasRecursion/RecursionProvider', () => {
52
51
  const context = { name: 'reusable-block' };
53
52
 
54
53
  it( 'allows a single block to render', () => {
@@ -43,7 +43,19 @@ _Optional._ Called when the block can be removed. `forward` is true when the sel
43
43
 
44
44
  ### `allowedFormats: Array`
45
45
 
46
- _Optional._ By default, all registered formats are allowed. This setting can be used to fine-tune the allowed formats. Example: `[ 'core/bold', 'core/link' ]`.
46
+ _Optional._ By default, all registered formats are allowed. This setting can be used to fine-tune the allowed formats. If you want to limit the formats allowed, you can specify using allowedFormats property in your code. If you want to allow only bold and italic settings, then you need to pass it in array. Example: `[ 'core/bold', 'core/link' ]`.
47
+
48
+ {% ESNext %}
49
+
50
+ ```js
51
+ <RichText
52
+ tagName="h2"
53
+ value={ attributes.content }
54
+ allowedFormats={ [ 'core/bold', 'core/italic' ] } // Allow the content to be made bold or italic, but do not allow othe formatting options
55
+ onChange={ ( content ) => setAttributes( { content } ) }
56
+ placeholder={ __( 'Heading...' ) }
57
+ />
58
+ ```
47
59
 
48
60
  ### `withoutInteractiveFormatting: Boolean`
49
61
 
@@ -38,6 +38,7 @@ import { store as blockEditorStore } from '../../store';
38
38
  import { useUndoAutomaticChange } from './use-undo-automatic-change';
39
39
  import { useMarkPersistent } from './use-mark-persistent';
40
40
  import { usePasteHandler } from './use-paste-handler';
41
+ import { useBeforeInputRules } from './use-before-input-rules';
41
42
  import { useInputRules } from './use-input-rules';
42
43
  import { useEnter } from './use-enter';
43
44
  import { useFormatTypes } from './use-format-types';
@@ -359,6 +360,7 @@ function RichTextWrapper(
359
360
  autocompleteProps.ref,
360
361
  props.ref,
361
362
  richTextRef,
363
+ useBeforeInputRules( { value, onChange } ),
362
364
  useInputRules( {
363
365
  value,
364
366
  onChange,
@@ -113,6 +113,7 @@ function RichTextWrapper(
113
113
  setRef,
114
114
  disableSuggestions,
115
115
  disableAutocorrection,
116
+ containerWidth,
116
117
  ...props
117
118
  },
118
119
  forwardedRef
@@ -639,6 +640,7 @@ function RichTextWrapper(
639
640
  setRef={ setRef }
640
641
  disableSuggestions={ disableSuggestions }
641
642
  disableAutocorrection={ disableAutocorrection }
643
+ containerWidth={ containerWidth }
642
644
  // Props to be set on the editable container are destructured on the
643
645
  // element itself for web (see below), but passed through rich text
644
646
  // for native.
@@ -0,0 +1,91 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useRef } from '@wordpress/element';
5
+ import { useRefEffect } from '@wordpress/compose';
6
+ import { insert, isCollapsed } from '@wordpress/rich-text';
7
+ import { useDispatch } from '@wordpress/data';
8
+ import { applyFilters } from '@wordpress/hooks';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import { store as blockEditorStore } from '../../store';
14
+
15
+ /**
16
+ * When typing over a selection, the selection will we wrapped by a matching
17
+ * character pair. The second character is optional, it defaults to the first
18
+ * character.
19
+ *
20
+ * @type {string[]} Array of character pairs.
21
+ */
22
+ const wrapSelectionSettings = [ '`', '"', "'", '“”', '‘’' ];
23
+
24
+ export function useBeforeInputRules( props ) {
25
+ const {
26
+ __unstableMarkLastChangeAsPersistent,
27
+ __unstableMarkAutomaticChange,
28
+ } = useDispatch( blockEditorStore );
29
+ const propsRef = useRef( props );
30
+ propsRef.current = props;
31
+ return useRefEffect( ( element ) => {
32
+ function onInput( event ) {
33
+ const { inputType, data } = event;
34
+ const { value, onChange } = propsRef.current;
35
+
36
+ // Only run the rules when inserting text.
37
+ if ( inputType !== 'insertText' ) {
38
+ return;
39
+ }
40
+
41
+ if ( isCollapsed( value ) ) {
42
+ return;
43
+ }
44
+
45
+ const pair = applyFilters(
46
+ 'blockEditor.wrapSelectionSettings',
47
+ wrapSelectionSettings
48
+ ).find(
49
+ ( [ startChar, endChar ] ) =>
50
+ startChar === data || endChar === data
51
+ );
52
+
53
+ if ( ! pair ) {
54
+ return;
55
+ }
56
+
57
+ const [ startChar, endChar = startChar ] = pair;
58
+ const start = value.start;
59
+ const end = value.end + startChar.length;
60
+
61
+ let newValue = insert( value, startChar, start, start );
62
+ newValue = insert( newValue, endChar, end, end );
63
+
64
+ __unstableMarkLastChangeAsPersistent();
65
+ onChange( newValue );
66
+ __unstableMarkAutomaticChange();
67
+
68
+ const init = {};
69
+
70
+ for ( const key in event ) {
71
+ init[ key ] = event[ key ];
72
+ }
73
+
74
+ init.data = endChar;
75
+
76
+ const { ownerDocument } = element;
77
+ const { defaultView } = ownerDocument;
78
+ const newEvent = new defaultView.InputEvent( 'input', init );
79
+
80
+ // Dispatch an input event with the new data. This will trigger the
81
+ // input rules.
82
+ event.target.dispatchEvent( newEvent );
83
+ event.preventDefault();
84
+ }
85
+
86
+ element.addEventListener( 'beforeinput', onInput );
87
+ return () => {
88
+ element.removeEventListener( 'beforeinput', onInput );
89
+ };
90
+ }, [] );
91
+ }
@@ -1,6 +1,3 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
1
  /**
5
2
  * WordPress dependencies
6
3
  */
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { mapKeys } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -35,7 +30,12 @@ const interactiveContentTags = new Set( [
35
30
 
36
31
  function prefixSelectKeys( selected, prefix ) {
37
32
  if ( typeof selected !== 'object' ) return { [ prefix ]: selected };
38
- return mapKeys( selected, ( value, key ) => `${ prefix }.${ key }` );
33
+ return Object.fromEntries(
34
+ Object.entries( selected ).map( ( [ key, value ] ) => [
35
+ `${ prefix }.${ key }`,
36
+ value,
37
+ ] )
38
+ );
39
39
  }
40
40
 
41
41
  function getPrefixedSelectKeys( selected, prefix ) {
@@ -0,0 +1,40 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __experimentalApplyValueToSides as applyValueToSides } from '@wordpress/components';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import SpacingInputControl from './spacing-input-control';
10
+ import { getAllRawValue, isValuesMixed, isValuesDefined } from './utils';
11
+
12
+ export default function AllInputControl( {
13
+ onChange,
14
+ values,
15
+ sides,
16
+ spacingSizes,
17
+ type,
18
+ minimumCustomValue,
19
+ } ) {
20
+ const allValue = getAllRawValue( values );
21
+ const hasValues = isValuesDefined( values );
22
+ const isMixed = hasValues && isValuesMixed( values, sides );
23
+
24
+ const handleOnChange = ( next ) => {
25
+ const nextValues = applyValueToSides( values, next, sides );
26
+ onChange( nextValues );
27
+ };
28
+
29
+ return (
30
+ <SpacingInputControl
31
+ value={ allValue }
32
+ onChange={ handleOnChange }
33
+ side={ 'all' }
34
+ spacingSizes={ spacingSizes }
35
+ isMixed={ isMixed }
36
+ type={ type }
37
+ minimumCustomValue={ minimumCustomValue }
38
+ />
39
+ );
40
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import SpacingInputControl from './spacing-input-control';
5
+ import { LABELS } from './utils';
6
+
7
+ const groupedSides = [ 'vertical', 'horizontal' ];
8
+
9
+ export default function AxialInputControls( {
10
+ onChange,
11
+ values,
12
+ sides,
13
+ spacingSizes,
14
+ type,
15
+ minimumCustomValue,
16
+ } ) {
17
+ const createHandleOnChange = ( side ) => ( next ) => {
18
+ if ( ! onChange ) {
19
+ return;
20
+ }
21
+ const nextValues = { ...values };
22
+
23
+ if ( side === 'vertical' ) {
24
+ nextValues.top = next;
25
+ nextValues.bottom = next;
26
+ }
27
+
28
+ if ( side === 'horizontal' ) {
29
+ nextValues.left = next;
30
+ nextValues.right = next;
31
+ }
32
+
33
+ onChange( nextValues );
34
+ };
35
+
36
+ // Filter sides if custom configuration provided, maintaining default order.
37
+ const filteredSides = sides?.length
38
+ ? groupedSides.filter( ( side ) => sides.includes( side ) )
39
+ : groupedSides;
40
+
41
+ return (
42
+ <>
43
+ { filteredSides.map( ( side ) => {
44
+ const axisValue =
45
+ side === 'vertical' ? values.top : values.left;
46
+ return (
47
+ <SpacingInputControl
48
+ value={ axisValue }
49
+ onChange={ createHandleOnChange( side ) }
50
+ label={ LABELS[ side ] }
51
+ key={ `spacing-sizes-control-${ side }` }
52
+ withInputField={ false }
53
+ side={ side }
54
+ spacingSizes={ spacingSizes }
55
+ type={ type }
56
+ minimumCustomValue={ minimumCustomValue }
57
+ />
58
+ );
59
+ } ) }
60
+ </>
61
+ );
62
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useState } from '@wordpress/element';
5
+ import { __ } from '@wordpress/i18n';
6
+ import { __experimentalText as Text } from '@wordpress/components';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import AllInputControl from './all-input-control';
12
+ import InputControls from './input-controls';
13
+ import AxialInputControls from './axial-input-controls';
14
+ import LinkedButton from './linked-button';
15
+ import { DEFAULT_VALUES, isValuesMixed, isValuesDefined } from './utils';
16
+ import useSetting from '../use-setting';
17
+
18
+ export default function SpacingSizesControl( {
19
+ inputProps,
20
+ onChange,
21
+ label = __( 'Spacing Control' ),
22
+ values,
23
+ sides,
24
+ splitOnAxis = false,
25
+ useSelect,
26
+ minimumCustomValue = 0,
27
+ } ) {
28
+ const spacingSizes = [
29
+ { name: 0, slug: '0', size: 0 },
30
+ ...( useSetting( 'spacing.spacingSizes' ) || [] ),
31
+ ];
32
+
33
+ if ( spacingSizes.length > 8 ) {
34
+ spacingSizes.unshift( {
35
+ name: __( 'Default' ),
36
+ slug: 'default',
37
+ size: undefined,
38
+ } );
39
+ }
40
+
41
+ const inputValues = values || DEFAULT_VALUES;
42
+ const hasInitialValue = isValuesDefined( values );
43
+ const hasOneSide = sides?.length === 1;
44
+
45
+ const [ isLinked, setIsLinked ] = useState(
46
+ ! hasInitialValue || ! isValuesMixed( inputValues, sides ) || hasOneSide
47
+ );
48
+
49
+ const toggleLinked = () => {
50
+ setIsLinked( ! isLinked );
51
+ };
52
+
53
+ const handleOnChange = ( nextValue ) => {
54
+ const newValues = { ...values, ...nextValue };
55
+ onChange( newValues );
56
+ };
57
+
58
+ const inputControlProps = {
59
+ ...inputProps,
60
+ onChange: handleOnChange,
61
+ isLinked,
62
+ sides,
63
+ values: inputValues,
64
+ spacingSizes,
65
+ useSelect,
66
+ type: label,
67
+ minimumCustomValue,
68
+ };
69
+
70
+ return (
71
+ <fieldset role="region" className="component-spacing-sizes-control">
72
+ <Text as="legend">{ label }</Text>
73
+ { ! hasOneSide && (
74
+ <LinkedButton onClick={ toggleLinked } isLinked={ isLinked } />
75
+ ) }
76
+ { isLinked && (
77
+ <AllInputControl
78
+ aria-label={ label }
79
+ { ...inputControlProps }
80
+ />
81
+ ) }
82
+
83
+ { ! isLinked && splitOnAxis && (
84
+ <AxialInputControls { ...inputControlProps } />
85
+ ) }
86
+ { ! isLinked && ! splitOnAxis && (
87
+ <InputControls { ...inputControlProps } />
88
+ ) }
89
+ </fieldset>
90
+ );
91
+ }