@wordpress/components 25.13.0 → 25.15.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 (656) hide show
  1. package/CHANGELOG.md +88 -1
  2. package/CONTRIBUTING.md +57 -115
  3. package/LICENSE.md +1 -1
  4. package/build/base-control/index.js +17 -13
  5. package/build/base-control/index.js.map +1 -1
  6. package/build/border-box-control/border-box-control-linked-button/component.js +1 -1
  7. package/build/border-box-control/border-box-control-linked-button/component.js.map +1 -1
  8. package/build/border-control/border-control-dropdown/component.js +4 -2
  9. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  10. package/build/border-control/border-control-dropdown/hook.js +3 -2
  11. package/build/border-control/border-control-dropdown/hook.js.map +1 -1
  12. package/build/border-control/border-control-style-picker/component.js +1 -1
  13. package/build/border-control/border-control-style-picker/component.js.map +1 -1
  14. package/build/border-control/styles.js +17 -17
  15. package/build/border-control/styles.js.map +1 -1
  16. package/build/box-control/index.js +1 -1
  17. package/build/box-control/index.js.map +1 -1
  18. package/build/box-control/linked-button.js +1 -1
  19. package/build/box-control/linked-button.js.map +1 -1
  20. package/build/button/index.js +1 -1
  21. package/build/button/index.js.map +1 -1
  22. package/build/checkbox-control/index.js +1 -1
  23. package/build/checkbox-control/index.js.map +1 -1
  24. package/build/checkbox-control/types.js.map +1 -1
  25. package/build/color-picker/color-copy-button.js +1 -1
  26. package/build/color-picker/color-copy-button.js.map +1 -1
  27. package/build/context/wordpress-component.js.map +1 -1
  28. package/build/custom-select-control-v2/index.js +11 -10
  29. package/build/custom-select-control-v2/index.js.map +1 -1
  30. package/build/date-time/date/styles.js +8 -8
  31. package/build/date-time/date/styles.js.map +1 -1
  32. package/build/date-time/time/timezone.js +11 -2
  33. package/build/date-time/time/timezone.js.map +1 -1
  34. package/build/dimension-control/index.js +2 -0
  35. package/build/dimension-control/index.js.map +1 -1
  36. package/build/dimension-control/types.js.map +1 -1
  37. package/build/dropdown-menu-v2/index.js +205 -159
  38. package/build/dropdown-menu-v2/index.js.map +1 -1
  39. package/build/dropdown-menu-v2/styles.js +86 -77
  40. package/build/dropdown-menu-v2/styles.js.map +1 -1
  41. package/build/dropdown-menu-v2/types.js.map +1 -1
  42. package/build/duotone-picker/duotone-picker.js +4 -3
  43. package/build/duotone-picker/duotone-picker.js.map +1 -1
  44. package/build/focal-point-picker/controls.js +5 -1
  45. package/build/focal-point-picker/controls.js.map +1 -1
  46. package/build/focal-point-picker/index.js +2 -0
  47. package/build/focal-point-picker/index.js.map +1 -1
  48. package/build/focal-point-picker/styles/focal-point-picker-style.js +15 -15
  49. package/build/focal-point-picker/styles/focal-point-picker-style.js.map +1 -1
  50. package/build/focal-point-picker/types.js.map +1 -1
  51. package/build/font-size-picker/font-size-picker-select.js +2 -0
  52. package/build/font-size-picker/font-size-picker-select.js.map +1 -1
  53. package/build/font-size-picker/font-size-picker-toggle-group.js +2 -0
  54. package/build/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  55. package/build/font-size-picker/index.js +10 -3
  56. package/build/font-size-picker/index.js.map +1 -1
  57. package/build/font-size-picker/index.native.js +6 -3
  58. package/build/font-size-picker/index.native.js.map +1 -1
  59. package/build/font-size-picker/types.js.map +1 -1
  60. package/build/form-token-field/index.js +10 -5
  61. package/build/form-token-field/index.js.map +1 -1
  62. package/build/form-token-field/token.js +1 -0
  63. package/build/form-token-field/token.js.map +1 -1
  64. package/build/gradient-picker/index.js +3 -2
  65. package/build/gradient-picker/index.js.map +1 -1
  66. package/build/index.native.js +20 -19
  67. package/build/index.native.js.map +1 -1
  68. package/build/input-control/styles/input-control-styles.js +32 -29
  69. package/build/input-control/styles/input-control-styles.js.map +1 -1
  70. package/build/input-control/types.js.map +1 -1
  71. package/build/lock-unlock.js +18 -0
  72. package/build/lock-unlock.js.map +1 -0
  73. package/build/mobile/bottom-sheet/index.native.js +8 -0
  74. package/build/mobile/bottom-sheet/index.native.js.map +1 -1
  75. package/build/mobile/global-styles-context/utils.native.js +39 -13
  76. package/build/mobile/global-styles-context/utils.native.js.map +1 -1
  77. package/build/mobile/image/constants.js +12 -0
  78. package/build/mobile/image/constants.js.map +1 -0
  79. package/build/mobile/image/index.native.js +26 -18
  80. package/build/mobile/image/index.native.js.map +1 -1
  81. package/build/mobile/keyboard-aware-flat-list/index.android.js +40 -8
  82. package/build/mobile/keyboard-aware-flat-list/index.android.js.map +1 -1
  83. package/build/mobile/keyboard-aware-flat-list/index.ios.js +44 -68
  84. package/build/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  85. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +39 -0
  86. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js.map +1 -0
  87. package/build/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +22 -29
  88. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-section.native.js.map +1 -0
  89. package/build/mobile/keyboard-aware-flat-list/use-scroll.native.js +93 -0
  90. package/build/mobile/keyboard-aware-flat-list/use-scroll.native.js.map +1 -0
  91. package/build/mobile/utils/get-px-from-css-unit.native.js +302 -0
  92. package/build/mobile/utils/get-px-from-css-unit.native.js.map +1 -0
  93. package/build/modal/index.js +18 -13
  94. package/build/modal/index.js.map +1 -1
  95. package/build/navigation/menu/menu-title.js +1 -1
  96. package/build/navigation/menu/menu-title.js.map +1 -1
  97. package/build/navigator/navigator-provider/component.js +13 -15
  98. package/build/navigator/navigator-provider/component.js.map +1 -1
  99. package/build/navigator/navigator-screen/component.js +23 -63
  100. package/build/navigator/navigator-screen/component.js.map +1 -1
  101. package/build/navigator/styles.js +52 -0
  102. package/build/navigator/styles.js.map +1 -0
  103. package/build/number-control/index.js +4 -8
  104. package/build/number-control/index.js.map +1 -1
  105. package/build/number-control/types.js.map +1 -1
  106. package/build/palette-edit/index.js +15 -34
  107. package/build/palette-edit/index.js.map +1 -1
  108. package/build/private-apis.js +11 -26
  109. package/build/private-apis.js.map +1 -1
  110. package/build/private-apis.native.js +21 -0
  111. package/build/private-apis.native.js.map +1 -0
  112. package/build/query-controls/author-select.js +3 -1
  113. package/build/query-controls/author-select.js.map +1 -1
  114. package/build/query-controls/category-select.js +3 -1
  115. package/build/query-controls/category-select.js.map +1 -1
  116. package/build/query-controls/index.js +6 -1
  117. package/build/query-controls/index.js.map +1 -1
  118. package/build/query-controls/types.js.map +1 -1
  119. package/build/radio-control/index.js +1 -0
  120. package/build/radio-control/index.js.map +1 -1
  121. package/build/range-control/index.js +1 -1
  122. package/build/range-control/index.js.map +1 -1
  123. package/build/select-control/styles/select-control-styles.js +15 -25
  124. package/build/select-control/styles/select-control-styles.js.map +1 -1
  125. package/build/slot-fill/index.js +3 -2
  126. package/build/slot-fill/index.js.map +1 -1
  127. package/build/slot-fill/types.js.map +1 -1
  128. package/build/snackbar/types.js.map +1 -1
  129. package/build/tabs/index.js +18 -1
  130. package/build/tabs/index.js.map +1 -1
  131. package/build/tabs/styles.js +3 -3
  132. package/build/tabs/styles.js.map +1 -1
  133. package/build/tabs/tab.js +2 -2
  134. package/build/tabs/tab.js.map +1 -1
  135. package/build/tabs/tabpanel.js +11 -8
  136. package/build/tabs/tabpanel.js.map +1 -1
  137. package/build/tabs/types.js.map +1 -1
  138. package/build/toggle-group-control/toggle-group-control/component.js +4 -4
  139. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  140. package/build/toggle-group-control/toggle-group-control/styles.js +29 -15
  141. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  142. package/build/toggle-group-control/toggle-group-control/utils.js +17 -17
  143. package/build/toggle-group-control/toggle-group-control/utils.js.map +1 -1
  144. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +9 -9
  145. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  146. package/build/tools-panel/tools-panel/component.js +3 -1
  147. package/build/tools-panel/tools-panel/component.js.map +1 -1
  148. package/build/tools-panel/tools-panel-header/component.js +9 -8
  149. package/build/tools-panel/tools-panel-header/component.js.map +1 -1
  150. package/build/tools-panel/tools-panel-item/hook.js +11 -11
  151. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  152. package/build/tools-panel/types.js.map +1 -1
  153. package/build/tooltip/index.js +1 -1
  154. package/build/tooltip/index.js.map +1 -1
  155. package/build/truncate/hook.js +10 -4
  156. package/build/truncate/hook.js.map +1 -1
  157. package/build/truncate/types.js.map +1 -1
  158. package/build/unit-control/index.js +1 -1
  159. package/build/unit-control/index.js.map +1 -1
  160. package/build/utils/strings.js +34 -3
  161. package/build/utils/strings.js.map +1 -1
  162. package/build-module/base-control/index.js +16 -12
  163. package/build-module/base-control/index.js.map +1 -1
  164. package/build-module/border-box-control/border-box-control-linked-button/component.js +1 -1
  165. package/build-module/border-box-control/border-box-control-linked-button/component.js.map +1 -1
  166. package/build-module/border-control/border-control-dropdown/component.js +4 -2
  167. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  168. package/build-module/border-control/border-control-dropdown/hook.js +3 -2
  169. package/build-module/border-control/border-control-dropdown/hook.js.map +1 -1
  170. package/build-module/border-control/border-control-style-picker/component.js +1 -1
  171. package/build-module/border-control/border-control-style-picker/component.js.map +1 -1
  172. package/build-module/border-control/styles.js +17 -17
  173. package/build-module/border-control/styles.js.map +1 -1
  174. package/build-module/box-control/index.js +1 -1
  175. package/build-module/box-control/index.js.map +1 -1
  176. package/build-module/box-control/linked-button.js +1 -1
  177. package/build-module/box-control/linked-button.js.map +1 -1
  178. package/build-module/button/index.js +1 -1
  179. package/build-module/button/index.js.map +1 -1
  180. package/build-module/checkbox-control/index.js +1 -1
  181. package/build-module/checkbox-control/index.js.map +1 -1
  182. package/build-module/checkbox-control/types.js.map +1 -1
  183. package/build-module/color-picker/color-copy-button.js +1 -1
  184. package/build-module/color-picker/color-copy-button.js.map +1 -1
  185. package/build-module/context/wordpress-component.js.map +1 -1
  186. package/build-module/custom-select-control-v2/index.js +11 -10
  187. package/build-module/custom-select-control-v2/index.js.map +1 -1
  188. package/build-module/date-time/date/styles.js +8 -8
  189. package/build-module/date-time/date/styles.js.map +1 -1
  190. package/build-module/date-time/time/timezone.js +11 -2
  191. package/build-module/date-time/time/timezone.js.map +1 -1
  192. package/build-module/dimension-control/index.js +2 -0
  193. package/build-module/dimension-control/index.js.map +1 -1
  194. package/build-module/dimension-control/types.js.map +1 -1
  195. package/build-module/dropdown-menu-v2/index.js +201 -154
  196. package/build-module/dropdown-menu-v2/index.js.map +1 -1
  197. package/build-module/dropdown-menu-v2/styles.js +68 -61
  198. package/build-module/dropdown-menu-v2/styles.js.map +1 -1
  199. package/build-module/dropdown-menu-v2/types.js.map +1 -1
  200. package/build-module/duotone-picker/duotone-picker.js +4 -3
  201. package/build-module/duotone-picker/duotone-picker.js.map +1 -1
  202. package/build-module/focal-point-picker/controls.js +5 -1
  203. package/build-module/focal-point-picker/controls.js.map +1 -1
  204. package/build-module/focal-point-picker/index.js +2 -0
  205. package/build-module/focal-point-picker/index.js.map +1 -1
  206. package/build-module/focal-point-picker/styles/focal-point-picker-style.js +15 -15
  207. package/build-module/focal-point-picker/styles/focal-point-picker-style.js.map +1 -1
  208. package/build-module/focal-point-picker/types.js.map +1 -1
  209. package/build-module/font-size-picker/font-size-picker-select.js +2 -0
  210. package/build-module/font-size-picker/font-size-picker-select.js.map +1 -1
  211. package/build-module/font-size-picker/font-size-picker-toggle-group.js +2 -0
  212. package/build-module/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  213. package/build-module/font-size-picker/index.js +10 -3
  214. package/build-module/font-size-picker/index.js.map +1 -1
  215. package/build-module/font-size-picker/index.native.js +5 -2
  216. package/build-module/font-size-picker/index.native.js.map +1 -1
  217. package/build-module/font-size-picker/types.js.map +1 -1
  218. package/build-module/form-token-field/index.js +10 -5
  219. package/build-module/form-token-field/index.js.map +1 -1
  220. package/build-module/form-token-field/token.js +1 -0
  221. package/build-module/form-token-field/token.js.map +1 -1
  222. package/build-module/gradient-picker/index.js +3 -2
  223. package/build-module/gradient-picker/index.js.map +1 -1
  224. package/build-module/index.native.js +6 -3
  225. package/build-module/index.native.js.map +1 -1
  226. package/build-module/input-control/styles/input-control-styles.js +31 -29
  227. package/build-module/input-control/styles/input-control-styles.js.map +1 -1
  228. package/build-module/input-control/types.js.map +1 -1
  229. package/build-module/lock-unlock.js +9 -0
  230. package/build-module/lock-unlock.js.map +1 -0
  231. package/build-module/mobile/bottom-sheet/index.native.js +9 -1
  232. package/build-module/mobile/bottom-sheet/index.native.js.map +1 -1
  233. package/build-module/mobile/global-styles-context/utils.native.js +38 -13
  234. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  235. package/build-module/mobile/image/constants.js +5 -0
  236. package/build-module/mobile/image/constants.js.map +1 -0
  237. package/build-module/mobile/image/index.native.js +25 -16
  238. package/build-module/mobile/image/index.native.js.map +1 -1
  239. package/build-module/mobile/keyboard-aware-flat-list/index.android.js +40 -6
  240. package/build-module/mobile/keyboard-aware-flat-list/index.android.js.map +1 -1
  241. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js +46 -68
  242. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  243. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +33 -0
  244. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js.map +1 -0
  245. package/build-module/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +21 -27
  246. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-section.native.js.map +1 -0
  247. package/build-module/mobile/keyboard-aware-flat-list/use-scroll.native.js +86 -0
  248. package/build-module/mobile/keyboard-aware-flat-list/use-scroll.native.js.map +1 -0
  249. package/build-module/mobile/utils/get-px-from-css-unit.native.js +294 -0
  250. package/build-module/mobile/utils/get-px-from-css-unit.native.js.map +1 -0
  251. package/build-module/modal/index.js +18 -13
  252. package/build-module/modal/index.js.map +1 -1
  253. package/build-module/navigation/menu/menu-title.js +1 -1
  254. package/build-module/navigation/menu/menu-title.js.map +1 -1
  255. package/build-module/navigator/navigator-provider/component.js +3 -16
  256. package/build-module/navigator/navigator-provider/component.js.map +1 -1
  257. package/build-module/navigator/navigator-screen/component.js +16 -70
  258. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  259. package/build-module/navigator/styles.js +47 -0
  260. package/build-module/navigator/styles.js.map +1 -0
  261. package/build-module/number-control/index.js +4 -8
  262. package/build-module/number-control/index.js.map +1 -1
  263. package/build-module/number-control/types.js.map +1 -1
  264. package/build-module/palette-edit/index.js +14 -33
  265. package/build-module/palette-edit/index.js.map +1 -1
  266. package/build-module/private-apis.js +10 -23
  267. package/build-module/private-apis.js.map +1 -1
  268. package/build-module/private-apis.native.js +14 -0
  269. package/build-module/private-apis.native.js.map +1 -0
  270. package/build-module/query-controls/author-select.js +3 -1
  271. package/build-module/query-controls/author-select.js.map +1 -1
  272. package/build-module/query-controls/category-select.js +3 -1
  273. package/build-module/query-controls/category-select.js.map +1 -1
  274. package/build-module/query-controls/index.js +6 -1
  275. package/build-module/query-controls/index.js.map +1 -1
  276. package/build-module/query-controls/types.js.map +1 -1
  277. package/build-module/radio-control/index.js +1 -0
  278. package/build-module/radio-control/index.js.map +1 -1
  279. package/build-module/range-control/index.js +1 -1
  280. package/build-module/range-control/index.js.map +1 -1
  281. package/build-module/select-control/styles/select-control-styles.js +15 -25
  282. package/build-module/select-control/styles/select-control-styles.js.map +1 -1
  283. package/build-module/slot-fill/index.js +3 -2
  284. package/build-module/slot-fill/index.js.map +1 -1
  285. package/build-module/slot-fill/types.js.map +1 -1
  286. package/build-module/snackbar/types.js.map +1 -1
  287. package/build-module/tabs/index.js +18 -1
  288. package/build-module/tabs/index.js.map +1 -1
  289. package/build-module/tabs/styles.js +3 -3
  290. package/build-module/tabs/styles.js.map +1 -1
  291. package/build-module/tabs/tab.js +2 -2
  292. package/build-module/tabs/tab.js.map +1 -1
  293. package/build-module/tabs/tabpanel.js +11 -8
  294. package/build-module/tabs/tabpanel.js.map +1 -1
  295. package/build-module/tabs/types.js.map +1 -1
  296. package/build-module/toggle-group-control/toggle-group-control/component.js +4 -4
  297. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  298. package/build-module/toggle-group-control/toggle-group-control/styles.js +29 -15
  299. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  300. package/build-module/toggle-group-control/toggle-group-control/utils.js +17 -17
  301. package/build-module/toggle-group-control/toggle-group-control/utils.js.map +1 -1
  302. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +9 -9
  303. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  304. package/build-module/tools-panel/tools-panel/component.js +3 -1
  305. package/build-module/tools-panel/tools-panel/component.js.map +1 -1
  306. package/build-module/tools-panel/tools-panel-header/component.js +9 -8
  307. package/build-module/tools-panel/tools-panel-header/component.js.map +1 -1
  308. package/build-module/tools-panel/tools-panel-item/hook.js +11 -11
  309. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  310. package/build-module/tools-panel/types.js.map +1 -1
  311. package/build-module/tooltip/index.js +1 -1
  312. package/build-module/tooltip/index.js.map +1 -1
  313. package/build-module/truncate/hook.js +10 -4
  314. package/build-module/truncate/hook.js.map +1 -1
  315. package/build-module/truncate/types.js.map +1 -1
  316. package/build-module/unit-control/index.js +1 -1
  317. package/build-module/unit-control/index.js.map +1 -1
  318. package/build-module/utils/strings.js +32 -2
  319. package/build-module/utils/strings.js.map +1 -1
  320. package/build-style/style-rtl.css +30 -6
  321. package/build-style/style.css +30 -6
  322. package/build-types/base-control/index.d.ts +3 -27
  323. package/build-types/base-control/index.d.ts.map +1 -1
  324. package/build-types/base-control/stories/index.story.d.ts +4 -1
  325. package/build-types/base-control/stories/index.story.d.ts.map +1 -1
  326. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  327. package/build-types/border-control/border-control-dropdown/hook.d.ts +1 -0
  328. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -1
  329. package/build-types/border-control/styles.d.ts +1 -1
  330. package/build-types/border-control/styles.d.ts.map +1 -1
  331. package/build-types/checkbox-control/index.d.ts.map +1 -1
  332. package/build-types/checkbox-control/types.d.ts +3 -2
  333. package/build-types/checkbox-control/types.d.ts.map +1 -1
  334. package/build-types/color-picker/component.d.ts +1 -1
  335. package/build-types/color-picker/stories/index.story.d.ts +1 -1
  336. package/build-types/color-picker/stories/index.story.d.ts.map +1 -1
  337. package/build-types/composite/test/index.d.ts.map +1 -0
  338. package/build-types/context/wordpress-component.d.ts +3 -3
  339. package/build-types/context/wordpress-component.d.ts.map +1 -1
  340. package/build-types/custom-select-control-v2/index.d.ts +3 -2
  341. package/build-types/custom-select-control-v2/index.d.ts.map +1 -1
  342. package/build-types/custom-select-control-v2/stories/index.story.d.ts +4 -3
  343. package/build-types/custom-select-control-v2/stories/index.story.d.ts.map +1 -1
  344. package/build-types/date-time/time/timezone.d.ts.map +1 -1
  345. package/build-types/dimension-control/index.d.ts.map +1 -1
  346. package/build-types/dimension-control/types.d.ts +6 -0
  347. package/build-types/dimension-control/types.d.ts.map +1 -1
  348. package/build-types/dropdown/index.d.ts +1 -1
  349. package/build-types/dropdown/index.d.ts.map +1 -1
  350. package/build-types/dropdown/stories/index.story.d.ts +3 -3
  351. package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
  352. package/build-types/dropdown-menu/index.d.ts +1 -1
  353. package/build-types/dropdown-menu/index.d.ts.map +1 -1
  354. package/build-types/dropdown-menu/stories/index.story.d.ts +2 -2
  355. package/build-types/dropdown-menu/stories/index.story.d.ts.map +1 -1
  356. package/build-types/dropdown-menu-v2/index.d.ts +18 -15
  357. package/build-types/dropdown-menu-v2/index.d.ts.map +1 -1
  358. package/build-types/dropdown-menu-v2/stories/index.story.d.ts +7 -2
  359. package/build-types/dropdown-menu-v2/stories/index.story.d.ts.map +1 -1
  360. package/build-types/dropdown-menu-v2/styles.d.ts +77 -23
  361. package/build-types/dropdown-menu-v2/styles.d.ts.map +1 -1
  362. package/build-types/dropdown-menu-v2/types.d.ts +89 -173
  363. package/build-types/dropdown-menu-v2/types.d.ts.map +1 -1
  364. package/build-types/duotone-picker/duotone-picker.d.ts.map +1 -1
  365. package/build-types/focal-point-picker/controls.d.ts +1 -1
  366. package/build-types/focal-point-picker/controls.d.ts.map +1 -1
  367. package/build-types/focal-point-picker/index.d.ts +1 -1
  368. package/build-types/focal-point-picker/index.d.ts.map +1 -1
  369. package/build-types/focal-point-picker/stories/index.story.d.ts +8 -4
  370. package/build-types/focal-point-picker/stories/index.story.d.ts.map +1 -1
  371. package/build-types/focal-point-picker/types.d.ts +7 -0
  372. package/build-types/focal-point-picker/types.d.ts.map +1 -1
  373. package/build-types/font-size-picker/font-size-picker-select.d.ts.map +1 -1
  374. package/build-types/font-size-picker/font-size-picker-toggle-group.d.ts.map +1 -1
  375. package/build-types/font-size-picker/index.d.ts.map +1 -1
  376. package/build-types/font-size-picker/types.d.ts +8 -1
  377. package/build-types/font-size-picker/types.d.ts.map +1 -1
  378. package/build-types/form-token-field/index.d.ts.map +1 -1
  379. package/build-types/form-token-field/token.d.ts.map +1 -1
  380. package/build-types/input-control/styles/input-control-styles.d.ts +11 -0
  381. package/build-types/input-control/styles/input-control-styles.d.ts.map +1 -1
  382. package/build-types/input-control/types.d.ts +1 -1
  383. package/build-types/input-control/types.d.ts.map +1 -1
  384. package/build-types/lock-unlock.d.ts +3 -0
  385. package/build-types/lock-unlock.d.ts.map +1 -0
  386. package/build-types/mobile/image/constants.d.ts +5 -0
  387. package/build-types/mobile/image/constants.d.ts.map +1 -0
  388. package/build-types/modal/index.d.ts.map +1 -1
  389. package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
  390. package/build-types/navigator/navigator-screen/component.d.ts +1 -7
  391. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  392. package/build-types/navigator/styles.d.ts +9 -0
  393. package/build-types/navigator/styles.d.ts.map +1 -0
  394. package/build-types/number-control/index.d.ts.map +1 -1
  395. package/build-types/number-control/types.d.ts +1 -1
  396. package/build-types/palette-edit/index.d.ts +2 -2
  397. package/build-types/palette-edit/index.d.ts.map +1 -1
  398. package/build-types/popover/index.d.ts +1 -1
  399. package/build-types/popover/index.d.ts.map +1 -1
  400. package/build-types/popover/stories/e2e/index.story.d.ts +1 -1
  401. package/build-types/private-apis.d.ts +0 -1
  402. package/build-types/private-apis.d.ts.map +1 -1
  403. package/build-types/query-controls/author-select.d.ts +1 -1
  404. package/build-types/query-controls/author-select.d.ts.map +1 -1
  405. package/build-types/query-controls/category-select.d.ts +1 -1
  406. package/build-types/query-controls/category-select.d.ts.map +1 -1
  407. package/build-types/query-controls/index.d.ts +1 -1
  408. package/build-types/query-controls/index.d.ts.map +1 -1
  409. package/build-types/query-controls/types.d.ts +9 -0
  410. package/build-types/query-controls/types.d.ts.map +1 -1
  411. package/build-types/radio-control/index.d.ts.map +1 -1
  412. package/build-types/select-control/styles/select-control-styles.d.ts.map +1 -1
  413. package/build-types/slot-fill/index.d.ts +1 -1
  414. package/build-types/slot-fill/index.d.ts.map +1 -1
  415. package/build-types/slot-fill/types.d.ts +4 -0
  416. package/build-types/slot-fill/types.d.ts.map +1 -1
  417. package/build-types/snackbar/index.d.ts +2 -2
  418. package/build-types/snackbar/stories/index.story.d.ts +0 -3
  419. package/build-types/snackbar/stories/index.story.d.ts.map +1 -1
  420. package/build-types/snackbar/types.d.ts +1 -1
  421. package/build-types/snackbar/types.d.ts.map +1 -1
  422. package/build-types/tabs/index.d.ts +2 -2
  423. package/build-types/tabs/index.d.ts.map +1 -1
  424. package/build-types/tabs/styles.d.ts.map +1 -1
  425. package/build-types/tabs/tab.d.ts +2 -1
  426. package/build-types/tabs/tab.d.ts.map +1 -1
  427. package/build-types/tabs/tabpanel.d.ts +3 -2
  428. package/build-types/tabs/tabpanel.d.ts.map +1 -1
  429. package/build-types/tabs/types.d.ts +8 -3
  430. package/build-types/tabs/types.d.ts.map +1 -1
  431. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  432. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts +2 -2
  433. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  434. package/build-types/toggle-group-control/toggle-group-control/utils.d.ts.map +1 -1
  435. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts +1 -1
  436. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  437. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -1
  438. package/build-types/tools-panel/tools-panel/component.d.ts.map +1 -1
  439. package/build-types/tools-panel/tools-panel/hook.d.ts +1 -0
  440. package/build-types/tools-panel/tools-panel/hook.d.ts.map +1 -1
  441. package/build-types/tools-panel/tools-panel-header/component.d.ts.map +1 -1
  442. package/build-types/tools-panel/tools-panel-header/hook.d.ts +1 -0
  443. package/build-types/tools-panel/tools-panel-header/hook.d.ts.map +1 -1
  444. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  445. package/build-types/tools-panel/types.d.ts +9 -0
  446. package/build-types/tools-panel/types.d.ts.map +1 -1
  447. package/build-types/truncate/hook.d.ts +1 -1
  448. package/build-types/truncate/hook.d.ts.map +1 -1
  449. package/build-types/truncate/types.d.ts +4 -0
  450. package/build-types/truncate/types.d.ts.map +1 -1
  451. package/build-types/utils/strings.d.ts +14 -2
  452. package/build-types/utils/strings.d.ts.map +1 -1
  453. package/package.json +20 -21
  454. package/src/alignment-matrix-control/test/index.tsx +10 -16
  455. package/src/base-control/index.tsx +21 -16
  456. package/src/border-box-control/border-box-control-linked-button/component.tsx +1 -1
  457. package/src/border-control/border-control-dropdown/component.tsx +3 -1
  458. package/src/border-control/border-control-dropdown/hook.ts +3 -2
  459. package/src/border-control/border-control-style-picker/component.tsx +1 -1
  460. package/src/border-control/styles.ts +2 -9
  461. package/src/box-control/index.tsx +1 -1
  462. package/src/box-control/linked-button.tsx +1 -1
  463. package/src/button/README.md +32 -6
  464. package/src/button/index.tsx +1 -1
  465. package/src/button-group/README.md +0 -6
  466. package/src/card/card/README.md +1 -1
  467. package/src/checkbox-control/README.md +3 -10
  468. package/src/checkbox-control/index.tsx +8 -6
  469. package/src/checkbox-control/test/__snapshots__/index.tsx.snap +3 -8
  470. package/src/checkbox-control/test/index.tsx +7 -0
  471. package/src/checkbox-control/types.ts +3 -2
  472. package/src/color-picker/color-copy-button.tsx +1 -1
  473. package/src/combobox-control/README.md +0 -6
  474. package/src/composite/test/index.tsx +576 -0
  475. package/src/context/wordpress-component.ts +11 -6
  476. package/src/custom-select-control/README.md +0 -6
  477. package/src/custom-select-control/test/index.js +367 -35
  478. package/src/custom-select-control-v2/index.tsx +13 -12
  479. package/src/date-time/date/styles.ts +3 -3
  480. package/src/date-time/time/timezone.tsx +15 -3
  481. package/src/dimension-control/index.tsx +2 -0
  482. package/src/dimension-control/test/__snapshots__/index.test.js.snap +2 -2
  483. package/src/dimension-control/types.ts +6 -0
  484. package/src/dropdown-menu/README.md +0 -5
  485. package/src/dropdown-menu-v2/README.md +75 -136
  486. package/src/dropdown-menu-v2/index.tsx +321 -231
  487. package/src/dropdown-menu-v2/stories/index.story.tsx +522 -126
  488. package/src/dropdown-menu-v2/styles.ts +226 -151
  489. package/src/dropdown-menu-v2/test/index.tsx +480 -188
  490. package/src/dropdown-menu-v2/types.ts +98 -184
  491. package/src/duotone-picker/duotone-picker.tsx +7 -3
  492. package/src/focal-point-picker/controls.tsx +4 -0
  493. package/src/focal-point-picker/index.tsx +2 -0
  494. package/src/focal-point-picker/styles/focal-point-picker-style.ts +1 -1
  495. package/src/focal-point-picker/types.ts +7 -0
  496. package/src/font-size-picker/font-size-picker-select.tsx +2 -0
  497. package/src/font-size-picker/font-size-picker-toggle-group.tsx +9 -1
  498. package/src/font-size-picker/index.native.js +8 -2
  499. package/src/font-size-picker/index.tsx +15 -5
  500. package/src/font-size-picker/types.ts +8 -1
  501. package/src/form-toggle/README.md +0 -6
  502. package/src/form-toggle/style.scss +4 -2
  503. package/src/form-token-field/index.tsx +11 -7
  504. package/src/form-token-field/test/index.tsx +97 -0
  505. package/src/form-token-field/token.tsx +1 -0
  506. package/src/gradient-picker/index.tsx +2 -2
  507. package/src/index.native.js +6 -3
  508. package/src/input-control/styles/input-control-styles.tsx +10 -8
  509. package/src/input-control/types.ts +1 -1
  510. package/src/lock-unlock.js +10 -0
  511. package/src/menu-group/README.md +0 -8
  512. package/src/menu-items-choice/README.md +0 -7
  513. package/src/mobile/bottom-sheet/index.native.js +15 -1
  514. package/src/mobile/global-styles-context/test/fixtures/theme.native.js +0 -20
  515. package/src/mobile/global-styles-context/test/utils.native.js +22 -0
  516. package/src/mobile/global-styles-context/utils.native.js +42 -19
  517. package/src/mobile/image/constants.js +1 -0
  518. package/src/mobile/image/index.native.js +55 -18
  519. package/src/mobile/image/style.native.scss +35 -9
  520. package/src/mobile/keyboard-aware-flat-list/index.android.js +50 -5
  521. package/src/mobile/keyboard-aware-flat-list/index.ios.js +65 -91
  522. package/src/mobile/keyboard-aware-flat-list/test/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +27 -25
  523. package/src/mobile/keyboard-aware-flat-list/test/use-scroll.native.js +71 -0
  524. package/src/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +41 -0
  525. package/src/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +22 -27
  526. package/src/mobile/keyboard-aware-flat-list/use-scroll.native.js +100 -0
  527. package/src/mobile/link-settings/style.native.scss +0 -17
  528. package/src/mobile/utils/get-px-from-css-unit.native.js +329 -0
  529. package/src/mobile/utils/test/get-px-from-css-unit.native.js +172 -0
  530. package/src/modal/README.md +0 -6
  531. package/src/modal/index.tsx +18 -16
  532. package/src/modal/test/index.tsx +90 -1
  533. package/src/navigation/menu/menu-title.tsx +1 -1
  534. package/src/navigator/navigator-provider/component.tsx +3 -4
  535. package/src/navigator/navigator-screen/component.tsx +15 -93
  536. package/src/navigator/styles.ts +71 -0
  537. package/src/navigator/test/index.tsx +0 -64
  538. package/src/notice/README.md +0 -6
  539. package/src/number-control/README.md +2 -2
  540. package/src/number-control/index.tsx +4 -8
  541. package/src/number-control/types.ts +1 -1
  542. package/src/palette-edit/index.tsx +14 -43
  543. package/src/palette-edit/style.scss +2 -2
  544. package/src/panel/README.md +0 -6
  545. package/src/private-apis.native.js +13 -0
  546. package/src/private-apis.ts +12 -37
  547. package/src/query-controls/author-select.tsx +2 -0
  548. package/src/query-controls/category-select.tsx +2 -0
  549. package/src/query-controls/index.tsx +6 -1
  550. package/src/query-controls/types.ts +9 -0
  551. package/src/radio-control/README.md +0 -6
  552. package/src/radio-control/index.tsx +4 -1
  553. package/src/radio-control/style.scss +29 -2
  554. package/src/radio-group/README.md +0 -6
  555. package/src/range-control/README.md +1 -9
  556. package/src/range-control/index.tsx +1 -1
  557. package/src/search-control/README.md +1 -5
  558. package/src/select-control/README.md +0 -6
  559. package/src/select-control/styles/select-control-styles.ts +10 -28
  560. package/src/slot-fill/index.tsx +5 -2
  561. package/src/slot-fill/types.ts +5 -0
  562. package/src/snackbar/README.md +0 -6
  563. package/src/snackbar/stories/index.story.tsx +7 -5
  564. package/src/snackbar/style.scss +4 -3
  565. package/src/snackbar/types.ts +2 -1
  566. package/src/spacer/README.md +0 -2
  567. package/src/spinner/README.md +2 -0
  568. package/src/tab-panel/README.md +0 -5
  569. package/src/tab-panel/test/index.tsx +39 -56
  570. package/src/tabs/README.md +4 -4
  571. package/src/tabs/index.tsx +22 -1
  572. package/src/tabs/stories/index.story.tsx +48 -48
  573. package/src/tabs/styles.ts +7 -1
  574. package/src/tabs/tab.tsx +3 -3
  575. package/src/tabs/tabpanel.tsx +13 -8
  576. package/src/tabs/test/index.tsx +236 -106
  577. package/src/tabs/types.ts +8 -3
  578. package/src/text-control/README.md +0 -6
  579. package/src/textarea-control/README.md +0 -6
  580. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +12 -16
  581. package/src/toggle-group-control/test/index.tsx +107 -41
  582. package/src/toggle-group-control/toggle-group-control/component.tsx +5 -4
  583. package/src/toggle-group-control/toggle-group-control/styles.ts +13 -19
  584. package/src/toggle-group-control/toggle-group-control/utils.ts +15 -20
  585. package/src/toggle-group-control/toggle-group-control-option/README.md +1 -1
  586. package/src/toggle-group-control/toggle-group-control-option-base/README.md +1 -1
  587. package/src/toggle-group-control/toggle-group-control-option-base/styles.ts +3 -2
  588. package/src/toggle-group-control/toggle-group-control-option-icon/README.md +1 -1
  589. package/src/toolbar/toolbar/README.md +0 -6
  590. package/src/tools-panel/test/index.tsx +12 -20
  591. package/src/tools-panel/tools-panel/README.md +7 -0
  592. package/src/tools-panel/tools-panel/component.tsx +2 -0
  593. package/src/tools-panel/tools-panel-header/README.md +7 -0
  594. package/src/tools-panel/tools-panel-header/component.tsx +20 -13
  595. package/src/tools-panel/tools-panel-item/hook.ts +10 -21
  596. package/src/tools-panel/types.ts +9 -0
  597. package/src/tooltip/index.tsx +1 -1
  598. package/src/tooltip/test/index.tsx +360 -256
  599. package/src/tree-grid/README.md +0 -4
  600. package/src/truncate/README.md +8 -0
  601. package/src/truncate/hook.ts +17 -10
  602. package/src/truncate/test/index.tsx +54 -27
  603. package/src/truncate/types.ts +4 -0
  604. package/src/unit-control/index.tsx +1 -1
  605. package/src/utils/strings.ts +30 -2
  606. package/src/utils/test/strings.js +96 -1
  607. package/tsconfig.tsbuildinfo +1 -1
  608. package/build/dropdown-menu-v2-ariakit/index.js +0 -256
  609. package/build/dropdown-menu-v2-ariakit/index.js.map +0 -1
  610. package/build/dropdown-menu-v2-ariakit/styles.js +0 -180
  611. package/build/dropdown-menu-v2-ariakit/styles.js.map +0 -1
  612. package/build/dropdown-menu-v2-ariakit/types.js +0 -6
  613. package/build/dropdown-menu-v2-ariakit/types.js.map +0 -1
  614. package/build/mobile/inserter-button/index.native.js +0 -98
  615. package/build/mobile/inserter-button/index.native.js.map +0 -1
  616. package/build/mobile/inserter-button/sparkles.js +0 -23
  617. package/build/mobile/inserter-button/sparkles.js.map +0 -1
  618. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js.map +0 -1
  619. package/build/mobile/link-settings/image-link-destinations-screen.native.js +0 -119
  620. package/build/mobile/link-settings/image-link-destinations-screen.native.js.map +0 -1
  621. package/build-module/dropdown-menu-v2-ariakit/index.js +0 -237
  622. package/build-module/dropdown-menu-v2-ariakit/index.js.map +0 -1
  623. package/build-module/dropdown-menu-v2-ariakit/styles.js +0 -165
  624. package/build-module/dropdown-menu-v2-ariakit/styles.js.map +0 -1
  625. package/build-module/dropdown-menu-v2-ariakit/types.js +0 -2
  626. package/build-module/dropdown-menu-v2-ariakit/types.js.map +0 -1
  627. package/build-module/mobile/inserter-button/index.native.js +0 -89
  628. package/build-module/mobile/inserter-button/index.native.js.map +0 -1
  629. package/build-module/mobile/inserter-button/sparkles.js +0 -15
  630. package/build-module/mobile/inserter-button/sparkles.js.map +0 -1
  631. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js.map +0 -1
  632. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js +0 -110
  633. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js.map +0 -1
  634. package/build-types/dropdown-menu-v2-ariakit/index.d.ts +0 -20
  635. package/build-types/dropdown-menu-v2-ariakit/index.d.ts.map +0 -1
  636. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts +0 -16
  637. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts.map +0 -1
  638. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts +0 -96
  639. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +0 -1
  640. package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts.map +0 -1
  641. package/build-types/dropdown-menu-v2-ariakit/types.d.ts +0 -168
  642. package/build-types/dropdown-menu-v2-ariakit/types.d.ts.map +0 -1
  643. package/build-types/mobile/inserter-button/sparkles.d.ts +0 -3
  644. package/build-types/mobile/inserter-button/sparkles.d.ts.map +0 -1
  645. package/src/dropdown-menu-v2-ariakit/README.md +0 -331
  646. package/src/dropdown-menu-v2-ariakit/index.tsx +0 -383
  647. package/src/dropdown-menu-v2-ariakit/stories/index.story.tsx +0 -617
  648. package/src/dropdown-menu-v2-ariakit/styles.ts +0 -333
  649. package/src/dropdown-menu-v2-ariakit/test/index.tsx +0 -1108
  650. package/src/dropdown-menu-v2-ariakit/types.ts +0 -179
  651. package/src/mobile/inserter-button/README.md +0 -62
  652. package/src/mobile/inserter-button/index.native.js +0 -116
  653. package/src/mobile/inserter-button/sparkles.js +0 -15
  654. package/src/mobile/inserter-button/style.native.scss +0 -72
  655. package/src/mobile/link-settings/image-link-destinations-screen.native.js +0 -152
  656. /package/build-types/{dropdown-menu-v2-ariakit → composite}/test/index.d.ts +0 -0
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ default as memoizedGetPxFromCssUnit,
6
+ getPxFromCssUnit,
7
+ } from '../get-px-from-css-unit';
8
+
9
+ describe( 'getPxFromCssUnit', () => {
10
+ // Absolute units.
11
+ describe( 'absolute unites should return px values', () => {
12
+ const testData = [
13
+ [ '25px', '25px' ],
14
+ [ '25.5', '26px' ],
15
+ [ '1cm', '38px' ],
16
+ [ '10mm', '38px' ],
17
+ [ '1in', '96px' ],
18
+ [ '12pt', '16px' ],
19
+ [ '1pc', '16px' ],
20
+ [ '40Q', '38px' ], // 40 Q should be 1 cm.
21
+ ];
22
+
23
+ test.each( testData )( 'getPxFromCssUnit( %s )', ( unit, expected ) => {
24
+ expect( getPxFromCssUnit( unit ) ).toBe( expected );
25
+ } );
26
+ test.each( testData )(
27
+ 'memoizedGetPxFromCssUnit( %s )',
28
+ ( unit, expected ) => {
29
+ expect( memoizedGetPxFromCssUnit( unit ) ).toBe( expected );
30
+ }
31
+ );
32
+ test.each( testData )(
33
+ 'cached memoizedGetPxFromCssUnit( %s )',
34
+ ( unit, expected ) => {
35
+ expect( memoizedGetPxFromCssUnit( unit ) ).toBe( expected );
36
+ }
37
+ );
38
+ } );
39
+
40
+ describe( 'relative unites should return px values', () => {
41
+ const settings = {
42
+ fontSize: 10,
43
+ width: 100,
44
+ height: 200,
45
+ lineHeight: 2,
46
+ type: 'font',
47
+ };
48
+
49
+ const testData = [
50
+ [ '2em', '20px' ],
51
+ [ '2rem', '20px' ],
52
+ [ '1.125rem', '11px' ],
53
+ [ '20vw', '20px' ],
54
+ [ '20vh', '40px' ],
55
+ [ '20vmin', '20px' ],
56
+ [ '20vmax', '40px' ],
57
+ [ '20lh', '40px' ],
58
+ [ '120%', '12px' ],
59
+ ];
60
+
61
+ test.each( testData )( 'getPxFromCssUnit( %s )', ( unit, expected ) => {
62
+ expect( getPxFromCssUnit( unit, settings ) ).toBe( expected );
63
+ } );
64
+ test.each( testData )(
65
+ 'memoizedGetPxFromCssUnit( %s )',
66
+ ( unit, expected ) => {
67
+ expect( memoizedGetPxFromCssUnit( unit, settings ) ).toBe(
68
+ expected
69
+ );
70
+ }
71
+ );
72
+ test.each( testData )(
73
+ 'cached memoizedGetPxFromCssUnit( %s )',
74
+ ( unit, expected ) => {
75
+ expect( memoizedGetPxFromCssUnit( unit, settings ) ).toBe(
76
+ expected
77
+ );
78
+ }
79
+ );
80
+ } );
81
+
82
+ // Function units.
83
+
84
+ describe( 'function unites should return px values', () => {
85
+ const settings = {
86
+ fontSize: 10,
87
+ width: 100,
88
+ height: 200,
89
+ lineHeight: 2,
90
+ type: 'font',
91
+ };
92
+
93
+ const testData = [
94
+ [ 'min(20px, 25px)', '20px' ],
95
+ [ 'min(20px, 9px, 12pt, 25px)', '9px' ],
96
+ [ 'max(20px, 25px)', '25px' ],
97
+ [ 'clamp(10px, 9px, 25px)', '10px' ],
98
+ [ 'clamp(10px, 35px, 25px)', '25px' ],
99
+ [ 'clamp(10px, 15px, 25px)', '15px' ],
100
+ [ 'min(max(20px,25px), 35px)', '25px' ],
101
+ [ 'max(min(20px,25px), 35px)', '35px' ],
102
+ [ '10px + 25px', '35px' ],
103
+ [ 'calc(10px + 25px)', '35px' ],
104
+ [ 'calc( 2 * 20px)', '40px' ],
105
+ [ 'calc(25px - 10px)', '15px' ],
106
+ [ 'min(10px + 25px, 55pt)', '35px' ],
107
+ [ 'calc(12vw * 10px)', '450px' ],
108
+ [ 'calc(45vw / 10px)', '17px' ],
109
+ [ '', null ],
110
+ [ undefined, null ],
111
+ [ 123, '123px' ],
112
+ [ 123.456, '123px' ],
113
+ [ 'abc', null ],
114
+ [ 'console.log("howdy"); + 10px', null ],
115
+ [ 'calc(12vw * 10px', null ], // Missing closing bracket.
116
+ [ 'calc( 1em + 0.875rem )', '30px' ], // Decimals
117
+ [
118
+ 'clamp(1.8rem, 1.8rem + ((1vw / 0.48rem + 1rem) * 2.885), 3rem)',
119
+ '48px',
120
+ ],
121
+ [
122
+ 'clamp(5rem, 5.25rem + ((1vw - 0.48rem) * 9.096), 8rem)',
123
+ '80px',
124
+ ],
125
+ [
126
+ 'clamp(2.625rem, calc(2.625rem + ((1vw - 0.48rem) * 8.4135)), 3.25rem)',
127
+ '42px',
128
+ ],
129
+ [ 'var:preset|font-size|medium', null ],
130
+ ];
131
+
132
+ test.each( testData )( 'getPxFromCssUnit( %s )', ( unit, expected ) => {
133
+ expect( getPxFromCssUnit( unit, settings ) ).toBe( expected );
134
+ } );
135
+ test.each( testData )(
136
+ 'memoizedGetPxFromCssUnit( %s )',
137
+ ( unit, expected ) => {
138
+ expect( memoizedGetPxFromCssUnit( unit, settings ) ).toBe(
139
+ expected
140
+ );
141
+ }
142
+ );
143
+ test.each( testData )(
144
+ 'cached memoizedGetPxFromCssUnit( %s )',
145
+ ( unit, expected ) => {
146
+ expect( memoizedGetPxFromCssUnit( unit, settings ) ).toBe(
147
+ expected
148
+ );
149
+ }
150
+ );
151
+ } );
152
+ // Skip this test it might be useful in dev.
153
+ it.skip( 'test performance of memoizedGetPxFromCssUnit function', () => {
154
+ const start = Date.now();
155
+ let i = 0;
156
+ const intervals = 1000;
157
+ while ( i < intervals ) {
158
+ getPxFromCssUnit( 'max(25px, 35px)', { width: 200 } );
159
+ i++;
160
+ }
161
+ const rawDuration = Date.now() - start;
162
+
163
+ const startM = Date.now();
164
+ i = 0;
165
+ // The memoized Version should be at 10X better then the non default one.
166
+ while ( i < intervals * 10 ) {
167
+ memoizedGetPxFromCssUnit( 'max(25px, 35px)', { width: 201 } );
168
+ i++;
169
+ }
170
+ expect( rawDuration > Date.now() - startM ).toBe( true );
171
+ } );
172
+ } );
@@ -4,12 +4,6 @@ Modals give users information and choices related to a task they’re trying to
4
4
 
5
5
  ![An alert modal for trashing a post](https://wordpress.org/gutenberg/files/2019/04/Modal.png)
6
6
 
7
- ## Table of contents
8
-
9
- 1. [Design guidelines](#design-guidelines)
10
- 2. [Development guidelines](#development-guidelines)
11
- 3. [Related components](#related-components)
12
-
13
7
  ## Design guidelines
14
8
 
15
9
  ### Usage
@@ -43,12 +43,12 @@ import StyleProvider from '../style-provider';
43
43
  import type { ModalProps } from './types';
44
44
 
45
45
  // Used to track and dismiss the prior modal when another opens unless nested.
46
- const level0Dismissers: MutableRefObject<
47
- ModalProps[ 'onRequestClose' ] | undefined
48
- >[] = [];
49
- const ModalContext = createContext( level0Dismissers );
46
+ const ModalContext = createContext<
47
+ MutableRefObject< ModalProps[ 'onRequestClose' ] | undefined >[]
48
+ >( [] );
50
49
 
51
- let isBodyOpenClassActive = false;
50
+ // Used to track body class names applied while modals are open.
51
+ const bodyOpenClasses = new Map< string, number >();
52
52
 
53
53
  function UnforwardedModal(
54
54
  props: ModalProps,
@@ -146,7 +146,7 @@ function UnforwardedModal(
146
146
  // one should remain open at a time and the list enables closing prior ones.
147
147
  const dismissers = useContext( ModalContext );
148
148
  // Used for the tracking and dismissing any nested modals.
149
- const nestedDismissers = useRef< typeof level0Dismissers >( [] );
149
+ const nestedDismissers = useRef< typeof dismissers >( [] );
150
150
 
151
151
  // Updates the stack tracking open modals at this level and calls
152
152
  // onRequestClose for any prior and/or nested modals as applicable.
@@ -162,20 +162,22 @@ function UnforwardedModal(
162
162
  };
163
163
  }, [ dismissers ] );
164
164
 
165
- const isLevel0 = dismissers === level0Dismissers;
166
165
  // Adds/removes the value of bodyOpenClassName to body element.
167
166
  useEffect( () => {
168
- if ( ! isBodyOpenClassActive ) {
169
- isBodyOpenClassActive = true;
170
- document.body.classList.add( bodyOpenClassName );
171
- }
167
+ const theClass = bodyOpenClassName;
168
+ const oneMore = 1 + ( bodyOpenClasses.get( theClass ) ?? 0 );
169
+ bodyOpenClasses.set( theClass, oneMore );
170
+ document.body.classList.add( bodyOpenClassName );
172
171
  return () => {
173
- if ( isLevel0 && dismissers.length === 0 ) {
174
- document.body.classList.remove( bodyOpenClassName );
175
- isBodyOpenClassActive = false;
172
+ const oneLess = bodyOpenClasses.get( theClass )! - 1;
173
+ if ( oneLess === 0 ) {
174
+ document.body.classList.remove( theClass );
175
+ bodyOpenClasses.delete( theClass );
176
+ } else {
177
+ bodyOpenClasses.set( theClass, oneLess );
176
178
  }
177
179
  };
178
- }, [ bodyOpenClassName, dismissers, isLevel0 ] );
180
+ }, [ bodyOpenClassName ] );
179
181
 
180
182
  // Calls the isContentScrollable callback when the Modal children container resizes.
181
183
  useLayoutEffect( () => {
@@ -207,7 +209,7 @@ function UnforwardedModal(
207
209
 
208
210
  if (
209
211
  shouldCloseOnEsc &&
210
- event.code === 'Escape' &&
212
+ ( event.code === 'Escape' || event.key === 'Escape' ) &&
211
213
  ! event.defaultPrevented
212
214
  ) {
213
215
  event.preventDefault();
@@ -7,7 +7,7 @@ import userEvent from '@testing-library/user-event';
7
7
  /**
8
8
  * WordPress dependencies
9
9
  */
10
- import { useState } from '@wordpress/element';
10
+ import { useEffect, useState } from '@wordpress/element';
11
11
 
12
12
  /**
13
13
  * Internal dependencies
@@ -388,4 +388,93 @@ describe( 'Modal', () => {
388
388
  expect( opener ).toHaveFocus();
389
389
  } );
390
390
  } );
391
+
392
+ describe( 'Body class name', () => {
393
+ const overrideClass = 'is-any-open';
394
+ const BodyClassDemo = () => {
395
+ const [ isAShown, setIsAShown ] = useState( false );
396
+ const [ isA1Shown, setIsA1Shown ] = useState( false );
397
+ const [ isBShown, setIsBShown ] = useState( false );
398
+ const [ isClassOverriden, setIsClassOverriden ] = useState( false );
399
+ useEffect( () => {
400
+ const toggles: ( e: KeyboardEvent ) => void = ( {
401
+ key,
402
+ metaKey,
403
+ } ) => {
404
+ if ( key === 'a' ) {
405
+ if ( metaKey ) return setIsA1Shown( ( v ) => ! v );
406
+ return setIsAShown( ( v ) => ! v );
407
+ }
408
+ if ( key === 'b' ) return setIsBShown( ( v ) => ! v );
409
+ if ( key === 'c' )
410
+ return setIsClassOverriden( ( v ) => ! v );
411
+ };
412
+ document.addEventListener( 'keydown', toggles );
413
+ return () =>
414
+ void document.removeEventListener( 'keydown', toggles );
415
+ }, [] );
416
+ return (
417
+ <>
418
+ { isAShown && (
419
+ <Modal
420
+ bodyOpenClassName={
421
+ isClassOverriden ? overrideClass : 'is-A-open'
422
+ }
423
+ onRequestClose={ () => setIsAShown( false ) }
424
+ >
425
+ <p>Modal A contents</p>
426
+ { isA1Shown && (
427
+ <Modal
428
+ title="Nested"
429
+ onRequestClose={ () =>
430
+ setIsA1Shown( false )
431
+ }
432
+ >
433
+ <p>Modal A1 contents</p>
434
+ </Modal>
435
+ ) }
436
+ </Modal>
437
+ ) }
438
+ { isBShown && (
439
+ <Modal
440
+ bodyOpenClassName={
441
+ isClassOverriden ? overrideClass : 'is-B-open'
442
+ }
443
+ onRequestClose={ () => setIsBShown( false ) }
444
+ >
445
+ <p>Modal B contents</p>
446
+ </Modal>
447
+ ) }
448
+ </>
449
+ );
450
+ };
451
+
452
+ it( 'is added and removed when modal opens and closes including when closed due to another modal opening', async () => {
453
+ const user = userEvent.setup();
454
+
455
+ const { baseElement } = render( <BodyClassDemo /> );
456
+
457
+ await user.keyboard( 'a' ); // Opens modal A.
458
+ expect( baseElement ).toHaveClass( 'is-A-open' );
459
+
460
+ await user.keyboard( 'b' ); // Opens modal B > closes modal A.
461
+ expect( baseElement ).toHaveClass( 'is-B-open' );
462
+ expect( baseElement ).not.toHaveClass( 'is-A-open' );
463
+
464
+ await user.keyboard( 'b' ); // Closes modal B.
465
+ expect( baseElement ).not.toHaveClass( 'is-B-open' );
466
+ } );
467
+
468
+ it( 'is removed even when prop changes while nested modal is open', async () => {
469
+ const user = userEvent.setup();
470
+
471
+ const { baseElement } = render( <BodyClassDemo /> );
472
+
473
+ await user.keyboard( 'a' ); // Opens modal A.
474
+ await user.keyboard( '{Meta>}a{/Meta}' ); // Opens nested modal.
475
+ await user.keyboard( 'c' ); // Changes `bodyOpenClassName`.
476
+ await user.keyboard( 'a' ); // Closes modal A.
477
+ expect( baseElement ).not.toHaveClass( 'is-A-open' );
478
+ } );
479
+ } );
391
480
  } );
@@ -66,7 +66,7 @@ export default function NavigationMenuTitle( {
66
66
 
67
67
  { hasSearch && (
68
68
  <Button
69
- isSmall
69
+ size="small"
70
70
  variant="tertiary"
71
71
  label={ searchButtonLabel }
72
72
  onClick={ () => setIsSearching( true ) }
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import type { ForwardedRef } from 'react';
5
- import { css } from '@emotion/react';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -23,15 +22,16 @@ import isShallowEqual from '@wordpress/is-shallow-equal';
23
22
  import type { WordPressComponentProps } from '../../context';
24
23
  import { contextConnect, useContextSystem } from '../../context';
25
24
  import { useCx } from '../../utils/hooks/use-cx';
25
+ import { patternMatch, findParent } from '../utils/router';
26
26
  import { View } from '../../view';
27
27
  import { NavigatorContext } from '../context';
28
+ import * as styles from '../styles';
28
29
  import type {
29
30
  NavigatorProviderProps,
30
31
  NavigatorLocation,
31
32
  NavigatorContext as NavigatorContextType,
32
33
  Screen,
33
34
  } from '../types';
34
- import { patternMatch, findParent } from '../utils/router';
35
35
 
36
36
  type MatchedPath = ReturnType< typeof patternMatch >;
37
37
  type ScreenAction = { type: string; screen: Screen };
@@ -248,8 +248,7 @@ function UnconnectedNavigatorProvider(
248
248
 
249
249
  const cx = useCx();
250
250
  const classes = useMemo(
251
- // Prevents horizontal overflow while animating screen transitions.
252
- () => cx( css( { overflowX: 'hidden' } ), className ),
251
+ () => cx( styles.navigatorProviderWrapper, className ),
253
252
  [ className, cx ]
254
253
  );
255
254
 
@@ -2,11 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import type { ForwardedRef } from 'react';
5
- // eslint-disable-next-line no-restricted-imports
6
- import type { MotionProps } from 'framer-motion';
7
- // eslint-disable-next-line no-restricted-imports
8
- import { motion } from 'framer-motion';
9
- import { css } from '@emotion/react';
10
5
 
11
6
  /**
12
7
  * WordPress dependencies
@@ -19,8 +14,8 @@ import {
19
14
  useRef,
20
15
  useId,
21
16
  } from '@wordpress/element';
22
- import { useReducedMotion, useMergeRefs } from '@wordpress/compose';
23
- import { isRTL } from '@wordpress/i18n';
17
+ import { useMergeRefs } from '@wordpress/compose';
18
+ import { isRTL as isRTLFn } from '@wordpress/i18n';
24
19
  import { escapeAttribute } from '@wordpress/escape-html';
25
20
 
26
21
  /**
@@ -31,22 +26,11 @@ import { contextConnect, useContextSystem } from '../../context';
31
26
  import { useCx } from '../../utils/hooks/use-cx';
32
27
  import { View } from '../../view';
33
28
  import { NavigatorContext } from '../context';
29
+ import * as styles from '../styles';
34
30
  import type { NavigatorScreenProps } from '../types';
35
31
 
36
- const animationEnterDelay = 0;
37
- const animationEnterDuration = 0.14;
38
- const animationExitDuration = 0.14;
39
- const animationExitDelay = 0;
40
-
41
- // Props specific to `framer-motion` can't be currently passed to `NavigatorScreen`,
42
- // as some of them would overlap with HTML props (e.g. `onAnimationStart`, ...)
43
- type Props = Omit<
44
- WordPressComponentProps< NavigatorScreenProps, 'div', false >,
45
- Exclude< keyof MotionProps, 'style' | 'children' >
46
- >;
47
-
48
32
  function UnconnectedNavigatorScreen(
49
- props: Props,
33
+ props: WordPressComponentProps< NavigatorScreenProps, 'div', false >,
50
34
  forwardedRef: ForwardedRef< any >
51
35
  ) {
52
36
  const screenId = useId();
@@ -55,7 +39,6 @@ function UnconnectedNavigatorScreen(
55
39
  'NavigatorScreen'
56
40
  );
57
41
 
58
- const prefersReducedMotion = useReducedMotion();
59
42
  const { location, match, addScreen, removeScreen } =
60
43
  useContext( NavigatorContext );
61
44
  const isMatch = match === screenId;
@@ -70,19 +53,20 @@ function UnconnectedNavigatorScreen(
70
53
  return () => removeScreen( screen );
71
54
  }, [ screenId, path, addScreen, removeScreen ] );
72
55
 
56
+ const isRTL = isRTLFn();
57
+ const { isInitial, isBack } = location;
73
58
  const cx = useCx();
74
59
  const classes = useMemo(
75
60
  () =>
76
61
  cx(
77
- css( {
78
- // Ensures horizontal overflow is visually accessible.
79
- overflowX: 'auto',
80
- // In case the root has a height, it should not be exceeded.
81
- maxHeight: '100%',
62
+ styles.navigatorScreen( {
63
+ isInitial,
64
+ isBack,
65
+ isRTL,
82
66
  } ),
83
67
  className
84
68
  ),
85
- [ className, cx ]
69
+ [ className, cx, isInitial, isBack, isRTL ]
86
70
  );
87
71
 
88
72
  const locationRef = useRef( location );
@@ -149,73 +133,11 @@ function UnconnectedNavigatorScreen(
149
133
 
150
134
  const mergedWrapperRef = useMergeRefs( [ forwardedRef, wrapperRef ] );
151
135
 
152
- if ( ! isMatch ) {
153
- return null;
154
- }
155
-
156
- if ( prefersReducedMotion ) {
157
- return (
158
- <View
159
- ref={ mergedWrapperRef }
160
- className={ classes }
161
- { ...otherProps }
162
- >
163
- { children }
164
- </View>
165
- );
166
- }
167
-
168
- const animate = {
169
- opacity: 1,
170
- transition: {
171
- delay: animationEnterDelay,
172
- duration: animationEnterDuration,
173
- ease: 'easeInOut',
174
- },
175
- x: 0,
176
- };
177
- // Disable the initial animation if the screen is the very first screen to be
178
- // rendered within the current `NavigatorProvider`.
179
- const initial =
180
- location.isInitial && ! location.isBack
181
- ? false
182
- : {
183
- opacity: 0,
184
- x:
185
- ( isRTL() && location.isBack ) ||
186
- ( ! isRTL() && ! location.isBack )
187
- ? 50
188
- : -50,
189
- };
190
- const exit = {
191
- delay: animationExitDelay,
192
- opacity: 0,
193
- x:
194
- ( ! isRTL() && location.isBack ) || ( isRTL() && ! location.isBack )
195
- ? 50
196
- : -50,
197
- transition: {
198
- duration: animationExitDuration,
199
- ease: 'easeInOut',
200
- },
201
- };
202
-
203
- const animatedProps = {
204
- animate,
205
- exit,
206
- initial,
207
- };
208
-
209
- return (
210
- <motion.div
211
- ref={ mergedWrapperRef }
212
- className={ classes }
213
- { ...otherProps }
214
- { ...animatedProps }
215
- >
136
+ return isMatch ? (
137
+ <View ref={ mergedWrapperRef } className={ classes } { ...otherProps }>
216
138
  { children }
217
- </motion.div>
218
- );
139
+ </View>
140
+ ) : null;
219
141
  }
220
142
 
221
143
  /**
@@ -0,0 +1,71 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { css, keyframes } from '@emotion/react';
5
+
6
+ export const navigatorProviderWrapper = css`
7
+ /* Prevents horizontal overflow while animating screen transitions */
8
+ overflow-x: hidden;
9
+ /* Mark this subsection of the DOM as isolated, providing performance benefits
10
+ * by limiting calculations of layout, style and paint to a DOM subtree rather
11
+ * than the entire page.
12
+ */
13
+ contain: content;
14
+ `;
15
+
16
+ const fadeInFromRight = keyframes( {
17
+ '0%': {
18
+ opacity: 0,
19
+ transform: `translateX( 50px )`,
20
+ },
21
+ '100%': { opacity: 1, transform: 'none' },
22
+ } );
23
+
24
+ const fadeInFromLeft = keyframes( {
25
+ '0%': {
26
+ opacity: 0,
27
+ transform: `translateX( -50px )`,
28
+ },
29
+ '100%': { opacity: 1, transform: 'none' },
30
+ } );
31
+
32
+ type NavigatorScreenAnimationProps = {
33
+ isInitial?: boolean;
34
+ isBack?: boolean;
35
+ isRTL: boolean;
36
+ };
37
+
38
+ const navigatorScreenAnimation = ( {
39
+ isInitial,
40
+ isBack,
41
+ isRTL,
42
+ }: NavigatorScreenAnimationProps ) => {
43
+ if ( isInitial && ! isBack ) {
44
+ return;
45
+ }
46
+
47
+ const animationName =
48
+ ( isRTL && isBack ) || ( ! isRTL && ! isBack )
49
+ ? fadeInFromRight
50
+ : fadeInFromLeft;
51
+
52
+ return css`
53
+ animation-duration: 0.14s;
54
+ animation-timing-function: ease-in-out;
55
+ will-change: transform, opacity;
56
+ animation-name: ${ animationName };
57
+
58
+ @media ( prefers-reduced-motion ) {
59
+ animation-duration: 0s;
60
+ }
61
+ `;
62
+ };
63
+
64
+ export const navigatorScreen = ( props: NavigatorScreenAnimationProps ) => css`
65
+ /* Ensures horizontal overflow is visually accessible */
66
+ overflow-x: auto;
67
+ /* In case the root has a height, it should not be exceeded */
68
+ max-height: 100%;
69
+
70
+ ${ navigatorScreenAnimation( props ) }
71
+ `;
@@ -769,68 +769,4 @@ describe( 'Navigator', () => {
769
769
  ).toHaveFocus();
770
770
  } );
771
771
  } );
772
-
773
- describe( 'animation', () => {
774
- it( 'should not animate the initial screen', async () => {
775
- const onHomeAnimationStartSpy = jest.fn();
776
-
777
- render(
778
- <NavigatorProvider initialPath="/">
779
- <NavigatorScreen
780
- path="/"
781
- onAnimationStart={ onHomeAnimationStartSpy }
782
- >
783
- <CustomNavigatorButton path="/child">
784
- To child
785
- </CustomNavigatorButton>
786
- </NavigatorScreen>
787
- </NavigatorProvider>
788
- );
789
-
790
- expect( onHomeAnimationStartSpy ).not.toHaveBeenCalled();
791
- } );
792
-
793
- it( 'should animate all other screens (including the initial screen when navigating back)', async () => {
794
- const user = userEvent.setup();
795
-
796
- const onHomeAnimationStartSpy = jest.fn();
797
- const onChildAnimationStartSpy = jest.fn();
798
-
799
- render(
800
- <NavigatorProvider initialPath="/">
801
- <NavigatorScreen
802
- path="/"
803
- onAnimationStart={ onHomeAnimationStartSpy }
804
- >
805
- <CustomNavigatorButton path="/child">
806
- To child
807
- </CustomNavigatorButton>
808
- </NavigatorScreen>
809
- <NavigatorScreen
810
- path="/child"
811
- onAnimationStart={ onChildAnimationStartSpy }
812
- >
813
- <CustomNavigatorBackButton>
814
- Back to home
815
- </CustomNavigatorBackButton>
816
- </NavigatorScreen>
817
- </NavigatorProvider>
818
- );
819
-
820
- expect( onHomeAnimationStartSpy ).not.toHaveBeenCalled();
821
- expect( onChildAnimationStartSpy ).not.toHaveBeenCalled();
822
-
823
- await user.click(
824
- screen.getByRole( 'button', { name: 'To child' } )
825
- );
826
- expect( onChildAnimationStartSpy ).toHaveBeenCalledTimes( 1 );
827
- expect( onHomeAnimationStartSpy ).not.toHaveBeenCalled();
828
-
829
- await user.click(
830
- screen.getByRole( 'button', { name: 'Back to home' } )
831
- );
832
- expect( onChildAnimationStartSpy ).toHaveBeenCalledTimes( 1 );
833
- expect( onHomeAnimationStartSpy ).toHaveBeenCalledTimes( 1 );
834
- } );
835
- } );
836
772
  } );