@wordpress/ui 0.12.0 → 0.13.1-next.v.202605131006.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 (521) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/CONTRIBUTING.md +34 -0
  3. package/build/alert-dialog/popup.cjs +92 -22
  4. package/build/alert-dialog/popup.cjs.map +3 -3
  5. package/build/badge/badge.cjs +84 -5
  6. package/build/badge/badge.cjs.map +3 -3
  7. package/build/button/button.cjs +90 -20
  8. package/build/button/button.cjs.map +3 -3
  9. package/build/button/icon.cjs.map +2 -2
  10. package/build/button/index.cjs +1 -0
  11. package/build/button/index.cjs.map +3 -3
  12. package/build/button/types.cjs.map +1 -1
  13. package/build/card/content.cjs +84 -5
  14. package/build/card/content.cjs.map +3 -3
  15. package/build/card/full-bleed.cjs +84 -5
  16. package/build/card/full-bleed.cjs.map +3 -3
  17. package/build/card/header.cjs +84 -5
  18. package/build/card/header.cjs.map +3 -3
  19. package/build/card/root.cjs +86 -10
  20. package/build/card/root.cjs.map +3 -3
  21. package/build/collapsible-card/content.cjs +85 -6
  22. package/build/collapsible-card/content.cjs.map +3 -3
  23. package/build/collapsible-card/header.cjs +131 -52
  24. package/build/collapsible-card/header.cjs.map +3 -3
  25. package/build/dialog/content.cjs +86 -10
  26. package/build/dialog/content.cjs.map +3 -3
  27. package/build/dialog/description.cjs +84 -5
  28. package/build/dialog/description.cjs.map +3 -3
  29. package/build/dialog/footer.cjs +84 -5
  30. package/build/dialog/footer.cjs.map +3 -3
  31. package/build/dialog/header.cjs +84 -5
  32. package/build/dialog/header.cjs.map +3 -3
  33. package/build/dialog/popup.cjs +86 -7
  34. package/build/dialog/popup.cjs.map +3 -3
  35. package/build/dialog/title.cjs +84 -5
  36. package/build/dialog/title.cjs.map +3 -3
  37. package/build/drawer/content.cjs +103 -19
  38. package/build/drawer/content.cjs.map +4 -4
  39. package/build/drawer/footer.cjs +84 -5
  40. package/build/drawer/footer.cjs.map +3 -3
  41. package/build/drawer/header.cjs +84 -5
  42. package/build/drawer/header.cjs.map +3 -3
  43. package/build/drawer/popup.cjs +86 -7
  44. package/build/drawer/popup.cjs.map +3 -3
  45. package/build/drawer/title.cjs +84 -5
  46. package/build/drawer/title.cjs.map +3 -3
  47. package/build/drawer/types.cjs.map +1 -1
  48. package/build/empty-state/actions.cjs +84 -5
  49. package/build/empty-state/actions.cjs.map +3 -3
  50. package/build/empty-state/description.cjs +84 -5
  51. package/build/empty-state/description.cjs.map +3 -3
  52. package/build/empty-state/icon.cjs +84 -5
  53. package/build/empty-state/icon.cjs.map +3 -3
  54. package/build/empty-state/root.cjs +84 -5
  55. package/build/empty-state/root.cjs.map +3 -3
  56. package/build/empty-state/title.cjs +84 -5
  57. package/build/empty-state/title.cjs.map +3 -3
  58. package/build/empty-state/visual.cjs +84 -5
  59. package/build/empty-state/visual.cjs.map +3 -3
  60. package/build/form/index.cjs +3 -1
  61. package/build/form/index.cjs.map +2 -2
  62. package/build/form/primitives/autocomplete/empty.cjs +84 -5
  63. package/build/form/primitives/autocomplete/empty.cjs.map +3 -3
  64. package/build/form/primitives/autocomplete/item.cjs +86 -10
  65. package/build/form/primitives/autocomplete/item.cjs.map +3 -3
  66. package/build/form/primitives/autocomplete/list-body.cjs +84 -5
  67. package/build/form/primitives/autocomplete/list-body.cjs.map +3 -3
  68. package/build/form/primitives/autocomplete/list.cjs +84 -5
  69. package/build/form/primitives/autocomplete/list.cjs.map +3 -3
  70. package/build/form/primitives/autocomplete/popup.cjs +90 -17
  71. package/build/form/primitives/autocomplete/popup.cjs.map +3 -3
  72. package/build/form/primitives/field/description.cjs +86 -10
  73. package/build/form/primitives/field/description.cjs.map +3 -3
  74. package/build/form/primitives/field/details.cjs +84 -5
  75. package/build/form/primitives/field/details.cjs.map +3 -3
  76. package/build/form/primitives/field/label.cjs +84 -5
  77. package/build/form/primitives/field/label.cjs.map +3 -3
  78. package/build/form/primitives/field/root.cjs +84 -5
  79. package/build/form/primitives/field/root.cjs.map +3 -3
  80. package/build/form/primitives/fieldset/description.cjs +86 -10
  81. package/build/form/primitives/fieldset/description.cjs.map +3 -3
  82. package/build/form/primitives/fieldset/details.cjs +84 -5
  83. package/build/form/primitives/fieldset/details.cjs.map +3 -3
  84. package/build/form/primitives/fieldset/legend.cjs +84 -5
  85. package/build/form/primitives/fieldset/legend.cjs.map +3 -3
  86. package/build/form/primitives/fieldset/root.cjs +84 -5
  87. package/build/form/primitives/fieldset/root.cjs.map +3 -3
  88. package/build/form/primitives/input/input.cjs +88 -15
  89. package/build/form/primitives/input/input.cjs.map +3 -3
  90. package/build/form/primitives/input-layout/input-layout.cjs +88 -15
  91. package/build/form/primitives/input-layout/input-layout.cjs.map +3 -3
  92. package/build/form/primitives/input-layout/slot.cjs +84 -5
  93. package/build/form/primitives/input-layout/slot.cjs.map +3 -3
  94. package/build/form/primitives/select/item.cjs +87 -11
  95. package/build/form/primitives/select/item.cjs.map +3 -3
  96. package/build/form/primitives/select/popup.cjs +90 -17
  97. package/build/form/primitives/select/popup.cjs.map +3 -3
  98. package/build/form/primitives/select/root.cjs.map +2 -2
  99. package/build/form/primitives/select/trigger.cjs +98 -16
  100. package/build/form/primitives/select/trigger.cjs.map +3 -3
  101. package/build/form/primitives/select/types.cjs.map +1 -1
  102. package/build/form/primitives/textarea/textarea.cjs +86 -10
  103. package/build/form/primitives/textarea/textarea.cjs.map +3 -3
  104. package/build/form/select-control/context.cjs +37 -0
  105. package/build/form/select-control/context.cjs.map +7 -0
  106. package/build/form/select-control/index.cjs +39 -0
  107. package/build/form/select-control/index.cjs.map +7 -0
  108. package/build/form/select-control/item.cjs +41 -0
  109. package/build/form/select-control/item.cjs.map +7 -0
  110. package/build/form/select-control/select-control.cjs +75 -0
  111. package/build/form/select-control/select-control.cjs.map +7 -0
  112. package/build/form/select-control/types.cjs +19 -0
  113. package/build/form/select-control/types.cjs.map +7 -0
  114. package/build/form/types.cjs.map +1 -1
  115. package/build/icon-button/icon-button.cjs +86 -6
  116. package/build/icon-button/icon-button.cjs.map +3 -3
  117. package/build/icon-button/types.cjs.map +1 -1
  118. package/build/link/link.cjs +90 -20
  119. package/build/link/link.cjs.map +3 -3
  120. package/build/notice/action-button.cjs +84 -5
  121. package/build/notice/action-button.cjs.map +3 -3
  122. package/build/notice/action-link.cjs +84 -5
  123. package/build/notice/action-link.cjs.map +3 -3
  124. package/build/notice/actions.cjs +84 -5
  125. package/build/notice/actions.cjs.map +3 -3
  126. package/build/notice/close-icon.cjs +84 -5
  127. package/build/notice/close-icon.cjs.map +3 -3
  128. package/build/notice/description.cjs +84 -5
  129. package/build/notice/description.cjs.map +3 -3
  130. package/build/notice/root.cjs +86 -10
  131. package/build/notice/root.cjs.map +3 -3
  132. package/build/notice/title.cjs +84 -5
  133. package/build/notice/title.cjs.map +3 -3
  134. package/build/popover/arrow.cjs +84 -5
  135. package/build/popover/arrow.cjs.map +3 -3
  136. package/build/popover/popup.cjs +88 -12
  137. package/build/popover/popup.cjs.map +3 -3
  138. package/build/popover/title.cjs +84 -5
  139. package/build/popover/title.cjs.map +3 -3
  140. package/build/stack/stack.cjs +84 -5
  141. package/build/stack/stack.cjs.map +3 -3
  142. package/build/tabs/list.cjs +84 -5
  143. package/build/tabs/list.cjs.map +3 -3
  144. package/build/tabs/panel.cjs +86 -10
  145. package/build/tabs/panel.cjs.map +3 -3
  146. package/build/tabs/tab.cjs +84 -5
  147. package/build/tabs/tab.cjs.map +3 -3
  148. package/build/text/text.cjs +86 -10
  149. package/build/text/text.cjs.map +3 -3
  150. package/build/tooltip/index.cjs +3 -0
  151. package/build/tooltip/index.cjs.map +2 -2
  152. package/build/tooltip/popup.cjs +111 -40
  153. package/build/tooltip/popup.cjs.map +3 -3
  154. package/build/tooltip/positioner.cjs +159 -0
  155. package/build/tooltip/positioner.cjs.map +7 -0
  156. package/build/tooltip/types.cjs.map +1 -1
  157. package/build/utils/{render-portal-with-children.cjs → render-slot-with-children.cjs} +9 -12
  158. package/build/utils/render-slot-with-children.cjs.map +7 -0
  159. package/build/visually-hidden/visually-hidden.cjs +84 -5
  160. package/build/visually-hidden/visually-hidden.cjs.map +3 -3
  161. package/build-module/alert-dialog/popup.mjs +92 -22
  162. package/build-module/alert-dialog/popup.mjs.map +3 -3
  163. package/build-module/badge/badge.mjs +84 -5
  164. package/build-module/badge/badge.mjs.map +3 -3
  165. package/build-module/button/button.mjs +90 -20
  166. package/build-module/button/button.mjs.map +3 -3
  167. package/build-module/button/icon.mjs.map +2 -2
  168. package/build-module/button/index.mjs +3 -2
  169. package/build-module/button/index.mjs.map +2 -2
  170. package/build-module/card/content.mjs +84 -5
  171. package/build-module/card/content.mjs.map +3 -3
  172. package/build-module/card/full-bleed.mjs +84 -5
  173. package/build-module/card/full-bleed.mjs.map +3 -3
  174. package/build-module/card/header.mjs +84 -5
  175. package/build-module/card/header.mjs.map +3 -3
  176. package/build-module/card/root.mjs +86 -10
  177. package/build-module/card/root.mjs.map +3 -3
  178. package/build-module/collapsible-card/content.mjs +85 -6
  179. package/build-module/collapsible-card/content.mjs.map +3 -3
  180. package/build-module/collapsible-card/header.mjs +131 -52
  181. package/build-module/collapsible-card/header.mjs.map +3 -3
  182. package/build-module/dialog/content.mjs +86 -10
  183. package/build-module/dialog/content.mjs.map +3 -3
  184. package/build-module/dialog/description.mjs +84 -5
  185. package/build-module/dialog/description.mjs.map +3 -3
  186. package/build-module/dialog/footer.mjs +84 -5
  187. package/build-module/dialog/footer.mjs.map +3 -3
  188. package/build-module/dialog/header.mjs +84 -5
  189. package/build-module/dialog/header.mjs.map +3 -3
  190. package/build-module/dialog/popup.mjs +86 -7
  191. package/build-module/dialog/popup.mjs.map +3 -3
  192. package/build-module/dialog/title.mjs +84 -5
  193. package/build-module/dialog/title.mjs.map +3 -3
  194. package/build-module/drawer/content.mjs +103 -19
  195. package/build-module/drawer/content.mjs.map +3 -3
  196. package/build-module/drawer/footer.mjs +84 -5
  197. package/build-module/drawer/footer.mjs.map +3 -3
  198. package/build-module/drawer/header.mjs +84 -5
  199. package/build-module/drawer/header.mjs.map +3 -3
  200. package/build-module/drawer/popup.mjs +86 -7
  201. package/build-module/drawer/popup.mjs.map +3 -3
  202. package/build-module/drawer/title.mjs +84 -5
  203. package/build-module/drawer/title.mjs.map +3 -3
  204. package/build-module/empty-state/actions.mjs +84 -5
  205. package/build-module/empty-state/actions.mjs.map +3 -3
  206. package/build-module/empty-state/description.mjs +84 -5
  207. package/build-module/empty-state/description.mjs.map +3 -3
  208. package/build-module/empty-state/icon.mjs +84 -5
  209. package/build-module/empty-state/icon.mjs.map +3 -3
  210. package/build-module/empty-state/root.mjs +84 -5
  211. package/build-module/empty-state/root.mjs.map +3 -3
  212. package/build-module/empty-state/title.mjs +84 -5
  213. package/build-module/empty-state/title.mjs.map +3 -3
  214. package/build-module/empty-state/visual.mjs +84 -5
  215. package/build-module/empty-state/visual.mjs.map +3 -3
  216. package/build-module/form/index.mjs +1 -0
  217. package/build-module/form/index.mjs.map +2 -2
  218. package/build-module/form/primitives/autocomplete/empty.mjs +84 -5
  219. package/build-module/form/primitives/autocomplete/empty.mjs.map +3 -3
  220. package/build-module/form/primitives/autocomplete/item.mjs +86 -10
  221. package/build-module/form/primitives/autocomplete/item.mjs.map +3 -3
  222. package/build-module/form/primitives/autocomplete/list-body.mjs +84 -5
  223. package/build-module/form/primitives/autocomplete/list-body.mjs.map +3 -3
  224. package/build-module/form/primitives/autocomplete/list.mjs +84 -5
  225. package/build-module/form/primitives/autocomplete/list.mjs.map +3 -3
  226. package/build-module/form/primitives/autocomplete/popup.mjs +90 -17
  227. package/build-module/form/primitives/autocomplete/popup.mjs.map +3 -3
  228. package/build-module/form/primitives/field/description.mjs +86 -10
  229. package/build-module/form/primitives/field/description.mjs.map +3 -3
  230. package/build-module/form/primitives/field/details.mjs +84 -5
  231. package/build-module/form/primitives/field/details.mjs.map +3 -3
  232. package/build-module/form/primitives/field/label.mjs +84 -5
  233. package/build-module/form/primitives/field/label.mjs.map +3 -3
  234. package/build-module/form/primitives/field/root.mjs +84 -5
  235. package/build-module/form/primitives/field/root.mjs.map +3 -3
  236. package/build-module/form/primitives/fieldset/description.mjs +86 -10
  237. package/build-module/form/primitives/fieldset/description.mjs.map +3 -3
  238. package/build-module/form/primitives/fieldset/details.mjs +84 -5
  239. package/build-module/form/primitives/fieldset/details.mjs.map +3 -3
  240. package/build-module/form/primitives/fieldset/legend.mjs +84 -5
  241. package/build-module/form/primitives/fieldset/legend.mjs.map +3 -3
  242. package/build-module/form/primitives/fieldset/root.mjs +84 -5
  243. package/build-module/form/primitives/fieldset/root.mjs.map +3 -3
  244. package/build-module/form/primitives/input/input.mjs +88 -15
  245. package/build-module/form/primitives/input/input.mjs.map +3 -3
  246. package/build-module/form/primitives/input-layout/input-layout.mjs +88 -15
  247. package/build-module/form/primitives/input-layout/input-layout.mjs.map +3 -3
  248. package/build-module/form/primitives/input-layout/slot.mjs +84 -5
  249. package/build-module/form/primitives/input-layout/slot.mjs.map +3 -3
  250. package/build-module/form/primitives/select/item.mjs +87 -11
  251. package/build-module/form/primitives/select/item.mjs.map +3 -3
  252. package/build-module/form/primitives/select/popup.mjs +90 -17
  253. package/build-module/form/primitives/select/popup.mjs.map +3 -3
  254. package/build-module/form/primitives/select/root.mjs.map +2 -2
  255. package/build-module/form/primitives/select/trigger.mjs +98 -16
  256. package/build-module/form/primitives/select/trigger.mjs.map +3 -3
  257. package/build-module/form/primitives/textarea/textarea.mjs +86 -10
  258. package/build-module/form/primitives/textarea/textarea.mjs.map +3 -3
  259. package/build-module/form/select-control/context.mjs +11 -0
  260. package/build-module/form/select-control/context.mjs.map +7 -0
  261. package/build-module/form/select-control/index.mjs +14 -0
  262. package/build-module/form/select-control/index.mjs.map +7 -0
  263. package/build-module/form/select-control/item.mjs +16 -0
  264. package/build-module/form/select-control/item.mjs.map +7 -0
  265. package/build-module/form/select-control/select-control.mjs +50 -0
  266. package/build-module/form/select-control/select-control.mjs.map +7 -0
  267. package/build-module/form/select-control/types.mjs +1 -0
  268. package/build-module/form/select-control/types.mjs.map +7 -0
  269. package/build-module/icon-button/icon-button.mjs +86 -6
  270. package/build-module/icon-button/icon-button.mjs.map +3 -3
  271. package/build-module/link/link.mjs +90 -20
  272. package/build-module/link/link.mjs.map +3 -3
  273. package/build-module/notice/action-button.mjs +84 -5
  274. package/build-module/notice/action-button.mjs.map +3 -3
  275. package/build-module/notice/action-link.mjs +84 -5
  276. package/build-module/notice/action-link.mjs.map +3 -3
  277. package/build-module/notice/actions.mjs +84 -5
  278. package/build-module/notice/actions.mjs.map +3 -3
  279. package/build-module/notice/close-icon.mjs +84 -5
  280. package/build-module/notice/close-icon.mjs.map +3 -3
  281. package/build-module/notice/description.mjs +84 -5
  282. package/build-module/notice/description.mjs.map +3 -3
  283. package/build-module/notice/root.mjs +86 -10
  284. package/build-module/notice/root.mjs.map +3 -3
  285. package/build-module/notice/title.mjs +84 -5
  286. package/build-module/notice/title.mjs.map +3 -3
  287. package/build-module/popover/arrow.mjs +84 -5
  288. package/build-module/popover/arrow.mjs.map +3 -3
  289. package/build-module/popover/popup.mjs +88 -12
  290. package/build-module/popover/popup.mjs.map +3 -3
  291. package/build-module/popover/title.mjs +84 -5
  292. package/build-module/popover/title.mjs.map +3 -3
  293. package/build-module/stack/stack.mjs +84 -5
  294. package/build-module/stack/stack.mjs.map +3 -3
  295. package/build-module/tabs/list.mjs +84 -5
  296. package/build-module/tabs/list.mjs.map +3 -3
  297. package/build-module/tabs/panel.mjs +86 -10
  298. package/build-module/tabs/panel.mjs.map +3 -3
  299. package/build-module/tabs/tab.mjs +84 -5
  300. package/build-module/tabs/tab.mjs.map +3 -3
  301. package/build-module/text/text.mjs +86 -10
  302. package/build-module/text/text.mjs.map +3 -3
  303. package/build-module/tooltip/index.mjs +2 -0
  304. package/build-module/tooltip/index.mjs.map +2 -2
  305. package/build-module/tooltip/popup.mjs +111 -40
  306. package/build-module/tooltip/popup.mjs.map +3 -3
  307. package/build-module/tooltip/positioner.mjs +124 -0
  308. package/build-module/tooltip/positioner.mjs.map +7 -0
  309. package/build-module/utils/render-slot-with-children.mjs +9 -0
  310. package/build-module/utils/render-slot-with-children.mjs.map +7 -0
  311. package/build-module/visually-hidden/visually-hidden.mjs +84 -5
  312. package/build-module/visually-hidden/visually-hidden.mjs.map +3 -3
  313. package/build-types/alert-dialog/portal.d.ts +1 -1
  314. package/build-types/alert-dialog/portal.d.ts.map +1 -1
  315. package/build-types/alert-dialog/root.d.ts +1 -1
  316. package/build-types/alert-dialog/root.d.ts.map +1 -1
  317. package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -1
  318. package/build-types/badge/stories/choosing-intent.story.d.ts.map +1 -1
  319. package/build-types/badge/stories/index.story.d.ts.map +1 -1
  320. package/build-types/button/button.d.ts +3 -0
  321. package/build-types/button/button.d.ts.map +1 -1
  322. package/build-types/button/icon.d.ts +1 -8
  323. package/build-types/button/icon.d.ts.map +1 -1
  324. package/build-types/button/index.d.ts +6 -5
  325. package/build-types/button/index.d.ts.map +1 -1
  326. package/build-types/button/stories/index.story.d.ts.map +1 -1
  327. package/build-types/button/types.d.ts +7 -0
  328. package/build-types/button/types.d.ts.map +1 -1
  329. package/build-types/card/stories/index.story.d.ts.map +1 -1
  330. package/build-types/collapsible/panel.d.ts +1 -1
  331. package/build-types/collapsible/root.d.ts +1 -1
  332. package/build-types/collapsible/stories/index.story.d.ts.map +1 -1
  333. package/build-types/collapsible/trigger.d.ts +1 -1
  334. package/build-types/collapsible-card/header.d.ts +6 -0
  335. package/build-types/collapsible-card/header.d.ts.map +1 -1
  336. package/build-types/collapsible-card/stories/index.story.d.ts +8 -0
  337. package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
  338. package/build-types/dialog/context.d.ts +2 -2
  339. package/build-types/dialog/popup.d.ts +1 -2
  340. package/build-types/dialog/popup.d.ts.map +1 -1
  341. package/build-types/dialog/portal.d.ts +1 -1
  342. package/build-types/dialog/portal.d.ts.map +1 -1
  343. package/build-types/dialog/stories/index.story.d.ts.map +1 -1
  344. package/build-types/drawer/content.d.ts +7 -4
  345. package/build-types/drawer/content.d.ts.map +1 -1
  346. package/build-types/drawer/context.d.ts +2 -2
  347. package/build-types/drawer/popup.d.ts +1 -2
  348. package/build-types/drawer/popup.d.ts.map +1 -1
  349. package/build-types/drawer/stories/index.story.d.ts.map +1 -1
  350. package/build-types/drawer/types.d.ts +1 -1
  351. package/build-types/empty-state/stories/index.story.d.ts.map +1 -1
  352. package/build-types/form/index.d.ts +1 -0
  353. package/build-types/form/index.d.ts.map +1 -1
  354. package/build-types/form/input-control/stories/index.story.d.ts.map +1 -1
  355. package/build-types/form/primitives/autocomplete/clear.d.ts +1 -1
  356. package/build-types/form/primitives/autocomplete/empty.d.ts +1 -1
  357. package/build-types/form/primitives/autocomplete/input-group.d.ts +1 -1
  358. package/build-types/form/primitives/autocomplete/item.d.ts +1 -1
  359. package/build-types/form/primitives/autocomplete/list-body.d.ts +1 -1
  360. package/build-types/form/primitives/autocomplete/list.d.ts +2 -2
  361. package/build-types/form/primitives/autocomplete/popup.d.ts +2 -2
  362. package/build-types/form/primitives/autocomplete/portal.d.ts +1 -1
  363. package/build-types/form/primitives/autocomplete/portal.d.ts.map +1 -1
  364. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts.map +1 -1
  365. package/build-types/form/primitives/field/control.d.ts +2 -2
  366. package/build-types/form/primitives/field/description.d.ts +1 -1
  367. package/build-types/form/primitives/field/details.d.ts +1 -1
  368. package/build-types/form/primitives/field/label.d.ts +3 -3
  369. package/build-types/form/primitives/field/root.d.ts +3 -3
  370. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  371. package/build-types/form/primitives/fieldset/description.d.ts +1 -1
  372. package/build-types/form/primitives/fieldset/details.d.ts +1 -1
  373. package/build-types/form/primitives/fieldset/legend.d.ts +1 -1
  374. package/build-types/form/primitives/fieldset/root.d.ts +1 -1
  375. package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
  376. package/build-types/form/primitives/input/input.d.ts +5 -5
  377. package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
  378. package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
  379. package/build-types/form/primitives/select/item.d.ts +3 -3
  380. package/build-types/form/primitives/select/popup.d.ts +2 -2
  381. package/build-types/form/primitives/select/root.d.ts +12 -1
  382. package/build-types/form/primitives/select/root.d.ts.map +1 -1
  383. package/build-types/form/primitives/select/stories/index.story.d.ts +9 -6
  384. package/build-types/form/primitives/select/stories/index.story.d.ts.map +1 -1
  385. package/build-types/form/primitives/select/trigger.d.ts +5 -4
  386. package/build-types/form/primitives/select/trigger.d.ts.map +1 -1
  387. package/build-types/form/primitives/select/types.d.ts +12 -4
  388. package/build-types/form/primitives/select/types.d.ts.map +1 -1
  389. package/build-types/form/primitives/textarea/stories/index.story.d.ts.map +1 -1
  390. package/build-types/form/primitives/textarea/textarea.d.ts +2 -2
  391. package/build-types/form/select-control/context.d.ts +3 -0
  392. package/build-types/form/select-control/context.d.ts.map +1 -0
  393. package/build-types/form/select-control/index.d.ts +20 -0
  394. package/build-types/form/select-control/index.d.ts.map +1 -0
  395. package/build-types/form/select-control/item.d.ts +6 -0
  396. package/build-types/form/select-control/item.d.ts.map +1 -0
  397. package/build-types/form/select-control/select-control.d.ts +11 -0
  398. package/build-types/form/select-control/select-control.d.ts.map +1 -0
  399. package/build-types/form/select-control/stories/index.story.d.ts +40 -0
  400. package/build-types/form/select-control/stories/index.story.d.ts.map +1 -0
  401. package/build-types/form/select-control/test/index.test.d.ts +2 -0
  402. package/build-types/form/select-control/test/index.test.d.ts.map +1 -0
  403. package/build-types/form/select-control/types.d.ts +40 -0
  404. package/build-types/form/select-control/types.d.ts.map +1 -0
  405. package/build-types/form/types.d.ts +1 -1
  406. package/build-types/form/types.d.ts.map +1 -1
  407. package/build-types/icon/stories/index.story.d.ts.map +1 -1
  408. package/build-types/icon-button/icon-button.d.ts +2 -1
  409. package/build-types/icon-button/icon-button.d.ts.map +1 -1
  410. package/build-types/icon-button/stories/index.story.d.ts +5 -0
  411. package/build-types/icon-button/stories/index.story.d.ts.map +1 -1
  412. package/build-types/icon-button/types.d.ts +8 -0
  413. package/build-types/icon-button/types.d.ts.map +1 -1
  414. package/build-types/link/stories/index.story.d.ts.map +1 -1
  415. package/build-types/notice/stories/index.story.d.ts.map +1 -1
  416. package/build-types/popover/stories/index.story.d.ts.map +1 -1
  417. package/build-types/stack/stories/index.story.d.ts.map +1 -1
  418. package/build-types/tabs/context.d.ts +1 -1
  419. package/build-types/tabs/context.d.ts.map +1 -1
  420. package/build-types/tabs/list.d.ts +2 -2
  421. package/build-types/tabs/panel.d.ts +1 -1
  422. package/build-types/tabs/root.d.ts +1 -1
  423. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  424. package/build-types/tabs/tab.d.ts +1 -1
  425. package/build-types/text/stories/index.story.d.ts.map +1 -1
  426. package/build-types/tooltip/index.d.ts +2 -1
  427. package/build-types/tooltip/index.d.ts.map +1 -1
  428. package/build-types/tooltip/popup.d.ts.map +1 -1
  429. package/build-types/tooltip/positioner.d.ts +9 -0
  430. package/build-types/tooltip/positioner.d.ts.map +1 -0
  431. package/build-types/tooltip/stories/index.story.d.ts +11 -2
  432. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  433. package/build-types/tooltip/stories/usage-guidelines.story.d.ts.map +1 -1
  434. package/build-types/tooltip/types.d.ts +10 -1
  435. package/build-types/tooltip/types.d.ts.map +1 -1
  436. package/build-types/utils/create-overlay-modal-context.d.ts.map +1 -1
  437. package/build-types/utils/render-slot-with-children.d.ts +24 -0
  438. package/build-types/utils/render-slot-with-children.d.ts.map +1 -0
  439. package/build-types/utils/use-deprioritized-initial-focus.d.ts +1 -1
  440. package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -1
  441. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  442. package/package.json +13 -12
  443. package/src/alert-dialog/popup.tsx +2 -2
  444. package/src/alert-dialog/stories/index.story.tsx +8 -0
  445. package/src/badge/stories/index.story.tsx +6 -0
  446. package/src/button/button.tsx +3 -0
  447. package/src/button/icon.tsx +1 -8
  448. package/src/button/index.ts +5 -6
  449. package/src/button/stories/index.story.tsx +10 -0
  450. package/src/button/types.ts +8 -0
  451. package/src/card/stories/index.story.tsx +6 -0
  452. package/src/collapsible/stories/index.story.tsx +6 -0
  453. package/src/collapsible-card/header.tsx +55 -42
  454. package/src/collapsible-card/stories/index.story.tsx +61 -0
  455. package/src/collapsible-card/style.module.css +20 -0
  456. package/src/collapsible-card/test/index.test.tsx +60 -1
  457. package/src/dialog/popup.tsx +3 -4
  458. package/src/dialog/stories/index.story.tsx +8 -0
  459. package/src/dialog/style.module.css +3 -9
  460. package/src/drawer/content.tsx +31 -16
  461. package/src/drawer/popup.tsx +3 -4
  462. package/src/drawer/stories/index.story.tsx +7 -0
  463. package/src/drawer/style.module.css +41 -9
  464. package/src/drawer/test/index.test.tsx +56 -0
  465. package/src/drawer/types.ts +1 -1
  466. package/src/empty-state/stories/index.story.tsx +7 -0
  467. package/src/form/index.ts +1 -0
  468. package/src/form/input-control/stories/index.story.tsx +7 -0
  469. package/src/form/primitives/autocomplete/popup.tsx +2 -2
  470. package/src/form/primitives/autocomplete/stories/index.story.tsx +18 -10
  471. package/src/form/primitives/field/stories/index.story.tsx +12 -5
  472. package/src/form/primitives/fieldset/stories/index.story.tsx +10 -3
  473. package/src/form/primitives/input/stories/index.story.tsx +7 -0
  474. package/src/form/primitives/input-layout/stories/index.story.tsx +8 -1
  475. package/src/form/primitives/select/item.tsx +1 -1
  476. package/src/form/primitives/select/popup.tsx +2 -2
  477. package/src/form/primitives/select/root.tsx +13 -2
  478. package/src/form/primitives/select/stories/index.story.tsx +132 -61
  479. package/src/form/primitives/select/test/index.test.tsx +123 -5
  480. package/src/form/primitives/select/trigger.tsx +11 -8
  481. package/src/form/primitives/select/types.ts +13 -5
  482. package/src/form/primitives/textarea/stories/index.story.tsx +7 -0
  483. package/src/form/select-control/context.tsx +9 -0
  484. package/src/form/select-control/index.ts +14 -0
  485. package/src/form/select-control/item.tsx +13 -0
  486. package/src/form/select-control/select-control.tsx +65 -0
  487. package/src/form/select-control/stories/index.story.tsx +220 -0
  488. package/src/form/select-control/test/index.test.tsx +196 -0
  489. package/src/form/select-control/types.ts +50 -0
  490. package/src/form/types.ts +1 -1
  491. package/src/icon/stories/index.story.tsx +7 -0
  492. package/src/icon-button/icon-button.tsx +2 -1
  493. package/src/icon-button/stories/index.story.tsx +20 -0
  494. package/src/icon-button/types.ts +9 -0
  495. package/src/link/stories/index.story.tsx +6 -0
  496. package/src/link/style.module.css +1 -0
  497. package/src/notice/stories/index.story.tsx +7 -0
  498. package/src/popover/popup.tsx +2 -2
  499. package/src/popover/stories/index.story.tsx +7 -0
  500. package/src/stack/stories/index.story.tsx +6 -0
  501. package/src/tabs/stories/index.story.tsx +15 -1
  502. package/src/text/stories/index.story.tsx +6 -0
  503. package/src/text/style.module.css +25 -0
  504. package/src/tooltip/index.ts +2 -1
  505. package/src/tooltip/popup.tsx +30 -38
  506. package/src/tooltip/positioner.tsx +36 -0
  507. package/src/tooltip/stories/index.story.tsx +61 -10
  508. package/src/tooltip/stories/usage-guidelines.story.tsx +5 -0
  509. package/src/tooltip/types.ts +14 -3
  510. package/src/utils/css/dropdown-motion.module.css +3 -3
  511. package/src/utils/css/item-popup.module.css +5 -1
  512. package/src/utils/css/overlay-chrome.module.css +21 -4
  513. package/src/utils/css/select-trigger.module.css +5 -2
  514. package/src/utils/render-slot-with-children.ts +31 -0
  515. package/src/visually-hidden/stories/index.story.tsx +6 -0
  516. package/build/utils/render-portal-with-children.cjs.map +0 -7
  517. package/build-module/utils/render-portal-with-children.mjs +0 -12
  518. package/build-module/utils/render-portal-with-children.mjs.map +0 -7
  519. package/build-types/utils/render-portal-with-children.d.ts +0 -16
  520. package/build-types/utils/render-portal-with-children.d.ts.map +0 -1
  521. package/src/utils/render-portal-with-children.ts +0 -27
@@ -0,0 +1,65 @@
1
+ import { forwardRef } from '@wordpress/element';
2
+ import { Field, Select } from '../primitives';
3
+ import { SelectControlSizeContext } from './context';
4
+ import { Item } from './item';
5
+ import type { SelectControlProps } from './types';
6
+
7
+ /**
8
+ * A complete select field with integrated label and description.
9
+ */
10
+ export const SelectControl = forwardRef<
11
+ HTMLButtonElement,
12
+ SelectControlProps
13
+ >( function SelectControl(
14
+ {
15
+ className,
16
+ children,
17
+ items,
18
+ label,
19
+ description,
20
+ details,
21
+ hideLabelFromVision,
22
+ placeholder,
23
+ size = 'default',
24
+ triggerContent,
25
+ ...restProps
26
+ },
27
+ ref
28
+ ) {
29
+ return (
30
+ <Field.Root className={ className }>
31
+ <Field.Label hideFromVision={ hideLabelFromVision }>
32
+ { label }
33
+ </Field.Label>
34
+ <Select.Root items={ items } { ...restProps }>
35
+ <Select.Trigger
36
+ ref={ ref }
37
+ placeholder={ placeholder }
38
+ size={ size }
39
+ >
40
+ { triggerContent }
41
+ </Select.Trigger>
42
+ <Select.Popup>
43
+ <SelectControlSizeContext.Provider value={ size }>
44
+ { children !== undefined
45
+ ? children
46
+ : items?.map( ( item ) => (
47
+ <Item
48
+ key={ item.value ?? 'null' }
49
+ value={ item }
50
+ label={ item.label }
51
+ disabled={ item.disabled }
52
+ >
53
+ { item.label }
54
+ </Item>
55
+ ) ) }
56
+ </SelectControlSizeContext.Provider>
57
+ </Select.Popup>
58
+ </Select.Root>
59
+ { description && (
60
+ <Field.Description>{ description }</Field.Description>
61
+ ) }
62
+ { details && <Field.Details>{ details }</Field.Details> }
63
+ </Field.Root>
64
+ );
65
+ } );
@@ -0,0 +1,220 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { SelectControl } from '../';
3
+ import {
4
+ WITH_DETAILS_DESCRIPTION,
5
+ DETAILS_EXAMPLE,
6
+ } from '../../stories/shared';
7
+
8
+ const meta: Meta< typeof SelectControl > = {
9
+ title: 'Design System/Components/Form/SelectControl',
10
+ component: SelectControl,
11
+ subcomponents: {
12
+ 'SelectControl.Item': SelectControl.Item,
13
+ },
14
+ argTypes: {
15
+ onValueChange: { action: 'onValueChange' },
16
+ },
17
+ };
18
+
19
+ export default meta;
20
+
21
+ type Story = StoryObj< typeof SelectControl >;
22
+
23
+ const defaultItems = [
24
+ {
25
+ value: '1',
26
+ label: 'Item 1',
27
+ },
28
+ {
29
+ value: '2',
30
+ label: 'Item 2',
31
+ },
32
+ ];
33
+
34
+ export const Default: Story = {
35
+ args: {
36
+ items: defaultItems,
37
+ label: 'Label',
38
+ description: 'This is the description.',
39
+ },
40
+ };
41
+
42
+ /**
43
+ * When no value is selected, the trigger shows the default placeholder text.
44
+ *
45
+ * Use the `placeholder` prop to customize text shown.
46
+ * Prefer a concise label without a trailing ellipsis.
47
+ */
48
+ export const WithCustomPlaceholder: Story = {
49
+ args: {
50
+ ...Default.args,
51
+ placeholder: 'Choose an item',
52
+ },
53
+ };
54
+
55
+ const nullValueOptionItems = [
56
+ {
57
+ value: null,
58
+ label: 'Select theme',
59
+ },
60
+ {
61
+ value: 'system',
62
+ label: 'System default',
63
+ },
64
+ {
65
+ value: 'light',
66
+ label: 'Light',
67
+ },
68
+ {
69
+ value: 'dark',
70
+ label: 'Dark',
71
+ },
72
+ ];
73
+
74
+ /**
75
+ * Use a `null` item value when users should be able to clear the selected value
76
+ * from the popup.
77
+ */
78
+ export const WithNullValueOption: Story = {
79
+ args: {
80
+ items: nullValueOptionItems,
81
+ label: 'Theme',
82
+ description: 'Choose a theme preference.',
83
+ defaultValue: nullValueOptionItems[ 0 ],
84
+ },
85
+ };
86
+
87
+ export const VisuallyHiddenLabel: Story = {
88
+ args: {
89
+ ...Default.args,
90
+ hideLabelFromVision: true,
91
+ },
92
+ };
93
+
94
+ export const WithDetails: Story = {
95
+ parameters: {
96
+ docs: { description: { story: WITH_DETAILS_DESCRIPTION } },
97
+ },
98
+ args: {
99
+ ...Default.args,
100
+ description: undefined,
101
+ details: DETAILS_EXAMPLE,
102
+ },
103
+ };
104
+
105
+ const disabledOptionItems = [
106
+ {
107
+ value: '1',
108
+ label: 'Item 1',
109
+ },
110
+ {
111
+ value: '2',
112
+ label: 'Item 2',
113
+ disabled: true,
114
+ },
115
+ ];
116
+
117
+ export const WithDisabledOption: Story = {
118
+ args: {
119
+ items: disabledOptionItems,
120
+ label: 'Label',
121
+ description: 'This is the description.',
122
+ defaultValue: disabledOptionItems[ 0 ],
123
+ },
124
+ };
125
+
126
+ const userOptions: React.ComponentProps< typeof SelectControl >[ 'items' ] = [
127
+ {
128
+ value: '1',
129
+ label: 'User 1 (Admin)',
130
+ },
131
+ {
132
+ value: '2',
133
+ label: 'User 2 (Editor)',
134
+ },
135
+ {
136
+ value: '3',
137
+ label: 'User 3 (Author)',
138
+ },
139
+ ];
140
+
141
+ const User = ( { user }: { user: ( typeof userOptions )[ number ] } ) => (
142
+ <span
143
+ style={ {
144
+ display: 'flex',
145
+ alignItems: 'center',
146
+ gap: 8,
147
+ } }
148
+ >
149
+ <img
150
+ src={ `https://gravatar.com/avatar/?d=initials&name=${
151
+ user.value ?? 'null'
152
+ }` }
153
+ alt=""
154
+ width="20"
155
+ style={ {
156
+ borderRadius: '50%',
157
+ } }
158
+ />
159
+ { user.label }
160
+ </span>
161
+ );
162
+
163
+ /**
164
+ * To customize what is rendered inside the trigger element, pass a
165
+ * render function to the `triggerContent` prop.
166
+ *
167
+ * The item list can be customized by passing an array of
168
+ * `SelectControl.Item` as children. Note that the `label` prop of a `SelectControl.Item`
169
+ * is used as the string to match against in the typeahead functionality, while the
170
+ * item content is determined by `children`.
171
+ */
172
+ export const WithCustomTriggerAndItems: Story = {
173
+ args: {
174
+ items: userOptions,
175
+ label: 'Label',
176
+ description: 'This is the description.',
177
+ triggerContent: ( item ) => <User user={ item } />,
178
+ children: (
179
+ <>
180
+ { userOptions.map( ( item ) => (
181
+ <SelectControl.Item
182
+ key={ item.value }
183
+ value={ item }
184
+ label={ item.label }
185
+ >
186
+ <User user={ item } />
187
+ </SelectControl.Item>
188
+ ) ) }
189
+ </>
190
+ ),
191
+ defaultValue: userOptions[ 0 ],
192
+ },
193
+ };
194
+
195
+ /**
196
+ * By default, the `items` array is used to render both the Trigger
197
+ * and the Item list. Passing a custom `triggerContent` or `children` in addition
198
+ * to `items` will override that particular aspect of the behavior.
199
+ * In other words, if you pass both an `items` array and a custom `triggerContent`,
200
+ * the Item list in the popover will still be rendered based on the `items` array.
201
+ */
202
+ export const WithItemsArrayAndPartialCustomization: Story = {
203
+ args: {
204
+ ...Default.args,
205
+ children: (
206
+ <>
207
+ { Default.args?.items?.map( ( item ) => (
208
+ <SelectControl.Item
209
+ key={ item.value ?? 'null' }
210
+ value={ item }
211
+ label={ item.label }
212
+ disabled={ item.disabled }
213
+ >
214
+ ✨ { item.label }
215
+ </SelectControl.Item>
216
+ ) ) }
217
+ </>
218
+ ),
219
+ },
220
+ };
@@ -0,0 +1,196 @@
1
+ import { act, render, screen } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { createRef } from '@wordpress/element';
4
+ import { SelectControl } from '../index';
5
+
6
+ describe( 'SelectControl', () => {
7
+ const mockItems = [
8
+ { value: '', label: 'Select' },
9
+ { value: 'option1', label: 'Option 1' },
10
+ { value: 'option2', label: 'Option 2' },
11
+ { value: 'option3', label: 'Option 3' },
12
+ ];
13
+
14
+ it( 'forwards ref to the visible trigger', () => {
15
+ const ref = createRef< HTMLButtonElement >();
16
+
17
+ render(
18
+ <SelectControl ref={ ref } label="Country" items={ mockItems } />
19
+ );
20
+
21
+ const trigger = screen.getByRole( 'combobox', { name: 'Country' } );
22
+
23
+ expect( ref.current ).toBe( trigger );
24
+ act( () => {
25
+ ref.current?.focus();
26
+ } );
27
+ expect( trigger ).toHaveFocus();
28
+ } );
29
+
30
+ it( 'renders accessible label and description', () => {
31
+ render(
32
+ <SelectControl
33
+ label="Country"
34
+ description="Choose your country"
35
+ items={ mockItems }
36
+ />
37
+ );
38
+
39
+ expect(
40
+ screen.getByRole( 'combobox', {
41
+ name: 'Country',
42
+ description: 'Choose your country',
43
+ } )
44
+ ).toBeVisible();
45
+ } );
46
+
47
+ it( 'renders custom placeholder text when no value is selected', () => {
48
+ render(
49
+ <SelectControl
50
+ label="Country"
51
+ items={ mockItems }
52
+ placeholder="Choose a country"
53
+ />
54
+ );
55
+
56
+ expect(
57
+ screen.getByRole( 'combobox', {
58
+ name: 'Country',
59
+ } )
60
+ ).toHaveTextContent( 'Choose a country' );
61
+ } );
62
+
63
+ it( 'renders with a visually hidden label', () => {
64
+ render(
65
+ <SelectControl
66
+ label="Country"
67
+ hideLabelFromVision
68
+ items={ mockItems }
69
+ />
70
+ );
71
+
72
+ expect(
73
+ screen.getByRole( 'combobox', { name: 'Country' } )
74
+ ).toBeVisible();
75
+ } );
76
+
77
+ it( 'renders with details', () => {
78
+ render(
79
+ <SelectControl
80
+ label="Country"
81
+ items={ mockItems }
82
+ details={
83
+ <span>
84
+ Select the country where your store is registered.
85
+ </span>
86
+ }
87
+ />
88
+ );
89
+
90
+ expect(
91
+ screen.getByText( /where your store is registered/ )
92
+ ).toBeVisible();
93
+ } );
94
+
95
+ it( 'passes the current value to custom trigger content', async () => {
96
+ const user = userEvent.setup();
97
+
98
+ render(
99
+ <SelectControl
100
+ label="Country"
101
+ items={ mockItems }
102
+ defaultValue={ mockItems[ 1 ] }
103
+ triggerContent={ ( item ) => `Selected ${ item.label }` }
104
+ />
105
+ );
106
+
107
+ const trigger = screen.getByRole( 'combobox', {
108
+ name: 'Country',
109
+ } );
110
+
111
+ expect( trigger ).toHaveTextContent( 'Selected Option 1' );
112
+
113
+ await user.click( trigger );
114
+ await user.click(
115
+ await screen.findByRole( 'option', {
116
+ name: 'Option 2',
117
+ } )
118
+ );
119
+
120
+ expect( trigger ).toHaveTextContent( 'Selected Option 2' );
121
+ } );
122
+
123
+ describe( 'Form data behavior', () => {
124
+ it( 'submits correct form data when option is selected with custom name', async () => {
125
+ const user = userEvent.setup();
126
+ const handleSubmit = jest.fn(
127
+ ( event: React.FormEvent< HTMLFormElement > ) => {
128
+ event.preventDefault();
129
+ return new FormData( event.currentTarget );
130
+ }
131
+ );
132
+
133
+ render(
134
+ <form onSubmit={ handleSubmit }>
135
+ <SelectControl
136
+ label="Country"
137
+ name="country"
138
+ items={ mockItems }
139
+ />
140
+ <button type="submit">Submit</button>
141
+ </form>
142
+ );
143
+
144
+ await user.click(
145
+ screen.getByRole( 'combobox', {
146
+ name: 'Country',
147
+ } )
148
+ );
149
+
150
+ const optionToSelect = await screen.findByRole( 'option', {
151
+ name: /Option 2/i,
152
+ } );
153
+ await user.click( optionToSelect );
154
+
155
+ await user.click(
156
+ screen.getByRole( 'button', {
157
+ name: 'Submit',
158
+ } )
159
+ );
160
+
161
+ const formData = handleSubmit.mock.results[ 0 ].value;
162
+ expect( formData.get( 'country' ) ).toBe( 'option2' );
163
+ } );
164
+
165
+ it( 'submits form data with default value when no selection is made', async () => {
166
+ const user = userEvent.setup();
167
+ const handleSubmit = jest.fn(
168
+ ( event: React.FormEvent< HTMLFormElement > ) => {
169
+ event.preventDefault();
170
+ return new FormData( event.currentTarget );
171
+ }
172
+ );
173
+
174
+ render(
175
+ <form onSubmit={ handleSubmit }>
176
+ <SelectControl
177
+ label="Country"
178
+ name="country"
179
+ items={ mockItems }
180
+ defaultValue={ mockItems[ 0 ] }
181
+ />
182
+ <button type="submit">Submit</button>
183
+ </form>
184
+ );
185
+
186
+ await user.click(
187
+ screen.getByRole( 'button', {
188
+ name: 'Submit',
189
+ } )
190
+ );
191
+
192
+ const formData = handleSubmit.mock.results[ 0 ].value;
193
+ expect( formData.get( 'country' ) ).toBe( '' );
194
+ } );
195
+ } );
196
+ } );
@@ -0,0 +1,50 @@
1
+ import type React from 'react';
2
+ import type { ControlProps } from '../types';
3
+ import type {
4
+ SelectRootProps,
5
+ SelectTriggerProps,
6
+ } from '../primitives/select/types';
7
+
8
+ export type SelectItem = {
9
+ label: string;
10
+ value: string | null;
11
+ disabled?: boolean;
12
+ };
13
+
14
+ export type SelectControlProps = Omit<
15
+ SelectRootProps< SelectItem >,
16
+ 'items' | 'inputRef'
17
+ > &
18
+ ControlProps & {
19
+ /**
20
+ * CSS class to apply.
21
+ */
22
+ className?: string;
23
+ /**
24
+ * The array of option items to render in the select.
25
+ */
26
+ items?: SelectItem[];
27
+ /**
28
+ * Text to show when no value is selected. This is overridden by `triggerContent`
29
+ * if specified, or by a null item's label in `items`.
30
+ *
31
+ * @default __( 'Select' )
32
+ */
33
+ placeholder?: SelectTriggerProps[ 'placeholder' ];
34
+ /**
35
+ * The custom trigger content to use instead of the default.
36
+ *
37
+ * ```jsx
38
+ * triggerContent={ ( item ) => item.label }
39
+ * ```
40
+ */
41
+ triggerContent?:
42
+ | ( ( item: SelectItem ) => React.ReactNode )
43
+ | React.ReactNode;
44
+ /**
45
+ * The size of the control.
46
+ *
47
+ * @default 'default'
48
+ */
49
+ size?: Exclude< SelectTriggerProps[ 'size' ], 'small' >;
50
+ };
package/src/form/types.ts CHANGED
@@ -4,7 +4,7 @@ export type ControlProps = {
4
4
  /**
5
5
  * The accessible label. All controls must be labeled.
6
6
  */
7
- label: React.ComponentProps< typeof Field.Label >[ 'children' ];
7
+ label: string;
8
8
  /**
9
9
  * The accessible description, associated using `aria-describedby`.
10
10
  *
@@ -18,6 +18,13 @@ const meta: Meta< typeof Icon > = {
18
18
  );
19
19
  },
20
20
  ],
21
+ parameters: {
22
+ componentStatus: {
23
+ status: 'use-with-caution',
24
+ whereUsed: 'global',
25
+ notes: 'Not yet recommended for use alongside components from `@wordpress/components`, pending a general readiness review. See [WordPress/gutenberg#76135](https://github.com/WordPress/gutenberg/issues/76135).',
26
+ },
27
+ },
21
28
  };
22
29
  export default meta;
23
30
 
@@ -22,6 +22,7 @@ export const IconButton = forwardRef< HTMLButtonElement, IconButtonProps >(
22
22
  icon,
23
23
  size,
24
24
  shortcut,
25
+ positioner,
25
26
  ...restProps
26
27
  }: IconButtonProps & { children?: unknown },
27
28
  ref
@@ -52,7 +53,7 @@ export const IconButton = forwardRef< HTMLButtonElement, IconButtonProps >(
52
53
  className={ styles.icon }
53
54
  />
54
55
  </Tooltip.Trigger>
55
- <Tooltip.Popup>
56
+ <Tooltip.Popup positioner={ positioner }>
56
57
  { label }
57
58
  { shortcut && (
58
59
  <>
@@ -11,6 +11,7 @@ import {
11
11
  } from '@wordpress/icons';
12
12
  import { displayShortcut, ariaKeyShortcut } from '@wordpress/keycodes';
13
13
  import { IconButton } from '../index';
14
+ import * as Tooltip from '../../tooltip';
14
15
 
15
16
  const meta: Meta< typeof IconButton > = {
16
17
  title: 'Design System/Components/IconButton',
@@ -20,6 +21,13 @@ const meta: Meta< typeof IconButton > = {
20
21
  control: { type: 'boolean' },
21
22
  },
22
23
  },
24
+ parameters: {
25
+ componentStatus: {
26
+ status: 'use-with-caution',
27
+ whereUsed: 'global',
28
+ notes: 'Not yet recommended for use alongside components from `@wordpress/components`, pending review of style consistency with `@wordpress/components`, text overflow behavior, and overlays compatibility. See [WordPress/gutenberg#76135](https://github.com/WordPress/gutenberg/issues/76135).',
29
+ },
30
+ },
23
31
  };
24
32
  export default meta;
25
33
 
@@ -126,3 +134,15 @@ export const WithShortcut: Story = {
126
134
  shortcut: EXAMPLE_SHORTCUT_OBJECT,
127
135
  },
128
136
  };
137
+
138
+ /**
139
+ * Customize where the tooltip appears relative to the button by passing a
140
+ * `<Tooltip.Positioner />` element with a `side` to the `positioner` prop.
141
+ */
142
+ export const WithCustomPositioner: Story = {
143
+ ...Default,
144
+ args: {
145
+ ...Default.args,
146
+ positioner: <Tooltip.Positioner side="right" />,
147
+ },
148
+ };
@@ -1,5 +1,6 @@
1
1
  import { type ButtonProps } from '../button/types';
2
2
  import { type IconProps } from '../icon/types';
3
+ import { type PopupProps as TooltipPopupProps } from '../tooltip/types';
3
4
 
4
5
  export type IconButtonProps = Omit< ButtonProps, 'children' > & {
5
6
  /**
@@ -35,4 +36,12 @@ export type IconButtonProps = Omit< ButtonProps, 'children' > & {
35
36
  */
36
37
  ariaKeyShortcut: string;
37
38
  };
39
+
40
+ /**
41
+ * Customize how the tooltip is positioned relative to the button. Accepts
42
+ * a `<Tooltip.Positioner />` element with custom positioning props
43
+ * (`side`, `align`, `sideOffset`, collision settings, etc.). When omitted,
44
+ * the tooltip uses the default placement.
45
+ */
46
+ positioner?: TooltipPopupProps[ 'positioner' ];
38
47
  };
@@ -7,6 +7,12 @@ const meta: Meta< typeof Link > = {
7
7
  title: 'Design System/Components/Link',
8
8
  component: Link,
9
9
  tags: [ 'manifest' ],
10
+ parameters: {
11
+ componentStatus: {
12
+ status: 'recommended',
13
+ whereUsed: 'global',
14
+ },
15
+ },
10
16
  };
11
17
  export default meta;
12
18
 
@@ -50,6 +50,7 @@
50
50
  * inline-block so the link underline stays scoped to the text. */
51
51
 
52
52
  .link-icon {
53
+ line-height: 1;
53
54
  display: inline-block;
54
55
  margin-inline-start: var(--wpds-dimension-padding-xs);
55
56
  font-weight: var(--wpds-typography-font-weight-regular);
@@ -12,6 +12,13 @@ const meta: Meta< typeof Notice.Root > = {
12
12
  'Notice.ActionButton': Notice.ActionButton,
13
13
  'Notice.ActionLink': Notice.ActionLink,
14
14
  },
15
+ parameters: {
16
+ componentStatus: {
17
+ status: 'use-with-caution',
18
+ whereUsed: 'global',
19
+ notes: 'Not yet recommended for use alongside components from `@wordpress/components`, pending review of style consistency with `@wordpress/components`. See [WordPress/gutenberg#76135](https://github.com/WordPress/gutenberg/issues/76135).',
20
+ },
21
+ },
15
22
  };
16
23
  export default meta;
17
24
 
@@ -9,7 +9,7 @@ import {
9
9
  import { unlock } from '../lock-unlock';
10
10
  import resetStyles from '../utils/css/resets.module.css';
11
11
  import { useDeprioritizedInitialFocus } from '../utils/use-deprioritized-initial-focus';
12
- import { renderPortalWithChildren } from '../utils/render-portal-with-children';
12
+ import { renderSlotWithChildren } from '../utils/render-slot-with-children';
13
13
  import { PopoverValidationProvider } from './context';
14
14
  import { Portal } from './portal';
15
15
  import styles from './style.module.css';
@@ -102,7 +102,7 @@ const Popup = forwardRef< HTMLDivElement, PopupProps >( function PopoverPopup(
102
102
  </>
103
103
  );
104
104
 
105
- return renderPortalWithChildren( portal, <Portal />, portalChildren );
105
+ return renderSlotWithChildren( portal, <Portal />, portalChildren );
106
106
  } );
107
107
 
108
108
  export { Popup };
@@ -23,6 +23,13 @@ const meta: Meta< typeof Popover.Root > = {
23
23
  argTypes: {
24
24
  children: { control: false },
25
25
  },
26
+ parameters: {
27
+ componentStatus: {
28
+ status: 'use-with-caution',
29
+ whereUsed: 'global',
30
+ notes: 'Not yet recommended for use alongside components from `@wordpress/components`, pending review of overlays compatibility. See [WordPress/gutenberg#76135](https://github.com/WordPress/gutenberg/issues/76135).',
31
+ },
32
+ },
26
33
  };
27
34
  export default meta;
28
35