@wordpress/block-editor 16.0.0 → 16.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 (368) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +8 -0
  3. package/build/components/alignment-control/ui.cjs +2 -4
  4. package/build/components/alignment-control/ui.cjs.map +2 -2
  5. package/build/components/background-image-control/index.cjs +40 -10
  6. package/build/components/background-image-control/index.cjs.map +2 -2
  7. package/build/components/block-alignment-control/ui.cjs +5 -3
  8. package/build/components/block-alignment-control/ui.cjs.map +2 -2
  9. package/build/components/block-inspector/index.cjs +73 -46
  10. package/build/components/block-inspector/index.cjs.map +2 -2
  11. package/build/components/block-list/block-html.cjs +4 -1
  12. package/build/components/block-list/block-html.cjs.map +2 -2
  13. package/build/components/block-list/use-block-props/index.cjs +5 -2
  14. package/build/components/block-list/use-block-props/index.cjs.map +2 -2
  15. package/build/components/block-list/use-block-props/use-focus-handler.cjs +2 -3
  16. package/build/components/block-list/use-block-props/use-focus-handler.cjs.map +2 -2
  17. package/build/components/block-list/use-block-props/use-register-block-event-handlers.cjs +48 -0
  18. package/build/components/block-list/use-block-props/use-register-block-event-handlers.cjs.map +7 -0
  19. package/build/components/block-parent-selector/index.cjs +2 -2
  20. package/build/components/block-parent-selector/index.cjs.map +2 -2
  21. package/build/components/block-toolbar/switch-section-style.cjs +4 -2
  22. package/build/components/block-toolbar/switch-section-style.cjs.map +3 -3
  23. package/build/components/block-tools/empty-block-inserter.cjs +2 -7
  24. package/build/components/block-tools/empty-block-inserter.cjs.map +2 -2
  25. package/build/components/block-vertical-alignment-control/ui.cjs +3 -5
  26. package/build/components/block-vertical-alignment-control/ui.cjs.map +2 -2
  27. package/build/components/border-radius-control/utils.cjs +8 -58
  28. package/build/components/border-radius-control/utils.cjs.map +2 -2
  29. package/build/components/colors-gradients/control.cjs +5 -3
  30. package/build/components/colors-gradients/control.cjs.map +2 -2
  31. package/build/components/dimension-control/index.cjs +30 -20
  32. package/build/components/dimension-control/index.cjs.map +3 -3
  33. package/build/components/dimensions-tool/aspect-ratio-tool.cjs +9 -2
  34. package/build/components/dimensions-tool/aspect-ratio-tool.cjs.map +3 -3
  35. package/build/components/editor-styles/index.cjs +9 -1
  36. package/build/components/editor-styles/index.cjs.map +2 -2
  37. package/build/components/global-styles/background-panel.cjs +66 -25
  38. package/build/components/global-styles/background-panel.cjs.map +3 -3
  39. package/build/components/global-styles/border-panel.cjs +153 -55
  40. package/build/components/global-styles/border-panel.cjs.map +3 -3
  41. package/build/components/global-styles/color-gradient-dropdown-item.cjs +46 -14
  42. package/build/components/global-styles/color-gradient-dropdown-item.cjs.map +3 -3
  43. package/build/components/global-styles/color-panel.cjs +63 -17
  44. package/build/components/global-styles/color-panel.cjs.map +2 -2
  45. package/build/components/global-styles/dimensions-panel.cjs +242 -64
  46. package/build/components/global-styles/dimensions-panel.cjs.map +3 -3
  47. package/build/components/global-styles/filters-panel.cjs +59 -20
  48. package/build/components/global-styles/filters-panel.cjs.map +3 -3
  49. package/build/components/global-styles/hooks.cjs +4 -1
  50. package/build/components/global-styles/hooks.cjs.map +2 -2
  51. package/build/components/global-styles/inheritance/index.cjs +142 -0
  52. package/build/components/global-styles/inheritance/index.cjs.map +7 -0
  53. package/build/components/global-styles/inherited-value-context.cjs +173 -0
  54. package/build/components/global-styles/inherited-value-context.cjs.map +7 -0
  55. package/build/components/global-styles/shadow-panel-components.cjs +38 -20
  56. package/build/components/global-styles/shadow-panel-components.cjs.map +2 -2
  57. package/build/components/global-styles/state-control.cjs +1 -1
  58. package/build/components/global-styles/state-control.cjs.map +2 -2
  59. package/build/components/global-styles/typography-panel.cjs +271 -78
  60. package/build/components/global-styles/typography-panel.cjs.map +3 -3
  61. package/build/components/inspector-controls-tabs/styles-tab.cjs +10 -1
  62. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +2 -2
  63. package/build/components/line-height-control/index.cjs +1 -1
  64. package/build/components/line-height-control/index.cjs.map +2 -2
  65. package/build/components/link-control/index.cjs +3 -1
  66. package/build/components/link-control/index.cjs.map +2 -2
  67. package/build/components/preset-input-control/index.cjs +2 -1
  68. package/build/components/preset-input-control/index.cjs.map +2 -2
  69. package/build/components/provider/block-refs-provider.cjs +8 -2
  70. package/build/components/provider/block-refs-provider.cjs.map +2 -2
  71. package/build/components/provider/index.cjs +1 -1
  72. package/build/components/provider/index.cjs.map +2 -2
  73. package/build/components/provider/use-block-sync.cjs +18 -6
  74. package/build/components/provider/use-block-sync.cjs.map +2 -2
  75. package/build/components/provider/use-media-upload-settings.cjs +3 -1
  76. package/build/components/provider/use-media-upload-settings.cjs.map +2 -2
  77. package/build/components/rich-text/index.cjs +23 -13
  78. package/build/components/rich-text/index.cjs.map +2 -2
  79. package/build/components/spacing-sizes-control/utils.cjs +6 -19
  80. package/build/components/spacing-sizes-control/utils.cjs.map +2 -2
  81. package/build/components/text-indent-control/index.cjs +8 -2
  82. package/build/components/text-indent-control/index.cjs.map +2 -2
  83. package/build/components/url-input/index.cjs +303 -344
  84. package/build/components/url-input/index.cjs.map +3 -3
  85. package/build/components/writing-flow/index.cjs +2 -0
  86. package/build/components/writing-flow/index.cjs.map +3 -3
  87. package/build/components/writing-flow/use-arrow-nav.cjs +24 -1
  88. package/build/components/writing-flow/use-arrow-nav.cjs.map +2 -2
  89. package/build/components/writing-flow/use-click-selection.cjs +28 -2
  90. package/build/components/writing-flow/use-click-selection.cjs.map +2 -2
  91. package/build/components/writing-flow/use-editable-root-event-handlers.cjs +179 -0
  92. package/build/components/writing-flow/use-editable-root-event-handlers.cjs.map +7 -0
  93. package/build/components/writing-flow/use-editable-root.cjs +5 -42
  94. package/build/components/writing-flow/use-editable-root.cjs.map +2 -2
  95. package/build/components/writing-flow/use-home-end.cjs +1 -1
  96. package/build/components/writing-flow/use-home-end.cjs.map +2 -2
  97. package/build/components/writing-flow/use-selection-observer.cjs +17 -13
  98. package/build/components/writing-flow/use-selection-observer.cjs.map +2 -2
  99. package/build/components/writing-flow/utils.cjs +3 -14
  100. package/build/components/writing-flow/utils.cjs.map +2 -2
  101. package/build/hooks/background.cjs +13 -10
  102. package/build/hooks/background.cjs.map +2 -2
  103. package/build/hooks/block-style-variation.cjs +4 -45
  104. package/build/hooks/block-style-variation.cjs.map +3 -3
  105. package/build/hooks/border.cjs +19 -4
  106. package/build/hooks/border.cjs.map +2 -2
  107. package/build/hooks/custom-css.cjs +6 -2
  108. package/build/hooks/custom-css.cjs.map +2 -2
  109. package/build/hooks/dimensions.cjs +15 -4
  110. package/build/hooks/dimensions.cjs.map +2 -2
  111. package/build/hooks/duotone.cjs +26 -14
  112. package/build/hooks/duotone.cjs.map +3 -3
  113. package/build/hooks/elements.cjs +14 -4
  114. package/build/hooks/elements.cjs.map +2 -2
  115. package/build/hooks/line-height.cjs +1 -2
  116. package/build/hooks/line-height.cjs.map +2 -2
  117. package/build/hooks/typography.cjs +13 -4
  118. package/build/hooks/typography.cjs.map +2 -2
  119. package/build/private-apis.cjs +9 -5
  120. package/build/private-apis.cjs.map +3 -3
  121. package/build/store/actions.cjs +9 -4
  122. package/build/store/actions.cjs.map +2 -2
  123. package/build/store/private-selectors.cjs +28 -1
  124. package/build/store/private-selectors.cjs.map +2 -2
  125. package/build/store/reducer.cjs +6 -6
  126. package/build/store/reducer.cjs.map +2 -2
  127. package/build/store/selectors.cjs +23 -0
  128. package/build/store/selectors.cjs.map +2 -2
  129. package/build/utils/native-undo.cjs +55 -0
  130. package/build/utils/native-undo.cjs.map +7 -0
  131. package/build-module/components/alignment-control/ui.mjs +2 -4
  132. package/build-module/components/alignment-control/ui.mjs.map +2 -2
  133. package/build-module/components/background-image-control/index.mjs +43 -10
  134. package/build-module/components/background-image-control/index.mjs.map +2 -2
  135. package/build-module/components/block-alignment-control/ui.mjs +5 -3
  136. package/build-module/components/block-alignment-control/ui.mjs.map +2 -2
  137. package/build-module/components/block-inspector/index.mjs +74 -46
  138. package/build-module/components/block-inspector/index.mjs.map +2 -2
  139. package/build-module/components/block-list/block-html.mjs +4 -1
  140. package/build-module/components/block-list/block-html.mjs.map +2 -2
  141. package/build-module/components/block-list/use-block-props/index.mjs +5 -2
  142. package/build-module/components/block-list/use-block-props/index.mjs.map +2 -2
  143. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs +2 -3
  144. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs.map +2 -2
  145. package/build-module/components/block-list/use-block-props/use-register-block-event-handlers.mjs +28 -0
  146. package/build-module/components/block-list/use-block-props/use-register-block-event-handlers.mjs.map +7 -0
  147. package/build-module/components/block-parent-selector/index.mjs +2 -2
  148. package/build-module/components/block-parent-selector/index.mjs.map +2 -2
  149. package/build-module/components/block-toolbar/switch-section-style.mjs +4 -2
  150. package/build-module/components/block-toolbar/switch-section-style.mjs.map +2 -2
  151. package/build-module/components/block-tools/empty-block-inserter.mjs +2 -7
  152. package/build-module/components/block-tools/empty-block-inserter.mjs.map +2 -2
  153. package/build-module/components/block-vertical-alignment-control/ui.mjs +4 -6
  154. package/build-module/components/block-vertical-alignment-control/ui.mjs.map +2 -2
  155. package/build-module/components/border-radius-control/utils.mjs +11 -53
  156. package/build-module/components/border-radius-control/utils.mjs.map +2 -2
  157. package/build-module/components/colors-gradients/control.mjs +5 -3
  158. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  159. package/build-module/components/dimension-control/index.mjs +30 -20
  160. package/build-module/components/dimension-control/index.mjs.map +2 -2
  161. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs +10 -6
  162. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs.map +2 -2
  163. package/build-module/components/editor-styles/index.mjs +9 -1
  164. package/build-module/components/editor-styles/index.mjs.map +2 -2
  165. package/build-module/components/global-styles/background-panel.mjs +71 -29
  166. package/build-module/components/global-styles/background-panel.mjs.map +2 -2
  167. package/build-module/components/global-styles/border-panel.mjs +157 -56
  168. package/build-module/components/global-styles/border-panel.mjs.map +2 -2
  169. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs +51 -15
  170. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs.map +2 -2
  171. package/build-module/components/global-styles/color-panel.mjs +63 -17
  172. package/build-module/components/global-styles/color-panel.mjs.map +2 -2
  173. package/build-module/components/global-styles/dimensions-panel.mjs +248 -66
  174. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  175. package/build-module/components/global-styles/filters-panel.mjs +64 -21
  176. package/build-module/components/global-styles/filters-panel.mjs.map +2 -2
  177. package/build-module/components/global-styles/hooks.mjs +4 -1
  178. package/build-module/components/global-styles/hooks.mjs.map +2 -2
  179. package/build-module/components/global-styles/inheritance/index.mjs +108 -0
  180. package/build-module/components/global-styles/inheritance/index.mjs.map +7 -0
  181. package/build-module/components/global-styles/inherited-value-context.mjs +141 -0
  182. package/build-module/components/global-styles/inherited-value-context.mjs.map +7 -0
  183. package/build-module/components/global-styles/shadow-panel-components.mjs +38 -20
  184. package/build-module/components/global-styles/shadow-panel-components.mjs.map +2 -2
  185. package/build-module/components/global-styles/state-control.mjs +1 -1
  186. package/build-module/components/global-styles/state-control.mjs.map +2 -2
  187. package/build-module/components/global-styles/typography-panel.mjs +276 -79
  188. package/build-module/components/global-styles/typography-panel.mjs.map +2 -2
  189. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +6 -1
  190. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  191. package/build-module/components/line-height-control/index.mjs +1 -1
  192. package/build-module/components/line-height-control/index.mjs.map +2 -2
  193. package/build-module/components/link-control/index.mjs +4 -2
  194. package/build-module/components/link-control/index.mjs.map +2 -2
  195. package/build-module/components/preset-input-control/index.mjs +2 -1
  196. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  197. package/build-module/components/provider/block-refs-provider.mjs +8 -2
  198. package/build-module/components/provider/block-refs-provider.mjs.map +2 -2
  199. package/build-module/components/provider/index.mjs +1 -1
  200. package/build-module/components/provider/index.mjs.map +2 -2
  201. package/build-module/components/provider/use-block-sync.mjs +18 -6
  202. package/build-module/components/provider/use-block-sync.mjs.map +2 -2
  203. package/build-module/components/provider/use-media-upload-settings.mjs +3 -1
  204. package/build-module/components/provider/use-media-upload-settings.mjs.map +2 -2
  205. package/build-module/components/rich-text/index.mjs +28 -14
  206. package/build-module/components/rich-text/index.mjs.map +2 -2
  207. package/build-module/components/spacing-sizes-control/utils.mjs +6 -18
  208. package/build-module/components/spacing-sizes-control/utils.mjs.map +2 -2
  209. package/build-module/components/text-indent-control/index.mjs +8 -2
  210. package/build-module/components/text-indent-control/index.mjs.map +2 -2
  211. package/build-module/components/url-input/index.mjs +306 -353
  212. package/build-module/components/url-input/index.mjs.map +2 -2
  213. package/build-module/components/writing-flow/index.mjs +2 -0
  214. package/build-module/components/writing-flow/index.mjs.map +2 -2
  215. package/build-module/components/writing-flow/use-arrow-nav.mjs +24 -1
  216. package/build-module/components/writing-flow/use-arrow-nav.mjs.map +2 -2
  217. package/build-module/components/writing-flow/use-click-selection.mjs +28 -2
  218. package/build-module/components/writing-flow/use-click-selection.mjs.map +2 -2
  219. package/build-module/components/writing-flow/use-editable-root-event-handlers.mjs +154 -0
  220. package/build-module/components/writing-flow/use-editable-root-event-handlers.mjs.map +7 -0
  221. package/build-module/components/writing-flow/use-editable-root.mjs +5 -37
  222. package/build-module/components/writing-flow/use-editable-root.mjs.map +2 -2
  223. package/build-module/components/writing-flow/use-home-end.mjs +1 -1
  224. package/build-module/components/writing-flow/use-home-end.mjs.map +2 -2
  225. package/build-module/components/writing-flow/use-selection-observer.mjs +18 -14
  226. package/build-module/components/writing-flow/use-selection-observer.mjs.map +2 -2
  227. package/build-module/components/writing-flow/utils.mjs +2 -11
  228. package/build-module/components/writing-flow/utils.mjs.map +2 -2
  229. package/build-module/hooks/background.mjs +13 -10
  230. package/build-module/hooks/background.mjs.map +2 -2
  231. package/build-module/hooks/block-style-variation.mjs +8 -44
  232. package/build-module/hooks/block-style-variation.mjs.map +2 -2
  233. package/build-module/hooks/border.mjs +19 -4
  234. package/build-module/hooks/border.mjs.map +2 -2
  235. package/build-module/hooks/custom-css.mjs +7 -3
  236. package/build-module/hooks/custom-css.mjs.map +2 -2
  237. package/build-module/hooks/dimensions.mjs +15 -4
  238. package/build-module/hooks/dimensions.mjs.map +2 -2
  239. package/build-module/hooks/duotone.mjs +20 -9
  240. package/build-module/hooks/duotone.mjs.map +2 -2
  241. package/build-module/hooks/elements.mjs +14 -4
  242. package/build-module/hooks/elements.mjs.map +2 -2
  243. package/build-module/hooks/line-height.mjs +1 -2
  244. package/build-module/hooks/line-height.mjs.map +2 -2
  245. package/build-module/hooks/typography.mjs +13 -4
  246. package/build-module/hooks/typography.mjs.map +2 -2
  247. package/build-module/private-apis.mjs +7 -3
  248. package/build-module/private-apis.mjs.map +2 -2
  249. package/build-module/store/actions.mjs +9 -4
  250. package/build-module/store/actions.mjs.map +2 -2
  251. package/build-module/store/private-selectors.mjs +29 -1
  252. package/build-module/store/private-selectors.mjs.map +2 -2
  253. package/build-module/store/reducer.mjs +6 -6
  254. package/build-module/store/reducer.mjs.map +2 -2
  255. package/build-module/store/selectors.mjs +23 -0
  256. package/build-module/store/selectors.mjs.map +2 -2
  257. package/build-module/utils/native-undo.mjs +29 -0
  258. package/build-module/utils/native-undo.mjs.map +7 -0
  259. package/build-style/content-rtl.css +10 -18
  260. package/build-style/content.css +10 -18
  261. package/build-style/style-rtl.css +150 -7
  262. package/build-style/style.css +150 -7
  263. package/package.json +40 -41
  264. package/src/components/alignment-control/test/__snapshots__/index.js.snap +1 -1
  265. package/src/components/alignment-control/ui.js +2 -4
  266. package/src/components/background-image-control/index.js +74 -37
  267. package/src/components/background-image-control/style.scss +13 -4
  268. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +3 -3
  269. package/src/components/block-alignment-control/test/index.js +1 -1
  270. package/src/components/block-alignment-control/ui.js +4 -2
  271. package/src/components/block-breadcrumb/test/__snapshots__/index.js.snap +1 -1
  272. package/src/components/block-compare/test/__snapshots__/block-view.js.snap +1 -1
  273. package/src/components/block-icon/test/__snapshots__/index.js.snap +1 -1
  274. package/src/components/block-inspector/index.js +60 -31
  275. package/src/components/block-list/block-html.js +5 -0
  276. package/src/components/block-list/content.scss +1 -11
  277. package/src/components/block-list/use-block-props/index.js +5 -1
  278. package/src/components/block-list/use-block-props/use-focus-handler.js +9 -8
  279. package/src/components/block-list/use-block-props/use-register-block-event-handlers.js +45 -0
  280. package/src/components/block-parent-selector/index.js +5 -2
  281. package/src/components/block-toolbar/switch-section-style.js +5 -2
  282. package/src/components/block-tools/empty-block-inserter.js +3 -7
  283. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +3 -3
  284. package/src/components/block-vertical-alignment-control/test/index.js +18 -2
  285. package/src/components/block-vertical-alignment-control/ui.js +3 -5
  286. package/src/components/border-radius-control/test/utils.js +0 -41
  287. package/src/components/border-radius-control/utils.js +16 -107
  288. package/src/components/button-block-appender/content.scss +6 -2
  289. package/src/components/color-palette/test/__snapshots__/control.js.snap +1 -1
  290. package/src/components/colors-gradients/control.js +6 -3
  291. package/src/components/default-block-appender/test/__snapshots__/index.js.snap +1 -1
  292. package/src/components/dimension-control/index.js +13 -1
  293. package/src/components/dimensions-tool/aspect-ratio-tool.js +13 -6
  294. package/src/components/editor-styles/index.js +16 -1
  295. package/src/components/global-styles/background-panel.js +107 -34
  296. package/src/components/global-styles/border-panel.js +219 -48
  297. package/src/components/global-styles/color-gradient-dropdown-item.js +93 -28
  298. package/src/components/global-styles/color-panel.js +92 -11
  299. package/src/components/global-styles/dimensions-panel.js +422 -71
  300. package/src/components/global-styles/filters-panel.js +88 -28
  301. package/src/components/global-styles/hooks.js +8 -1
  302. package/src/components/global-styles/inheritance/index.js +204 -0
  303. package/src/components/global-styles/inheritance/style.scss +184 -0
  304. package/src/components/global-styles/inheritance/test/index.js +281 -0
  305. package/src/components/global-styles/inherited-value-context.js +271 -0
  306. package/src/components/global-styles/shadow-panel-components.js +48 -26
  307. package/src/components/global-styles/state-control.js +2 -2
  308. package/src/components/global-styles/test/background-panel.js +338 -1
  309. package/src/components/global-styles/test/border-panel.js +441 -0
  310. package/src/components/global-styles/test/color-panel.js +182 -2
  311. package/src/components/global-styles/test/dimensions-panel.js +753 -0
  312. package/src/components/global-styles/test/filters-panel.js +194 -0
  313. package/src/components/global-styles/test/inherited-value-context-core.js +98 -0
  314. package/src/components/global-styles/test/inherited-value-context.js +454 -0
  315. package/src/components/global-styles/test/typography-panel-core.js +185 -0
  316. package/src/components/global-styles/test/typography-panel.js +849 -12
  317. package/src/components/global-styles/typography-panel.js +449 -100
  318. package/src/components/image-editor/style.scss +33 -0
  319. package/src/components/inner-blocks/test/__snapshots__/index.js.snap +1 -1
  320. package/src/components/inspector-controls-tabs/styles-tab.js +5 -1
  321. package/src/components/line-height-control/index.js +1 -1
  322. package/src/components/link-control/index.js +7 -2
  323. package/src/components/preset-input-control/index.js +4 -1
  324. package/src/components/provider/block-refs-provider.js +12 -2
  325. package/src/components/provider/index.js +2 -2
  326. package/src/components/provider/use-block-sync.js +18 -6
  327. package/src/components/provider/use-media-upload-settings.js +2 -0
  328. package/src/components/rich-text/index.js +37 -16
  329. package/src/components/spacing-sizes-control/test/utils.js +16 -5
  330. package/src/components/spacing-sizes-control/utils.js +11 -28
  331. package/src/components/text-indent-control/index.js +8 -0
  332. package/src/components/url-input/index.js +363 -431
  333. package/src/components/url-input/test/index.js +592 -0
  334. package/src/components/warning/test/__snapshots__/index.js.snap +1 -1
  335. package/src/components/writing-flow/index.js +2 -0
  336. package/src/components/writing-flow/use-arrow-nav.js +51 -1
  337. package/src/components/writing-flow/use-click-selection.js +54 -3
  338. package/src/components/writing-flow/use-editable-root-event-handlers.js +266 -0
  339. package/src/components/writing-flow/use-editable-root.js +7 -77
  340. package/src/components/writing-flow/use-home-end.js +17 -9
  341. package/src/components/writing-flow/use-selection-observer.js +32 -15
  342. package/src/components/writing-flow/utils.js +3 -24
  343. package/src/hooks/background.js +26 -21
  344. package/src/hooks/block-fields/rich-text/styles.scss +1 -1
  345. package/src/hooks/block-style-variation.js +8 -74
  346. package/src/hooks/border.js +19 -4
  347. package/src/hooks/custom-css.js +15 -6
  348. package/src/hooks/dimensions.js +17 -4
  349. package/src/hooks/duotone.js +26 -8
  350. package/src/hooks/elements.js +14 -3
  351. package/src/hooks/line-height.js +0 -1
  352. package/src/hooks/test/inherited-value-wiring.js +411 -0
  353. package/src/hooks/test/preset-round-trip.js +456 -0
  354. package/src/hooks/typography.js +35 -23
  355. package/src/private-apis.js +11 -2
  356. package/src/store/actions.js +10 -4
  357. package/src/store/private-selectors.js +57 -1
  358. package/src/store/reducer.js +9 -9
  359. package/src/store/selectors.js +56 -8
  360. package/src/store/test/private-selectors.js +160 -1
  361. package/src/style.scss +2 -0
  362. package/src/utils/native-undo.js +56 -0
  363. package/build/components/duotone/utils.cjs +0 -87
  364. package/build/components/duotone/utils.cjs.map +0 -7
  365. package/build-module/components/duotone/utils.mjs +0 -59
  366. package/build-module/components/duotone/utils.mjs.map +0 -7
  367. package/src/components/duotone/utils.js +0 -90
  368. package/src/hooks/test/get-variation-styles-with-ref-values.js +0 -91
@@ -0,0 +1,33 @@
1
+ // `wp-block-image` class prefixes are used for back compat.
2
+ // This component was previously in the block library package.
3
+ .wp-block-image__crop-area {
4
+ position: relative;
5
+ max-width: 100%;
6
+ width: 100%;
7
+ overflow: hidden;
8
+
9
+ // stylelint-disable selector-class-pattern -- react-easy-crop library class names.
10
+ .reactEasyCrop_Container {
11
+ // The linked Image block has `pointer-events: none` applied. Override it
12
+ // here to enable the crop action.
13
+ pointer-events: auto;
14
+
15
+ // This removes the border from the img within the image cropper so it
16
+ // can be applied to the cropper itself. This then allows the image to be
17
+ // cropped within the visual border providing more accurate editing and
18
+ // smoother UX.
19
+ .reactEasyCrop_Image {
20
+ border: none;
21
+ border-radius: 0; // Prevent's theme.json radius bleeding into cropper.
22
+ }
23
+ }
24
+
25
+ // stylelint-enable selector-class-pattern
26
+ }
27
+
28
+ .wp-block-image__zoom {
29
+ .components-popover__content {
30
+ min-width: 260px;
31
+ overflow: visible !important;
32
+ }
33
+ }
@@ -1,4 +1,4 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
2
2
 
3
3
  exports[`InnerBlocks should force serialize for invalid block with inner blocks 1`] = `
4
4
  "<!-- wp:test-block -->
@@ -29,7 +29,11 @@ import { BackgroundToolsPanel } from '../global-styles/background-panel';
29
29
  // - Typography: text color only (font controls disabled).
30
30
  // - Background: color + gradient only (image controls disabled).
31
31
  // - Elements: link/heading/button/caption colors (unchanged).
32
- function SectionStyleControls( { blockName, clientId, contentClientIds } ) {
32
+ export function SectionStyleControls( {
33
+ blockName,
34
+ clientId,
35
+ contentClientIds,
36
+ } ) {
33
37
  const settings = useBlockSettings( blockName );
34
38
  const { updateBlockAttributes } = useDispatch( blockEditorStore );
35
39
 
@@ -96,12 +96,12 @@ const LineHeightControl = ( {
96
96
  return (
97
97
  <div className="block-editor-line-height-control">
98
98
  <NumberControl
99
+ placeholder={ BASE_DEFAULT_VALUE }
99
100
  { ...otherProps }
100
101
  __unstableInputWidth={ __unstableInputWidth }
101
102
  __unstableStateReducer={ stateReducer }
102
103
  onChange={ handleOnChange }
103
104
  label={ __( 'Line height' ) }
104
- placeholder={ BASE_DEFAULT_VALUE }
105
105
  step={ STEP }
106
106
  spinFactor={ SPIN_FACTOR }
107
107
  value={ value }
@@ -16,7 +16,7 @@ import {
16
16
  } from '@wordpress/components';
17
17
  import { __, sprintf } from '@wordpress/i18n';
18
18
  import { useRef, useState, useEffect, useMemo } from '@wordpress/element';
19
- import { useInstanceId } from '@wordpress/compose';
19
+ import { useInstanceId, useMergeRefs } from '@wordpress/compose';
20
20
  import { focus } from '@wordpress/dom';
21
21
  import { ENTER } from '@wordpress/keycodes';
22
22
  import { isShallowEqualObjects } from '@wordpress/is-shallow-equal';
@@ -29,6 +29,7 @@ import { isURL, prependHTTPS } from '@wordpress/url';
29
29
  /**
30
30
  * Internal dependencies
31
31
  */
32
+ import { useNativeUndo } from '../../utils/native-undo';
32
33
  import LinkControlSettingsDrawer from './settings-drawer';
33
34
  import LinkControlSearchInput from './search-input';
34
35
  import LinkPreview from './link-preview';
@@ -227,6 +228,7 @@ function LinkControl( {
227
228
 
228
229
  const isMountingRef = useRef( true );
229
230
  const wrapperNode = useRef();
231
+ const wrapperRef = useMergeRefs( [ wrapperNode, useNativeUndo() ] );
230
232
  const textInputRef = useRef();
231
233
  const searchInputRef = useRef();
232
234
  // TODO: Remove entityUrlFallbackRef and previewValue in favor of value prop after taxonomy entity binding
@@ -651,7 +653,10 @@ function LinkControl( {
651
653
  return (
652
654
  <div
653
655
  tabIndex={ -1 }
654
- ref={ wrapperNode }
656
+ // The dialog holds local state that is only committed when the
657
+ // link is applied, so undo and redo within it must remain the
658
+ // browser's own.
659
+ ref={ wrapperRef }
655
660
  className="block-editor-link-control"
656
661
  >
657
662
  { isCreatingPage && (
@@ -50,6 +50,8 @@ import CustomValueControls from './custom-value-controls';
50
50
  * @param {Function} props.onMouseOut Callback for mouse out events.
51
51
  * @param {Function} props.onMouseOver Callback for mouse over events.
52
52
  * @param {Function} props.onUnitChange Callback when unit changes.
53
+ * @param {string} props.placeholder Placeholder text forwarded to the inner UnitControl when
54
+ * rendered in custom-value mode.
53
55
  * @param {Array} props.presets Array of preset objects with name, slug, and size.
54
56
  * @param {string} props.presetType Type of preset (e.g., 'spacing', 'border-radius').
55
57
  * @param {string} props.selectedUnit Currently selected unit (e.g., 'px', 'em').
@@ -73,6 +75,7 @@ export default function PresetInputControl( {
73
75
  onMouseOut,
74
76
  onMouseOver,
75
77
  onUnitChange,
78
+ placeholder,
76
79
  presets = [],
77
80
  presetType,
78
81
  selectedUnit,
@@ -95,7 +98,7 @@ export default function PresetInputControl( {
95
98
  const hasPresets = marks.length > 0;
96
99
  const showRangeControl = presets.length <= RANGE_CONTROL_MAX_SIZE;
97
100
 
98
- const allPlaceholder = isMixed ? __( 'Mixed' ) : null;
101
+ const allPlaceholder = isMixed ? __( 'Mixed' ) : placeholder ?? null;
99
102
 
100
103
  const [ minValue, setMinValue ] = useState( minimumCustomValue );
101
104
  const [ showCustomValueControl, setShowCustomValueControl ] = useState(
@@ -4,11 +4,21 @@
4
4
  import { createContext, useMemo } from '@wordpress/element';
5
5
  import { observableMap } from '@wordpress/compose';
6
6
 
7
- export const BlockRefs = createContext( { refsMap: observableMap() } );
7
+ // `eventHandlers` maps a block's client ID to a ref holding its `wrapperProps`
8
+ // event handlers, so the writing flow host can call them for a block that
9
+ // supports `editableRoot` (see `useEditableRootEventHandlers`). It rides in this
10
+ // context, next to `refsMap`, as another per-block registry keyed by client ID.
11
+ export const BlockRefs = createContext( {
12
+ refsMap: observableMap(),
13
+ eventHandlers: new Map(),
14
+ } );
8
15
  BlockRefs.displayName = 'BlockRefsContext';
9
16
 
10
17
  export function BlockRefsProvider( { children } ) {
11
- const value = useMemo( () => ( { refsMap: observableMap() } ), [] );
18
+ const value = useMemo(
19
+ () => ( { refsMap: observableMap(), eventHandlers: new Map() } ),
20
+ []
21
+ );
12
22
  return (
13
23
  <BlockRefs.Provider value={ value }>{ children }</BlockRefs.Provider>
14
24
  );
@@ -102,7 +102,7 @@ function shouldEnableClientSideMediaProcessing() {
102
102
  *
103
103
  * Returns true when:
104
104
  * 1. Full client-side processing is NOT available (otherwise it handles HEIC already)
105
- * 2. The server has set the __heicUploadSupport flag
105
+ * 2. The server has set the __clientSideMediaProcessing flag
106
106
  * 3. The browser supports createImageBitmap + OffscreenCanvas (e.g. Safari)
107
107
  *
108
108
  * @return {boolean} Whether HEIC-only canvas processing should be enabled.
@@ -118,7 +118,7 @@ function shouldEnableHeicCanvasProcessing() {
118
118
  return false;
119
119
  }
120
120
 
121
- if ( ! window.__heicUploadSupport ) {
121
+ if ( ! window.__clientSideMediaProcessing ) {
122
122
  isHeicCanvasEnabledCache = false;
123
123
  return false;
124
124
  }
@@ -252,13 +252,17 @@ export default function useBlockSync( {
252
252
  cloneBlockWithMapping( block, idMappingRef.current )
253
253
  );
254
254
 
255
- __unstableMarkNextChangeAsNotPersistent();
255
+ __unstableMarkNextChangeAsNotPersistent( {
256
+ history: 'ignore',
257
+ } );
256
258
  setHasControlledInnerBlocks( clientId, true );
257
259
 
258
260
  if ( subscribedRef.current ) {
259
261
  pendingChangesRef.current.incoming = storeBlocks;
260
262
  }
261
- __unstableMarkNextChangeAsNotPersistent();
263
+ __unstableMarkNextChangeAsNotPersistent( {
264
+ history: 'ignore',
265
+ } );
262
266
  replaceInnerBlocks( clientId, storeBlocks );
263
267
 
264
268
  // Invalidate the applied-selection ref so that
@@ -271,7 +275,9 @@ export default function useBlockSync( {
271
275
  if ( subscribedRef.current ) {
272
276
  pendingChangesRef.current.incoming = controlledBlocks;
273
277
  }
274
- __unstableMarkNextChangeAsNotPersistent();
278
+ __unstableMarkNextChangeAsNotPersistent( {
279
+ history: 'ignore',
280
+ } );
275
281
  resetBlocks( controlledBlocks );
276
282
  }
277
283
  };
@@ -280,12 +286,18 @@ export default function useBlockSync( {
280
286
  // containing useBlockSync() unmounts.
281
287
  const unsetControlledBlocks = () => {
282
288
  if ( clientId ) {
283
- __unstableMarkNextChangeAsNotPersistent();
289
+ __unstableMarkNextChangeAsNotPersistent( {
290
+ history: 'ignore',
291
+ } );
284
292
  setHasControlledInnerBlocks( clientId, false );
285
- __unstableMarkNextChangeAsNotPersistent();
293
+ __unstableMarkNextChangeAsNotPersistent( {
294
+ history: 'ignore',
295
+ } );
286
296
  replaceInnerBlocks( clientId, [] );
287
297
  } else {
288
- __unstableMarkNextChangeAsNotPersistent();
298
+ __unstableMarkNextChangeAsNotPersistent( {
299
+ history: 'ignore',
300
+ } );
289
301
  resetBlocks( [] );
290
302
  }
291
303
  };
@@ -21,6 +21,8 @@ function useMediaUploadSettings( settings = {} ) {
21
21
  allowedMimeTypes: settings.allowedMimeTypes,
22
22
  allImageSizes: settings.allImageSizes,
23
23
  bigImageSizeThreshold: settings.bigImageSizeThreshold,
24
+ imageStripMeta: settings.imageStripMeta,
25
+ imageMaxBitDepth: settings.imageMaxBitDepth,
24
26
  } ),
25
27
  [ settings ]
26
28
  );
@@ -29,7 +29,11 @@ import { __, sprintf } from '@wordpress/i18n';
29
29
  */
30
30
  import { useBlockEditorAutocompleteProps } from '../autocomplete';
31
31
  import { useBlockEditContext } from '../block-edit';
32
- import { blockBindingsKey, isPreviewModeKey } from '../block-edit/context';
32
+ import {
33
+ blockBindingsKey,
34
+ blockEditingModeKey,
35
+ isPreviewModeKey,
36
+ } from '../block-edit/context';
33
37
  import FormatToolbarContainer from './format-toolbar-container';
34
38
  import { store as blockEditorStore } from '../../store';
35
39
  import { useMarkPersistent } from './use-mark-persistent';
@@ -39,7 +43,6 @@ import { getAllowedFormats } from './utils';
39
43
  import { Content, valueToHTMLString } from './content';
40
44
  import { withDeprecations } from './with-deprecations';
41
45
  import BlockContext from '../block-context';
42
- import { useHasEditableRoot } from '../writing-flow/use-editable-root';
43
46
  import { unlock } from '../../lock-unlock';
44
47
 
45
48
  // `RichTextShortcut` and `RichTextInputEvent` now live in
@@ -101,6 +104,7 @@ export function RichTextWrapper(
101
104
  const context = useBlockEditContext();
102
105
  const { clientId, isSelected: isBlockSelected, name: blockName } = context;
103
106
  const blockBindings = context[ blockBindingsKey ];
107
+ const hasDefaultEditingMode = context[ blockEditingModeKey ] === 'default';
104
108
  const blockContext = useContext( BlockContext );
105
109
  const registry = useRegistry();
106
110
  const selector = ( select ) => {
@@ -243,13 +247,27 @@ export function RichTextWrapper(
243
247
  const shouldDisableEditing =
244
248
  readOnly || disableBoundBlock || shouldDisableForPattern;
245
249
 
246
- const hasEditableRoot = useHasEditableRoot();
247
- const hasDefaultEditingMode = useSelect(
248
- ( select ) =>
249
- select( blockEditorStore ).getBlockEditingMode( clientId ) ===
250
- 'default',
251
- [ clientId ]
250
+ // Whether the wrapper is the editing host, which depends on the selected
251
+ // block, not necessarily this one. Only the selected, default-mode block
252
+ // can be it, so others skip the subscription entirely.
253
+ const isEditingHost = useSelect(
254
+ ( select ) => {
255
+ if (
256
+ shouldDisableEditing ||
257
+ ! hasDefaultEditingMode ||
258
+ ! isBlockSelected
259
+ ) {
260
+ return false;
261
+ }
262
+
263
+ const { getSelectedBlockClientId, canHostEditableRoot } = unlock(
264
+ select( blockEditorStore )
265
+ );
266
+ return canHostEditableRoot( getSelectedBlockClientId() );
267
+ },
268
+ [ shouldDisableEditing, hasDefaultEditingMode, isBlockSelected ]
252
269
  );
270
+
253
271
  const { getSelectionStart, getSelectionEnd, getBlockRootClientId } =
254
272
  useSelect( blockEditorStore );
255
273
  const { selectionChange } = useDispatch( blockEditorStore );
@@ -359,11 +377,13 @@ export function RichTextWrapper(
359
377
  // to the focused element.
360
378
  const {
361
379
  'aria-autocomplete': ariaAutocomplete,
380
+ 'aria-haspopup': ariaHasPopup,
381
+ 'aria-controls': ariaControls,
362
382
  'aria-owns': ariaOwns,
363
383
  'aria-activedescendant': ariaActiveDescendant,
364
384
  } = autocompleteProps;
365
385
  useEffect( () => {
366
- if ( ! hasEditableRoot || ! isSelected ) {
386
+ if ( ! isSelected ) {
367
387
  return;
368
388
  }
369
389
 
@@ -377,6 +397,8 @@ export function RichTextWrapper(
377
397
 
378
398
  const attributes = {
379
399
  'aria-autocomplete': ariaAutocomplete,
400
+ 'aria-haspopup': ariaHasPopup,
401
+ 'aria-controls': ariaControls,
380
402
  'aria-owns': ariaOwns,
381
403
  'aria-activedescendant': ariaActiveDescendant,
382
404
  };
@@ -395,9 +417,10 @@ export function RichTextWrapper(
395
417
  }
396
418
  };
397
419
  }, [
398
- hasEditableRoot,
399
420
  isSelected,
400
421
  ariaAutocomplete,
422
+ ariaHasPopup,
423
+ ariaControls,
401
424
  ariaOwns,
402
425
  ariaActiveDescendant,
403
426
  ] );
@@ -421,12 +444,10 @@ export function RichTextWrapper(
421
444
  // focusable areas on their own, so an explicit tabIndex restores their
422
445
  // focusability.
423
446
  let tabIndex = props.tabIndex;
424
- if ( ! shouldDisableEditing ) {
425
- if ( hasEditableRoot && hasDefaultEditingMode && isBlockSelected ) {
426
- tabIndex = props.tabIndex ?? 0;
427
- } else if ( hasEditableRoot && props.tabIndex === 0 ) {
428
- tabIndex = null;
429
- }
447
+ if ( isEditingHost ) {
448
+ tabIndex = props.tabIndex ?? 0;
449
+ } else if ( ! shouldDisableEditing && props.tabIndex === 0 ) {
450
+ tabIndex = null;
430
451
  }
431
452
 
432
453
  const TagName = tagName;
@@ -8,12 +8,12 @@ import {
8
8
  getPresetValueFromCustomValue,
9
9
  getSliderValueFromPreset,
10
10
  getSpacingPresetCssVar,
11
- getSpacingPresetSlug,
12
11
  hasAxisSupport,
13
12
  hasBalancedSidesSupport,
14
13
  isValueSpacingPreset,
15
14
  VIEWS,
16
15
  } from '../utils';
16
+ import { getPresetSlug } from '../../preset-input-control/utils';
17
17
 
18
18
  describe( 'isValueSpacingPreset', () => {
19
19
  it( 'should return true if value is string in spacing presets var format', () => {
@@ -82,15 +82,26 @@ describe( 'getSpacingPresetCssVar', () => {
82
82
  'var(--wp--preset--spacing--20)'
83
83
  );
84
84
  } );
85
+ it( 'should return undefined for a malformed non-string value such as an array', () => {
86
+ // Malformed blockGap data, e.g. `{ top: [ '1rem' ] }`, would otherwise
87
+ // throw when `.match()` is called on the array.
88
+ expect( getSpacingPresetCssVar( [ '1rem' ] ) ).toBe( undefined );
89
+ } );
90
+ it( 'should return undefined for other non-string values', () => {
91
+ expect( getSpacingPresetCssVar( { top: '1rem' } ) ).toBe( undefined );
92
+ expect( getSpacingPresetCssVar( 20 ) ).toBe( undefined );
93
+ } );
85
94
  } );
86
95
 
87
- describe( 'getSpacingPresetSlug', () => {
96
+ describe( 'getPresetSlug', () => {
88
97
  it( 'should return original value if 0 or default', () => {
89
- expect( getSpacingPresetSlug( '0' ) ).toBe( '0' );
90
- expect( getSpacingPresetSlug( 'default' ) ).toBe( 'default' );
98
+ expect( getPresetSlug( '0', 'spacing' ) ).toBe( '0' );
99
+ expect( getPresetSlug( 'default', 'spacing' ) ).toBe( 'default' );
91
100
  } );
92
101
  it( 'should return the int value of the slug portion of a valid preset var', () => {
93
- expect( getSpacingPresetSlug( 'var:preset|spacing|20' ) ).toBe( '20' );
102
+ expect( getPresetSlug( 'var:preset|spacing|20', 'spacing' ) ).toBe(
103
+ '20'
104
+ );
94
105
  } );
95
106
  } );
96
107
 
@@ -12,6 +12,13 @@ import {
12
12
  sidesVertical,
13
13
  } from '@wordpress/icons';
14
14
 
15
+ /**
16
+ * Internal dependencies
17
+ */
18
+ import { getPresetSlug, isValuePreset } from '../preset-input-control/utils';
19
+
20
+ const SPACING_PRESET_TYPE = 'spacing';
21
+
15
22
  export const RANGE_CONTROL_MAX_SIZE = 8;
16
23
 
17
24
  export const ALL_SIDES = [ 'top', 'bottom', 'left', 'right' ];
@@ -64,10 +71,7 @@ export const VIEWS = {
64
71
  * @return {boolean} Return true if value is string in format var:preset|spacing|.
65
72
  */
66
73
  export function isValueSpacingPreset( value ) {
67
- if ( ! value?.includes ) {
68
- return false;
69
- }
70
- return value === '0' || value.includes( 'var:preset|spacing|' );
74
+ return isValuePreset( value, SPACING_PRESET_TYPE );
71
75
  }
72
76
 
73
77
  /**
@@ -83,7 +87,7 @@ export function getCustomValueFromPreset( value, spacingSizes ) {
83
87
  return value;
84
88
  }
85
89
 
86
- const slug = getSpacingPresetSlug( value );
90
+ const slug = getPresetSlug( value, SPACING_PRESET_TYPE );
87
91
  const spacingSize = spacingSizes.find(
88
92
  ( size ) => String( size.slug ) === slug
89
93
  );
@@ -126,7 +130,7 @@ export function getPresetValueFromCustomValue( value, spacingSizes ) {
126
130
  * @return {string | undefined} CSS var string for given spacing preset value.
127
131
  */
128
132
  export function getSpacingPresetCssVar( value ) {
129
- if ( ! value ) {
133
+ if ( ! value || typeof value !== 'string' ) {
130
134
  return;
131
135
  }
132
136
 
@@ -139,27 +143,6 @@ export function getSpacingPresetCssVar( value ) {
139
143
  return `var(--wp--preset--spacing--${ slug[ 1 ] })`;
140
144
  }
141
145
 
142
- /**
143
- * Returns the slug section of the given spacing preset string.
144
- *
145
- * @param {string} value Value to extract slug from.
146
- *
147
- * @return {string|undefined} The int value of the slug from given spacing preset.
148
- */
149
- export function getSpacingPresetSlug( value ) {
150
- if ( ! value ) {
151
- return;
152
- }
153
-
154
- if ( value === '0' || value === 'default' ) {
155
- return value;
156
- }
157
-
158
- const slug = value.match( /var:preset\|spacing\|(.+)/ );
159
-
160
- return slug ? slug[ 1 ] : undefined;
161
- }
162
-
163
146
  /**
164
147
  * Converts spacing preset value into a Range component value .
165
148
  *
@@ -175,7 +158,7 @@ export function getSliderValueFromPreset( presetValue, spacingSizes ) {
175
158
  const slug =
176
159
  parseFloat( presetValue, 10 ) === 0
177
160
  ? '0'
178
- : getSpacingPresetSlug( presetValue );
161
+ : getPresetSlug( presetValue, SPACING_PRESET_TYPE );
179
162
  const sliderValue = spacingSizes.findIndex( ( spacingSize ) => {
180
163
  return String( spacingSize.slug ) === slug;
181
164
  } );
@@ -29,6 +29,8 @@ import { useSettings } from '../../components/use-settings';
29
29
  * @param {boolean} props.withSlider Whether to show the slider control.
30
30
  * @param {boolean} props.hasBottomMargin Whether to add bottom margin below the control.
31
31
  * @param {string} props.help Help text to display below the control.
32
+ * @param {string} props.className Class name to add to the inner UnitControl.
33
+ * @param {string} props.placeholder Placeholder for the inner UnitControl.
32
34
  *
33
35
  * @return {Element} Text indent control.
34
36
  */
@@ -39,6 +41,8 @@ export default function TextIndentControl( {
39
41
  withSlider = false,
40
42
  hasBottomMargin = false,
41
43
  help,
44
+ className,
45
+ placeholder,
42
46
  ...otherProps
43
47
  } ) {
44
48
  const [ availableUnits ] = useSettings( 'spacing.units' );
@@ -73,6 +77,8 @@ export default function TextIndentControl( {
73
77
  units={ units }
74
78
  onChange={ onChange }
75
79
  help={ help }
80
+ className={ className }
81
+ placeholder={ placeholder }
76
82
  />
77
83
  );
78
84
  }
@@ -93,6 +99,8 @@ export default function TextIndentControl( {
93
99
  units={ units }
94
100
  __unstableInputWidth={ __unstableInputWidth }
95
101
  min={ 0 }
102
+ className={ className }
103
+ placeholder={ placeholder }
96
104
  />
97
105
  </FlexItem>
98
106
  { withSlider && (