@wordpress/components 25.14.0 → 25.15.1-next.79a6196f.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 (568) hide show
  1. package/CHANGELOG.md +51 -0
  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-style-picker/component.js +1 -1
  9. package/build/border-control/border-control-style-picker/component.js.map +1 -1
  10. package/build/box-control/index.js +1 -1
  11. package/build/box-control/index.js.map +1 -1
  12. package/build/box-control/linked-button.js +1 -1
  13. package/build/box-control/linked-button.js.map +1 -1
  14. package/build/button/index.js +1 -1
  15. package/build/button/index.js.map +1 -1
  16. package/build/color-palette/index.native.js +11 -7
  17. package/build/color-palette/index.native.js.map +1 -1
  18. package/build/color-picker/color-copy-button.js +1 -1
  19. package/build/color-picker/color-copy-button.js.map +1 -1
  20. package/build/context/wordpress-component.js.map +1 -1
  21. package/build/custom-select-control-v2/index.js +11 -10
  22. package/build/custom-select-control-v2/index.js.map +1 -1
  23. package/build/date-time/date/styles.js +8 -8
  24. package/build/date-time/date/styles.js.map +1 -1
  25. package/build/dropdown-menu-v2/index.js +205 -159
  26. package/build/dropdown-menu-v2/index.js.map +1 -1
  27. package/build/dropdown-menu-v2/styles.js +86 -77
  28. package/build/dropdown-menu-v2/styles.js.map +1 -1
  29. package/build/dropdown-menu-v2/types.js.map +1 -1
  30. package/build/duotone-picker/duotone-picker.js +4 -3
  31. package/build/duotone-picker/duotone-picker.js.map +1 -1
  32. package/build/font-size-picker/index.js +4 -2
  33. package/build/font-size-picker/index.js.map +1 -1
  34. package/build/font-size-picker/index.native.js +6 -3
  35. package/build/font-size-picker/index.native.js.map +1 -1
  36. package/build/form-token-field/index.js +10 -5
  37. package/build/form-token-field/index.js.map +1 -1
  38. package/build/form-token-field/token.js +1 -0
  39. package/build/form-token-field/token.js.map +1 -1
  40. package/build/gradient-picker/index.js +3 -2
  41. package/build/gradient-picker/index.js.map +1 -1
  42. package/build/index.native.js +20 -3
  43. package/build/index.native.js.map +1 -1
  44. package/build/input-control/styles/input-control-styles.js +32 -29
  45. package/build/input-control/styles/input-control-styles.js.map +1 -1
  46. package/build/input-control/types.js.map +1 -1
  47. package/build/lock-unlock.js +18 -0
  48. package/build/lock-unlock.js.map +1 -0
  49. package/build/mobile/bottom-sheet/index.native.js +8 -0
  50. package/build/mobile/bottom-sheet/index.native.js.map +1 -1
  51. package/build/mobile/color-settings/palette.screen.native.js +8 -4
  52. package/build/mobile/color-settings/palette.screen.native.js.map +1 -1
  53. package/build/mobile/global-styles-context/utils.native.js +26 -13
  54. package/build/mobile/global-styles-context/utils.native.js.map +1 -1
  55. package/build/mobile/image/constants.js +12 -0
  56. package/build/mobile/image/constants.js.map +1 -0
  57. package/build/mobile/image/index.native.js +26 -18
  58. package/build/mobile/image/index.native.js.map +1 -1
  59. package/build/mobile/keyboard-aware-flat-list/index.android.js +40 -8
  60. package/build/mobile/keyboard-aware-flat-list/index.android.js.map +1 -1
  61. package/build/mobile/keyboard-aware-flat-list/index.ios.js +44 -68
  62. package/build/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  63. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +39 -0
  64. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js.map +1 -0
  65. package/build/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +22 -29
  66. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-section.native.js.map +1 -0
  67. package/build/mobile/keyboard-aware-flat-list/use-scroll.native.js +93 -0
  68. package/build/mobile/keyboard-aware-flat-list/use-scroll.native.js.map +1 -0
  69. package/build/mobile/utils/get-px-from-css-unit.native.js +302 -0
  70. package/build/mobile/utils/get-px-from-css-unit.native.js.map +1 -0
  71. package/build/modal/index.js +18 -13
  72. package/build/modal/index.js.map +1 -1
  73. package/build/navigation/menu/menu-title.js +1 -1
  74. package/build/navigation/menu/menu-title.js.map +1 -1
  75. package/build/navigator/navigator-provider/component.js +13 -15
  76. package/build/navigator/navigator-provider/component.js.map +1 -1
  77. package/build/navigator/navigator-screen/component.js +23 -63
  78. package/build/navigator/navigator-screen/component.js.map +1 -1
  79. package/build/navigator/styles.js +52 -0
  80. package/build/navigator/styles.js.map +1 -0
  81. package/build/number-control/index.js +4 -8
  82. package/build/number-control/index.js.map +1 -1
  83. package/build/number-control/types.js.map +1 -1
  84. package/build/palette-edit/index.js +15 -54
  85. package/build/palette-edit/index.js.map +1 -1
  86. package/build/private-apis.js +11 -26
  87. package/build/private-apis.js.map +1 -1
  88. package/build/private-apis.native.js +21 -0
  89. package/build/private-apis.native.js.map +1 -0
  90. package/build/radio-control/index.js +1 -0
  91. package/build/radio-control/index.js.map +1 -1
  92. package/build/range-control/index.js +1 -1
  93. package/build/range-control/index.js.map +1 -1
  94. package/build/select-control/styles/select-control-styles.js +15 -25
  95. package/build/select-control/styles/select-control-styles.js.map +1 -1
  96. package/build/slot-fill/index.js +3 -2
  97. package/build/slot-fill/index.js.map +1 -1
  98. package/build/slot-fill/types.js.map +1 -1
  99. package/build/snackbar/types.js.map +1 -1
  100. package/build/tabs/styles.js +3 -3
  101. package/build/tabs/styles.js.map +1 -1
  102. package/build/tabs/tabpanel.js +9 -7
  103. package/build/tabs/tabpanel.js.map +1 -1
  104. package/build/toggle-group-control/toggle-group-control/component.js +4 -4
  105. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  106. package/build/toggle-group-control/toggle-group-control/styles.js +29 -15
  107. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  108. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +9 -9
  109. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  110. package/build/tools-panel/tools-panel/component.js +3 -1
  111. package/build/tools-panel/tools-panel/component.js.map +1 -1
  112. package/build/tools-panel/tools-panel-header/component.js +9 -8
  113. package/build/tools-panel/tools-panel-header/component.js.map +1 -1
  114. package/build/tools-panel/types.js.map +1 -1
  115. package/build/tooltip/index.js +34 -10
  116. package/build/tooltip/index.js.map +1 -1
  117. package/build/tooltip/types.js.map +1 -1
  118. package/build/truncate/hook.js +10 -4
  119. package/build/truncate/hook.js.map +1 -1
  120. package/build/truncate/types.js.map +1 -1
  121. package/build/unit-control/index.js +1 -1
  122. package/build/unit-control/index.js.map +1 -1
  123. package/build/utils/strings.js +34 -3
  124. package/build/utils/strings.js.map +1 -1
  125. package/build-module/base-control/index.js +16 -12
  126. package/build-module/base-control/index.js.map +1 -1
  127. package/build-module/border-box-control/border-box-control-linked-button/component.js +1 -1
  128. package/build-module/border-box-control/border-box-control-linked-button/component.js.map +1 -1
  129. package/build-module/border-control/border-control-style-picker/component.js +1 -1
  130. package/build-module/border-control/border-control-style-picker/component.js.map +1 -1
  131. package/build-module/box-control/index.js +1 -1
  132. package/build-module/box-control/index.js.map +1 -1
  133. package/build-module/box-control/linked-button.js +1 -1
  134. package/build-module/box-control/linked-button.js.map +1 -1
  135. package/build-module/button/index.js +1 -1
  136. package/build-module/button/index.js.map +1 -1
  137. package/build-module/color-palette/index.native.js +11 -7
  138. package/build-module/color-palette/index.native.js.map +1 -1
  139. package/build-module/color-picker/color-copy-button.js +1 -1
  140. package/build-module/color-picker/color-copy-button.js.map +1 -1
  141. package/build-module/context/wordpress-component.js.map +1 -1
  142. package/build-module/custom-select-control-v2/index.js +11 -10
  143. package/build-module/custom-select-control-v2/index.js.map +1 -1
  144. package/build-module/date-time/date/styles.js +8 -8
  145. package/build-module/date-time/date/styles.js.map +1 -1
  146. package/build-module/dropdown-menu-v2/index.js +201 -154
  147. package/build-module/dropdown-menu-v2/index.js.map +1 -1
  148. package/build-module/dropdown-menu-v2/styles.js +68 -61
  149. package/build-module/dropdown-menu-v2/styles.js.map +1 -1
  150. package/build-module/dropdown-menu-v2/types.js.map +1 -1
  151. package/build-module/duotone-picker/duotone-picker.js +4 -3
  152. package/build-module/duotone-picker/duotone-picker.js.map +1 -1
  153. package/build-module/font-size-picker/index.js +4 -2
  154. package/build-module/font-size-picker/index.js.map +1 -1
  155. package/build-module/font-size-picker/index.native.js +5 -2
  156. package/build-module/font-size-picker/index.native.js.map +1 -1
  157. package/build-module/form-token-field/index.js +10 -5
  158. package/build-module/form-token-field/index.js.map +1 -1
  159. package/build-module/form-token-field/token.js +1 -0
  160. package/build-module/form-token-field/token.js.map +1 -1
  161. package/build-module/gradient-picker/index.js +3 -2
  162. package/build-module/gradient-picker/index.js.map +1 -1
  163. package/build-module/index.native.js +6 -1
  164. package/build-module/index.native.js.map +1 -1
  165. package/build-module/input-control/styles/input-control-styles.js +31 -29
  166. package/build-module/input-control/styles/input-control-styles.js.map +1 -1
  167. package/build-module/input-control/types.js.map +1 -1
  168. package/build-module/lock-unlock.js +9 -0
  169. package/build-module/lock-unlock.js.map +1 -0
  170. package/build-module/mobile/bottom-sheet/index.native.js +9 -1
  171. package/build-module/mobile/bottom-sheet/index.native.js.map +1 -1
  172. package/build-module/mobile/color-settings/palette.screen.native.js +8 -4
  173. package/build-module/mobile/color-settings/palette.screen.native.js.map +1 -1
  174. package/build-module/mobile/global-styles-context/utils.native.js +25 -13
  175. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  176. package/build-module/mobile/image/constants.js +5 -0
  177. package/build-module/mobile/image/constants.js.map +1 -0
  178. package/build-module/mobile/image/index.native.js +25 -16
  179. package/build-module/mobile/image/index.native.js.map +1 -1
  180. package/build-module/mobile/keyboard-aware-flat-list/index.android.js +40 -6
  181. package/build-module/mobile/keyboard-aware-flat-list/index.android.js.map +1 -1
  182. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js +46 -68
  183. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  184. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +33 -0
  185. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js.map +1 -0
  186. package/build-module/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +21 -27
  187. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-section.native.js.map +1 -0
  188. package/build-module/mobile/keyboard-aware-flat-list/use-scroll.native.js +86 -0
  189. package/build-module/mobile/keyboard-aware-flat-list/use-scroll.native.js.map +1 -0
  190. package/build-module/mobile/utils/get-px-from-css-unit.native.js +294 -0
  191. package/build-module/mobile/utils/get-px-from-css-unit.native.js.map +1 -0
  192. package/build-module/modal/index.js +18 -13
  193. package/build-module/modal/index.js.map +1 -1
  194. package/build-module/navigation/menu/menu-title.js +1 -1
  195. package/build-module/navigation/menu/menu-title.js.map +1 -1
  196. package/build-module/navigator/navigator-provider/component.js +3 -16
  197. package/build-module/navigator/navigator-provider/component.js.map +1 -1
  198. package/build-module/navigator/navigator-screen/component.js +16 -70
  199. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  200. package/build-module/navigator/styles.js +47 -0
  201. package/build-module/navigator/styles.js.map +1 -0
  202. package/build-module/number-control/index.js +4 -8
  203. package/build-module/number-control/index.js.map +1 -1
  204. package/build-module/number-control/types.js.map +1 -1
  205. package/build-module/palette-edit/index.js +15 -51
  206. package/build-module/palette-edit/index.js.map +1 -1
  207. package/build-module/private-apis.js +10 -23
  208. package/build-module/private-apis.js.map +1 -1
  209. package/build-module/private-apis.native.js +14 -0
  210. package/build-module/private-apis.native.js.map +1 -0
  211. package/build-module/radio-control/index.js +1 -0
  212. package/build-module/radio-control/index.js.map +1 -1
  213. package/build-module/range-control/index.js +1 -1
  214. package/build-module/range-control/index.js.map +1 -1
  215. package/build-module/select-control/styles/select-control-styles.js +15 -25
  216. package/build-module/select-control/styles/select-control-styles.js.map +1 -1
  217. package/build-module/slot-fill/index.js +3 -2
  218. package/build-module/slot-fill/index.js.map +1 -1
  219. package/build-module/slot-fill/types.js.map +1 -1
  220. package/build-module/snackbar/types.js.map +1 -1
  221. package/build-module/tabs/styles.js +3 -3
  222. package/build-module/tabs/styles.js.map +1 -1
  223. package/build-module/tabs/tabpanel.js +9 -7
  224. package/build-module/tabs/tabpanel.js.map +1 -1
  225. package/build-module/toggle-group-control/toggle-group-control/component.js +4 -4
  226. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  227. package/build-module/toggle-group-control/toggle-group-control/styles.js +29 -15
  228. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  229. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +9 -9
  230. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  231. package/build-module/tools-panel/tools-panel/component.js +3 -1
  232. package/build-module/tools-panel/tools-panel/component.js.map +1 -1
  233. package/build-module/tools-panel/tools-panel-header/component.js +9 -8
  234. package/build-module/tools-panel/tools-panel-header/component.js.map +1 -1
  235. package/build-module/tools-panel/types.js.map +1 -1
  236. package/build-module/tooltip/index.js +34 -12
  237. package/build-module/tooltip/index.js.map +1 -1
  238. package/build-module/tooltip/types.js.map +1 -1
  239. package/build-module/truncate/hook.js +10 -4
  240. package/build-module/truncate/hook.js.map +1 -1
  241. package/build-module/truncate/types.js.map +1 -1
  242. package/build-module/unit-control/index.js +1 -1
  243. package/build-module/unit-control/index.js.map +1 -1
  244. package/build-module/utils/strings.js +32 -2
  245. package/build-module/utils/strings.js.map +1 -1
  246. package/build-style/style-rtl.css +29 -5
  247. package/build-style/style.css +29 -5
  248. package/build-types/base-control/index.d.ts +3 -27
  249. package/build-types/base-control/index.d.ts.map +1 -1
  250. package/build-types/base-control/stories/index.story.d.ts +4 -1
  251. package/build-types/base-control/stories/index.story.d.ts.map +1 -1
  252. package/build-types/border-box-control/border-box-control/hook.d.ts +4 -4
  253. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +6 -6
  254. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +4 -4
  255. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +4 -4
  256. package/build-types/border-box-control/stories/index.story.d.ts +1 -1
  257. package/build-types/border-control/border-control/hook.d.ts +4 -4
  258. package/build-types/border-control/border-control-dropdown/hook.d.ts +4 -4
  259. package/build-types/border-control/border-control-style-picker/hook.d.ts +4 -4
  260. package/build-types/border-control/stories/index.story.d.ts +6 -6
  261. package/build-types/box-control/stories/index.story.d.ts +42 -42
  262. package/build-types/box-control/styles/box-control-styles.d.ts +1 -1
  263. package/build-types/button/deprecated.d.ts +3 -3
  264. package/build-types/card/card/hook.d.ts +4 -4
  265. package/build-types/card/card-body/hook.d.ts +4 -4
  266. package/build-types/card/card-divider/hook.d.ts +4 -4
  267. package/build-types/card/card-footer/hook.d.ts +4 -4
  268. package/build-types/card/card-header/hook.d.ts +4 -4
  269. package/build-types/card/card-media/hook.d.ts +4 -4
  270. package/build-types/color-palette/styles.d.ts +2 -2
  271. package/build-types/color-picker/component.d.ts +2 -2
  272. package/build-types/color-picker/stories/index.story.d.ts +1 -1
  273. package/build-types/color-picker/stories/index.story.d.ts.map +1 -1
  274. package/build-types/color-picker/styles.d.ts +3 -3
  275. package/build-types/composite/test/index.d.ts.map +1 -0
  276. package/build-types/context/wordpress-component.d.ts +3 -3
  277. package/build-types/context/wordpress-component.d.ts.map +1 -1
  278. package/build-types/custom-select-control-v2/index.d.ts +3 -2
  279. package/build-types/custom-select-control-v2/index.d.ts.map +1 -1
  280. package/build-types/custom-select-control-v2/stories/index.story.d.ts +4 -3
  281. package/build-types/custom-select-control-v2/stories/index.story.d.ts.map +1 -1
  282. package/build-types/date-time/date/styles.d.ts +3 -3
  283. package/build-types/date-time/date-time/styles.d.ts +1 -1
  284. package/build-types/date-time/time/styles.d.ts +4 -4
  285. package/build-types/dropdown/index.d.ts +1 -1
  286. package/build-types/dropdown/index.d.ts.map +1 -1
  287. package/build-types/dropdown/stories/index.story.d.ts +3 -3
  288. package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
  289. package/build-types/dropdown-menu/index.d.ts +1 -1
  290. package/build-types/dropdown-menu/index.d.ts.map +1 -1
  291. package/build-types/dropdown-menu/stories/index.story.d.ts +2 -2
  292. package/build-types/dropdown-menu/stories/index.story.d.ts.map +1 -1
  293. package/build-types/dropdown-menu-v2/index.d.ts +18 -15
  294. package/build-types/dropdown-menu-v2/index.d.ts.map +1 -1
  295. package/build-types/dropdown-menu-v2/stories/index.story.d.ts +7 -2
  296. package/build-types/dropdown-menu-v2/stories/index.story.d.ts.map +1 -1
  297. package/build-types/dropdown-menu-v2/styles.d.ts +77 -23
  298. package/build-types/dropdown-menu-v2/styles.d.ts.map +1 -1
  299. package/build-types/dropdown-menu-v2/types.d.ts +89 -173
  300. package/build-types/dropdown-menu-v2/types.d.ts.map +1 -1
  301. package/build-types/duotone-picker/duotone-picker.d.ts.map +1 -1
  302. package/build-types/elevation/hook.d.ts +4 -4
  303. package/build-types/flex/flex/hook.d.ts +4 -4
  304. package/build-types/flex/flex-block/hook.d.ts +4 -4
  305. package/build-types/flex/flex-item/hook.d.ts +4 -4
  306. package/build-types/focal-point-picker/stories/index.story.d.ts +4 -4
  307. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts +1 -1
  308. package/build-types/font-size-picker/index.d.ts.map +1 -1
  309. package/build-types/font-size-picker/styles.d.ts +1 -1
  310. package/build-types/form-token-field/index.d.ts.map +1 -1
  311. package/build-types/form-token-field/token.d.ts.map +1 -1
  312. package/build-types/grid/hook.d.ts +4 -4
  313. package/build-types/h-stack/hook.d.ts +4 -4
  314. package/build-types/heading/component.d.ts +1 -1
  315. package/build-types/heading/hook.d.ts +4 -4
  316. package/build-types/input-control/styles/input-control-styles.d.ts +11 -0
  317. package/build-types/input-control/styles/input-control-styles.d.ts.map +1 -1
  318. package/build-types/input-control/types.d.ts +1 -1
  319. package/build-types/input-control/types.d.ts.map +1 -1
  320. package/build-types/item-group/item/hook.d.ts +4 -4
  321. package/build-types/item-group/item-group/hook.d.ts +4 -4
  322. package/build-types/lock-unlock.d.ts +3 -0
  323. package/build-types/lock-unlock.d.ts.map +1 -0
  324. package/build-types/menu-item/index.d.ts +1 -1
  325. package/build-types/menu-item/stories/index.story.d.ts +4 -4
  326. package/build-types/mobile/image/constants.d.ts +5 -0
  327. package/build-types/mobile/image/constants.d.ts.map +1 -0
  328. package/build-types/modal/index.d.ts.map +1 -1
  329. package/build-types/navigation/styles/navigation-styles.d.ts +3 -3
  330. package/build-types/navigator/navigator-back-button/hook.d.ts +6 -6
  331. package/build-types/navigator/navigator-button/hook.d.ts +6 -6
  332. package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
  333. package/build-types/navigator/navigator-screen/component.d.ts +1 -7
  334. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  335. package/build-types/navigator/styles.d.ts +9 -0
  336. package/build-types/navigator/styles.d.ts.map +1 -0
  337. package/build-types/number-control/index.d.ts +1 -1
  338. package/build-types/number-control/index.d.ts.map +1 -1
  339. package/build-types/number-control/stories/index.story.d.ts +1 -1
  340. package/build-types/number-control/types.d.ts +1 -1
  341. package/build-types/palette-edit/index.d.ts +3 -8
  342. package/build-types/palette-edit/index.d.ts.map +1 -1
  343. package/build-types/palette-edit/styles.d.ts +3 -3
  344. package/build-types/popover/index.d.ts +1 -1
  345. package/build-types/popover/index.d.ts.map +1 -1
  346. package/build-types/popover/stories/e2e/index.story.d.ts +1 -1
  347. package/build-types/private-apis.d.ts +0 -1
  348. package/build-types/private-apis.d.ts.map +1 -1
  349. package/build-types/radio-control/index.d.ts.map +1 -1
  350. package/build-types/range-control/index.d.ts +1 -1
  351. package/build-types/range-control/styles/range-control-styles.d.ts +1 -1
  352. package/build-types/resizable-box/index.d.ts +1 -1
  353. package/build-types/resizable-box/resize-tooltip/index.d.ts +1 -1
  354. package/build-types/resizable-box/stories/index.story.d.ts +2 -2
  355. package/build-types/scrollable/hook.d.ts +4 -4
  356. package/build-types/search-control/index.d.ts +1 -1
  357. package/build-types/search-control/stories/index.story.d.ts +2 -2
  358. package/build-types/select-control/styles/select-control-styles.d.ts.map +1 -1
  359. package/build-types/slot-fill/index.d.ts +1 -1
  360. package/build-types/slot-fill/index.d.ts.map +1 -1
  361. package/build-types/slot-fill/types.d.ts +4 -0
  362. package/build-types/slot-fill/types.d.ts.map +1 -1
  363. package/build-types/snackbar/index.d.ts +2 -2
  364. package/build-types/snackbar/stories/index.story.d.ts +0 -3
  365. package/build-types/snackbar/stories/index.story.d.ts.map +1 -1
  366. package/build-types/snackbar/types.d.ts +1 -1
  367. package/build-types/snackbar/types.d.ts.map +1 -1
  368. package/build-types/spacer/hook.d.ts +4 -4
  369. package/build-types/surface/hook.d.ts +4 -4
  370. package/build-types/tabs/styles.d.ts.map +1 -1
  371. package/build-types/tabs/tabpanel.d.ts +1 -1
  372. package/build-types/tabs/tabpanel.d.ts.map +1 -1
  373. package/build-types/text/hook.d.ts +4 -4
  374. package/build-types/text-control/index.d.ts +1 -1
  375. package/build-types/textarea-control/index.d.ts +1 -1
  376. package/build-types/toggle-control/stories/index.story.d.ts +2 -2
  377. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +1 -1
  378. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +1 -1
  379. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  380. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts +2 -2
  381. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  382. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +1 -1
  383. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts +1 -1
  384. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  385. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -1
  386. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +1 -1
  387. package/build-types/toolbar/toolbar-button/index.d.ts +3 -3
  388. package/build-types/tools-panel/tools-panel/component.d.ts.map +1 -1
  389. package/build-types/tools-panel/tools-panel/hook.d.ts +5 -4
  390. package/build-types/tools-panel/tools-panel/hook.d.ts.map +1 -1
  391. package/build-types/tools-panel/tools-panel-header/component.d.ts.map +1 -1
  392. package/build-types/tools-panel/tools-panel-header/hook.d.ts +5 -4
  393. package/build-types/tools-panel/tools-panel-header/hook.d.ts.map +1 -1
  394. package/build-types/tools-panel/tools-panel-item/hook.d.ts +4 -4
  395. package/build-types/tools-panel/types.d.ts +9 -0
  396. package/build-types/tools-panel/types.d.ts.map +1 -1
  397. package/build-types/tooltip/index.d.ts +1 -1
  398. package/build-types/tooltip/index.d.ts.map +1 -1
  399. package/build-types/tooltip/stories/index.story.d.ts +10 -1
  400. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  401. package/build-types/tooltip/types.d.ts +3 -0
  402. package/build-types/tooltip/types.d.ts.map +1 -1
  403. package/build-types/truncate/hook.d.ts +5 -5
  404. package/build-types/truncate/hook.d.ts.map +1 -1
  405. package/build-types/truncate/types.d.ts +4 -0
  406. package/build-types/truncate/types.d.ts.map +1 -1
  407. package/build-types/unit-control/index.d.ts +1 -1
  408. package/build-types/unit-control/styles/unit-control-styles.d.ts +1 -1
  409. package/build-types/utils/strings.d.ts +14 -2
  410. package/build-types/utils/strings.d.ts.map +1 -1
  411. package/build-types/v-stack/hook.d.ts +4 -4
  412. package/build-types/v-stack/stories/index.story.d.ts +1 -1
  413. package/package.json +20 -21
  414. package/src/alignment-matrix-control/test/index.tsx +10 -16
  415. package/src/base-control/index.tsx +21 -16
  416. package/src/border-box-control/border-box-control-linked-button/component.tsx +1 -1
  417. package/src/border-control/border-control-style-picker/component.tsx +1 -1
  418. package/src/box-control/index.tsx +1 -1
  419. package/src/box-control/linked-button.tsx +1 -1
  420. package/src/button/README.md +32 -6
  421. package/src/button/index.tsx +1 -1
  422. package/src/button-group/README.md +0 -6
  423. package/src/card/card/README.md +1 -1
  424. package/src/checkbox-control/README.md +1 -9
  425. package/src/color-palette/index.native.js +18 -7
  426. package/src/color-picker/color-copy-button.tsx +1 -1
  427. package/src/combobox-control/README.md +0 -6
  428. package/src/composite/test/index.tsx +576 -0
  429. package/src/context/wordpress-component.ts +11 -6
  430. package/src/custom-select-control/README.md +0 -6
  431. package/src/custom-select-control-v2/index.tsx +13 -12
  432. package/src/date-time/date/styles.ts +3 -3
  433. package/src/dropdown-menu/README.md +0 -5
  434. package/src/dropdown-menu-v2/README.md +75 -136
  435. package/src/dropdown-menu-v2/index.tsx +321 -231
  436. package/src/dropdown-menu-v2/stories/index.story.tsx +522 -126
  437. package/src/dropdown-menu-v2/styles.ts +226 -151
  438. package/src/dropdown-menu-v2/test/index.tsx +480 -188
  439. package/src/dropdown-menu-v2/types.ts +98 -184
  440. package/src/duotone-picker/duotone-picker.tsx +7 -3
  441. package/src/font-size-picker/index.native.js +8 -2
  442. package/src/font-size-picker/index.tsx +4 -2
  443. package/src/form-toggle/README.md +0 -6
  444. package/src/form-token-field/index.tsx +11 -7
  445. package/src/form-token-field/test/index.tsx +97 -0
  446. package/src/form-token-field/token.tsx +1 -0
  447. package/src/gradient-picker/index.tsx +2 -2
  448. package/src/index.native.js +6 -1
  449. package/src/input-control/styles/input-control-styles.tsx +10 -8
  450. package/src/input-control/types.ts +1 -1
  451. package/src/lock-unlock.js +10 -0
  452. package/src/menu-group/README.md +0 -8
  453. package/src/menu-items-choice/README.md +0 -7
  454. package/src/mobile/bottom-sheet/index.native.js +15 -1
  455. package/src/mobile/color-settings/palette.screen.native.js +7 -5
  456. package/src/mobile/global-styles-context/test/fixtures/theme.native.js +0 -20
  457. package/src/mobile/global-styles-context/utils.native.js +28 -19
  458. package/src/mobile/image/constants.js +1 -0
  459. package/src/mobile/image/index.native.js +55 -18
  460. package/src/mobile/image/style.native.scss +35 -9
  461. package/src/mobile/keyboard-aware-flat-list/index.android.js +50 -5
  462. package/src/mobile/keyboard-aware-flat-list/index.ios.js +65 -91
  463. package/src/mobile/keyboard-aware-flat-list/test/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +27 -25
  464. package/src/mobile/keyboard-aware-flat-list/test/use-scroll.native.js +71 -0
  465. package/src/mobile/keyboard-aware-flat-list/use-scroll-to-element.native.js +41 -0
  466. package/src/mobile/keyboard-aware-flat-list/{use-scroll-to-text-input.native.js → use-scroll-to-section.native.js} +22 -27
  467. package/src/mobile/keyboard-aware-flat-list/use-scroll.native.js +100 -0
  468. package/src/mobile/utils/get-px-from-css-unit.native.js +329 -0
  469. package/src/mobile/utils/test/get-px-from-css-unit.native.js +172 -0
  470. package/src/modal/README.md +0 -6
  471. package/src/modal/index.tsx +18 -16
  472. package/src/modal/test/index.tsx +90 -1
  473. package/src/navigation/menu/menu-title.tsx +1 -1
  474. package/src/navigator/navigator-provider/component.tsx +3 -4
  475. package/src/navigator/navigator-screen/component.tsx +15 -93
  476. package/src/navigator/styles.ts +71 -0
  477. package/src/navigator/test/index.tsx +0 -64
  478. package/src/notice/README.md +0 -6
  479. package/src/number-control/README.md +2 -2
  480. package/src/number-control/index.tsx +4 -8
  481. package/src/number-control/types.ts +1 -1
  482. package/src/palette-edit/index.tsx +15 -58
  483. package/src/palette-edit/test/index.tsx +1 -75
  484. package/src/panel/README.md +0 -6
  485. package/src/private-apis.native.js +13 -0
  486. package/src/private-apis.ts +12 -37
  487. package/src/radio-control/README.md +0 -6
  488. package/src/radio-control/index.tsx +4 -1
  489. package/src/radio-control/style.scss +29 -2
  490. package/src/radio-group/README.md +0 -6
  491. package/src/range-control/README.md +1 -9
  492. package/src/range-control/index.tsx +1 -1
  493. package/src/search-control/README.md +0 -6
  494. package/src/select-control/README.md +0 -6
  495. package/src/select-control/styles/select-control-styles.ts +10 -28
  496. package/src/slot-fill/index.tsx +5 -2
  497. package/src/slot-fill/types.ts +5 -0
  498. package/src/snackbar/README.md +0 -6
  499. package/src/snackbar/stories/index.story.tsx +7 -5
  500. package/src/snackbar/style.scss +4 -3
  501. package/src/snackbar/types.ts +2 -1
  502. package/src/spacer/README.md +0 -2
  503. package/src/tab-panel/README.md +0 -5
  504. package/src/tab-panel/test/index.tsx +39 -56
  505. package/src/tabs/styles.ts +7 -1
  506. package/src/tabs/tabpanel.tsx +7 -6
  507. package/src/tabs/test/index.tsx +56 -0
  508. package/src/text-control/README.md +0 -6
  509. package/src/textarea-control/README.md +0 -6
  510. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +12 -16
  511. package/src/toggle-group-control/test/index.tsx +58 -45
  512. package/src/toggle-group-control/toggle-group-control/component.tsx +5 -4
  513. package/src/toggle-group-control/toggle-group-control/styles.ts +13 -19
  514. package/src/toggle-group-control/toggle-group-control-option/README.md +1 -1
  515. package/src/toggle-group-control/toggle-group-control-option-base/README.md +1 -1
  516. package/src/toggle-group-control/toggle-group-control-option-base/styles.ts +3 -2
  517. package/src/toggle-group-control/toggle-group-control-option-icon/README.md +1 -1
  518. package/src/toolbar/toolbar/README.md +0 -6
  519. package/src/tools-panel/test/index.tsx +12 -20
  520. package/src/tools-panel/tools-panel/README.md +7 -0
  521. package/src/tools-panel/tools-panel/component.tsx +2 -0
  522. package/src/tools-panel/tools-panel-header/README.md +7 -0
  523. package/src/tools-panel/tools-panel-header/component.tsx +20 -13
  524. package/src/tools-panel/types.ts +9 -0
  525. package/src/tooltip/README.md +4 -0
  526. package/src/tooltip/index.tsx +48 -10
  527. package/src/tooltip/stories/index.story.tsx +18 -1
  528. package/src/tooltip/test/index.tsx +404 -254
  529. package/src/tooltip/types.ts +4 -0
  530. package/src/tree-grid/README.md +0 -4
  531. package/src/truncate/README.md +8 -0
  532. package/src/truncate/hook.ts +17 -10
  533. package/src/truncate/test/index.tsx +54 -27
  534. package/src/truncate/types.ts +4 -0
  535. package/src/unit-control/index.tsx +1 -1
  536. package/src/utils/strings.ts +30 -2
  537. package/src/utils/test/strings.js +96 -1
  538. package/tsconfig.tsbuildinfo +1 -1
  539. package/build/dropdown-menu-v2-ariakit/index.js +0 -256
  540. package/build/dropdown-menu-v2-ariakit/index.js.map +0 -1
  541. package/build/dropdown-menu-v2-ariakit/styles.js +0 -180
  542. package/build/dropdown-menu-v2-ariakit/styles.js.map +0 -1
  543. package/build/dropdown-menu-v2-ariakit/types.js +0 -6
  544. package/build/dropdown-menu-v2-ariakit/types.js.map +0 -1
  545. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js.map +0 -1
  546. package/build-module/dropdown-menu-v2-ariakit/index.js +0 -237
  547. package/build-module/dropdown-menu-v2-ariakit/index.js.map +0 -1
  548. package/build-module/dropdown-menu-v2-ariakit/styles.js +0 -165
  549. package/build-module/dropdown-menu-v2-ariakit/styles.js.map +0 -1
  550. package/build-module/dropdown-menu-v2-ariakit/types.js +0 -2
  551. package/build-module/dropdown-menu-v2-ariakit/types.js.map +0 -1
  552. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js.map +0 -1
  553. package/build-types/dropdown-menu-v2-ariakit/index.d.ts +0 -20
  554. package/build-types/dropdown-menu-v2-ariakit/index.d.ts.map +0 -1
  555. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts +0 -16
  556. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts.map +0 -1
  557. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts +0 -96
  558. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +0 -1
  559. package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts.map +0 -1
  560. package/build-types/dropdown-menu-v2-ariakit/types.d.ts +0 -168
  561. package/build-types/dropdown-menu-v2-ariakit/types.d.ts.map +0 -1
  562. package/src/dropdown-menu-v2-ariakit/README.md +0 -331
  563. package/src/dropdown-menu-v2-ariakit/index.tsx +0 -383
  564. package/src/dropdown-menu-v2-ariakit/stories/index.story.tsx +0 -617
  565. package/src/dropdown-menu-v2-ariakit/styles.ts +0 -345
  566. package/src/dropdown-menu-v2-ariakit/test/index.tsx +0 -1108
  567. package/src/dropdown-menu-v2-ariakit/types.ts +0 -179
  568. /package/build-types/{dropdown-menu-v2-ariakit → composite}/test/index.d.ts +0 -0
@@ -2,7 +2,7 @@
2
2
  * External dependencies
3
3
  */
4
4
  import { render, screen, waitFor } from '@testing-library/react';
5
- import userEvent from '@testing-library/user-event';
5
+ import { press, hover, click, sleep } from '@ariakit/test';
6
6
 
7
7
  /**
8
8
  * WordPress dependencies
@@ -15,321 +15,471 @@ import { shortcutAriaLabel } from '@wordpress/keycodes';
15
15
  import Button from '../../button';
16
16
  import Modal from '../../modal';
17
17
  import Tooltip, { TOOLTIP_DELAY } from '..';
18
- import cleanupTooltip from './utils/';
19
18
 
20
19
  const props = {
21
- children: <Button>Button</Button>,
20
+ children: <Button>Tooltip anchor</Button>,
22
21
  text: 'tooltip text',
23
22
  };
24
23
 
25
- describe( 'Tooltip', () => {
26
- it( 'should not render the tooltip if multiple children are passed', async () => {
27
- render(
28
- // expected TS error since Tooltip cannot have more than one child element
29
- // @ts-expect-error
30
- <Tooltip { ...props }>
31
- <Button>This is a button</Button>
32
- <Button>This is another button</Button>
33
- </Tooltip>
34
- );
35
-
36
- expect(
37
- screen.queryByRole( 'tooltip', { name: /tooltip text/i } )
38
- ).not.toBeInTheDocument();
39
- } );
24
+ const expectTooltipToBeVisible = () =>
25
+ expect(
26
+ screen.getByRole( 'tooltip', { name: 'tooltip text' } )
27
+ ).toBeVisible();
40
28
 
41
- it( 'should not render the tooltip if there is no focus', () => {
42
- render( <Tooltip { ...props } /> );
29
+ const expectTooltipToBeHidden = () =>
30
+ expect(
31
+ screen.queryByRole( 'tooltip', { name: 'tooltip text' } )
32
+ ).not.toBeInTheDocument();
43
33
 
44
- expect(
45
- screen.getByRole( 'button', { name: /Button/i } )
46
- ).toBeVisible();
34
+ const waitExpectTooltipToShow = async ( timeout = TOOLTIP_DELAY ) =>
35
+ await waitFor( expectTooltipToBeVisible, { timeout } );
47
36
 
48
- expect(
49
- screen.queryByRole( 'tooltip', { name: /tooltip text/i } )
50
- ).not.toBeInTheDocument();
51
- } );
37
+ const waitExpectTooltipToHide = async () =>
38
+ await waitFor( expectTooltipToBeHidden );
52
39
 
53
- it( 'should render the tooltip when focusing on the tooltip anchor via tab', async () => {
54
- const user = userEvent.setup();
40
+ const hoverOutside = async () => {
41
+ await hover( document.body );
42
+ await hover( document.body, { clientX: 10, clientY: 10 } );
43
+ };
55
44
 
56
- render( <Tooltip { ...props } /> );
45
+ describe( 'Tooltip', () => {
46
+ // Wait enough time to make sure that tooltips don't show immediately, ignoring
47
+ // the showTimeout delay. For more context, see:
48
+ // - https://github.com/WordPress/gutenberg/pull/57345#discussion_r1435167187
49
+ // - https://ariakit.org/reference/tooltip-provider#skiptimeout
50
+ afterEach( async () => {
51
+ await sleep( 300 );
52
+ } );
57
53
 
58
- await user.tab();
54
+ describe( 'basic behavior', () => {
55
+ it( 'should not render the tooltip if multiple children are passed', async () => {
56
+ render(
57
+ // @ts-expect-error Tooltip cannot have more than one child element
58
+ <Tooltip { ...props }>
59
+ <Button>First button</Button>
60
+ <Button>Second button</Button>
61
+ </Tooltip>
62
+ );
59
63
 
60
- expect(
61
- screen.getByRole( 'button', { name: /Button/i } )
62
- ).toHaveFocus();
64
+ expect(
65
+ screen.getByRole( 'button', { name: 'First button' } )
66
+ ).toBeVisible();
67
+ expect(
68
+ screen.getByRole( 'button', { name: 'Second button' } )
69
+ ).toBeVisible();
63
70
 
64
- expect(
65
- await screen.findByRole( 'tooltip', { name: /tooltip text/i } )
66
- ).toBeVisible();
71
+ await press.Tab();
67
72
 
68
- await cleanupTooltip( user );
69
- } );
73
+ expectTooltipToBeHidden();
74
+ } );
70
75
 
71
- it( 'should render the tooltip when the tooltip anchor is hovered', async () => {
72
- const user = userEvent.setup();
76
+ it( 'should associate the tooltip text with its anchor via the accessible description when visible', async () => {
77
+ render( <Tooltip { ...props } /> );
73
78
 
74
- render( <Tooltip { ...props } /> );
79
+ // The anchor can not be found by querying for its description,
80
+ // since that is present only when the tooltip is visible
81
+ expect(
82
+ screen.queryByRole( 'button', { description: 'tooltip text' } )
83
+ ).not.toBeInTheDocument();
84
+
85
+ // Hover the anchor. The tooltip shows and its text is used to describe
86
+ // the tooltip anchor
87
+ await hover(
88
+ screen.getByRole( 'button', {
89
+ name: 'Tooltip anchor',
90
+ } )
91
+ );
92
+ expect(
93
+ await screen.findByRole( 'button', {
94
+ description: 'tooltip text',
95
+ } )
96
+ ).toBeInTheDocument();
97
+
98
+ // Hover outside of the anchor, tooltip should hide
99
+ await hoverOutside();
100
+ await waitExpectTooltipToHide();
101
+ expect(
102
+ screen.queryByRole( 'button', { description: 'tooltip text' } )
103
+ ).not.toBeInTheDocument();
104
+ } );
105
+ } );
75
106
 
76
- await user.hover( screen.getByRole( 'button', { name: /Button/i } ) );
107
+ describe( 'keyboard focus', () => {
108
+ it( 'should not render the tooltip if there is no focus', () => {
109
+ render( <Tooltip { ...props } /> );
77
110
 
78
- expect(
79
- await screen.findByRole( 'tooltip', { name: /tooltip text/i } )
80
- ).toBeVisible();
111
+ expect(
112
+ screen.getByRole( 'button', { name: 'Tooltip anchor' } )
113
+ ).toBeVisible();
114
+
115
+ expectTooltipToBeHidden();
116
+ } );
117
+
118
+ it( 'should show the tooltip when focusing on the tooltip anchor and hide it the anchor loses focus', async () => {
119
+ render(
120
+ <>
121
+ <Tooltip { ...props } />
122
+ <button>Focus me</button>
123
+ </>
124
+ );
125
+
126
+ // Focus the anchor, tooltip should show
127
+ await press.Tab();
128
+ expect(
129
+ screen.getByRole( 'button', { name: 'Tooltip anchor' } )
130
+ ).toHaveFocus();
131
+ await waitExpectTooltipToShow();
81
132
 
82
- await cleanupTooltip( user );
133
+ // Focus the other button, tooltip should hide
134
+ await press.Tab();
135
+ expect(
136
+ screen.getByRole( 'button', { name: 'Focus me' } )
137
+ ).toHaveFocus();
138
+ await waitExpectTooltipToHide();
139
+ } );
140
+
141
+ it( 'should show tooltip when focussing a disabled (but focussable) anchor button', async () => {
142
+ render(
143
+ <>
144
+ <Tooltip { ...props }>
145
+ <Button disabled __experimentalIsFocusable>
146
+ Tooltip anchor
147
+ </Button>
148
+ </Tooltip>
149
+ <button>Focus me</button>
150
+ </>
151
+ );
152
+
153
+ const anchor = screen.getByRole( 'button', {
154
+ name: 'Tooltip anchor',
155
+ } );
156
+
157
+ expect( anchor ).toBeVisible();
158
+ expect( anchor ).toHaveAttribute( 'aria-disabled', 'true' );
159
+
160
+ // Focus anchor, tooltip should show
161
+ await press.Tab();
162
+ expect( anchor ).toHaveFocus();
163
+ await waitExpectTooltipToShow();
164
+
165
+ // Focus another button, tooltip should hide
166
+ await press.Tab();
167
+ expect(
168
+ screen.getByRole( 'button', {
169
+ name: 'Focus me',
170
+ } )
171
+ ).toHaveFocus();
172
+ await waitExpectTooltipToHide();
173
+ } );
83
174
  } );
84
175
 
85
- it( 'should not show tooltip on focus as result of mouse click', async () => {
86
- const user = userEvent.setup();
87
-
88
- render( <Tooltip { ...props } /> );
176
+ describe( 'mouse hover', () => {
177
+ it( 'should show the tooltip when the tooltip anchor is hovered and hide it when the cursor stops hovering the anchor', async () => {
178
+ render( <Tooltip { ...props } /> );
179
+
180
+ const anchor = screen.getByRole( 'button', {
181
+ name: 'Tooltip anchor',
182
+ } );
183
+
184
+ expect( anchor ).toBeVisible();
185
+
186
+ // Hover over the anchor, tooltip should show
187
+ await hover( anchor );
188
+ await waitExpectTooltipToShow();
189
+
190
+ // Hover outside of the anchor, tooltip should hide
191
+ await hoverOutside();
192
+ await waitExpectTooltipToHide();
193
+ } );
194
+
195
+ it( 'should show tooltip when hovering over a disabled (but focussable) anchor button', async () => {
196
+ render(
197
+ <>
198
+ <Tooltip { ...props }>
199
+ <Button disabled __experimentalIsFocusable>
200
+ Tooltip anchor
201
+ </Button>
202
+ </Tooltip>
203
+ <button>Focus me</button>
204
+ </>
205
+ );
206
+
207
+ const anchor = screen.getByRole( 'button', {
208
+ name: 'Tooltip anchor',
209
+ } );
210
+
211
+ expect( anchor ).toBeVisible();
212
+ expect( anchor ).toHaveAttribute( 'aria-disabled', 'true' );
213
+
214
+ // Hover over the anchor, tooltip should show
215
+ await hover( anchor );
216
+ await waitExpectTooltipToShow();
217
+
218
+ // Hover outside of the anchor, tooltip should hide
219
+ await hoverOutside();
220
+ await waitExpectTooltipToHide();
221
+ } );
222
+ } );
89
223
 
90
- await user.click( screen.getByRole( 'button', { name: /Button/i } ) );
224
+ describe( 'mouse click', () => {
225
+ it( 'should hide tooltip when the tooltip anchor is clicked', async () => {
226
+ render( <Tooltip { ...props } /> );
91
227
 
92
- expect(
93
- screen.queryByRole( 'tooltip', { name: /tooltip text/i } )
94
- ).not.toBeInTheDocument();
228
+ const anchor = screen.getByRole( 'button', {
229
+ name: 'Tooltip anchor',
230
+ } );
95
231
 
96
- await cleanupTooltip( user );
97
- } );
232
+ expect( anchor ).toBeVisible();
98
233
 
99
- it( 'should respect custom delay prop when showing tooltip', async () => {
100
- const user = userEvent.setup();
101
- const ADDITIONAL_DELAY = 100;
234
+ // Hover over the anchor, tooltip should show
235
+ await hover( anchor );
236
+ await waitExpectTooltipToShow();
102
237
 
103
- render(
104
- <Tooltip { ...props } delay={ TOOLTIP_DELAY + ADDITIONAL_DELAY } />
105
- );
238
+ // Click the anchor, tooltip should hide
239
+ await click( anchor );
240
+ await waitExpectTooltipToHide();
241
+ } );
106
242
 
107
- await user.hover( screen.getByRole( 'button', { name: /Button/i } ) );
243
+ it( 'should not hide tooltip when the tooltip anchor is clicked and the `hideOnClick` prop is `false', async () => {
244
+ render(
245
+ <>
246
+ <Tooltip { ...props } hideOnClick={ false } />
247
+ <button>Click me</button>
248
+ </>
249
+ );
108
250
 
109
- // Advance time by default delay
110
- await new Promise( ( resolve ) =>
111
- setTimeout( resolve, TOOLTIP_DELAY )
112
- );
251
+ const anchor = screen.getByRole( 'button', {
252
+ name: 'Tooltip anchor',
253
+ } );
113
254
 
114
- // Tooltip hasn't appeared yet
115
- expect(
116
- screen.queryByRole( 'tooltip', { name: /tooltip text/i } )
117
- ).not.toBeInTheDocument();
255
+ expect( anchor ).toBeVisible();
118
256
 
119
- // wait for additional delay for tooltip to appear
120
- await waitFor(
121
- () =>
122
- new Promise( ( resolve ) =>
123
- setTimeout( resolve, ADDITIONAL_DELAY )
124
- )
125
- );
257
+ // Hover over the anchor, tooltip should show
258
+ await hover( anchor );
259
+ await waitExpectTooltipToShow();
126
260
 
127
- expect(
128
- screen.getByRole( 'tooltip', { name: /tooltip text/i } )
129
- ).toBeVisible();
261
+ // Click the anchor, tooltip should not hide
262
+ await click( anchor );
263
+ await waitExpectTooltipToShow();
130
264
 
131
- await cleanupTooltip( user );
265
+ // Click another button, tooltip should hide
266
+ await click( screen.getByRole( 'button', { name: 'Click me' } ) );
267
+ await waitExpectTooltipToHide();
268
+ } );
132
269
  } );
133
270
 
134
- it( 'should show tooltip when an element is disabled', async () => {
135
- const user = userEvent.setup();
271
+ describe( 'delay', () => {
272
+ it( 'should respect custom delay prop when showing tooltip', async () => {
273
+ const ADDITIONAL_DELAY = 100;
136
274
 
137
- render(
138
- <Tooltip { ...props }>
139
- <Button aria-disabled>Button</Button>
140
- </Tooltip>
141
- );
275
+ render(
276
+ <Tooltip
277
+ { ...props }
278
+ delay={ TOOLTIP_DELAY + ADDITIONAL_DELAY }
279
+ />
280
+ );
142
281
 
143
- const button = screen.getByRole( 'button', { name: /Button/i } );
282
+ const anchor = screen.getByRole( 'button', {
283
+ name: 'Tooltip anchor',
284
+ } );
285
+ expect( anchor ).toBeVisible();
144
286
 
145
- expect( button ).toBeVisible();
146
- expect( button ).toHaveAttribute( 'aria-disabled' );
287
+ // Hover over the anchor
288
+ await hover( anchor );
289
+ expectTooltipToBeHidden();
147
290
 
148
- await user.hover( button );
291
+ // Advance time by default delay
292
+ await sleep( TOOLTIP_DELAY );
149
293
 
150
- expect(
151
- await screen.findByRole( 'tooltip', { name: /tooltip text/i } )
152
- ).toBeVisible();
294
+ // Tooltip hasn't appeared yet
295
+ expectTooltipToBeHidden();
153
296
 
154
- await cleanupTooltip( user );
155
- } );
297
+ // Wait for additional delay for tooltip to appear
298
+ await sleep( ADDITIONAL_DELAY );
299
+ await waitExpectTooltipToShow();
300
+
301
+ // Hover outside of the anchor, tooltip should hide
302
+ await hoverOutside();
303
+ await waitExpectTooltipToHide();
304
+ } );
156
305
 
157
- it( 'should not show tooltip if the mouse leaves the tooltip anchor before set delay', async () => {
158
- const user = userEvent.setup();
159
- const onMouseEnterMock = jest.fn();
160
- const onMouseLeaveMock = jest.fn();
161
- const MOUSE_LEAVE_DELAY = TOOLTIP_DELAY - 200;
306
+ it( 'should not show tooltip if the mouse leaves the tooltip anchor before set delay', async () => {
307
+ const onMouseEnterMock = jest.fn();
308
+ const onMouseLeaveMock = jest.fn();
309
+ const HOVER_OUTSIDE_ANTICIPATION = 200;
162
310
 
163
- render(
164
- <>
311
+ render(
165
312
  <Tooltip { ...props }>
166
313
  <Button
167
314
  onMouseEnter={ onMouseEnterMock }
168
315
  onMouseLeave={ onMouseLeaveMock }
169
316
  >
170
- Button 1
317
+ Tooltip anchor
171
318
  </Button>
172
319
  </Tooltip>
173
- <Button>Button 2</Button>
174
- </>
175
- );
176
-
177
- await user.hover(
178
- screen.getByRole( 'button', {
179
- name: 'Button 1',
180
- } )
181
- );
182
-
183
- // Tooltip hasn't appeared yet
184
- expect(
185
- screen.queryByRole( 'tooltip', { name: /tooltip text/i } )
186
- ).not.toBeInTheDocument();
187
- expect( onMouseEnterMock ).toHaveBeenCalledTimes( 1 );
188
-
189
- // Advance time by MOUSE_LEAVE_DELAY time
190
- await new Promise( ( resolve ) =>
191
- setTimeout( resolve, MOUSE_LEAVE_DELAY )
192
- );
193
-
194
- expect(
195
- screen.queryByRole( 'tooltip', { name: /tooltip text/i } )
196
- ).not.toBeInTheDocument();
197
-
198
- // Hover the other button, meaning that the mouse will leave the tooltip anchor
199
- await user.hover(
200
- screen.getByRole( 'button', {
201
- name: 'Button 2',
202
- } )
203
- );
204
-
205
- // Tooltip still hasn't appeared yet
206
- expect(
207
- screen.queryByRole( 'tooltip', { name: /tooltip text/i } )
208
- ).not.toBeInTheDocument();
209
- expect( onMouseEnterMock ).toHaveBeenCalledTimes( 1 );
210
- expect( onMouseLeaveMock ).toHaveBeenCalledTimes( 1 );
211
-
212
- // Advance time again, so that we reach the full TOOLTIP_DELAY time
213
- await new Promise( ( resolve ) =>
214
- setTimeout( resolve, TOOLTIP_DELAY )
215
- );
216
-
217
- // Tooltip won't show, since the mouse has left the tooltip anchor
218
- expect(
219
- screen.queryByRole( 'tooltip', { name: /tooltip text/i } )
220
- ).not.toBeInTheDocument();
221
-
222
- await cleanupTooltip( user );
223
- } );
224
-
225
- it( 'should render the shortcut display text when a string is passed as the shortcut', async () => {
226
- const user = userEvent.setup();
227
-
228
- render( <Tooltip { ...props } shortcut="shortcut text" /> );
320
+ );
229
321
 
230
- await user.hover( screen.getByRole( 'button', { name: /Button/i } ) );
231
-
232
- await waitFor( () =>
233
- expect( screen.getByText( 'shortcut text' ) ).toBeVisible()
234
- );
235
-
236
- await cleanupTooltip( user );
237
- } );
322
+ const anchor = screen.getByRole( 'button', {
323
+ name: 'Tooltip anchor',
324
+ } );
325
+ expect( anchor ).toBeVisible();
238
326
 
239
- it( 'should render the keyboard shortcut display text and aria-label when an object is passed as the shortcut', async () => {
240
- const user = userEvent.setup();
327
+ // Hover over the anchor, tooltip hasn't appeared yet
328
+ await hover( anchor );
329
+ expect( onMouseEnterMock ).toHaveBeenCalledTimes( 1 );
330
+ expectTooltipToBeHidden();
241
331
 
242
- render(
243
- <Tooltip
244
- { ...props }
245
- shortcut={ {
246
- display: '⇧⌘,',
247
- ariaLabel: shortcutAriaLabel.primaryShift( ',' ),
248
- } }
249
- />
250
- );
332
+ // Advance time, tooltip hasn't appeared yet because TOOLTIP_DELAY time
333
+ // hasn't passed yet
334
+ await sleep( TOOLTIP_DELAY - HOVER_OUTSIDE_ANTICIPATION );
335
+ expectTooltipToBeHidden();
251
336
 
252
- await user.hover( screen.getByRole( 'button', { name: /Button/i } ) );
337
+ // Hover outside of the anchor, tooltip still hasn't appeared yet
338
+ await hoverOutside();
339
+ expectTooltipToBeHidden();
253
340
 
254
- await waitFor( () =>
255
- expect( screen.getByText( '⇧⌘,' ) ).toBeVisible()
256
- );
341
+ expect( onMouseEnterMock ).toHaveBeenCalledTimes( 1 );
342
+ expect( onMouseLeaveMock ).toHaveBeenCalledTimes( 1 );
257
343
 
258
- expect( screen.getByText( '⇧⌘,' ) ).toHaveAttribute(
259
- 'aria-label',
260
- 'Control + Shift + Comma'
261
- );
344
+ // Advance time again, so that we reach the full TOOLTIP_DELAY time
345
+ await sleep( HOVER_OUTSIDE_ANTICIPATION );
262
346
 
263
- await cleanupTooltip( user );
347
+ // Tooltip won't show, since the mouse has left the tooltip anchor
348
+ expectTooltipToBeHidden();
349
+ } );
264
350
  } );
265
351
 
266
- it( 'esc should close modal even when tooltip is visible', async () => {
267
- const user = userEvent.setup();
268
- const onRequestClose = jest.fn();
269
- render(
270
- <Modal onRequestClose={ onRequestClose }>
271
- <p>Modal content</p>
272
- </Modal>
273
- );
274
-
275
- expect(
276
- screen.queryByRole( 'tooltip', { name: /close/i } )
277
- ).not.toBeInTheDocument();
278
-
279
- await user.hover(
280
- screen.getByRole( 'button', {
281
- name: /Close/i,
282
- } )
283
- );
284
-
285
- await waitFor( () =>
352
+ describe( 'shortcut', () => {
353
+ it( 'should show the shortcut in the tooltip when a string is passed as the shortcut', async () => {
354
+ render( <Tooltip { ...props } shortcut="shortcut text" /> );
355
+
356
+ // Hover over the anchor, tooltip should show
357
+ await hover(
358
+ screen.getByRole( 'button', { name: 'Tooltip anchor' } )
359
+ );
360
+ await waitFor( () =>
361
+ expect(
362
+ screen.getByRole( 'tooltip', {
363
+ name: 'tooltip text shortcut text',
364
+ } )
365
+ ).toBeVisible()
366
+ );
367
+
368
+ // Hover outside of the anchor, tooltip should hide
369
+ await hoverOutside();
370
+ await waitExpectTooltipToHide();
371
+ } );
372
+
373
+ it( 'should show the shortcut in the tooltip when an object is passed as the shortcut', async () => {
374
+ render(
375
+ <Tooltip
376
+ { ...props }
377
+ shortcut={ {
378
+ display: '⇧⌘,',
379
+ ariaLabel: shortcutAriaLabel.primaryShift( ',' ),
380
+ } }
381
+ />
382
+ );
383
+
384
+ // Hover over the anchor, tooltip should show
385
+ await hover(
386
+ screen.getByRole( 'button', { name: 'Tooltip anchor' } )
387
+ );
388
+ await waitFor( () =>
389
+ expect(
390
+ screen.getByRole( 'tooltip', {
391
+ name: 'tooltip text Control + Shift + Comma',
392
+ } )
393
+ ).toBeVisible()
394
+ );
286
395
  expect(
287
- screen.getByRole( 'tooltip', { name: /close/i } )
288
- ).toBeVisible()
289
- );
290
-
291
- await user.keyboard( '[Escape]' );
292
-
293
- expect( onRequestClose ).toHaveBeenCalled();
294
-
295
- await cleanupTooltip( user );
396
+ screen.getByRole( 'tooltip', {
397
+ name: 'tooltip text Control + Shift + Comma',
398
+ } )
399
+ ).toHaveTextContent( /⇧⌘,/i );
400
+
401
+ // Hover outside of the anchor, tooltip should hide
402
+ await hoverOutside();
403
+ await waitExpectTooltipToHide();
404
+ } );
296
405
  } );
297
406
 
298
- it( 'should associate the tooltip text with its anchor via the accessible description when visible', async () => {
299
- const user = userEvent.setup();
300
-
301
- render( <Tooltip { ...props } /> );
302
-
303
- await user.hover(
304
- screen.getByRole( 'button', {
305
- name: /Button/i,
306
- } )
307
- );
308
-
309
- expect(
310
- await screen.findByRole( 'button', { description: 'tooltip text' } )
311
- ).toBeInTheDocument();
407
+ describe( 'event propagation', () => {
408
+ it( 'should close the parent dialog component when pressing the Escape key while the tooltip is visible', async () => {
409
+ const onRequestClose = jest.fn();
410
+ render(
411
+ <Modal onRequestClose={ onRequestClose }>
412
+ <p>Modal content</p>
413
+ </Modal>
414
+ );
415
+
416
+ expectTooltipToBeHidden();
417
+
418
+ const closeButton = screen.getByRole( 'button', {
419
+ name: /close/i,
420
+ } );
421
+
422
+ // Hover over the anchor, tooltip should show
423
+ await hover( closeButton );
424
+ await waitFor( () =>
425
+ expect(
426
+ screen.getByRole( 'tooltip', { name: /close/i } )
427
+ ).toBeVisible()
428
+ );
429
+
430
+ // Press the Escape key, Modal should request to be closed
431
+ await press.Escape();
432
+ expect( onRequestClose ).toHaveBeenCalled();
433
+
434
+ // Hover outside of the anchor, tooltip should hide
435
+ await hoverOutside();
436
+ await waitExpectTooltipToHide();
437
+ } );
312
438
  } );
313
439
 
314
- it( 'should not hide tooltip when the anchor is clicked if hideOnClick is false', async () => {
315
- const user = userEvent.setup();
316
-
317
- render( <Tooltip { ...props } hideOnClick={ false } /> );
318
-
319
- const button = screen.getByRole( 'button', { name: /Button/i } );
320
-
321
- await user.hover( button );
322
-
323
- expect(
324
- await screen.findByRole( 'tooltip', { name: /tooltip text/i } )
325
- ).toBeVisible();
326
-
327
- await user.click( button );
328
-
329
- expect(
330
- screen.getByRole( 'tooltip', { name: /tooltip text/i } )
331
- ).toBeVisible();
332
-
333
- await cleanupTooltip( user );
440
+ describe( 'nested', () => {
441
+ it( 'should render the outer tooltip and ignore nested tooltips', async () => {
442
+ render(
443
+ <Tooltip text="Outer tooltip">
444
+ <Tooltip text="Middle tooltip">
445
+ <Tooltip text="Inner tooltip">
446
+ <Button>Tooltip anchor</Button>
447
+ </Tooltip>
448
+ </Tooltip>
449
+ </Tooltip>
450
+ );
451
+
452
+ // Hover the anchor. Only the outer tooltip should show.
453
+ await hover(
454
+ screen.getByRole( 'button', {
455
+ name: 'Tooltip anchor',
456
+ } )
457
+ );
458
+
459
+ await waitFor( () =>
460
+ expect(
461
+ screen.getByRole( 'tooltip', { name: 'Outer tooltip' } )
462
+ ).toBeVisible()
463
+ );
464
+ expect(
465
+ screen.queryByRole( 'tooltip', { name: 'Middle tooltip' } )
466
+ ).not.toBeInTheDocument();
467
+ expect(
468
+ screen.queryByRole( 'tooltip', { name: 'Inner tooltip' } )
469
+ ).not.toBeInTheDocument();
470
+ expect(
471
+ screen.getByRole( 'button', {
472
+ description: 'Outer tooltip',
473
+ } )
474
+ ).toBeVisible();
475
+
476
+ // Hover outside of the anchor, tooltip should hide
477
+ await hoverOutside();
478
+ await waitFor( () =>
479
+ expect(
480
+ screen.queryByRole( 'tooltip', { name: 'Outer tooltip' } )
481
+ ).not.toBeInTheDocument()
482
+ );
483
+ } );
334
484
  } );
335
485
  } );