@wordpress/components 19.15.0 → 19.16.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 (439) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/build/angle-picker-control/index.js +2 -2
  3. package/build/angle-picker-control/index.js.map +1 -1
  4. package/build/base-control/styles/base-control-styles.js +8 -8
  5. package/build/base-control/styles/base-control-styles.js.map +1 -1
  6. package/build/border-control/border-control/component.js +38 -25
  7. package/build/border-control/border-control/component.js.map +1 -1
  8. package/build/border-control/border-control/hook.js +4 -7
  9. package/build/border-control/border-control/hook.js.map +1 -1
  10. package/build/border-control/border-control-dropdown/component.js +13 -7
  11. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  12. package/build/border-control/border-control-dropdown/hook.js +0 -4
  13. package/build/border-control/border-control-dropdown/hook.js.map +1 -1
  14. package/build/border-control/styles.js +33 -56
  15. package/build/border-control/styles.js.map +1 -1
  16. package/build/box-control/axial-input-controls.js +1 -1
  17. package/build/box-control/axial-input-controls.js.map +1 -1
  18. package/build/box-control/utils.js +2 -8
  19. package/build/box-control/utils.js.map +1 -1
  20. package/build/color-palette/index.js +14 -2
  21. package/build/color-palette/index.js.map +1 -1
  22. package/build/color-picker/hex-input.js +2 -1
  23. package/build/color-picker/hex-input.js.map +1 -1
  24. package/build/color-picker/input-with-slider.js +3 -2
  25. package/build/color-picker/input-with-slider.js.map +1 -1
  26. package/build/color-picker/styles.js +8 -15
  27. package/build/color-picker/styles.js.map +1 -1
  28. package/build/combobox-control/index.js +5 -7
  29. package/build/combobox-control/index.js.map +1 -1
  30. package/build/custom-select-control/index.js +26 -8
  31. package/build/custom-select-control/index.js.map +1 -1
  32. package/build/divider/component.js +0 -1
  33. package/build/divider/component.js.map +1 -1
  34. package/build/divider/index.js.map +1 -1
  35. package/build/divider/styles.js +5 -5
  36. package/build/divider/styles.js.map +1 -1
  37. package/build/dropdown/dropdown-content-wrapper.js +60 -0
  38. package/build/dropdown/dropdown-content-wrapper.js.map +1 -0
  39. package/build/dropdown/styles.js +42 -0
  40. package/build/dropdown/styles.js.map +1 -0
  41. package/build/dropdown/types.js +6 -0
  42. package/build/dropdown/types.js.map +1 -0
  43. package/build/elevation/component.js +15 -15
  44. package/build/elevation/component.js.map +1 -1
  45. package/build/elevation/hook.js +5 -17
  46. package/build/elevation/hook.js.map +1 -1
  47. package/build/elevation/index.js.map +1 -1
  48. package/build/elevation/styles.js +1 -1
  49. package/build/elevation/styles.js.map +1 -1
  50. package/build/flex/flex/component.js +11 -17
  51. package/build/flex/flex/component.js.map +1 -1
  52. package/build/flex/flex-block/component.js +9 -3
  53. package/build/flex/flex-block/component.js.map +1 -1
  54. package/build/flex/flex-item/component.js +9 -3
  55. package/build/flex/flex-item/component.js.map +1 -1
  56. package/build/index.js +24 -0
  57. package/build/index.js.map +1 -1
  58. package/build/input-control/index.js +7 -0
  59. package/build/input-control/index.js.map +1 -1
  60. package/build/input-control/input-base.js +23 -1
  61. package/build/input-control/input-base.js.map +1 -1
  62. package/build/input-control/input-prefix-wrapper.js +54 -0
  63. package/build/input-control/input-prefix-wrapper.js.map +1 -0
  64. package/build/input-control/input-suffix-wrapper.js +54 -0
  65. package/build/input-control/input-suffix-wrapper.js.map +1 -0
  66. package/build/input-control/styles/input-control-styles.js +61 -42
  67. package/build/input-control/styles/input-control-styles.js.map +1 -1
  68. package/build/mobile/image/index.native.js +7 -4
  69. package/build/mobile/image/index.native.js.map +1 -1
  70. package/build/mobile/media-edit/index.native.js +1 -7
  71. package/build/mobile/media-edit/index.native.js.map +1 -1
  72. package/build/popover/index.js +13 -10
  73. package/build/popover/index.js.map +1 -1
  74. package/build/radio-control/index.js +1 -3
  75. package/build/radio-control/index.js.map +1 -1
  76. package/build/range-control/utils.js +1 -1
  77. package/build/range-control/utils.js.map +1 -1
  78. package/build/sandbox/index.native.js +13 -2
  79. package/build/sandbox/index.native.js.map +1 -1
  80. package/build/scroll-lock/index.js +35 -6
  81. package/build/scroll-lock/index.js.map +1 -1
  82. package/build/select-control/index.js +1 -3
  83. package/build/select-control/index.js.map +1 -1
  84. package/build/select-control/styles/select-control-styles.js +31 -11
  85. package/build/select-control/styles/select-control-styles.js.map +1 -1
  86. package/build/shortcut/index.js +4 -13
  87. package/build/shortcut/index.js.map +1 -1
  88. package/build/shortcut/types.js +6 -0
  89. package/build/shortcut/types.js.map +1 -0
  90. package/build/spacer/component.js +3 -1
  91. package/build/spacer/component.js.map +1 -1
  92. package/build/toggle-group-control/toggle-group-control/component.js +4 -1
  93. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  94. package/build/toggle-group-control/toggle-group-control/styles.js +20 -4
  95. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  96. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +7 -9
  97. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  98. package/build/tooltip/index.js +51 -14
  99. package/build/tooltip/index.js.map +1 -1
  100. package/build/tree-select/index.js +2 -2
  101. package/build/tree-select/index.js.map +1 -1
  102. package/build/ui/context/use-context-system.js +7 -2
  103. package/build/ui/context/use-context-system.js.map +1 -1
  104. package/build/ui/utils/space.js +7 -1
  105. package/build/ui/utils/space.js.map +1 -1
  106. package/build/unit-control/styles/unit-control-styles.js +10 -26
  107. package/build/unit-control/styles/unit-control-styles.js.map +1 -1
  108. package/build-module/angle-picker-control/index.js +2 -2
  109. package/build-module/angle-picker-control/index.js.map +1 -1
  110. package/build-module/base-control/styles/base-control-styles.js +8 -8
  111. package/build-module/base-control/styles/base-control-styles.js.map +1 -1
  112. package/build-module/border-control/border-control/component.js +37 -25
  113. package/build-module/border-control/border-control/component.js.map +1 -1
  114. package/build-module/border-control/border-control/hook.js +4 -7
  115. package/build-module/border-control/border-control/hook.js.map +1 -1
  116. package/build-module/border-control/border-control-dropdown/component.js +12 -7
  117. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  118. package/build-module/border-control/border-control-dropdown/hook.js +0 -4
  119. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -1
  120. package/build-module/border-control/styles.js +33 -49
  121. package/build-module/border-control/styles.js.map +1 -1
  122. package/build-module/box-control/axial-input-controls.js +1 -1
  123. package/build-module/box-control/axial-input-controls.js.map +1 -1
  124. package/build-module/box-control/utils.js +2 -7
  125. package/build-module/box-control/utils.js.map +1 -1
  126. package/build-module/color-palette/index.js +10 -1
  127. package/build-module/color-palette/index.js.map +1 -1
  128. package/build-module/color-picker/hex-input.js +2 -1
  129. package/build-module/color-picker/hex-input.js.map +1 -1
  130. package/build-module/color-picker/input-with-slider.js +3 -2
  131. package/build-module/color-picker/input-with-slider.js.map +1 -1
  132. package/build-module/color-picker/styles.js +9 -16
  133. package/build-module/color-picker/styles.js.map +1 -1
  134. package/build-module/combobox-control/index.js +5 -6
  135. package/build-module/combobox-control/index.js.map +1 -1
  136. package/build-module/custom-select-control/index.js +26 -10
  137. package/build-module/custom-select-control/index.js.map +1 -1
  138. package/build-module/divider/component.js +0 -1
  139. package/build-module/divider/component.js.map +1 -1
  140. package/build-module/divider/index.js.map +1 -1
  141. package/build-module/divider/styles.js +5 -5
  142. package/build-module/divider/styles.js.map +1 -1
  143. package/build-module/dropdown/dropdown-content-wrapper.js +47 -0
  144. package/build-module/dropdown/dropdown-content-wrapper.js.map +1 -0
  145. package/build-module/dropdown/styles.js +31 -0
  146. package/build-module/dropdown/styles.js.map +1 -0
  147. package/build-module/dropdown/types.js +2 -0
  148. package/build-module/dropdown/types.js.map +1 -0
  149. package/build-module/elevation/component.js +15 -15
  150. package/build-module/elevation/component.js.map +1 -1
  151. package/build-module/elevation/hook.js +5 -17
  152. package/build-module/elevation/hook.js.map +1 -1
  153. package/build-module/elevation/index.js.map +1 -1
  154. package/build-module/elevation/styles.js +1 -1
  155. package/build-module/elevation/styles.js.map +1 -1
  156. package/build-module/flex/flex/component.js +11 -17
  157. package/build-module/flex/flex/component.js.map +1 -1
  158. package/build-module/flex/flex-block/component.js +9 -3
  159. package/build-module/flex/flex-block/component.js.map +1 -1
  160. package/build-module/flex/flex-item/component.js +9 -3
  161. package/build-module/flex/flex-item/component.js.map +1 -1
  162. package/build-module/index.js +3 -0
  163. package/build-module/index.js.map +1 -1
  164. package/build-module/input-control/index.js +6 -0
  165. package/build-module/input-control/index.js.map +1 -1
  166. package/build-module/input-control/input-base.js +24 -3
  167. package/build-module/input-control/input-base.js.map +1 -1
  168. package/build-module/input-control/input-prefix-wrapper.js +41 -0
  169. package/build-module/input-control/input-prefix-wrapper.js.map +1 -0
  170. package/build-module/input-control/input-suffix-wrapper.js +41 -0
  171. package/build-module/input-control/input-suffix-wrapper.js.map +1 -0
  172. package/build-module/input-control/styles/input-control-styles.js +57 -41
  173. package/build-module/input-control/styles/input-control-styles.js.map +1 -1
  174. package/build-module/mobile/image/index.native.js +9 -6
  175. package/build-module/mobile/image/index.native.js.map +1 -1
  176. package/build-module/mobile/media-edit/index.native.js +1 -6
  177. package/build-module/mobile/media-edit/index.native.js.map +1 -1
  178. package/build-module/popover/index.js +13 -10
  179. package/build-module/popover/index.js.map +1 -1
  180. package/build-module/radio-control/index.js +1 -2
  181. package/build-module/radio-control/index.js.map +1 -1
  182. package/build-module/range-control/utils.js +1 -1
  183. package/build-module/range-control/utils.js.map +1 -1
  184. package/build-module/sandbox/index.native.js +13 -3
  185. package/build-module/sandbox/index.native.js.map +1 -1
  186. package/build-module/scroll-lock/index.js +32 -6
  187. package/build-module/scroll-lock/index.js.map +1 -1
  188. package/build-module/select-control/index.js +1 -2
  189. package/build-module/select-control/index.js.map +1 -1
  190. package/build-module/select-control/styles/select-control-styles.js +31 -11
  191. package/build-module/select-control/styles/select-control-styles.js.map +1 -1
  192. package/build-module/shortcut/index.js +4 -13
  193. package/build-module/shortcut/index.js.map +1 -1
  194. package/build-module/shortcut/types.js +2 -0
  195. package/build-module/shortcut/types.js.map +1 -0
  196. package/build-module/spacer/component.js +3 -1
  197. package/build-module/spacer/component.js.map +1 -1
  198. package/build-module/toggle-group-control/toggle-group-control/component.js +4 -1
  199. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  200. package/build-module/toggle-group-control/toggle-group-control/styles.js +15 -3
  201. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  202. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +6 -7
  203. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  204. package/build-module/tooltip/index.js +53 -16
  205. package/build-module/tooltip/index.js.map +1 -1
  206. package/build-module/tree-select/index.js +3 -3
  207. package/build-module/tree-select/index.js.map +1 -1
  208. package/build-module/ui/context/use-context-system.js +7 -2
  209. package/build-module/ui/context/use-context-system.js.map +1 -1
  210. package/build-module/ui/utils/space.js +7 -1
  211. package/build-module/ui/utils/space.js.map +1 -1
  212. package/build-module/unit-control/styles/unit-control-styles.js +10 -27
  213. package/build-module/unit-control/styles/unit-control-styles.js.map +1 -1
  214. package/build-style/style-rtl.css +12 -26
  215. package/build-style/style.css +12 -24
  216. package/build-types/base-control/styles/base-control-styles.d.ts.map +1 -1
  217. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  218. package/build-types/border-control/border-control/hook.d.ts +1 -1
  219. package/build-types/border-control/border-control/hook.d.ts.map +1 -1
  220. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  221. package/build-types/border-control/border-control-dropdown/hook.d.ts +0 -1
  222. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -1
  223. package/build-types/border-control/stories/index.d.ts.map +1 -1
  224. package/build-types/border-control/styles.d.ts +1 -4
  225. package/build-types/border-control/styles.d.ts.map +1 -1
  226. package/build-types/card/card-divider/hook.d.ts +1 -1
  227. package/build-types/color-palette/index.d.ts +1 -0
  228. package/build-types/color-palette/index.d.ts.map +1 -1
  229. package/build-types/color-picker/hex-input.d.ts.map +1 -1
  230. package/build-types/color-picker/input-with-slider.d.ts.map +1 -1
  231. package/build-types/color-picker/styles.d.ts.map +1 -1
  232. package/build-types/divider/component.d.ts +2 -3
  233. package/build-types/divider/component.d.ts.map +1 -1
  234. package/build-types/divider/index.d.ts +1 -1
  235. package/build-types/divider/index.d.ts.map +1 -1
  236. package/build-types/divider/styles.d.ts +6 -2
  237. package/build-types/divider/styles.d.ts.map +1 -1
  238. package/build-types/divider/test/index.d.ts +2 -0
  239. package/build-types/divider/test/index.d.ts.map +1 -0
  240. package/build-types/divider/types.d.ts +18 -10
  241. package/build-types/divider/types.d.ts.map +1 -1
  242. package/build-types/dropdown/dropdown-content-wrapper.d.ts +23 -0
  243. package/build-types/dropdown/dropdown-content-wrapper.d.ts.map +1 -0
  244. package/build-types/dropdown/styles.d.ts +7 -0
  245. package/build-types/dropdown/styles.d.ts.map +1 -0
  246. package/build-types/dropdown/types.d.ts +9 -0
  247. package/build-types/dropdown/types.d.ts.map +1 -0
  248. package/build-types/elevation/component.d.ts +11 -10
  249. package/build-types/elevation/component.d.ts.map +1 -1
  250. package/build-types/elevation/hook.d.ts +6 -7
  251. package/build-types/elevation/hook.d.ts.map +1 -1
  252. package/build-types/elevation/index.d.ts +2 -2
  253. package/build-types/elevation/index.d.ts.map +1 -1
  254. package/build-types/elevation/stories/index.d.ts +22 -0
  255. package/build-types/elevation/stories/index.d.ts.map +1 -0
  256. package/build-types/elevation/styles.d.ts +1 -1
  257. package/build-types/elevation/styles.d.ts.map +1 -1
  258. package/build-types/elevation/test/index.d.ts +2 -0
  259. package/build-types/elevation/test/index.d.ts.map +1 -0
  260. package/build-types/elevation/types.d.ts +12 -19
  261. package/build-types/elevation/types.d.ts.map +1 -1
  262. package/build-types/flex/flex/component.d.ts +11 -17
  263. package/build-types/flex/flex/component.d.ts.map +1 -1
  264. package/build-types/flex/flex-block/component.d.ts +9 -3
  265. package/build-types/flex/flex-block/component.d.ts.map +1 -1
  266. package/build-types/flex/flex-item/component.d.ts +9 -3
  267. package/build-types/flex/flex-item/component.d.ts.map +1 -1
  268. package/build-types/flex/types.d.ts +4 -1
  269. package/build-types/flex/types.d.ts.map +1 -1
  270. package/build-types/input-control/index.d.ts +1 -1
  271. package/build-types/input-control/index.d.ts.map +1 -1
  272. package/build-types/input-control/input-base.d.ts +1 -1
  273. package/build-types/input-control/input-base.d.ts.map +1 -1
  274. package/build-types/input-control/input-prefix-wrapper.d.ts +19 -0
  275. package/build-types/input-control/input-prefix-wrapper.d.ts.map +1 -0
  276. package/build-types/input-control/input-suffix-wrapper.d.ts +19 -0
  277. package/build-types/input-control/input-suffix-wrapper.d.ts.map +1 -0
  278. package/build-types/input-control/stories/index.d.ts +10 -0
  279. package/build-types/input-control/stories/index.d.ts.map +1 -1
  280. package/build-types/input-control/styles/input-control-styles.d.ts +21 -0
  281. package/build-types/input-control/styles/input-control-styles.d.ts.map +1 -1
  282. package/build-types/input-control/types.d.ts +45 -3
  283. package/build-types/input-control/types.d.ts.map +1 -1
  284. package/build-types/popover/index.d.ts.map +1 -1
  285. package/build-types/radio-control/index.d.ts.map +1 -1
  286. package/build-types/range-control/types.d.ts +4 -2
  287. package/build-types/range-control/types.d.ts.map +1 -1
  288. package/build-types/range-control/utils.d.ts.map +1 -1
  289. package/build-types/scroll-lock/index.d.ts +32 -3
  290. package/build-types/scroll-lock/index.d.ts.map +1 -1
  291. package/build-types/scroll-lock/stories/index.d.ts +9 -0
  292. package/build-types/scroll-lock/stories/index.d.ts.map +1 -0
  293. package/build-types/scroll-lock/test/index.d.ts +2 -0
  294. package/build-types/scroll-lock/test/index.d.ts.map +1 -0
  295. package/build-types/select-control/index.d.ts.map +1 -1
  296. package/build-types/select-control/styles/select-control-styles.d.ts +1 -1
  297. package/build-types/select-control/styles/select-control-styles.d.ts.map +1 -1
  298. package/build-types/select-control/types.d.ts +1 -1
  299. package/build-types/select-control/types.d.ts.map +1 -1
  300. package/build-types/shortcut/index.d.ts +5 -24
  301. package/build-types/shortcut/index.d.ts.map +1 -1
  302. package/build-types/shortcut/test/index.d.ts +2 -0
  303. package/build-types/shortcut/test/index.d.ts.map +1 -0
  304. package/build-types/shortcut/types.d.ts +14 -0
  305. package/build-types/shortcut/types.d.ts.map +1 -0
  306. package/build-types/spacer/component.d.ts +3 -1
  307. package/build-types/spacer/component.d.ts.map +1 -1
  308. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts +5 -1
  309. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  310. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts +0 -1
  311. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -1
  312. package/build-types/toggle-group-control/types.d.ts +6 -0
  313. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  314. package/build-types/tooltip/index.d.ts.map +1 -1
  315. package/build-types/tree-select/index.d.ts.map +1 -1
  316. package/build-types/tree-select/types.d.ts +1 -0
  317. package/build-types/tree-select/types.d.ts.map +1 -1
  318. package/build-types/ui/context/use-context-system.d.ts.map +1 -1
  319. package/build-types/ui/utils/space.d.ts +7 -1
  320. package/build-types/ui/utils/space.d.ts.map +1 -1
  321. package/build-types/unit-control/index.d.ts +2 -2
  322. package/build-types/unit-control/index.d.ts.map +1 -1
  323. package/build-types/unit-control/styles/unit-control-styles.d.ts +0 -1
  324. package/build-types/unit-control/styles/unit-control-styles.d.ts.map +1 -1
  325. package/build-types/unit-control/types.d.ts +1 -1
  326. package/build-types/unit-control/types.d.ts.map +1 -1
  327. package/package.json +17 -17
  328. package/src/angle-picker-control/index.js +1 -2
  329. package/src/base-control/styles/base-control-styles.ts +5 -0
  330. package/src/border-control/border-control/component.tsx +41 -32
  331. package/src/border-control/border-control/hook.ts +4 -9
  332. package/src/border-control/border-control-dropdown/component.tsx +50 -45
  333. package/src/border-control/border-control-dropdown/hook.ts +0 -5
  334. package/src/border-control/stories/index.tsx +3 -0
  335. package/src/border-control/styles.ts +23 -69
  336. package/src/border-control/test/index.js +19 -8
  337. package/src/box-control/axial-input-controls.js +1 -1
  338. package/src/box-control/utils.js +6 -13
  339. package/src/card/test/__snapshots__/index.js.snap +8 -8
  340. package/src/color-palette/index.js +19 -8
  341. package/src/color-palette/style.scss +5 -0
  342. package/src/color-palette/test/utils.ts +19 -1
  343. package/src/color-picker/hex-input.tsx +2 -1
  344. package/src/color-picker/input-with-slider.tsx +2 -1
  345. package/src/color-picker/styles.ts +0 -11
  346. package/src/combobox-control/index.js +5 -6
  347. package/src/confirm-dialog/README.md +1 -1
  348. package/src/custom-select-control/index.js +44 -26
  349. package/src/custom-select-control/stories/index.js +7 -2
  350. package/src/custom-select-control/style.scss +4 -29
  351. package/src/divider/README.md +12 -5
  352. package/src/divider/component.tsx +2 -3
  353. package/src/divider/index.ts +1 -1
  354. package/src/divider/stories/index.tsx +4 -4
  355. package/src/divider/styles.ts +7 -7
  356. package/src/divider/test/__snapshots__/{index.js.snap → index.tsx.snap} +7 -7
  357. package/src/divider/test/index.tsx +40 -0
  358. package/src/divider/types.ts +21 -15
  359. package/src/draggable/README.md +1 -1
  360. package/src/dropdown/dropdown-content-wrapper.tsx +59 -0
  361. package/src/dropdown/stories/index.js +60 -69
  362. package/src/dropdown/styles.ts +38 -0
  363. package/src/dropdown/types.ts +8 -0
  364. package/src/elevation/README.md +16 -14
  365. package/src/elevation/component.tsx +48 -0
  366. package/src/elevation/{hook.js → hook.ts} +20 -17
  367. package/src/elevation/{index.js → index.ts} +0 -0
  368. package/src/elevation/stories/index.tsx +85 -0
  369. package/src/elevation/{styles.js → styles.ts} +0 -0
  370. package/src/elevation/test/__snapshots__/{index.js.snap → index.tsx.snap} +19 -13
  371. package/src/elevation/test/index.tsx +64 -0
  372. package/src/elevation/types.ts +12 -19
  373. package/src/flex/flex/README.md +1 -5
  374. package/src/flex/flex/component.js +11 -17
  375. package/src/flex/flex-block/README.md +0 -4
  376. package/src/flex/flex-block/component.js +9 -3
  377. package/src/flex/flex-item/README.md +0 -4
  378. package/src/flex/flex-item/component.js +9 -3
  379. package/src/flex/stories/index.js +1 -1
  380. package/src/flex/types.ts +4 -1
  381. package/src/form-token-field/test/index.js +1 -1
  382. package/src/index.js +3 -0
  383. package/src/input-control/index.tsx +6 -0
  384. package/src/input-control/input-base.tsx +28 -12
  385. package/src/input-control/input-prefix-wrapper.tsx +48 -0
  386. package/src/input-control/input-suffix-wrapper.tsx +48 -0
  387. package/src/input-control/stories/index.tsx +15 -2
  388. package/src/input-control/styles/input-control-styles.tsx +25 -11
  389. package/src/input-control/types.ts +52 -3
  390. package/src/mobile/image/index.native.js +12 -7
  391. package/src/mobile/media-edit/index.native.js +2 -7
  392. package/src/modal/style.scss +5 -1
  393. package/src/popover/index.js +13 -9
  394. package/src/popover/stories/index.js +2 -0
  395. package/src/popover/style.scss +1 -1
  396. package/src/radio-control/index.tsx +1 -2
  397. package/src/range-control/README.md +1 -1
  398. package/src/range-control/test/index.tsx +30 -0
  399. package/src/range-control/types.ts +4 -2
  400. package/src/range-control/utils.ts +4 -1
  401. package/src/sandbox/index.native.js +14 -1
  402. package/src/scroll-lock/README.md +1 -1
  403. package/src/scroll-lock/{index.js → index.tsx} +34 -7
  404. package/src/scroll-lock/stories/index.tsx +96 -0
  405. package/src/scroll-lock/test/index.tsx +26 -0
  406. package/src/select-control/index.tsx +1 -2
  407. package/src/select-control/styles/select-control-styles.ts +33 -9
  408. package/src/select-control/types.ts +1 -0
  409. package/src/shortcut/{index.js → index.tsx} +5 -9
  410. package/src/shortcut/test/__snapshots__/index.tsx.snap +15 -0
  411. package/src/shortcut/test/index.tsx +41 -0
  412. package/src/shortcut/types.ts +10 -0
  413. package/src/spacer/component.tsx +3 -1
  414. package/src/toggle-group-control/stories/index.js +19 -3
  415. package/src/toggle-group-control/test/__snapshots__/index.js.snap +4 -4
  416. package/src/toggle-group-control/toggle-group-control/component.tsx +3 -3
  417. package/src/toggle-group-control/toggle-group-control/styles.ts +22 -2
  418. package/src/toggle-group-control/toggle-group-control-option-base/styles.ts +0 -4
  419. package/src/toggle-group-control/types.ts +6 -0
  420. package/src/tools-panel/tools-panel/README.md +94 -21
  421. package/src/tooltip/index.js +56 -10
  422. package/src/tooltip/stories/index.js +28 -13
  423. package/src/tooltip/style.scss +1 -1
  424. package/src/tree-select/index.tsx +5 -4
  425. package/src/tree-select/types.ts +4 -0
  426. package/src/ui/context/test/context-system-provider.js +101 -1
  427. package/src/ui/context/use-context-system.js +7 -2
  428. package/src/ui/utils/space.ts +7 -1
  429. package/src/unit-control/styles/unit-control-styles.ts +15 -13
  430. package/src/unit-control/test/__snapshots__/index.tsx.snap +4 -4
  431. package/src/unit-control/types.ts +1 -1
  432. package/tsconfig.tsbuildinfo +1 -1
  433. package/src/divider/test/index.js +0 -41
  434. package/src/elevation/component.js +0 -43
  435. package/src/elevation/stories/index.js +0 -148
  436. package/src/elevation/test/index.js +0 -51
  437. package/src/scroll-lock/stories/index.js +0 -71
  438. package/src/scroll-lock/test/index.js +0 -53
  439. package/src/shortcut/test/index.js +0 -37
@@ -7,10 +7,13 @@ import type { ComponentMeta, ComponentStory } from '@storybook/react';
7
7
  * Internal dependencies
8
8
  */
9
9
  import InputControl from '..';
10
+ import { InputControlPrefixWrapper } from '../input-prefix-wrapper';
11
+ import { InputControlSuffixWrapper } from '../input-suffix-wrapper';
10
12
 
11
13
  const meta: ComponentMeta< typeof InputControl > = {
12
14
  title: 'Components (Experimental)/InputControl',
13
15
  component: InputControl,
16
+ subcomponents: { InputControlPrefixWrapper, InputControlSuffixWrapper },
14
17
  argTypes: {
15
18
  __unstableInputWidth: { control: { type: 'text' } },
16
19
  __unstableStateReducer: { control: { type: null } },
@@ -37,16 +40,26 @@ Default.args = {
37
40
  placeholder: 'Placeholder',
38
41
  };
39
42
 
43
+ /**
44
+ * A `prefix` can be inserted before the input. By default, the prefix is aligned with the edge of the input border,
45
+ * with no padding. If you want to apply standard padding in accordance with the size variant, use the provided
46
+ * `<InputControlPrefixWrapper>` convenience wrapper.
47
+ */
40
48
  export const WithPrefix = Template.bind( {} );
41
49
  WithPrefix.args = {
42
50
  ...Default.args,
43
- prefix: <span style={ { paddingLeft: 8 } }>@</span>,
51
+ prefix: <InputControlPrefixWrapper>@</InputControlPrefixWrapper>,
44
52
  };
45
53
 
54
+ /**
55
+ * A `suffix` can be inserted after the input. By default, the suffix is aligned with the edge of the input border,
56
+ * with no padding. If you want to apply standard padding in accordance with the size variant, use the provided
57
+ * `<InputControlSuffixWrapper>` convenience wrapper.
58
+ */
46
59
  export const WithSuffix = Template.bind( {} );
47
60
  WithSuffix.args = {
48
61
  ...Default.args,
49
- suffix: <button style={ { marginRight: 4 } }>Send</button>,
62
+ suffix: <InputControlSuffixWrapper>%</InputControlSuffixWrapper>,
50
63
  };
51
64
 
52
65
  export const WithSideLabel = Template.bind( {} );
@@ -13,6 +13,7 @@ import { Flex, FlexItem } from '../../flex';
13
13
  import { Text } from '../../text';
14
14
  import { COLORS, rtl } from '../../utils';
15
15
  import type { LabelPosition, Size } from '../types';
16
+ import { space } from '../../ui/utils/space';
16
17
 
17
18
  type ContainerProps = {
18
19
  disabled?: boolean;
@@ -110,6 +111,8 @@ type InputProps = {
110
111
  inputSize?: Size;
111
112
  isDragging?: boolean;
112
113
  dragCursor?: CSSProperties[ 'cursor' ];
114
+ paddingInlineStart?: CSSProperties[ 'paddingInlineStart' ];
115
+ paddingInlineEnd?: CSSProperties[ 'paddingInlineEnd' ];
113
116
  };
114
117
 
115
118
  const disabledStyles = ( { disabled }: InputProps ) => {
@@ -141,31 +144,32 @@ const fontSizeStyles = ( { inputSize: size }: InputProps ) => {
141
144
  `;
142
145
  };
143
146
 
144
- const sizeStyles = ( {
147
+ export const getSizeConfig = ( {
145
148
  inputSize: size,
146
149
  __next36pxDefaultSize,
147
150
  }: InputProps ) => {
151
+ // Paddings may be overridden by the custom paddings props.
148
152
  const sizes = {
149
153
  default: {
150
154
  height: 36,
151
155
  lineHeight: 1,
152
156
  minHeight: 36,
153
- paddingLeft: 16,
154
- paddingRight: 16,
157
+ paddingLeft: space( 4 ),
158
+ paddingRight: space( 4 ),
155
159
  },
156
160
  small: {
157
161
  height: 24,
158
162
  lineHeight: 1,
159
163
  minHeight: 24,
160
- paddingLeft: 8,
161
- paddingRight: 8,
164
+ paddingLeft: space( 2 ),
165
+ paddingRight: space( 2 ),
162
166
  },
163
167
  '__unstable-large': {
164
168
  height: 40,
165
169
  lineHeight: 1,
166
170
  minHeight: 40,
167
- paddingLeft: 16,
168
- paddingRight: 16,
171
+ paddingLeft: space( 4 ),
172
+ paddingRight: space( 4 ),
169
173
  },
170
174
  };
171
175
 
@@ -174,14 +178,23 @@ const sizeStyles = ( {
174
178
  height: 30,
175
179
  lineHeight: 1,
176
180
  minHeight: 30,
177
- paddingLeft: 8,
178
- paddingRight: 8,
181
+ paddingLeft: space( 2 ),
182
+ paddingRight: space( 2 ),
179
183
  };
180
184
  }
181
185
 
182
- const style = sizes[ size as Size ] || sizes.default;
186
+ return sizes[ size as Size ] || sizes.default;
187
+ };
188
+
189
+ const sizeStyles = ( props: InputProps ) => {
190
+ return css( getSizeConfig( props ) );
191
+ };
183
192
 
184
- return css( style );
193
+ const customPaddings = ( {
194
+ paddingInlineStart,
195
+ paddingInlineEnd,
196
+ }: InputProps ) => {
197
+ return css( { paddingInlineStart, paddingInlineEnd } );
185
198
  };
186
199
 
187
200
  const dragStyles = ( { isDragging, dragCursor }: InputProps ) => {
@@ -235,6 +248,7 @@ export const Input = styled.input< InputProps >`
235
248
  ${ disabledStyles }
236
249
  ${ fontSizeStyles }
237
250
  ${ sizeStyles }
251
+ ${ customPaddings }
238
252
 
239
253
  &::-webkit-input-placeholder {
240
254
  line-height: normal;
@@ -102,6 +102,8 @@ export interface InputFieldProps extends BaseProps {
102
102
  nextValue: string,
103
103
  event?: SyntheticEvent< HTMLInputElement >
104
104
  ) => void;
105
+ paddingInlineStart?: CSSProperties[ 'paddingInlineStart' ];
106
+ paddingInlineEnd?: CSSProperties[ 'paddingInlineEnd' ];
105
107
  setIsFocused: ( isFocused: boolean ) => void;
106
108
  stateReducer?: StateReducer;
107
109
  /**
@@ -123,10 +125,38 @@ export interface InputBaseProps extends BaseProps, FlexProps {
123
125
  children: ReactNode;
124
126
  /**
125
127
  * Renders an element on the left side of the input.
128
+ *
129
+ * By default, the prefix is aligned with the edge of the input border, with no padding.
130
+ * If you want to apply standard padding in accordance with the size variant, wrap the element in
131
+ * the provided `<InputControlPrefixWrapper>` component.
132
+ *
133
+ * @example
134
+ * import {
135
+ * __experimentalInputControl as InputControl,
136
+ * __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
137
+ * } from '@wordpress/components';
138
+ *
139
+ * <InputControl
140
+ * prefix={<InputControlPrefixWrapper>@</InputControlPrefixWrapper>}
141
+ * />
126
142
  */
127
143
  prefix?: ReactNode;
128
144
  /**
129
145
  * Renders an element on the right side of the input.
146
+ *
147
+ * By default, the suffix is aligned with the edge of the input border, with no padding.
148
+ * If you want to apply standard padding in accordance with the size variant, wrap the element in
149
+ * the provided `<InputControlSuffixWrapper>` component.
150
+ *
151
+ * @example
152
+ * import {
153
+ * __experimentalInputControl as InputControl,
154
+ * __experimentalInputControlSuffixWrapper as InputControlSuffixWrapper,
155
+ * } from '@wordpress/components';
156
+ *
157
+ * <InputControl
158
+ * suffix={<InputControlSuffixWrapper>%</InputControlSuffixWrapper>}
159
+ * />
130
160
  */
131
161
  suffix?: ReactNode;
132
162
  /**
@@ -152,12 +182,17 @@ export interface InputControlProps
152
182
  * be the only prefix prop. Otherwise it tries to do a union of the two prefix properties and you end up
153
183
  * with an unresolvable type.
154
184
  *
155
- * `isFocused` and `setIsFocused` are managed internally by the InputControl, but the rest of the props
156
- * for InputField are passed through.
185
+ * `isFocused`, `setIsFocused`, `paddingInlineStart`, and `paddingInlineEnd` are managed internally by
186
+ * the InputControl, but the rest of the props for InputField are passed through.
157
187
  */
158
188
  Omit<
159
189
  WordPressComponentProps< InputFieldProps, 'input', false >,
160
- 'stateReducer' | 'prefix' | 'isFocused' | 'setIsFocused'
190
+ | 'stateReducer'
191
+ | 'prefix'
192
+ | 'isFocused'
193
+ | 'setIsFocused'
194
+ | 'paddingInlineStart'
195
+ | 'paddingInlineEnd'
161
196
  > {
162
197
  __unstableStateReducer?: InputFieldProps[ 'stateReducer' ];
163
198
  }
@@ -168,3 +203,17 @@ export interface InputControlLabelProps {
168
203
  labelPosition?: BaseProps[ 'labelPosition' ];
169
204
  size?: BaseProps[ 'size' ];
170
205
  }
206
+
207
+ export type InputControlPrefixWrapperProps = {
208
+ /**
209
+ * The prefix to be inserted.
210
+ */
211
+ children: ReactNode;
212
+ };
213
+
214
+ export type InputControlSuffixWrapperProps = {
215
+ /**
216
+ * The suffix to be inserted.
217
+ */
218
+ children: ReactNode;
219
+ };
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { Image, Text, View } from 'react-native';
4
+ import { Image as RNImage, Text, View } from 'react-native';
5
5
  import FastImage from 'react-native-fast-image';
6
6
 
7
7
  /**
@@ -37,6 +37,7 @@ const ImageComponent = ( {
37
37
  height: imageHeight,
38
38
  highlightSelected = true,
39
39
  isSelected,
40
+ shouldUseFastImage,
40
41
  isUploadFailed,
41
42
  isUploadInProgress,
42
43
  mediaPickerOptions,
@@ -53,11 +54,15 @@ const ImageComponent = ( {
53
54
  } ) => {
54
55
  const [ imageData, setImageData ] = useState( null );
55
56
  const [ containerSize, setContainerSize ] = useState( null );
57
+ const Image = ! shouldUseFastImage ? RNImage : FastImage;
58
+ const imageResizeMode = ! shouldUseFastImage
59
+ ? resizeMode
60
+ : FastImage.resizeMode[ resizeMode ];
56
61
 
57
62
  useEffect( () => {
58
63
  let isCurrent = true;
59
64
  if ( url ) {
60
- Image.getSize( url, ( imgWidth, imgHeight ) => {
65
+ RNImage.getSize( url, ( imgWidth, imgHeight ) => {
61
66
  if ( ! isCurrent ) {
62
67
  return;
63
68
  }
@@ -152,6 +157,9 @@ const ImageComponent = ( {
152
157
  opacity: isUploadInProgress ? 0.3 : 1,
153
158
  height: containerSize?.height,
154
159
  },
160
+ ! resizeMode && {
161
+ aspectRatio: imageData?.aspectRatio,
162
+ },
155
163
  focalPoint && styles.focalPoint,
156
164
  focalPoint &&
157
165
  getImageWithFocalPointStyles(
@@ -211,16 +219,13 @@ const ImageComponent = ( {
211
219
  </View>
212
220
  ) : (
213
221
  <View style={ focalPoint && styles.focalPointContent }>
214
- <FastImage
215
- { ...( ! resizeMode && {
216
- aspectRatio: imageData?.aspectRatio,
217
- } ) }
222
+ <Image
218
223
  style={ imageStyles }
219
224
  source={ { uri: url } }
220
225
  { ...( ! focalPoint && {
221
226
  resizeMethod: 'scale',
222
227
  } ) }
223
- resizeMode={ FastImage.resizeMode[ resizeMode ] }
228
+ resizeMode={ imageResizeMode }
224
229
  />
225
230
  </View>
226
231
  ) }
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { compact } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -46,11 +41,11 @@ export class MediaEdit extends Component {
46
41
  getMediaOptionsItems() {
47
42
  const { pickerOptions, openReplaceMediaOptions, source } = this.props;
48
43
 
49
- return compact( [
44
+ return [
50
45
  source?.uri && editOption,
51
46
  openReplaceMediaOptions && replaceOption,
52
47
  ...( pickerOptions ? pickerOptions : [] ),
53
- ] );
48
+ ].filter( Boolean );
54
49
  }
55
50
 
56
51
  getDestructiveButtonIndex() {
@@ -95,6 +95,10 @@
95
95
  .components-modal__content.has-scrolled-content:not(.hide-header) & {
96
96
  border-bottom-color: $gray-300;
97
97
  }
98
+
99
+ & + p {
100
+ margin-top: 0;
101
+ }
98
102
  }
99
103
 
100
104
  .components-modal__header-heading-container {
@@ -119,7 +123,7 @@
119
123
  .components-modal__content {
120
124
  flex: 1;
121
125
  margin-top: $header-height + $grid-unit-20;
122
- padding: 0 $grid-unit-40 $grid-unit-30;
126
+ padding: 0 $grid-unit-40 $grid-unit-40;
123
127
  overflow: auto;
124
128
 
125
129
  &.hide-header {
@@ -210,15 +210,19 @@ const Popover = (
210
210
  const slotName = useContext( slotNameContext ) || __unstableSlotName;
211
211
  const slot = useSlot( slotName );
212
212
 
213
- const onDialogClose = ( type, event ) => {
214
- // Ideally the popover should have just a single onClose prop and
215
- // not three props that potentially do the same thing.
216
- if ( type === 'focus-outside' && onFocusOutside ) {
217
- onFocusOutside( event );
218
- } else if ( onClose ) {
219
- onClose();
220
- }
221
- };
213
+ let onDialogClose;
214
+
215
+ if ( onClose || onFocusOutside ) {
216
+ onDialogClose = ( type, event ) => {
217
+ // Ideally the popover should have just a single onClose prop and
218
+ // not three props that potentially do the same thing.
219
+ if ( type === 'focus-outside' && onFocusOutside ) {
220
+ onFocusOutside( event );
221
+ } else if ( onClose ) {
222
+ onClose();
223
+ }
224
+ };
225
+ }
222
226
 
223
227
  const [ dialogRef, dialogProps ] = useDialog( {
224
228
  focusOnMount,
@@ -27,6 +27,7 @@ export const _default = () => {
27
27
  const show = boolean( 'Example: Show', true );
28
28
  const children = text( 'children', 'Popover Content' );
29
29
  const animate = boolean( 'animate', false );
30
+ const expandOnMobile = boolean( 'expandOnMobile', false );
30
31
  const focusOnMount = select(
31
32
  'focusOnMount',
32
33
  {
@@ -41,6 +42,7 @@ export const _default = () => {
41
42
  const props = {
42
43
  animate,
43
44
  children,
45
+ expandOnMobile,
44
46
  focusOnMount,
45
47
  noArrow,
46
48
  isAlternate,
@@ -31,7 +31,7 @@
31
31
  position: static;
32
32
  height: calc(100% - #{ $panel-header-height });
33
33
  overflow-y: visible;
34
- min-width: auto;
34
+ width: auto;
35
35
  border: none;
36
36
  outline: none;
37
37
  border-top: $border-width solid $gray-900;
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { isEmpty } from 'lodash';
5
4
  import classnames from 'classnames';
6
5
  import type { ChangeEvent } from 'react';
7
6
 
@@ -65,7 +64,7 @@ export function RadioControl(
65
64
  const onChangeValue = ( event: ChangeEvent< HTMLInputElement > ) =>
66
65
  onChange( event.target.value );
67
66
 
68
- if ( isEmpty( options ) ) {
67
+ if ( ! options?.length ) {
69
68
  return null;
70
69
  }
71
70
 
@@ -184,7 +184,7 @@ An icon to be shown above the slider next to its container title.
184
184
 
185
185
  ### `initialPosition`: `number`
186
186
 
187
- If no value exists this prop contains the slider starting position.
187
+ The slider starting position, used when no `value` is passed. The `initialPosition` will be clamped between the provided `min` and `max` prop values.
188
188
 
189
189
  - Required: No
190
190
  - Platform: Web | Mobile
@@ -200,6 +200,36 @@ describe( 'RangeControl', () => {
200
200
 
201
201
  expect( rangeInput?.value ).toBe( '10' );
202
202
  } );
203
+
204
+ it( 'should clamp initialPosition between min and max on first render, and on reset', () => {
205
+ render(
206
+ <RangeControl
207
+ initialPosition={ 200 }
208
+ min={ 0 }
209
+ max={ 100 }
210
+ allowReset
211
+ />
212
+ );
213
+
214
+ const numberInput = getNumberInput();
215
+ const rangeInput = getRangeInput();
216
+ const resetButton = getResetButton();
217
+
218
+ // Value should be clamped on initial load
219
+ expect( numberInput?.value ).toBe( '100' );
220
+ expect( rangeInput?.value ).toBe( '100' );
221
+
222
+ fireChangeEvent( numberInput, '50' );
223
+
224
+ expect( numberInput?.value ).toBe( '50' );
225
+ expect( rangeInput?.value ).toBe( '50' );
226
+
227
+ // Value should be clamped after resetting
228
+ fireEvent.click( resetButton as Element );
229
+
230
+ expect( numberInput?.value ).toBe( '100' );
231
+ expect( rangeInput?.value ).toBe( '100' );
232
+ } );
203
233
  } );
204
234
 
205
235
  describe( 'input field', () => {
@@ -88,7 +88,7 @@ export type RangeControlProps< IconProps = unknown > = Pick<
88
88
  */
89
89
  afterIcon?: IconType< IconProps >;
90
90
  /**
91
- * If this property is true, a button to reset the the slider is
91
+ * If this property is true, a button to reset the slider is
92
92
  * rendered.
93
93
  *
94
94
  * @default false
@@ -119,7 +119,9 @@ export type RangeControlProps< IconProps = unknown > = Pick<
119
119
  */
120
120
  icon?: string;
121
121
  /**
122
- * If no value exists this prop contains the slider starting position.
122
+ * The slider starting position, used when no `value` is passed.
123
+ * The `initialPosition` will be clamped between the provided `min`
124
+ * and `max` prop values.
123
125
  */
124
126
  initialPosition?: number;
125
127
  /**
@@ -50,7 +50,10 @@ export function useControlledRangeValue(
50
50
  const { min, max, value: valueProp, initial } = settings;
51
51
  const [ state, setInternalState ] = useControlledState(
52
52
  floatClamp( valueProp, min, max ),
53
- { initial, fallback: null }
53
+ {
54
+ initial: floatClamp( initial ?? null, min, max ),
55
+ fallback: null,
56
+ }
54
57
  );
55
58
 
56
59
  const setState = useCallback(
@@ -1,13 +1,14 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { Dimensions, Platform } from 'react-native';
4
+ import { Dimensions, StyleSheet } from 'react-native';
5
5
  import { WebView } from 'react-native-webview';
6
6
 
7
7
  /**
8
8
  * WordPress dependencies
9
9
  */
10
10
  import {
11
+ Platform,
11
12
  renderToString,
12
13
  memo,
13
14
  useRef,
@@ -307,6 +308,7 @@ function Sandbox( {
307
308
  style={ [
308
309
  sandboxStyles[ 'sandbox-webview__content' ],
309
310
  getSizeStyle(),
311
+ Platform.isAndroid && workaroundStyles.webView,
310
312
  ] }
311
313
  onMessage={ checkMessageForResize }
312
314
  scrollEnabled={ false }
@@ -317,4 +319,15 @@ function Sandbox( {
317
319
  );
318
320
  }
319
321
 
322
+ const workaroundStyles = StyleSheet.create( {
323
+ webView: {
324
+ /**
325
+ * The slight opacity below is a workaround for an Android crash caused from combining Android
326
+ * 12's new scroll overflow behavior and webviews.
327
+ * https://github.com/react-native-webview/react-native-webview/issues/1915#issuecomment-808869253
328
+ */
329
+ opacity: 0.99,
330
+ },
331
+ } );
332
+
320
333
  export default memo( Sandbox );
@@ -7,7 +7,7 @@ ScrollLock is a content-free React component for declaratively preventing scroll
7
7
  Declare scroll locking as part of modal UI.
8
8
 
9
9
  ```jsx
10
- import { ScrollLock } from '@wordpress/components';
10
+ import { ScrollLock, Button } from '@wordpress/components';
11
11
  import { useState } from '@wordpress/element';
12
12
 
13
13
  const MyScrollLock = () => {
@@ -12,10 +12,7 @@ import { useEffect } from '@wordpress/element';
12
12
  */
13
13
  let previousScrollTop = 0;
14
14
 
15
- /**
16
- * @param {boolean} locked
17
- */
18
- function setLocked( locked ) {
15
+ function setLocked( locked: boolean ) {
19
16
  const scrollingElement = document.scrollingElement || document.body;
20
17
 
21
18
  if ( locked ) {
@@ -36,11 +33,39 @@ function setLocked( locked ) {
36
33
  let lockCounter = 0;
37
34
 
38
35
  /**
39
- * A component that will lock scrolling when it is mounted and unlock scrolling when it is unmounted.
36
+ * ScrollLock is a content-free React component for declaratively preventing
37
+ * scroll bleed from modal UI to the page body. This component applies a
38
+ * `lockscroll` class to the `document.documentElement` and
39
+ * `document.scrollingElement` elements to stop the body from scrolling. When it
40
+ * is present, the lock is applied.
41
+ *
42
+ * ```jsx
43
+ * import { ScrollLock, Button } from '@wordpress/components';
44
+ * import { useState } from '@wordpress/element';
40
45
  *
41
- * @return {null} Render nothing.
46
+ * const MyScrollLock = () => {
47
+ * const [ isScrollLocked, setIsScrollLocked ] = useState( false );
48
+ *
49
+ * const toggleLock = () => {
50
+ * setIsScrollLocked( ( locked ) => ! locked ) );
51
+ * };
52
+ *
53
+ * return (
54
+ * <div>
55
+ * <Button variant="secondary" onClick={ toggleLock }>
56
+ * Toggle scroll lock
57
+ * </Button>
58
+ * { isScrollLocked && <ScrollLock /> }
59
+ * <p>
60
+ * Scroll locked:
61
+ * <strong>{ isScrollLocked ? 'Yes' : 'No' }</strong>
62
+ * </p>
63
+ * </div>
64
+ * );
65
+ * };
66
+ * ```
42
67
  */
43
- export default function ScrollLock() {
68
+ export function ScrollLock(): null {
44
69
  useEffect( () => {
45
70
  if ( lockCounter === 0 ) {
46
71
  setLocked( true );
@@ -59,3 +84,5 @@ export default function ScrollLock() {
59
84
 
60
85
  return null;
61
86
  }
87
+
88
+ export default ScrollLock;