@wordpress/components 28.8.4 → 28.9.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 (329) hide show
  1. package/CHANGELOG.md +26 -3
  2. package/build/autocomplete/index.js +4 -1
  3. package/build/autocomplete/index.js.map +1 -1
  4. package/build/border-box-control/border-box-control/component.js +3 -14
  5. package/build/border-box-control/border-box-control/component.js.map +1 -1
  6. package/build/border-control/border-control/component.js +1 -2
  7. package/build/border-control/border-control/component.js.map +1 -1
  8. package/build/border-control/border-control-dropdown/component.js +2 -14
  9. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  10. package/build/border-control/styles.js +13 -13
  11. package/build/border-control/styles.js.map +1 -1
  12. package/build/border-control/types.js.map +1 -1
  13. package/build/box-control/index.js +4 -4
  14. package/build/box-control/index.js.map +1 -1
  15. package/build/box-control/types.js.map +1 -1
  16. package/build/composite/group-label.js +7 -1
  17. package/build/composite/group-label.js.map +1 -1
  18. package/build/composite/group.js +7 -1
  19. package/build/composite/group.js.map +1 -1
  20. package/build/composite/hover.js +8 -2
  21. package/build/composite/hover.js.map +1 -1
  22. package/build/composite/index.js +5 -1
  23. package/build/composite/index.js.map +1 -1
  24. package/build/composite/item.js +16 -1
  25. package/build/composite/item.js.map +1 -1
  26. package/build/composite/row.js +7 -1
  27. package/build/composite/row.js.map +1 -1
  28. package/build/composite/typeahead.js +8 -2
  29. package/build/composite/typeahead.js.map +1 -1
  30. package/build/date-time/date/index.js +4 -2
  31. package/build/date-time/date/index.js.map +1 -1
  32. package/build/index.js +36 -5
  33. package/build/index.js.map +1 -1
  34. package/build/navigator/index.js +128 -32
  35. package/build/navigator/index.js.map +1 -1
  36. package/build/navigator/legacy.js +179 -0
  37. package/build/navigator/legacy.js.map +1 -0
  38. package/build/navigator/{navigator-provider → navigator}/component.js +5 -40
  39. package/build/navigator/navigator/component.js.map +1 -0
  40. package/build/navigator/navigator-back-button/component.js +2 -38
  41. package/build/navigator/navigator-back-button/component.js.map +1 -1
  42. package/build/navigator/navigator-back-button/hook.js +1 -1
  43. package/build/navigator/navigator-back-button/hook.js.map +1 -1
  44. package/build/navigator/navigator-button/component.js +2 -37
  45. package/build/navigator/navigator-button/component.js.map +1 -1
  46. package/build/navigator/navigator-button/hook.js +1 -1
  47. package/build/navigator/navigator-button/hook.js.map +1 -1
  48. package/build/navigator/navigator-screen/component.js +40 -62
  49. package/build/navigator/navigator-screen/component.js.map +1 -1
  50. package/build/navigator/navigator-screen/use-screen-animate-presence.js +114 -0
  51. package/build/navigator/navigator-screen/use-screen-animate-presence.js.map +1 -0
  52. package/build/navigator/navigator-to-parent-button/component.js +3 -7
  53. package/build/navigator/navigator-to-parent-button/component.js.map +1 -1
  54. package/build/navigator/styles.js +78 -35
  55. package/build/navigator/styles.js.map +1 -1
  56. package/build/navigator/types.js.map +1 -1
  57. package/build/navigator/use-navigator.js +4 -1
  58. package/build/navigator/use-navigator.js.map +1 -1
  59. package/build/search-control/index.js +5 -2
  60. package/build/search-control/index.js.map +1 -1
  61. package/build/tabs/styles.js +3 -3
  62. package/build/tabs/styles.js.map +1 -1
  63. package/build/tabs/tablist.js +61 -28
  64. package/build/tabs/tablist.js.map +1 -1
  65. package/build/tabs/use-track-overflow.js +73 -0
  66. package/build/tabs/use-track-overflow.js.map +1 -0
  67. package/build/toggle-group-control/toggle-group-control/as-button-group.js +4 -2
  68. package/build/toggle-group-control/toggle-group-control/as-button-group.js.map +1 -1
  69. package/build/toggle-group-control/toggle-group-control/as-radio-group.js +6 -2
  70. package/build/toggle-group-control/toggle-group-control/as-radio-group.js.map +1 -1
  71. package/build/toggle-group-control/toggle-group-control/component.js +73 -8
  72. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  73. package/build/toggle-group-control/toggle-group-control/styles.js +7 -7
  74. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  75. package/build/toggle-group-control/toggle-group-control-option-base/component.js +10 -19
  76. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  77. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +8 -9
  78. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  79. package/build/toggle-group-control/types.js.map +1 -1
  80. package/build/utils/element-rect.js +22 -13
  81. package/build/utils/element-rect.js.map +1 -1
  82. package/build/utils/hooks/use-on-value-update.js +3 -7
  83. package/build/utils/hooks/use-on-value-update.js.map +1 -1
  84. package/build-module/autocomplete/index.js +4 -1
  85. package/build-module/autocomplete/index.js.map +1 -1
  86. package/build-module/border-box-control/border-box-control/component.js +3 -14
  87. package/build-module/border-box-control/border-box-control/component.js.map +1 -1
  88. package/build-module/border-control/border-control/component.js +1 -2
  89. package/build-module/border-control/border-control/component.js.map +1 -1
  90. package/build-module/border-control/border-control-dropdown/component.js +2 -14
  91. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  92. package/build-module/border-control/styles.js +13 -13
  93. package/build-module/border-control/styles.js.map +1 -1
  94. package/build-module/border-control/types.js.map +1 -1
  95. package/build-module/box-control/index.js +4 -4
  96. package/build-module/box-control/index.js.map +1 -1
  97. package/build-module/box-control/types.js.map +1 -1
  98. package/build-module/composite/group-label.js +7 -1
  99. package/build-module/composite/group-label.js.map +1 -1
  100. package/build-module/composite/group.js +7 -1
  101. package/build-module/composite/group.js.map +1 -1
  102. package/build-module/composite/hover.js +8 -2
  103. package/build-module/composite/hover.js.map +1 -1
  104. package/build-module/composite/index.js +5 -1
  105. package/build-module/composite/index.js.map +1 -1
  106. package/build-module/composite/item.js +16 -1
  107. package/build-module/composite/item.js.map +1 -1
  108. package/build-module/composite/row.js +7 -1
  109. package/build-module/composite/row.js.map +1 -1
  110. package/build-module/composite/typeahead.js +8 -2
  111. package/build-module/composite/typeahead.js.map +1 -1
  112. package/build-module/date-time/date/index.js +4 -2
  113. package/build-module/date-time/date/index.js.map +1 -1
  114. package/build-module/index.js +14 -4
  115. package/build-module/index.js.map +1 -1
  116. package/build-module/navigator/index.js +130 -5
  117. package/build-module/navigator/index.js.map +1 -1
  118. package/build-module/navigator/legacy.js +167 -0
  119. package/build-module/navigator/legacy.js.map +1 -0
  120. package/build-module/navigator/{navigator-provider → navigator}/component.js +4 -39
  121. package/build-module/navigator/navigator/component.js.map +1 -0
  122. package/build-module/navigator/navigator-back-button/component.js +1 -37
  123. package/build-module/navigator/navigator-back-button/component.js.map +1 -1
  124. package/build-module/navigator/navigator-back-button/hook.js +1 -1
  125. package/build-module/navigator/navigator-back-button/hook.js.map +1 -1
  126. package/build-module/navigator/navigator-button/component.js +1 -36
  127. package/build-module/navigator/navigator-button/component.js.map +1 -1
  128. package/build-module/navigator/navigator-button/hook.js +1 -1
  129. package/build-module/navigator/navigator-button/hook.js.map +1 -1
  130. package/build-module/navigator/navigator-screen/component.js +39 -61
  131. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  132. package/build-module/navigator/navigator-screen/use-screen-animate-presence.js +106 -0
  133. package/build-module/navigator/navigator-screen/use-screen-animate-presence.js.map +1 -0
  134. package/build-module/navigator/navigator-to-parent-button/component.js +2 -6
  135. package/build-module/navigator/navigator-to-parent-button/component.js.map +1 -1
  136. package/build-module/navigator/styles.js +77 -33
  137. package/build-module/navigator/styles.js.map +1 -1
  138. package/build-module/navigator/types.js.map +1 -1
  139. package/build-module/navigator/use-navigator.js +4 -1
  140. package/build-module/navigator/use-navigator.js.map +1 -1
  141. package/build-module/search-control/index.js +5 -2
  142. package/build-module/search-control/index.js.map +1 -1
  143. package/build-module/tabs/styles.js +3 -3
  144. package/build-module/tabs/styles.js.map +1 -1
  145. package/build-module/tabs/tablist.js +62 -29
  146. package/build-module/tabs/tablist.js.map +1 -1
  147. package/build-module/tabs/use-track-overflow.js +67 -0
  148. package/build-module/tabs/use-track-overflow.js.map +1 -0
  149. package/build-module/toggle-group-control/toggle-group-control/as-button-group.js +4 -2
  150. package/build-module/toggle-group-control/toggle-group-control/as-button-group.js.map +1 -1
  151. package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js +6 -2
  152. package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js.map +1 -1
  153. package/build-module/toggle-group-control/toggle-group-control/component.js +76 -10
  154. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  155. package/build-module/toggle-group-control/toggle-group-control/styles.js +7 -7
  156. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  157. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +12 -22
  158. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  159. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +7 -8
  160. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  161. package/build-module/toggle-group-control/types.js.map +1 -1
  162. package/build-module/utils/element-rect.js +22 -12
  163. package/build-module/utils/element-rect.js.map +1 -1
  164. package/build-module/utils/hooks/use-on-value-update.js +3 -6
  165. package/build-module/utils/hooks/use-on-value-update.js.map +1 -1
  166. package/build-style/style-rtl.css +26 -13
  167. package/build-style/style.css +26 -13
  168. package/build-types/autocomplete/index.d.ts.map +1 -1
  169. package/build-types/border-box-control/border-box-control/component.d.ts +5 -15
  170. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
  171. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts +2 -1
  172. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -1
  173. package/build-types/border-box-control/stories/index.story.d.ts +3 -2
  174. package/build-types/border-box-control/stories/index.story.d.ts.map +1 -1
  175. package/build-types/border-control/border-control/component.d.ts +3 -2
  176. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  177. package/build-types/border-control/border-control-dropdown/component.d.ts +2 -1
  178. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  179. package/build-types/border-control/border-control-style-picker/component.d.ts.map +1 -1
  180. package/build-types/border-control/stories/index.story.d.ts +15 -30
  181. package/build-types/border-control/stories/index.story.d.ts.map +1 -1
  182. package/build-types/border-control/styles.d.ts.map +1 -1
  183. package/build-types/border-control/types.d.ts +12 -7
  184. package/build-types/border-control/types.d.ts.map +1 -1
  185. package/build-types/box-control/index.d.ts +4 -4
  186. package/build-types/box-control/stories/index.story.d.ts.map +1 -1
  187. package/build-types/box-control/types.d.ts +3 -3
  188. package/build-types/composite/group-label.d.ts.map +1 -1
  189. package/build-types/composite/index.d.ts.map +1 -1
  190. package/build-types/composite/item.d.ts.map +1 -1
  191. package/build-types/composite/stories/index.story.d.ts +22 -0
  192. package/build-types/composite/stories/index.story.d.ts.map +1 -1
  193. package/build-types/composite/test/index.d.ts +2 -0
  194. package/build-types/composite/test/index.d.ts.map +1 -0
  195. package/build-types/date-time/date/index.d.ts.map +1 -1
  196. package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
  197. package/build-types/dropdown-menu/stories/index.story.d.ts.map +1 -1
  198. package/build-types/index.d.ts +23 -4
  199. package/build-types/index.d.ts.map +1 -1
  200. package/build-types/navigator/index.d.ts +171 -5
  201. package/build-types/navigator/index.d.ts.map +1 -1
  202. package/build-types/navigator/legacy.d.ts +226 -0
  203. package/build-types/navigator/legacy.d.ts.map +1 -0
  204. package/build-types/navigator/navigator/component.d.ts +3 -0
  205. package/build-types/navigator/navigator/component.d.ts.map +1 -0
  206. package/build-types/navigator/navigator-back-button/component.d.ts +0 -35
  207. package/build-types/navigator/navigator-back-button/component.d.ts.map +1 -1
  208. package/build-types/navigator/navigator-button/component.d.ts +0 -34
  209. package/build-types/navigator/navigator-button/component.d.ts.map +1 -1
  210. package/build-types/navigator/navigator-screen/component.d.ts +0 -35
  211. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  212. package/build-types/navigator/navigator-screen/use-screen-animate-presence.d.ts +16 -0
  213. package/build-types/navigator/navigator-screen/use-screen-animate-presence.d.ts.map +1 -0
  214. package/build-types/navigator/navigator-to-parent-button/component.d.ts +0 -4
  215. package/build-types/navigator/navigator-to-parent-button/component.d.ts.map +1 -1
  216. package/build-types/navigator/stories/index.story.d.ts +5 -5
  217. package/build-types/navigator/stories/index.story.d.ts.map +1 -1
  218. package/build-types/navigator/styles.d.ts +20 -7
  219. package/build-types/navigator/styles.d.ts.map +1 -1
  220. package/build-types/navigator/types.d.ts +19 -1
  221. package/build-types/navigator/types.d.ts.map +1 -1
  222. package/build-types/navigator/use-navigator.d.ts +4 -1
  223. package/build-types/navigator/use-navigator.d.ts.map +1 -1
  224. package/build-types/select-control/stories/index.story.d.ts +7 -0
  225. package/build-types/select-control/stories/index.story.d.ts.map +1 -1
  226. package/build-types/tabs/stories/index.story.d.ts +2 -1
  227. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  228. package/build-types/tabs/styles.d.ts.map +1 -1
  229. package/build-types/tabs/tablist.d.ts.map +1 -1
  230. package/build-types/tabs/use-track-overflow.d.ts +17 -0
  231. package/build-types/tabs/use-track-overflow.d.ts.map +1 -0
  232. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +2 -2
  233. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts.map +1 -1
  234. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +2 -2
  235. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts.map +1 -1
  236. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  237. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  238. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  239. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts +0 -1
  240. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -1
  241. package/build-types/toggle-group-control/types.d.ts +2 -1
  242. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  243. package/build-types/utils/element-rect.d.ts +8 -0
  244. package/build-types/utils/element-rect.d.ts.map +1 -1
  245. package/build-types/utils/hooks/use-on-value-update.d.ts.map +1 -1
  246. package/package.json +19 -19
  247. package/src/autocomplete/index.tsx +4 -1
  248. package/src/border-box-control/border-box-control/README.md +22 -26
  249. package/src/border-box-control/border-box-control/component.tsx +3 -14
  250. package/src/border-box-control/stories/index.story.tsx +2 -1
  251. package/src/border-control/border-control/README.md +26 -36
  252. package/src/border-control/border-control/component.tsx +1 -2
  253. package/src/border-control/border-control-dropdown/component.tsx +1 -15
  254. package/src/border-control/stories/index.story.tsx +4 -10
  255. package/src/border-control/styles.ts +0 -1
  256. package/src/border-control/test/index.js +2 -15
  257. package/src/border-control/types.ts +12 -7
  258. package/src/box-control/README.md +9 -12
  259. package/src/box-control/index.tsx +4 -4
  260. package/src/box-control/stories/index.story.tsx +1 -1
  261. package/src/box-control/types.ts +3 -3
  262. package/src/composite/group-label.tsx +7 -5
  263. package/src/composite/group.tsx +7 -7
  264. package/src/composite/hover.tsx +7 -7
  265. package/src/composite/index.tsx +6 -1
  266. package/src/composite/item.tsx +19 -1
  267. package/src/composite/legacy/test/index.tsx +22 -21
  268. package/src/composite/row.tsx +7 -7
  269. package/src/composite/stories/index.story.tsx +42 -0
  270. package/src/composite/test/index.tsx +123 -0
  271. package/src/composite/typeahead.tsx +7 -7
  272. package/src/date-time/date/index.tsx +2 -0
  273. package/src/dropdown/stories/index.story.tsx +1 -0
  274. package/src/dropdown/style.scss +10 -13
  275. package/src/dropdown-menu/stories/index.story.tsx +3 -0
  276. package/src/index.ts +19 -1
  277. package/src/menu-group/style.scss +4 -1
  278. package/src/menu-items-choice/style.scss +2 -0
  279. package/src/navigator/README.md +176 -0
  280. package/src/navigator/index.tsx +131 -0
  281. package/src/navigator/legacy.ts +169 -0
  282. package/src/navigator/{navigator-provider → navigator}/component.tsx +6 -44
  283. package/src/navigator/navigator-back-button/component.tsx +1 -37
  284. package/src/navigator/navigator-back-button/hook.ts +1 -1
  285. package/src/navigator/navigator-button/component.tsx +1 -36
  286. package/src/navigator/navigator-button/hook.ts +1 -1
  287. package/src/navigator/navigator-screen/component.tsx +48 -76
  288. package/src/navigator/navigator-screen/use-screen-animate-presence.ts +177 -0
  289. package/src/navigator/navigator-to-parent-button/component.tsx +2 -7
  290. package/src/navigator/stories/index.story.tsx +55 -54
  291. package/src/navigator/styles.ts +112 -41
  292. package/src/navigator/test/index.tsx +47 -47
  293. package/src/navigator/types.ts +19 -1
  294. package/src/navigator/use-navigator.ts +4 -1
  295. package/src/search-control/index.tsx +2 -2
  296. package/src/select-control/stories/index.story.tsx +14 -1
  297. package/src/tabs/stories/index.story.tsx +106 -0
  298. package/src/tabs/styles.ts +54 -20
  299. package/src/tabs/tablist.tsx +60 -26
  300. package/src/tabs/use-track-overflow.ts +76 -0
  301. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +208 -44
  302. package/src/toggle-group-control/toggle-group-control/as-button-group.tsx +18 -10
  303. package/src/toggle-group-control/toggle-group-control/as-radio-group.tsx +19 -9
  304. package/src/toggle-group-control/toggle-group-control/component.tsx +114 -6
  305. package/src/toggle-group-control/toggle-group-control/styles.ts +41 -0
  306. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +10 -27
  307. package/src/toggle-group-control/toggle-group-control-option-base/styles.ts +0 -11
  308. package/src/toggle-group-control/types.ts +3 -1
  309. package/src/tools-panel/tools-panel/README.md +10 -10
  310. package/src/utils/element-rect.ts +32 -15
  311. package/src/utils/hooks/use-on-value-update.ts +3 -6
  312. package/tsconfig.tsbuildinfo +1 -1
  313. package/build/navigator/navigator-provider/component.js.map +0 -1
  314. package/build/utils/hooks/use-event.js +0 -41
  315. package/build/utils/hooks/use-event.js.map +0 -1
  316. package/build-module/navigator/navigator-provider/component.js.map +0 -1
  317. package/build-module/utils/hooks/use-event.js +0 -35
  318. package/build-module/utils/hooks/use-event.js.map +0 -1
  319. package/build-types/navigator/navigator-provider/component.d.ts +0 -37
  320. package/build-types/navigator/navigator-provider/component.d.ts.map +0 -1
  321. package/build-types/utils/hooks/use-event.d.ts +0 -20
  322. package/build-types/utils/hooks/use-event.d.ts.map +0 -1
  323. package/src/navigator/index.ts +0 -6
  324. package/src/navigator/navigator-back-button/README.md +0 -15
  325. package/src/navigator/navigator-button/README.md +0 -38
  326. package/src/navigator/navigator-provider/README.md +0 -94
  327. package/src/navigator/navigator-screen/README.md +0 -33
  328. package/src/navigator/navigator-to-parent-button/README.md +0 -17
  329. package/src/utils/hooks/use-event.ts +0 -38
@@ -232,7 +232,7 @@ describe.each( [
232
232
  <button>After</button>
233
233
  </>
234
234
  );
235
- renderAndValidate( <Test /> );
235
+ await renderAndValidate( <Test /> );
236
236
 
237
237
  await press.Tab();
238
238
  expect( screen.getByText( 'Before' ) ).toHaveFocus();
@@ -260,7 +260,7 @@ describe.each( [
260
260
  </Composite>
261
261
  );
262
262
  };
263
- renderAndValidate( <Test /> );
263
+ await renderAndValidate( <Test /> );
264
264
 
265
265
  const { item1, item2, item3 } = getOneDimensionalItems();
266
266
 
@@ -289,7 +289,7 @@ describe.each( [
289
289
  </Composite>
290
290
  );
291
291
  };
292
- renderAndValidate( <Test /> );
292
+ await renderAndValidate( <Test /> );
293
293
  const { item1, item2, item3 } = getOneDimensionalItems();
294
294
 
295
295
  expect( item2 ).toBeEnabled();
@@ -310,7 +310,7 @@ describe.each( [
310
310
  } ) }
311
311
  />
312
312
  );
313
- renderAndValidate( <Test /> );
313
+ await renderAndValidate( <Test /> );
314
314
  const { item1, item2, item3 } = getOneDimensionalItems();
315
315
 
316
316
  expect( item1.id ).toMatch( 'test-id-1' );
@@ -327,7 +327,7 @@ describe.each( [
327
327
  } ) }
328
328
  />
329
329
  );
330
- renderAndValidate( <Test /> );
330
+ await renderAndValidate( <Test /> );
331
331
  const { item2 } = getOneDimensionalItems();
332
332
 
333
333
  await press.Tab();
@@ -341,37 +341,37 @@ describe.each( [
341
341
  ] )( '%s', ( _when, rtl ) => {
342
342
  const { previous, next, first, last } = getKeys( rtl );
343
343
 
344
- function useOneDimensionalTest( initialState?: InitialState ) {
344
+ async function useOneDimensionalTest( initialState?: InitialState ) {
345
345
  const Test = () => (
346
346
  <OneDimensionalTest
347
347
  state={ useCompositeState( { rtl, ...initialState } ) }
348
348
  />
349
349
  );
350
- renderAndValidate( <Test /> );
350
+ await renderAndValidate( <Test /> );
351
351
  return getOneDimensionalItems();
352
352
  }
353
353
 
354
- function useTwoDimensionalTest( initialState?: InitialState ) {
354
+ async function useTwoDimensionalTest( initialState?: InitialState ) {
355
355
  const Test = () => (
356
356
  <TwoDimensionalTest
357
357
  state={ useCompositeState( { rtl, ...initialState } ) }
358
358
  />
359
359
  );
360
- renderAndValidate( <Test /> );
360
+ await renderAndValidate( <Test /> );
361
361
  return getTwoDimensionalItems();
362
362
  }
363
363
 
364
- function useShiftTest( shift: boolean ) {
364
+ async function useShiftTest( shift: boolean ) {
365
365
  const Test = () => (
366
366
  <ShiftTest state={ useCompositeState( { rtl, shift } ) } />
367
367
  );
368
- renderAndValidate( <Test /> );
368
+ await renderAndValidate( <Test /> );
369
369
  return getShiftTestItems();
370
370
  }
371
371
 
372
372
  describe( 'In one dimension', () => {
373
373
  test( 'All directions work with no orientation', async () => {
374
- const { item1, item2, item3 } = useOneDimensionalTest();
374
+ const { item1, item2, item3 } = await useOneDimensionalTest();
375
375
 
376
376
  await press.Tab();
377
377
  expect( item1 ).toHaveFocus();
@@ -406,7 +406,7 @@ describe.each( [
406
406
  } );
407
407
 
408
408
  test( 'Only left/right work with horizontal orientation', async () => {
409
- const { item1, item2, item3 } = useOneDimensionalTest( {
409
+ const { item1, item2, item3 } = await useOneDimensionalTest( {
410
410
  orientation: 'horizontal',
411
411
  } );
412
412
 
@@ -435,7 +435,7 @@ describe.each( [
435
435
  } );
436
436
 
437
437
  test( 'Only up/down work with vertical orientation', async () => {
438
- const { item1, item2, item3 } = useOneDimensionalTest( {
438
+ const { item1, item2, item3 } = await useOneDimensionalTest( {
439
439
  orientation: 'vertical',
440
440
  } );
441
441
 
@@ -464,7 +464,7 @@ describe.each( [
464
464
  } );
465
465
 
466
466
  test( 'Focus wraps with loop enabled', async () => {
467
- const { item1, item2, item3 } = useOneDimensionalTest( {
467
+ const { item1, item2, item3 } = await useOneDimensionalTest( {
468
468
  loop: true,
469
469
  } );
470
470
 
@@ -488,7 +488,7 @@ describe.each( [
488
488
  describe( 'In two dimensions', () => {
489
489
  test( 'All directions work as standard', async () => {
490
490
  const { itemA1, itemA2, itemA3, itemB1, itemB2, itemC1, itemC3 } =
491
- useTwoDimensionalTest();
491
+ await useTwoDimensionalTest();
492
492
 
493
493
  await press.Tab();
494
494
  expect( itemA1 ).toHaveFocus();
@@ -524,7 +524,7 @@ describe.each( [
524
524
 
525
525
  test( 'Focus wraps around rows/columns with loop enabled', async () => {
526
526
  const { itemA1, itemA2, itemA3, itemB1, itemC1, itemC3 } =
527
- useTwoDimensionalTest( { loop: true } );
527
+ await useTwoDimensionalTest( { loop: true } );
528
528
 
529
529
  await press.Tab();
530
530
  expect( itemA1 ).toHaveFocus();
@@ -548,7 +548,7 @@ describe.each( [
548
548
 
549
549
  test( 'Focus moves between rows/columns with wrap enabled', async () => {
550
550
  const { itemA1, itemA2, itemA3, itemB1, itemC1, itemC3 } =
551
- useTwoDimensionalTest( { wrap: true } );
551
+ await useTwoDimensionalTest( { wrap: true } );
552
552
 
553
553
  await press.Tab();
554
554
  expect( itemA1 ).toHaveFocus();
@@ -577,7 +577,7 @@ describe.each( [
577
577
  } );
578
578
 
579
579
  test( 'Focus wraps around start/end with loop and wrap enabled', async () => {
580
- const { itemA1, itemC3 } = useTwoDimensionalTest( {
580
+ const { itemA1, itemC3 } = await useTwoDimensionalTest( {
581
581
  loop: true,
582
582
  wrap: true,
583
583
  } );
@@ -595,7 +595,8 @@ describe.each( [
595
595
  } );
596
596
 
597
597
  test( 'Focus shifts if vertical neighbour unavailable when shift enabled', async () => {
598
- const { itemA1, itemB1, itemB2, itemC1 } = useShiftTest( true );
598
+ const { itemA1, itemB1, itemB2, itemC1 } =
599
+ await useShiftTest( true );
599
600
 
600
601
  await press.Tab();
601
602
  expect( itemA1 ).toHaveFocus();
@@ -616,7 +617,7 @@ describe.each( [
616
617
  } );
617
618
 
618
619
  test( 'Focus does not shift if vertical neighbour unavailable when shift not enabled', async () => {
619
- const { itemA1, itemB1, itemB2 } = useShiftTest( false );
620
+ const { itemA1, itemB1, itemB2 } = await useShiftTest( false );
620
621
 
621
622
  await press.Tab();
622
623
  expect( itemA1 ).toHaveFocus();
@@ -20,11 +20,11 @@ export const CompositeRow = forwardRef<
20
20
  WordPressComponentProps< CompositeRowProps, 'div', false >
21
21
  >( function CompositeRow( props, ref ) {
22
22
  const context = useCompositeContext();
23
- return (
24
- <Ariakit.CompositeRow
25
- store={ context.store as Ariakit.CompositeStore }
26
- { ...props }
27
- ref={ ref }
28
- />
29
- );
23
+
24
+ // @ts-expect-error The store prop is undocumented and only used by the
25
+ // legacy compat layer. The `store` prop is documented, but its type is
26
+ // obfuscated to discourage its use outside of the component's internals.
27
+ const store = ( props.store ?? context.store ) as Ariakit.CompositeStore;
28
+
29
+ return <Ariakit.CompositeRow store={ store } { ...props } ref={ ref } />;
30
30
  } );
@@ -13,6 +13,7 @@ import { useContext, useMemo } from '@wordpress/element';
13
13
  */
14
14
  import { createSlotFill, Provider as SlotFillProvider } from '../../slot-fill';
15
15
  import { Composite } from '..';
16
+ import { Tooltip } from '../../tooltip';
16
17
 
17
18
  const meta: Meta< typeof Composite > = {
18
19
  title: 'Components/Composite',
@@ -353,3 +354,44 @@ const Fill = ( { children } ) => {
353
354
  },
354
355
  },
355
356
  };
357
+
358
+ /**
359
+ * Combining the `Tooltip` and `Composite` component has a few caveats. And while there are a few ways to compose these two components, our recommendation is to render `Composite.Item` as a child of `Tooltip`.
360
+ *
361
+ * ```jsx
362
+ * // 🔴 Does not work
363
+ * <Composite.Item
364
+ * render={
365
+ * <Tooltip text="Tooltip">
366
+ * <button>Item</button>
367
+ * </Tooltip>
368
+ * }
369
+ * />
370
+ *
371
+ * // 🟢 Good
372
+ * <Tooltip text="Tooltip one">
373
+ * <Composite.Item>
374
+ * Item one
375
+ * </Composite.Item>
376
+ * </Tooltip>
377
+ * ```
378
+ */
379
+ export const WithTooltips: StoryObj< typeof Composite > = {
380
+ ...Default,
381
+ args: {
382
+ ...Default.args,
383
+ children: (
384
+ <>
385
+ <Tooltip text="Tooltip one">
386
+ <Composite.Item>Item one</Composite.Item>
387
+ </Tooltip>
388
+ <Tooltip text="Tooltip two">
389
+ <Composite.Item>Item two</Composite.Item>
390
+ </Tooltip>
391
+ <Tooltip text="Tooltip three">
392
+ <Composite.Item>Item three</Composite.Item>
393
+ </Tooltip>
394
+ </>
395
+ ),
396
+ },
397
+ };
@@ -0,0 +1,123 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { queryByAttribute, render, screen } from '@testing-library/react';
5
+ import { click, press, waitFor } from '@ariakit/test';
6
+ import type { ComponentProps } from 'react';
7
+
8
+ /**
9
+ * WordPress dependencies
10
+ */
11
+ import { useState } from '@wordpress/element';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import { Composite } from '..';
17
+
18
+ // This is necessary because of how Ariakit calculates page up and
19
+ // page down. Without this, nothing has a height, and so paging up
20
+ // and down doesn't behave as expected in tests.
21
+
22
+ let clientHeightSpy: jest.SpiedGetter<
23
+ typeof HTMLElement.prototype.clientHeight
24
+ >;
25
+
26
+ beforeAll( () => {
27
+ clientHeightSpy = jest
28
+ .spyOn( HTMLElement.prototype, 'clientHeight', 'get' )
29
+ .mockImplementation( function getClientHeight( this: HTMLElement ) {
30
+ if ( this.tagName === 'BODY' ) {
31
+ return window.outerHeight;
32
+ }
33
+ return 50;
34
+ } );
35
+ } );
36
+
37
+ afterAll( () => {
38
+ clientHeightSpy?.mockRestore();
39
+ } );
40
+
41
+ async function renderAndValidate( ...args: Parameters< typeof render > ) {
42
+ const view = render( ...args );
43
+ await waitFor( () => {
44
+ const activeButton = queryByAttribute(
45
+ 'data-active-item',
46
+ view.baseElement,
47
+ 'true'
48
+ );
49
+ expect( activeButton ).not.toBeNull();
50
+ } );
51
+ return view;
52
+ }
53
+
54
+ function RemoveItemTest( props: ComponentProps< typeof Composite > ) {
55
+ const [ showThirdItem, setShowThirdItem ] = useState( true );
56
+ return (
57
+ <>
58
+ <button>Focus trap before composite</button>
59
+ <Composite { ...props }>
60
+ <Composite.Item>Item 1</Composite.Item>
61
+ <Composite.Item>Item 2</Composite.Item>
62
+ { showThirdItem && <Composite.Item>Item 3</Composite.Item> }
63
+ </Composite>
64
+ <button onClick={ () => setShowThirdItem( ( value ) => ! value ) }>
65
+ Toggle third item
66
+ </button>
67
+ </>
68
+ );
69
+ }
70
+
71
+ describe( 'Composite', () => {
72
+ it( 'should remain focusable even when there are no elements in the DOM associated with the currently active ID', async () => {
73
+ await renderAndValidate( <RemoveItemTest /> );
74
+
75
+ const toggleButton = screen.getByRole( 'button', {
76
+ name: 'Toggle third item',
77
+ } );
78
+
79
+ await press.Tab();
80
+ await press.Tab();
81
+
82
+ expect(
83
+ screen.getByRole( 'button', { name: 'Item 1' } )
84
+ ).toHaveFocus();
85
+
86
+ await press.ArrowRight();
87
+ await press.ArrowRight();
88
+
89
+ expect(
90
+ screen.getByRole( 'button', { name: 'Item 3' } )
91
+ ).toHaveFocus();
92
+
93
+ await click( toggleButton );
94
+
95
+ expect(
96
+ screen.queryByRole( 'button', { name: 'Item 3' } )
97
+ ).not.toBeInTheDocument();
98
+
99
+ await press.ShiftTab();
100
+
101
+ expect(
102
+ screen.getByRole( 'button', { name: 'Item 2' } )
103
+ ).toHaveFocus();
104
+
105
+ await click( toggleButton );
106
+
107
+ expect(
108
+ screen.getByRole( 'button', { name: 'Item 3' } )
109
+ ).toBeVisible();
110
+
111
+ await press.ShiftTab();
112
+
113
+ expect(
114
+ screen.getByRole( 'button', { name: 'Item 2' } )
115
+ ).toHaveFocus();
116
+
117
+ await press.ArrowRight();
118
+
119
+ expect(
120
+ screen.getByRole( 'button', { name: 'Item 3' } )
121
+ ).toHaveFocus();
122
+ } );
123
+ } );
@@ -20,11 +20,11 @@ export const CompositeTypeahead = forwardRef<
20
20
  WordPressComponentProps< CompositeTypeaheadProps, 'div', false >
21
21
  >( function CompositeTypeahead( props, ref ) {
22
22
  const context = useCompositeContext();
23
- return (
24
- <Ariakit.CompositeTypeahead
25
- store={ context.store as Ariakit.CompositeStore }
26
- { ...props }
27
- ref={ ref }
28
- />
29
- );
23
+
24
+ // @ts-expect-error The store prop is undocumented and only used by the
25
+ // legacy compat layer. The `store` prop is documented, but its type is
26
+ // obfuscated to discourage its use outside of the component's internals.
27
+ const store = ( props.store ?? context.store ) as Ariakit.CompositeStore;
28
+
29
+ return <Ariakit.CompositeRow store={ store } { ...props } ref={ ref } />;
30
30
  } );
@@ -125,6 +125,7 @@ export function DatePicker( {
125
125
  )
126
126
  );
127
127
  } }
128
+ size="compact"
128
129
  />
129
130
  <NavigatorHeading level={ 3 }>
130
131
  <strong>
@@ -150,6 +151,7 @@ export function DatePicker( {
150
151
  )
151
152
  );
152
153
  } }
154
+ size="compact"
153
155
  />
154
156
  </Navigator>
155
157
  <Calendar
@@ -99,6 +99,7 @@ export const WithMenuItems: StoryObj< typeof Dropdown > = {
99
99
  ...Default.args,
100
100
  renderContent: () => (
101
101
  <>
102
+ <MenuItem>Standalone Item</MenuItem>
102
103
  <MenuGroup label="Group 1">
103
104
  <MenuItem>Item 1</MenuItem>
104
105
  <MenuItem>Item 2</MenuItem>
@@ -5,6 +5,16 @@
5
5
  .components-dropdown__content {
6
6
  .components-popover__content {
7
7
  padding: $grid-unit-10;
8
+
9
+ &:has(.components-menu-group) {
10
+ padding: 0;
11
+
12
+ .components-dropdown-menu__menu > .components-menu-item__button,
13
+ > .components-menu-item__button {
14
+ margin: $grid-unit-10;
15
+ width: auto;
16
+ }
17
+ }
8
18
  }
9
19
 
10
20
  [role="menuitem"] {
@@ -13,22 +23,9 @@
13
23
 
14
24
  .components-menu-group {
15
25
  padding: $grid-unit-10;
16
- margin-top: 0;
17
- margin-bottom: 0;
18
- margin-left: -$grid-unit-10;
19
- margin-right: -$grid-unit-10;
20
-
21
- &:first-child {
22
- margin-top: -$grid-unit-10;
23
- }
24
-
25
- &:last-child {
26
- margin-bottom: -$grid-unit-10;
27
- }
28
26
  }
29
27
 
30
28
  .components-menu-group + .components-menu-group {
31
- margin-top: 0;
32
29
  border-top: $border-width solid $gray-400;
33
30
  padding: $grid-unit-10;
34
31
  }
@@ -96,6 +96,9 @@ export const WithChildren: StoryObj< typeof DropdownMenu > = {
96
96
  icon: more,
97
97
  children: ( { onClose } ) => (
98
98
  <>
99
+ <MenuItem icon={ arrowUp } onClick={ onClose }>
100
+ Standalone Item
101
+ </MenuItem>
99
102
  <MenuGroup>
100
103
  <MenuItem icon={ arrowUp } onClick={ onClose }>
101
104
  Move Up
package/src/index.ts CHANGED
@@ -33,14 +33,22 @@ export {
33
33
  } from './autocomplete';
34
34
  export { default as BaseControl, useBaseControlProps } from './base-control';
35
35
  export {
36
+ /** @deprecated Import `BorderBoxControl` instead. */
36
37
  BorderBoxControl as __experimentalBorderBoxControl,
38
+ BorderBoxControl,
37
39
  hasSplitBorders as __experimentalHasSplitBorders,
38
40
  isDefinedBorder as __experimentalIsDefinedBorder,
39
41
  isEmptyBorder as __experimentalIsEmptyBorder,
40
42
  } from './border-box-control';
41
- export { BorderControl as __experimentalBorderControl } from './border-control';
42
43
  export {
44
+ /** @deprecated Import `BorderControl` instead. */
45
+ BorderControl as __experimentalBorderControl,
46
+ BorderControl,
47
+ } from './border-control';
48
+ export {
49
+ /** @deprecated Import `BoxControl` instead. */
43
50
  default as __experimentalBoxControl,
51
+ default as BoxControl,
44
52
  applyValueToSides as __experimentalApplyValueToSides,
45
53
  } from './box-control';
46
54
  export { default as Button } from './button';
@@ -121,11 +129,21 @@ export { default as __experimentalNavigationGroup } from './navigation/group';
121
129
  export { default as __experimentalNavigationItem } from './navigation/item';
122
130
  export { default as __experimentalNavigationMenu } from './navigation/menu';
123
131
  export {
132
+ /** @deprecated Import `Navigator` instead. */
124
133
  NavigatorProvider as __experimentalNavigatorProvider,
134
+ /** @deprecated Import `Navigator` and use `Navigator.Screen` instead. */
125
135
  NavigatorScreen as __experimentalNavigatorScreen,
136
+ /** @deprecated Import `Navigator` and use `Navigator.Button` instead. */
126
137
  NavigatorButton as __experimentalNavigatorButton,
138
+ /** @deprecated Import `Navigator` and use `Navigator.BackButton` instead. */
127
139
  NavigatorBackButton as __experimentalNavigatorBackButton,
140
+ /** @deprecated Import `Navigator` and use `Navigator.BackButton` instead. */
128
141
  NavigatorToParentButton as __experimentalNavigatorToParentButton,
142
+ } from './navigator/legacy';
143
+ export {
144
+ Navigator,
145
+ useNavigator,
146
+ /** @deprecated Import `useNavigator` instead. */
129
147
  useNavigator as __experimentalUseNavigator,
130
148
  } from './navigator';
131
149
  export { default as Notice } from './notice';
@@ -1,5 +1,4 @@
1
1
  .components-menu-group + .components-menu-group {
2
- margin-top: $grid-unit-10;
3
2
  padding-top: $grid-unit-10;
4
3
  border-top: $border-width solid $gray-900;
5
4
 
@@ -10,6 +9,10 @@
10
9
  }
11
10
  }
12
11
 
12
+ .components-menu-group:has(> div:empty) {
13
+ display: none;
14
+ }
15
+
13
16
  .components-menu-group__label {
14
17
  padding: 0 $grid-unit-10;
15
18
  margin-top: $grid-unit-05;
@@ -1,5 +1,7 @@
1
1
  .components-menu-items-choice,
2
2
  .components-menu-items-choice.components-button {
3
+ height: auto;
4
+
3
5
  svg {
4
6
  margin-right: $grid-unit-15;
5
7
  }