@wordpress/ui 0.10.0 → 0.11.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 (454) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/CONTRIBUTING.md +149 -0
  3. package/README.md +34 -6
  4. package/build/alert-dialog/context.cjs +6 -1
  5. package/build/alert-dialog/context.cjs.map +2 -2
  6. package/build/alert-dialog/popup.cjs +105 -33
  7. package/build/alert-dialog/popup.cjs.map +4 -4
  8. package/build/alert-dialog/root.cjs +106 -6
  9. package/build/alert-dialog/root.cjs.map +2 -2
  10. package/build/alert-dialog/trigger.cjs +4 -14
  11. package/build/alert-dialog/trigger.cjs.map +3 -3
  12. package/build/alert-dialog/types.cjs.map +1 -1
  13. package/build/badge/badge.cjs +14 -14
  14. package/build/badge/badge.cjs.map +2 -2
  15. package/build/button/button.cjs +16 -6
  16. package/build/button/button.cjs.map +3 -3
  17. package/build/card/content.cjs +4 -4
  18. package/build/card/content.cjs.map +2 -2
  19. package/build/card/full-bleed.cjs +4 -4
  20. package/build/card/full-bleed.cjs.map +2 -2
  21. package/build/card/header.cjs +4 -4
  22. package/build/card/header.cjs.map +2 -2
  23. package/build/card/root.cjs +4 -4
  24. package/build/card/root.cjs.map +2 -2
  25. package/build/card/title.cjs +5 -25
  26. package/build/card/title.cjs.map +4 -4
  27. package/build/collapsible-card/content.cjs +3 -3
  28. package/build/collapsible-card/content.cjs.map +1 -1
  29. package/build/collapsible-card/header.cjs +6 -6
  30. package/build/collapsible-card/header.cjs.map +2 -2
  31. package/build/dialog/footer.cjs +3 -3
  32. package/build/dialog/footer.cjs.map +2 -2
  33. package/build/dialog/header.cjs +3 -3
  34. package/build/dialog/header.cjs.map +2 -2
  35. package/build/dialog/popup.cjs +5 -4
  36. package/build/dialog/popup.cjs.map +2 -2
  37. package/build/dialog/title.cjs +10 -19
  38. package/build/dialog/title.cjs.map +3 -3
  39. package/build/dialog/types.cjs.map +1 -1
  40. package/build/empty-state/actions.cjs +3 -3
  41. package/build/empty-state/actions.cjs.map +2 -2
  42. package/build/empty-state/description.cjs +8 -5
  43. package/build/empty-state/description.cjs.map +2 -2
  44. package/build/empty-state/icon.cjs +3 -3
  45. package/build/empty-state/icon.cjs.map +2 -2
  46. package/build/empty-state/root.cjs +3 -3
  47. package/build/empty-state/root.cjs.map +2 -2
  48. package/build/empty-state/title.cjs +8 -5
  49. package/build/empty-state/title.cjs.map +2 -2
  50. package/build/empty-state/visual.cjs +3 -3
  51. package/build/empty-state/visual.cjs.map +2 -2
  52. package/build/form/primitives/field/description.cjs +17 -4
  53. package/build/form/primitives/field/description.cjs.map +3 -3
  54. package/build/form/primitives/field/details.cjs +4 -4
  55. package/build/form/primitives/field/details.cjs.map +2 -2
  56. package/build/form/primitives/field/label.cjs +8 -8
  57. package/build/form/primitives/field/label.cjs.map +2 -2
  58. package/build/form/primitives/field/root.cjs +2 -2
  59. package/build/form/primitives/field/root.cjs.map +2 -2
  60. package/build/form/primitives/fieldset/description.cjs +20 -4
  61. package/build/form/primitives/fieldset/description.cjs.map +3 -3
  62. package/build/form/primitives/fieldset/details.cjs +3 -3
  63. package/build/form/primitives/fieldset/details.cjs.map +2 -2
  64. package/build/form/primitives/fieldset/legend.cjs +8 -7
  65. package/build/form/primitives/fieldset/legend.cjs.map +2 -2
  66. package/build/form/primitives/input/input.cjs +23 -7
  67. package/build/form/primitives/input/input.cjs.map +3 -3
  68. package/build/form/primitives/input-layout/input-layout.cjs +13 -3
  69. package/build/form/primitives/input-layout/input-layout.cjs.map +3 -3
  70. package/build/form/primitives/input-layout/slot.cjs +3 -3
  71. package/build/form/primitives/input-layout/slot.cjs.map +2 -2
  72. package/build/form/primitives/select/item.cjs +3 -3
  73. package/build/form/primitives/select/item.cjs.map +2 -2
  74. package/build/form/primitives/select/popup.cjs +5 -5
  75. package/build/form/primitives/select/popup.cjs.map +2 -2
  76. package/build/form/primitives/select/trigger.cjs +6 -6
  77. package/build/form/primitives/select/trigger.cjs.map +2 -2
  78. package/build/form/primitives/select/types.cjs.map +1 -1
  79. package/build/form/primitives/textarea/textarea.cjs +20 -1
  80. package/build/form/primitives/textarea/textarea.cjs.map +3 -3
  81. package/build/index.cjs +3 -0
  82. package/build/index.cjs.map +2 -2
  83. package/build/link/link.cjs +16 -6
  84. package/build/link/link.cjs.map +3 -3
  85. package/build/notice/action-button.cjs +3 -3
  86. package/build/notice/action-button.cjs.map +2 -2
  87. package/build/notice/action-link.cjs +3 -3
  88. package/build/notice/action-link.cjs.map +2 -2
  89. package/build/notice/actions.cjs +3 -3
  90. package/build/notice/actions.cjs.map +2 -2
  91. package/build/notice/close-icon.cjs +3 -3
  92. package/build/notice/close-icon.cjs.map +2 -2
  93. package/build/notice/description.cjs +3 -3
  94. package/build/notice/description.cjs.map +2 -2
  95. package/build/notice/root.cjs +3 -3
  96. package/build/notice/root.cjs.map +2 -2
  97. package/build/notice/title.cjs +3 -3
  98. package/build/notice/title.cjs.map +2 -2
  99. package/build/popover/arrow.cjs +94 -0
  100. package/build/popover/arrow.cjs.map +7 -0
  101. package/build/popover/close.cjs +45 -0
  102. package/build/popover/close.cjs.map +7 -0
  103. package/build/popover/context.cjs +76 -0
  104. package/build/popover/context.cjs.map +7 -0
  105. package/build/popover/description.cjs +70 -0
  106. package/build/popover/description.cjs.map +7 -0
  107. package/build/popover/index.cjs +49 -0
  108. package/build/popover/index.cjs.map +7 -0
  109. package/build/popover/popup.cjs +138 -0
  110. package/build/popover/popup.cjs.map +7 -0
  111. package/build/popover/root.cjs +35 -0
  112. package/build/popover/root.cjs.map +7 -0
  113. package/build/popover/title.cjs +56 -0
  114. package/build/popover/title.cjs.map +7 -0
  115. package/build/popover/trigger.cjs +38 -0
  116. package/build/popover/trigger.cjs.map +7 -0
  117. package/build/popover/types.cjs +19 -0
  118. package/build/popover/types.cjs.map +7 -0
  119. package/build/tabs/list.cjs +3 -4
  120. package/build/tabs/list.cjs.map +2 -2
  121. package/build/tabs/panel.cjs +3 -3
  122. package/build/tabs/panel.cjs.map +2 -2
  123. package/build/tabs/tab.cjs +3 -3
  124. package/build/tabs/tab.cjs.map +2 -2
  125. package/build/text/text.cjs +20 -5
  126. package/build/text/text.cjs.map +3 -3
  127. package/build/tooltip/popup.cjs +5 -4
  128. package/build/tooltip/popup.cjs.map +2 -2
  129. package/build/tooltip/root.cjs.map +2 -2
  130. package/build/tooltip/types.cjs.map +1 -1
  131. package/build/utils/types.cjs.map +1 -1
  132. package/build/utils/use-deprioritized-initial-focus.cjs.map +2 -2
  133. package/build/visually-hidden/visually-hidden.cjs.map +2 -2
  134. package/build-module/alert-dialog/context.mjs +6 -1
  135. package/build-module/alert-dialog/context.mjs.map +2 -2
  136. package/build-module/alert-dialog/popup.mjs +107 -33
  137. package/build-module/alert-dialog/popup.mjs.map +4 -4
  138. package/build-module/alert-dialog/root.mjs +113 -7
  139. package/build-module/alert-dialog/root.mjs.map +2 -2
  140. package/build-module/alert-dialog/trigger.mjs +4 -4
  141. package/build-module/alert-dialog/trigger.mjs.map +3 -3
  142. package/build-module/badge/badge.mjs +14 -14
  143. package/build-module/badge/badge.mjs.map +2 -2
  144. package/build-module/button/button.mjs +16 -6
  145. package/build-module/button/button.mjs.map +3 -3
  146. package/build-module/card/content.mjs +4 -4
  147. package/build-module/card/content.mjs.map +2 -2
  148. package/build-module/card/full-bleed.mjs +4 -4
  149. package/build-module/card/full-bleed.mjs.map +2 -2
  150. package/build-module/card/header.mjs +4 -4
  151. package/build-module/card/header.mjs.map +2 -2
  152. package/build-module/card/root.mjs +4 -4
  153. package/build-module/card/root.mjs.map +2 -2
  154. package/build-module/card/title.mjs +5 -15
  155. package/build-module/card/title.mjs.map +3 -3
  156. package/build-module/collapsible-card/content.mjs +3 -3
  157. package/build-module/collapsible-card/content.mjs.map +1 -1
  158. package/build-module/collapsible-card/header.mjs +6 -6
  159. package/build-module/collapsible-card/header.mjs.map +2 -2
  160. package/build-module/dialog/footer.mjs +3 -3
  161. package/build-module/dialog/footer.mjs.map +2 -2
  162. package/build-module/dialog/header.mjs +3 -3
  163. package/build-module/dialog/header.mjs.map +2 -2
  164. package/build-module/dialog/popup.mjs +5 -4
  165. package/build-module/dialog/popup.mjs.map +2 -2
  166. package/build-module/dialog/title.mjs +10 -9
  167. package/build-module/dialog/title.mjs.map +2 -2
  168. package/build-module/empty-state/actions.mjs +3 -3
  169. package/build-module/empty-state/actions.mjs.map +2 -2
  170. package/build-module/empty-state/description.mjs +8 -5
  171. package/build-module/empty-state/description.mjs.map +2 -2
  172. package/build-module/empty-state/icon.mjs +3 -3
  173. package/build-module/empty-state/icon.mjs.map +2 -2
  174. package/build-module/empty-state/root.mjs +3 -3
  175. package/build-module/empty-state/root.mjs.map +2 -2
  176. package/build-module/empty-state/title.mjs +8 -5
  177. package/build-module/empty-state/title.mjs.map +2 -2
  178. package/build-module/empty-state/visual.mjs +3 -3
  179. package/build-module/empty-state/visual.mjs.map +2 -2
  180. package/build-module/form/primitives/field/description.mjs +17 -4
  181. package/build-module/form/primitives/field/description.mjs.map +3 -3
  182. package/build-module/form/primitives/field/details.mjs +4 -4
  183. package/build-module/form/primitives/field/details.mjs.map +2 -2
  184. package/build-module/form/primitives/field/label.mjs +8 -8
  185. package/build-module/form/primitives/field/label.mjs.map +2 -2
  186. package/build-module/form/primitives/field/root.mjs +2 -2
  187. package/build-module/form/primitives/field/root.mjs.map +2 -2
  188. package/build-module/form/primitives/fieldset/description.mjs +20 -4
  189. package/build-module/form/primitives/fieldset/description.mjs.map +3 -3
  190. package/build-module/form/primitives/fieldset/details.mjs +3 -3
  191. package/build-module/form/primitives/fieldset/details.mjs.map +2 -2
  192. package/build-module/form/primitives/fieldset/legend.mjs +8 -7
  193. package/build-module/form/primitives/fieldset/legend.mjs.map +2 -2
  194. package/build-module/form/primitives/input/input.mjs +23 -7
  195. package/build-module/form/primitives/input/input.mjs.map +3 -3
  196. package/build-module/form/primitives/input-layout/input-layout.mjs +13 -3
  197. package/build-module/form/primitives/input-layout/input-layout.mjs.map +3 -3
  198. package/build-module/form/primitives/input-layout/slot.mjs +3 -3
  199. package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
  200. package/build-module/form/primitives/select/item.mjs +3 -3
  201. package/build-module/form/primitives/select/item.mjs.map +2 -2
  202. package/build-module/form/primitives/select/popup.mjs +5 -5
  203. package/build-module/form/primitives/select/popup.mjs.map +2 -2
  204. package/build-module/form/primitives/select/trigger.mjs +6 -6
  205. package/build-module/form/primitives/select/trigger.mjs.map +2 -2
  206. package/build-module/form/primitives/textarea/textarea.mjs +20 -1
  207. package/build-module/form/primitives/textarea/textarea.mjs.map +3 -3
  208. package/build-module/index.mjs +2 -0
  209. package/build-module/index.mjs.map +2 -2
  210. package/build-module/link/link.mjs +16 -6
  211. package/build-module/link/link.mjs.map +3 -3
  212. package/build-module/notice/action-button.mjs +3 -3
  213. package/build-module/notice/action-button.mjs.map +2 -2
  214. package/build-module/notice/action-link.mjs +3 -3
  215. package/build-module/notice/action-link.mjs.map +2 -2
  216. package/build-module/notice/actions.mjs +3 -3
  217. package/build-module/notice/actions.mjs.map +2 -2
  218. package/build-module/notice/close-icon.mjs +3 -3
  219. package/build-module/notice/close-icon.mjs.map +2 -2
  220. package/build-module/notice/description.mjs +3 -3
  221. package/build-module/notice/description.mjs.map +2 -2
  222. package/build-module/notice/root.mjs +3 -3
  223. package/build-module/notice/root.mjs.map +2 -2
  224. package/build-module/notice/title.mjs +3 -3
  225. package/build-module/notice/title.mjs.map +2 -2
  226. package/build-module/popover/arrow.mjs +59 -0
  227. package/build-module/popover/arrow.mjs.map +7 -0
  228. package/build-module/popover/close.mjs +20 -0
  229. package/build-module/popover/close.mjs.map +7 -0
  230. package/build-module/popover/context.mjs +57 -0
  231. package/build-module/popover/context.mjs.map +7 -0
  232. package/build-module/popover/description.mjs +35 -0
  233. package/build-module/popover/description.mjs.map +7 -0
  234. package/build-module/popover/index.mjs +18 -0
  235. package/build-module/popover/index.mjs.map +7 -0
  236. package/build-module/popover/popup.mjs +105 -0
  237. package/build-module/popover/popup.mjs.map +7 -0
  238. package/build-module/popover/root.mjs +10 -0
  239. package/build-module/popover/root.mjs.map +7 -0
  240. package/build-module/popover/title.mjs +31 -0
  241. package/build-module/popover/title.mjs.map +7 -0
  242. package/build-module/popover/trigger.mjs +13 -0
  243. package/build-module/popover/trigger.mjs.map +7 -0
  244. package/build-module/popover/types.mjs +1 -0
  245. package/build-module/popover/types.mjs.map +7 -0
  246. package/build-module/tabs/list.mjs +3 -4
  247. package/build-module/tabs/list.mjs.map +2 -2
  248. package/build-module/tabs/panel.mjs +3 -3
  249. package/build-module/tabs/panel.mjs.map +2 -2
  250. package/build-module/tabs/tab.mjs +3 -3
  251. package/build-module/tabs/tab.mjs.map +2 -2
  252. package/build-module/text/text.mjs +20 -5
  253. package/build-module/text/text.mjs.map +3 -3
  254. package/build-module/tooltip/popup.mjs +5 -4
  255. package/build-module/tooltip/popup.mjs.map +2 -2
  256. package/build-module/tooltip/root.mjs.map +2 -2
  257. package/build-module/utils/use-deprioritized-initial-focus.mjs.map +2 -2
  258. package/build-module/visually-hidden/visually-hidden.mjs.map +2 -2
  259. package/build-types/alert-dialog/context.d.ts +6 -3
  260. package/build-types/alert-dialog/context.d.ts.map +1 -1
  261. package/build-types/alert-dialog/popup.d.ts.map +1 -1
  262. package/build-types/alert-dialog/root.d.ts +2 -8
  263. package/build-types/alert-dialog/root.d.ts.map +1 -1
  264. package/build-types/alert-dialog/stories/index.story.d.ts +18 -6
  265. package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -1
  266. package/build-types/alert-dialog/trigger.d.ts +2 -1
  267. package/build-types/alert-dialog/trigger.d.ts.map +1 -1
  268. package/build-types/alert-dialog/types.d.ts +61 -26
  269. package/build-types/alert-dialog/types.d.ts.map +1 -1
  270. package/build-types/badge/badge.d.ts.map +1 -1
  271. package/build-types/button/button.d.ts.map +1 -1
  272. package/build-types/card/stories/index.story.d.ts.map +1 -1
  273. package/build-types/card/title.d.ts.map +1 -1
  274. package/build-types/collapsible/panel.d.ts +2 -1
  275. package/build-types/collapsible/panel.d.ts.map +1 -1
  276. package/build-types/collapsible/root.d.ts +2 -1
  277. package/build-types/collapsible/root.d.ts.map +1 -1
  278. package/build-types/collapsible/trigger.d.ts +2 -1
  279. package/build-types/collapsible/trigger.d.ts.map +1 -1
  280. package/build-types/dialog/popup.d.ts.map +1 -1
  281. package/build-types/dialog/stories/index.story.d.ts +8 -0
  282. package/build-types/dialog/stories/index.story.d.ts.map +1 -1
  283. package/build-types/dialog/title.d.ts +12 -2
  284. package/build-types/dialog/title.d.ts.map +1 -1
  285. package/build-types/dialog/types.d.ts +8 -1
  286. package/build-types/dialog/types.d.ts.map +1 -1
  287. package/build-types/empty-state/description.d.ts.map +1 -1
  288. package/build-types/empty-state/title.d.ts.map +1 -1
  289. package/build-types/form/primitives/field/description.d.ts +2 -1
  290. package/build-types/form/primitives/field/description.d.ts.map +1 -1
  291. package/build-types/form/primitives/field/details.d.ts +2 -1
  292. package/build-types/form/primitives/field/details.d.ts.map +1 -1
  293. package/build-types/form/primitives/field/label.d.ts +2 -1
  294. package/build-types/form/primitives/field/label.d.ts.map +1 -1
  295. package/build-types/form/primitives/fieldset/description.d.ts +2 -1
  296. package/build-types/form/primitives/fieldset/description.d.ts.map +1 -1
  297. package/build-types/form/primitives/fieldset/details.d.ts +2 -1
  298. package/build-types/form/primitives/fieldset/details.d.ts.map +1 -1
  299. package/build-types/form/primitives/fieldset/legend.d.ts +2 -1
  300. package/build-types/form/primitives/fieldset/legend.d.ts.map +1 -1
  301. package/build-types/form/primitives/fieldset/root.d.ts +2 -1
  302. package/build-types/form/primitives/fieldset/root.d.ts.map +1 -1
  303. package/build-types/form/primitives/input/input.d.ts.map +1 -1
  304. package/build-types/form/primitives/input-layout/input-layout.d.ts.map +1 -1
  305. package/build-types/form/primitives/select/item.d.ts +6 -2
  306. package/build-types/form/primitives/select/item.d.ts.map +1 -1
  307. package/build-types/form/primitives/select/popup.d.ts +11 -1
  308. package/build-types/form/primitives/select/popup.d.ts.map +1 -1
  309. package/build-types/form/primitives/select/trigger.d.ts +12 -2
  310. package/build-types/form/primitives/select/trigger.d.ts.map +1 -1
  311. package/build-types/form/primitives/select/types.d.ts +13 -3
  312. package/build-types/form/primitives/select/types.d.ts.map +1 -1
  313. package/build-types/form/primitives/textarea/textarea.d.ts.map +1 -1
  314. package/build-types/form/stories/shared.d.ts.map +1 -1
  315. package/build-types/index.d.ts +1 -0
  316. package/build-types/index.d.ts.map +1 -1
  317. package/build-types/link/link.d.ts.map +1 -1
  318. package/build-types/popover/arrow.d.ts +10 -0
  319. package/build-types/popover/arrow.d.ts.map +1 -0
  320. package/build-types/popover/close.d.ts +11 -0
  321. package/build-types/popover/close.d.ts.map +1 -0
  322. package/build-types/popover/context.d.ts +22 -0
  323. package/build-types/popover/context.d.ts.map +1 -0
  324. package/build-types/popover/description.d.ts +10 -0
  325. package/build-types/popover/description.d.ts.map +1 -0
  326. package/build-types/popover/index.d.ts +9 -0
  327. package/build-types/popover/index.d.ts.map +1 -0
  328. package/build-types/popover/popup.d.ts +11 -0
  329. package/build-types/popover/popup.d.ts.map +1 -0
  330. package/build-types/popover/root.d.ts +37 -0
  331. package/build-types/popover/root.d.ts.map +1 -0
  332. package/build-types/popover/stories/index.story.d.ts +211 -0
  333. package/build-types/popover/stories/index.story.d.ts.map +1 -0
  334. package/build-types/popover/stories/utils.d.ts +25 -0
  335. package/build-types/popover/stories/utils.d.ts.map +1 -0
  336. package/build-types/popover/test/index.test.d.ts +2 -0
  337. package/build-types/popover/test/index.test.d.ts.map +1 -0
  338. package/build-types/popover/title.d.ts +20 -0
  339. package/build-types/popover/title.d.ts.map +1 -0
  340. package/build-types/popover/trigger.d.ts +10 -0
  341. package/build-types/popover/trigger.d.ts.map +1 -0
  342. package/build-types/popover/types.d.ts +83 -0
  343. package/build-types/popover/types.d.ts.map +1 -0
  344. package/build-types/tabs/list.d.ts +2 -1
  345. package/build-types/tabs/list.d.ts.map +1 -1
  346. package/build-types/tabs/panel.d.ts +2 -1
  347. package/build-types/tabs/panel.d.ts.map +1 -1
  348. package/build-types/tabs/root.d.ts +2 -1
  349. package/build-types/tabs/root.d.ts.map +1 -1
  350. package/build-types/tabs/tab.d.ts +2 -1
  351. package/build-types/tabs/tab.d.ts.map +1 -1
  352. package/build-types/text/stories/index.story.d.ts +4 -0
  353. package/build-types/text/stories/index.story.d.ts.map +1 -1
  354. package/build-types/text/text.d.ts.map +1 -1
  355. package/build-types/tooltip/popup.d.ts.map +1 -1
  356. package/build-types/tooltip/root.d.ts +9 -8
  357. package/build-types/tooltip/root.d.ts.map +1 -1
  358. package/build-types/tooltip/stories/usage-guidelines.story.d.ts +21 -0
  359. package/build-types/tooltip/stories/usage-guidelines.story.d.ts.map +1 -0
  360. package/build-types/tooltip/types.d.ts +4 -0
  361. package/build-types/tooltip/types.d.ts.map +1 -1
  362. package/build-types/utils/types.d.ts +6 -2
  363. package/build-types/utils/types.d.ts.map +1 -1
  364. package/build-types/utils/use-deprioritized-initial-focus.d.ts +6 -5
  365. package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -1
  366. package/build-types/visually-hidden/stories/index.story.d.ts +7 -0
  367. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  368. package/build-types/visually-hidden/visually-hidden.d.ts +34 -0
  369. package/build-types/visually-hidden/visually-hidden.d.ts.map +1 -1
  370. package/package.json +12 -12
  371. package/src/alert-dialog/context.tsx +12 -4
  372. package/src/alert-dialog/popup.tsx +91 -33
  373. package/src/alert-dialog/root.tsx +191 -13
  374. package/src/alert-dialog/stories/index.story.tsx +116 -65
  375. package/src/alert-dialog/style.module.css +11 -0
  376. package/src/alert-dialog/test/index.test.tsx +1319 -347
  377. package/src/alert-dialog/trigger.tsx +2 -2
  378. package/src/alert-dialog/types.ts +64 -28
  379. package/src/badge/badge.tsx +11 -14
  380. package/src/badge/style.module.css +0 -4
  381. package/src/button/button.tsx +2 -0
  382. package/src/button/style.module.css +7 -3
  383. package/src/card/stories/index.story.tsx +4 -5
  384. package/src/card/style.module.css +1 -5
  385. package/src/card/test/index.test.tsx +17 -1
  386. package/src/card/title.tsx +6 -5
  387. package/src/collapsible-card/stories/index.story.tsx +5 -5
  388. package/src/dialog/popup.tsx +2 -1
  389. package/src/dialog/stories/index.story.tsx +33 -0
  390. package/src/dialog/style.module.css +13 -9
  391. package/src/dialog/test/index.test.tsx +63 -4
  392. package/src/dialog/title.tsx +21 -9
  393. package/src/dialog/types.ts +9 -1
  394. package/src/empty-state/description.tsx +6 -2
  395. package/src/empty-state/style.module.css +1 -1
  396. package/src/empty-state/test/description.test.tsx +13 -0
  397. package/src/empty-state/test/title.test.tsx +13 -0
  398. package/src/empty-state/title.tsx +9 -3
  399. package/src/form/primitives/field/description.tsx +6 -1
  400. package/src/form/primitives/field/details.tsx +4 -2
  401. package/src/form/primitives/field/label.tsx +9 -5
  402. package/src/form/primitives/field/root.tsx +2 -2
  403. package/src/form/primitives/field/test/index.test.tsx +11 -0
  404. package/src/form/primitives/fieldset/description.tsx +9 -1
  405. package/src/form/primitives/fieldset/legend.tsx +9 -4
  406. package/src/form/primitives/fieldset/test/index.test.tsx +22 -0
  407. package/src/form/primitives/input/input.tsx +6 -1
  408. package/src/form/primitives/input/style.module.css +4 -0
  409. package/src/form/primitives/input-layout/input-layout.tsx +2 -0
  410. package/src/form/primitives/input-layout/style.module.css +3 -3
  411. package/src/form/primitives/select/popup.tsx +5 -2
  412. package/src/form/primitives/select/test/index.test.tsx +60 -1
  413. package/src/form/primitives/select/types.ts +14 -4
  414. package/src/form/primitives/textarea/textarea.tsx +10 -1
  415. package/src/form/stories/shared.tsx +4 -2
  416. package/src/index.ts +1 -0
  417. package/src/link/link.tsx +2 -0
  418. package/src/link/style.module.css +11 -1
  419. package/src/notice/style.module.css +5 -5
  420. package/src/popover/arrow.tsx +49 -0
  421. package/src/popover/close.tsx +24 -0
  422. package/src/popover/context.tsx +100 -0
  423. package/src/popover/description.tsx +29 -0
  424. package/src/popover/index.ts +9 -0
  425. package/src/popover/popup.tsx +106 -0
  426. package/src/popover/root.tsx +41 -0
  427. package/src/popover/stories/index.story.tsx +1315 -0
  428. package/src/popover/stories/utils.tsx +91 -0
  429. package/src/popover/style.module.css +64 -0
  430. package/src/popover/test/index.test.tsx +727 -0
  431. package/src/popover/title.tsx +47 -0
  432. package/src/popover/trigger.tsx +17 -0
  433. package/src/popover/types.ts +113 -0
  434. package/src/tabs/list.tsx +0 -1
  435. package/src/tabs/style.module.css +2 -2
  436. package/src/text/stories/index.story.tsx +4 -2
  437. package/src/text/style.module.css +62 -36
  438. package/src/text/test/index.test.tsx +1 -4
  439. package/src/text/text.tsx +8 -1
  440. package/src/tooltip/popup.tsx +2 -1
  441. package/src/tooltip/root.tsx +9 -8
  442. package/src/tooltip/stories/usage-guidelines.mdx +91 -0
  443. package/src/tooltip/stories/usage-guidelines.story.tsx +119 -0
  444. package/src/tooltip/style.module.css +2 -2
  445. package/src/tooltip/test/index.test.tsx +61 -0
  446. package/src/tooltip/types.ts +5 -0
  447. package/src/utils/css/field.module.css +12 -9
  448. package/src/utils/css/focus.module.css +7 -5
  449. package/src/utils/css/global-css-defense.module.css +117 -0
  450. package/src/utils/css/item-popup.module.css +2 -2
  451. package/src/utils/types.ts +7 -2
  452. package/src/utils/use-deprioritized-initial-focus.ts +5 -4
  453. package/src/visually-hidden/stories/index.story.tsx +25 -0
  454. package/src/visually-hidden/visually-hidden.tsx +34 -0
@@ -84,4 +84,65 @@ describe( 'Tooltip', () => {
84
84
  screen.queryByText( 'Tooltip content' )
85
85
  ).not.toBeInTheDocument();
86
86
  } );
87
+
88
+ describe( 'container', () => {
89
+ it( 'should render inside the container when provided', async () => {
90
+ const user = userEvent.setup();
91
+ const containerRef = createRef< HTMLDivElement >();
92
+
93
+ render(
94
+ <TestProvider>
95
+ <div data-testid="wrapper">
96
+ <Tooltip.Root>
97
+ <Tooltip.Trigger>Hover me</Tooltip.Trigger>
98
+ <div
99
+ ref={ containerRef }
100
+ data-testid="custom-container"
101
+ />
102
+ <Tooltip.Popup container={ containerRef }>
103
+ Tooltip content
104
+ </Tooltip.Popup>
105
+ </Tooltip.Root>
106
+ </div>
107
+ </TestProvider>
108
+ );
109
+
110
+ await user.hover(
111
+ screen.getByRole( 'button', { name: 'Hover me' } )
112
+ );
113
+
114
+ const content = await screen.findByText( 'Tooltip content' );
115
+ expect( content ).toBeVisible();
116
+
117
+ expect( screen.getByTestId( 'custom-container' ) ).toContainElement(
118
+ content
119
+ );
120
+ } );
121
+
122
+ it( 'should render with a portal by default', async () => {
123
+ const user = userEvent.setup();
124
+
125
+ render(
126
+ <TestProvider>
127
+ <div data-testid="wrapper">
128
+ <Tooltip.Root>
129
+ <Tooltip.Trigger>Hover me</Tooltip.Trigger>
130
+ <Tooltip.Popup>Tooltip content</Tooltip.Popup>
131
+ </Tooltip.Root>
132
+ </div>
133
+ </TestProvider>
134
+ );
135
+
136
+ await user.hover(
137
+ screen.getByRole( 'button', { name: 'Hover me' } )
138
+ );
139
+
140
+ const content = await screen.findByText( 'Tooltip content' );
141
+ expect( content ).toBeVisible();
142
+
143
+ expect( screen.getByTestId( 'wrapper' ) ).not.toContainElement(
144
+ content
145
+ );
146
+ } );
147
+ } );
87
148
  } );
@@ -23,4 +23,9 @@ export interface PopupProps
23
23
  * The content to be rendered inside the component.
24
24
  */
25
25
  children?: ReactNode;
26
+
27
+ /**
28
+ * A parent element to render the portal into.
29
+ */
30
+ container?: Tooltip.Portal.Props[ 'container' ];
26
31
  }
@@ -2,26 +2,29 @@
2
2
 
3
3
  @layer wp-ui-utilities {
4
4
  .label {
5
- --wp-ui-field-label-line-height: var(--wpds-font-line-height-xs);
5
+ --wp-ui-field-label-line-height: var(--wpds-typography-line-height-xs);
6
6
 
7
- font-family: var(--wpds-font-family-body);
8
- font-size: var(--wpds-font-size-xs);
7
+ font-family: var(--wpds-typography-font-family-body);
8
+ font-size: var(--wpds-typography-font-size-xs);
9
9
  line-height: var(--wp-ui-field-label-line-height);
10
- font-weight: var(--wpds-font-weight-medium);
10
+ font-weight: var(--wpds-typography-font-weight-medium);
11
11
  text-transform: uppercase;
12
12
  color: var(--wpds-color-fg-content-neutral);
13
13
 
14
14
  &.is-plain {
15
- font-size: var(--wpds-font-size-md);
15
+ font-size: var(--wpds-typography-font-size-md);
16
16
  text-transform: none;
17
17
  }
18
18
  }
19
19
 
20
20
  .description {
21
- margin: 0;
22
- font-family: var(--wpds-font-family-body);
23
- font-size: var(--wpds-font-size-sm);
24
- line-height: var(--wpds-font-line-height-xs);
21
+ --_gcd-p-font-size: var(--wpds-typography-font-size-sm);
22
+ --_gcd-p-line-height: var(--wpds-typography-line-height-xs);
23
+ --_gcd-p-margin: 0;
24
+
25
+ font-family: var(--wpds-typography-font-family-body);
26
+ font-size: var(--wpds-typography-font-size-sm);
27
+ line-height: var(--wpds-typography-line-height-xs);
25
28
  color: var(--wpds-color-fg-content-neutral-weak);
26
29
  }
27
30
  }
@@ -9,14 +9,14 @@
9
9
  .outset-ring--focus-within-visible,
10
10
  .outset-ring--focus-parent-visible {
11
11
  @media not ( prefers-reduced-motion ) {
12
+ --_gcd-a-transition: outline 0.1s ease-out;
13
+
12
14
  transition: outline 0.1s ease-out;
13
15
  }
14
16
 
15
17
  /* Outline width must be kept at 0 even with a transparent color,
16
18
  or else the outline will be visible in forced-colors mode. */
17
- outline-width: 0;
18
- outline-style: solid;
19
- outline-color: transparent;
19
+ outline: 0 solid transparent;
20
20
  outline-offset: 1px;
21
21
  }
22
22
 
@@ -27,7 +27,9 @@
27
27
  .outset-ring--focus-within-except-active:focus-within:not(:has(:active)),
28
28
  .outset-ring--focus-within-visible:focus-within:has(:focus-visible),
29
29
  :focus-visible .outset-ring--focus-parent-visible {
30
- outline-width: var(--wpds-border-width-focus);
31
- outline-color: var(--wpds-color-stroke-focus-brand);
30
+ --_gcd-a-outline: var(--wpds-border-width-focus) solid var(--wpds-color-stroke-focus-brand);
31
+ --_gcd-div-outline: var(--wpds-border-width-focus) solid var(--wpds-color-stroke-focus-brand);
32
+
33
+ outline: var(--wpds-border-width-focus) solid var(--wpds-color-stroke-focus-brand);
32
34
  }
33
35
  }
@@ -0,0 +1,117 @@
1
+ /*
2
+ * Unlayered defense against wp-admin global CSS (common.css, forms.css).
3
+ *
4
+ * CSS cascade layers always lose to unlayered styles, so @wordpress/ui's
5
+ * layered component styles get overridden by wp-admin's broad bare-element
6
+ * selectors. This file provides unlayered, class-scoped defenses that
7
+ * restore control to the component.
8
+ *
9
+ * Mechanism (custom property bridge):
10
+ * .input { font-size: var(--_gcd-input-font-size, inherit); }
11
+ *
12
+ * - The class selector beats admin bare-element selectors in specificity.
13
+ * - Each property reads a custom property. The fallback values are what
14
+ * makes sense for @wordpress/ui, to minimize the number of overrides
15
+ * in each individual component stylesheet.
16
+ * - Component CSS modules only need to define the custom properties for
17
+ * the specific properties they want to override.
18
+ * - Custom property definitions aren't suppressed by cascade layers, so the
19
+ * layered value propagates through to the unlayered declaration.
20
+ *
21
+ * Usage: apply the element-specific class directly to each element that
22
+ * needs defense (e.g. defenseStyles.input on an <input>).
23
+ */
24
+
25
+ /*
26
+ * ==========================================================================
27
+ * forms.css defense - https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/css/forms.css
28
+ * ==========================================================================
29
+ */
30
+
31
+ .button {
32
+ box-sizing: var(--_gcd-button-box-sizing, border-box);
33
+ font-family: var(--_gcd-button-font-family, inherit);
34
+ font-size: var(--_gcd-button-font-size, inherit);
35
+ font-weight: var(--_gcd-button-font-weight, inherit);
36
+ }
37
+
38
+ .input {
39
+ box-sizing: var(--_gcd-input-box-sizing, border-box);
40
+ font-family: var(--_gcd-input-font-family, inherit);
41
+ font-size: var(--_gcd-input-font-size, inherit);
42
+ font-weight: var(--_gcd-input-font-weight, inherit);
43
+ margin: var(--_gcd-input-margin, 0);
44
+
45
+ /* Also targets textarea elements, which the `Input` primitive can render as. We combine these textarea defenses
46
+ into the input defenses to minimize the number of tokens, but they should be split if it ever becomes necessary. */
47
+ &:is(textarea, [type="text"], [type="password"], [type="color"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="month"], [type="number"], [type="search"], [type="tel"], [type="time"], [type="url"], [type="week"]) {
48
+ box-shadow: var(--_gcd-input-box-shadow, 0 0 0 transparent);
49
+ border-radius: var(--_gcd-input-border-radius, 0);
50
+ border: var(--_gcd-input-border, none);
51
+ background-color: var(--_gcd-input-background-color, transparent);
52
+ color: var(--_gcd-input-color, var(--wpds-color-fg-interactive-neutral));
53
+
54
+ &:focus {
55
+ border-color: var(--_gcd-input-border-color-focus, var(--wp-admin-theme-color));
56
+ box-shadow: var(--_gcd-input-box-shadow-focus, none);
57
+ outline: var(--_gcd-input-outline-focus, none);
58
+ }
59
+
60
+ &:disabled {
61
+ background: var(--_gcd-input-background-disabled, transparent);
62
+ border-color: var(--_gcd-input-border-color-disabled, transparent);
63
+ box-shadow: var(--_gcd-input-box-shadow-disabled, none);
64
+ color: var(--_gcd-input-color-disabled, var(--wpds-color-fg-interactive-neutral-disabled));
65
+ }
66
+
67
+ &::placeholder {
68
+ color: var(--_gcd-input-placeholder-color, var(--wpds-color-fg-interactive-neutral-disabled));
69
+ }
70
+ }
71
+
72
+ &:is(textarea, [type="text"], [type="password"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="month"], [type="number"], [type="search"], [type="tel"], [type="time"], [type="url"], [type="week"]) {
73
+ padding: var(--_gcd-input-padding, 0);
74
+ line-height: var(--_gcd-input-line-height, inherit);
75
+ min-height: var(--_gcd-input-min-height, auto);
76
+ }
77
+ }
78
+
79
+ .textarea {
80
+ box-sizing: var(--_gcd-textarea-box-sizing, border-box);
81
+ overflow: var(--_gcd-textarea-overflow, auto);
82
+ resize: var(--_gcd-textarea-resize, block);
83
+ }
84
+
85
+ /*
86
+ * ==========================================================================
87
+ * common.css defense - https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/css/common.css
88
+ * ==========================================================================
89
+ */
90
+
91
+ .div {
92
+ outline: var(--_gcd-div-outline, 0 solid transparent);
93
+ }
94
+
95
+ /* Narrowed down to p elements only, to support element multiplicity of Text component. */
96
+ p.p {
97
+ font-size: var(--_gcd-p-font-size, 13px);
98
+ line-height: var(--_gcd-p-line-height, 1.5);
99
+ margin: var(--_gcd-p-margin, 0);
100
+ }
101
+
102
+ /* Narrowed down to h[1-6] elements only, to support element multiplicity of Text component. */
103
+ :is(h1, h2, h3, h4, h5, h6).heading {
104
+ color: var(--_gcd-heading-color, var(--wpds-color-fg-content-neutral));
105
+ font-size: var(--_gcd-heading-font-size, inherit);
106
+ font-weight: var(--_gcd-heading-font-weight, var(--wpds-typography-font-weight-medium));
107
+ margin: var(--_gcd-heading-margin, 0);
108
+ }
109
+
110
+ .a,
111
+ .a:is(:hover, :focus, :active) {
112
+ outline: var(--_gcd-a-outline, 0 solid transparent);
113
+ color: var(--_gcd-a-color, inherit);
114
+ box-shadow: var(--_gcd-a-box-shadow, none);
115
+ border-radius: var(--_gcd-a-border-radius, 0);
116
+ transition: var(--_gcd-a-transition, none);
117
+ }
@@ -16,8 +16,8 @@
16
16
  border: 1px solid var(--wpds-color-stroke-surface-neutral);
17
17
  box-shadow: var(--wpds-elevation-md);
18
18
  background-color: var(--wpds-color-bg-surface-neutral-strong);
19
- font-family: var(--wpds-font-family-body);
20
- font-size: var(--wpds-font-size-md);
19
+ font-family: var(--wpds-typography-font-family-body);
20
+ font-size: var(--wpds-typography-font-size-md);
21
21
  line-height: 1.4;
22
22
  color: var(--wpds-color-fg-interactive-neutral);
23
23
  }
@@ -14,13 +14,18 @@ type ComponentRenderFn< Props > = (
14
14
 
15
15
  export type ComponentProps< E extends ElementType > = Omit<
16
16
  ComponentPropsWithoutRef< E >,
17
- 'className' | 'children' | 'render'
17
+ 'className' | 'children' | 'render' | 'style'
18
18
  > & {
19
19
  /**
20
- * CSS class name to apply to the component.
20
+ * CSS class name to apply to the element.
21
21
  */
22
22
  className?: string;
23
23
 
24
+ /**
25
+ * CSS style to apply to the element.
26
+ */
27
+ style?: React.CSSProperties;
28
+
24
29
  /**
25
30
  * Replaces the component's default HTML element using a given React
26
31
  * element, or a function that returns a React element.
@@ -1,12 +1,13 @@
1
- import type { Dialog as _Dialog } from '@base-ui/react/dialog';
1
+ import type { Popover as _Popover } from '@base-ui/react/popover';
2
2
  import { useMemo, useRef } from '@wordpress/element';
3
3
  import { tabbable } from 'tabbable';
4
4
 
5
5
  /**
6
- * Derived from Base UI's `Dialog.Popup.Props['initialFocus']`.
7
- * The same type is shared by all Base UI overlay popups (Dialog, Popover, etc.).
6
+ * The `initialFocus` type shared by Base UI overlay popups (Dialog, Popover,
7
+ * AlertDialog, etc.). We derive it from `Popover.Popup.Props` here, but it
8
+ * is identical across all overlay components.
8
9
  */
9
- type InitialFocus = _Dialog.Popup.Props[ 'initialFocus' ];
10
+ type InitialFocus = _Popover.Popup.Props[ 'initialFocus' ];
10
11
 
11
12
  /**
12
13
  * Options matching Base UI's internal tabbable configuration.
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { useId } from '@wordpress/element';
2
3
  import { VisuallyHidden } from '../';
3
4
 
4
5
  const meta: Meta< typeof VisuallyHidden > = {
@@ -20,3 +21,27 @@ export const Default: Story = {
20
21
  </>
21
22
  ),
22
23
  };
24
+
25
+ /**
26
+ * Use the `render` prop to change the underlying HTML element.
27
+ * By default, `VisuallyHidden` renders a `<div>`. Here it renders
28
+ * a `<label>` instead, keeping the native label–input association
29
+ * while hiding the label text visually.
30
+ */
31
+ export const WithCustomElement: Story = {
32
+ render: function WithCustomElementStory() {
33
+ const inputId = useId();
34
+ return (
35
+ <>
36
+ { /* eslint-disable-next-line jsx-a11y/label-has-associated-control */ }
37
+ <VisuallyHidden render={ <label htmlFor={ inputId } /> }>
38
+ Accessible label
39
+ </VisuallyHidden>
40
+ <input
41
+ id={ inputId }
42
+ placeholder="This input has a visually hidden label"
43
+ />
44
+ </>
45
+ );
46
+ },
47
+ };
@@ -6,6 +6,40 @@ import styles from './style.module.css';
6
6
  /**
7
7
  * Visually hides content while keeping it accessible to screen readers.
8
8
  * Useful when providing context that's only meaningful to assistive technology.
9
+ *
10
+ * Renders a `<div>` by default. Use the `render` prop to swap the
11
+ * underlying element while preserving the visually-hidden behavior.
12
+ *
13
+ * ## Composing with other components
14
+ *
15
+ * When composing with another component that uses the `render` prop
16
+ * pattern, there are two directions — and they produce different results.
17
+ *
18
+ * Most of the time you'll want `VisuallyHidden` as the **host** (outer
19
+ * component) and pass the other component via `render`. This keeps the
20
+ * other component's HTML element and semantics intact, while
21
+ * `VisuallyHidden` only adds its hiding styles:
22
+ *
23
+ * ```jsx
24
+ * // OtherComponent keeps its semantic element (e.g. <h2>).
25
+ * <VisuallyHidden render={ <OtherComponent /> }>
26
+ * Accessible text
27
+ * </VisuallyHidden>
28
+ * ```
29
+ *
30
+ * The opposite direction is also possible, but be aware that it replaces
31
+ * the other component's element with VisuallyHidden's default `<div>`:
32
+ *
33
+ * ```jsx
34
+ * // OtherComponent's element becomes a <div>.
35
+ * <OtherComponent render={ <VisuallyHidden /> }>
36
+ * Accessible text
37
+ * </OtherComponent>
38
+ * ```
39
+ *
40
+ * Choose based on what you need: if the other component's semantic
41
+ * element matters (e.g. `<label>`, `<legend>`, `<h2>`), keep
42
+ * `VisuallyHidden` as the host so the element is preserved.
9
43
  */
10
44
  export const VisuallyHidden = forwardRef< HTMLDivElement, VisuallyHiddenProps >(
11
45
  function VisuallyHidden( { render, ...restProps }, ref ) {