@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
@@ -10,4 +10,17 @@ describe( 'EmptyState.Description', () => {
10
10
 
11
11
  expect( ref.current ).toBeInstanceOf( HTMLParagraphElement );
12
12
  } );
13
+
14
+ it( 'forwards ref to custom render element', () => {
15
+ const ref = createRef< HTMLDivElement >();
16
+
17
+ render(
18
+ <Description ref={ ref } render={ <div /> }>
19
+ Description text
20
+ </Description>
21
+ );
22
+
23
+ expect( ref.current ).toBeInstanceOf( HTMLDivElement );
24
+ expect( ref.current?.tagName ).toBe( 'DIV' );
25
+ } );
13
26
  } );
@@ -10,4 +10,17 @@ describe( 'EmptyState.Title', () => {
10
10
 
11
11
  expect( ref.current ).toBeInstanceOf( HTMLHeadingElement );
12
12
  } );
13
+
14
+ it( 'forwards ref to custom render element', () => {
15
+ const ref = createRef< HTMLHeadingElement >();
16
+
17
+ render(
18
+ <Title ref={ ref } render={ <h3 /> }>
19
+ No results found
20
+ </Title>
21
+ );
22
+
23
+ expect( ref.current ).toBeInstanceOf( HTMLHeadingElement );
24
+ expect( ref.current?.tagName ).toBe( 'H3' );
25
+ } );
13
26
  } );
@@ -4,17 +4,23 @@ import { Text } from '../text';
4
4
  import type { EmptyStateTitleProps } from './types';
5
5
  import styles from './style.module.css';
6
6
 
7
+ const DEFAULT_TAG = <h2 />;
8
+
7
9
  /**
8
10
  * The title is a short heading that communicates the empty state.
9
11
  */
10
12
  export const Title = forwardRef< HTMLHeadingElement, EmptyStateTitleProps >(
11
- function EmptyStateTitle( { render, className, children, ...props }, ref ) {
13
+ function EmptyStateTitle(
14
+ { render = DEFAULT_TAG, className, children, ...props },
15
+ ref
16
+ ) {
12
17
  return (
13
18
  <Text
19
+ ref={ ref }
14
20
  variant="heading-lg"
15
- // eslint-disable-next-line jsx-a11y/heading-has-content -- content provided via render prop
16
- render={ render ?? <h2 ref={ ref } { ...props } /> }
21
+ render={ render }
17
22
  className={ clsx( styles.title, className ) }
23
+ { ...props }
18
24
  >
19
25
  { children }
20
26
  </Text>
@@ -1,6 +1,7 @@
1
1
  import clsx from 'clsx';
2
2
  import { Field as _Field } from '@base-ui/react/field';
3
3
  import { forwardRef } from '@wordpress/element';
4
+ import defenseStyles from '../../../utils/css/global-css-defense.module.css';
4
5
  import fieldStyles from '../../../utils/css/field.module.css';
5
6
  import type { FieldDescriptionProps } from './types';
6
7
 
@@ -11,7 +12,11 @@ export const Description = forwardRef<
11
12
  return (
12
13
  <_Field.Description
13
14
  ref={ ref }
14
- className={ clsx( fieldStyles.description, className ) }
15
+ className={ clsx(
16
+ defenseStyles.p,
17
+ fieldStyles.description,
18
+ className
19
+ ) }
15
20
  { ...restProps }
16
21
  />
17
22
  );
@@ -22,9 +22,11 @@ export const Details = forwardRef< HTMLDivElement, FieldDetailsProps >(
22
22
  function Details( { className, ...restProps }, ref ) {
23
23
  return (
24
24
  <>
25
- <_Field.Description render={ <VisuallyHidden /> }>
25
+ { /* VisuallyHidden is the host so that _Field.Description's
26
+ semantic element is preserved. See VisuallyHidden docs. */ }
27
+ <VisuallyHidden render={ <_Field.Description /> }>
26
28
  { __( 'More details follow the field.' ) }
27
- </_Field.Description>
29
+ </VisuallyHidden>
28
30
  <div
29
31
  ref={ ref }
30
32
  className={ clsx( fieldStyles.description, className ) }
@@ -10,7 +10,7 @@ export const Label = forwardRef< HTMLLabelElement, FieldLabelProps >(
10
10
  { className, hideFromVision, variant, ...restProps },
11
11
  ref
12
12
  ) {
13
- return (
13
+ const label = (
14
14
  <_Field.Label
15
15
  ref={ ref }
16
16
  className={ clsx(
@@ -18,12 +18,16 @@ export const Label = forwardRef< HTMLLabelElement, FieldLabelProps >(
18
18
  variant && fieldStyles[ `is-${ variant }` ],
19
19
  className
20
20
  ) }
21
- { ...( hideFromVision && {
22
- render: <VisuallyHidden />,
23
- nativeLabel: false,
24
- } ) }
25
21
  { ...restProps }
26
22
  />
27
23
  );
24
+
25
+ // VisuallyHidden is the host so that _Field.Label's semantic
26
+ // element is preserved. See VisuallyHidden docs for details.
27
+ if ( hideFromVision ) {
28
+ return <VisuallyHidden render={ label } />;
29
+ }
30
+
31
+ return label;
28
32
  }
29
33
  );
@@ -5,7 +5,7 @@ import resetStyles from '../../../utils/css/resets.module.css';
5
5
  import type { FieldRootProps } from './types';
6
6
  import { Stack } from '../../../stack';
7
7
 
8
- const defaultRender = ( props: React.ComponentProps< typeof Stack > ) => (
8
+ const DEFAULT_RENDER = ( props: React.ComponentProps< typeof Stack > ) => (
9
9
  <Stack { ...props } direction="column" gap="sm" />
10
10
  );
11
11
 
@@ -19,7 +19,7 @@ const defaultRender = ( props: React.ComponentProps< typeof Stack > ) => (
19
19
  * accessible labeling. See examples for how to associate the label in different cases.
20
20
  */
21
21
  export const Root = forwardRef< HTMLDivElement, FieldRootProps >( function Root(
22
- { className, render = defaultRender, ...restProps },
22
+ { className, render = DEFAULT_RENDER, ...restProps },
23
23
  ref
24
24
  ) {
25
25
  return (
@@ -47,6 +47,17 @@ describe( 'Field', () => {
47
47
  ).toBeVisible();
48
48
  } );
49
49
 
50
+ it( 'preserves the native label element when hideFromVision is enabled', () => {
51
+ render(
52
+ <Field.Root>
53
+ <Field.Label hideFromVision>Field Label</Field.Label>
54
+ <Field.Control render={ <input /> } />
55
+ </Field.Root>
56
+ );
57
+
58
+ expect( screen.getByText( 'Field Label' ).tagName ).toBe( 'LABEL' );
59
+ } );
60
+
50
61
  it( 'renders details with a semantically associated description for the control', () => {
51
62
  render(
52
63
  <Field.Root>
@@ -1,6 +1,7 @@
1
1
  import clsx from 'clsx';
2
2
  import { mergeProps, useRender } from '@base-ui/react';
3
3
  import { forwardRef, useEffect, useId } from '@wordpress/element';
4
+ import defenseStyles from '../../../utils/css/global-css-defense.module.css';
4
5
  import fieldStyles from '../../../utils/css/field.module.css';
5
6
  import { useFieldsetContext } from './context';
6
7
  import type { FieldsetDescriptionProps } from './types';
@@ -27,7 +28,14 @@ export const FieldsetDescription = forwardRef<
27
28
  render,
28
29
  ref,
29
30
  props: mergeProps< 'p' >(
30
- { className: clsx( fieldStyles.description, className ), id },
31
+ {
32
+ className: clsx(
33
+ defenseStyles.p,
34
+ fieldStyles.description,
35
+ className
36
+ ),
37
+ id,
38
+ },
31
39
  restProps
32
40
  ),
33
41
  } );
@@ -10,15 +10,20 @@ export const FieldsetLegend = forwardRef< HTMLDivElement, FieldsetLegendProps >(
10
10
  { className, hideFromVision, ...restProps },
11
11
  ref
12
12
  ) {
13
- return (
13
+ const legend = (
14
14
  <_Fieldset.Legend
15
15
  ref={ ref }
16
16
  className={ clsx( fieldStyles.label, className ) }
17
- { ...( hideFromVision && {
18
- render: <VisuallyHidden />,
19
- } ) }
20
17
  { ...restProps }
21
18
  />
22
19
  );
20
+
21
+ // VisuallyHidden is the host so that _Fieldset.Legend's semantic
22
+ // element is preserved. See VisuallyHidden docs for details.
23
+ if ( hideFromVision ) {
24
+ return <VisuallyHidden render={ legend } />;
25
+ }
26
+
27
+ return legend;
23
28
  }
24
29
  );
@@ -43,6 +43,28 @@ describe( 'Fieldset', () => {
43
43
  ).toBeVisible();
44
44
  } );
45
45
 
46
+ it( 'preserves the legend element type when hideFromVision is enabled', () => {
47
+ const { rerender } = render(
48
+ <Fieldset.Root>
49
+ <Fieldset.Legend>Choose your options</Fieldset.Legend>
50
+ </Fieldset.Root>
51
+ );
52
+
53
+ const tagWithout = screen.getByText( 'Choose your options' ).tagName;
54
+
55
+ rerender(
56
+ <Fieldset.Root>
57
+ <Fieldset.Legend hideFromVision>
58
+ Choose your options
59
+ </Fieldset.Legend>
60
+ </Fieldset.Root>
61
+ );
62
+
63
+ expect( screen.getByText( 'Choose your options' ).tagName ).toBe(
64
+ tagWithout
65
+ );
66
+ } );
67
+
46
68
  it( 'accessibly associates description when Fieldset.Description is present', () => {
47
69
  render(
48
70
  <Fieldset.Root>
@@ -1,6 +1,7 @@
1
1
  import { Input as _Input } from '@base-ui/react/input';
2
2
  import clsx from 'clsx';
3
3
  import { forwardRef } from '@wordpress/element';
4
+ import defenseStyles from '../../../utils/css/global-css-defense.module.css';
4
5
  import focusStyles from '../../../utils/css/focus.module.css';
5
6
  import styles from './style.module.css';
6
7
  import type { InputProps } from './types';
@@ -22,7 +23,11 @@ export const Input = forwardRef< HTMLElement, InputProps >( function Input(
22
23
  prefix={ prefix }
23
24
  suffix={ suffix }
24
25
  >
25
- <_Input ref={ ref } className={ styles.input } { ...restProps } />
26
+ <_Input
27
+ ref={ ref }
28
+ className={ clsx( defenseStyles.input, styles.input ) }
29
+ { ...restProps }
30
+ />
26
31
  </InputLayout>
27
32
  );
28
33
  } );
@@ -2,6 +2,10 @@
2
2
 
3
3
  @layer wp-ui-components {
4
4
  .input {
5
+ --_gcd-input-padding:
6
+ var(--wp-ui-input-padding-block, 0)
7
+ var(--wp-ui-input-layout-padding-inline, 0);
8
+
5
9
  padding-block: var(--wp-ui-input-padding-block, 0);
6
10
  padding-inline: var(--wp-ui-input-layout-padding-inline, 0);
7
11
  width: 100%;
@@ -1,5 +1,6 @@
1
1
  import clsx from 'clsx';
2
2
  import { Children, forwardRef } from '@wordpress/element';
3
+ import defenseStyles from '../../../utils/css/global-css-defense.module.css';
3
4
  import resetStyles from '../../../utils/css/resets.module.css';
4
5
  import styles from './style.module.css';
5
6
  import type { InputLayoutProps } from './types';
@@ -26,6 +27,7 @@ export const InputLayout = forwardRef< HTMLDivElement, InputLayoutProps >(
26
27
  <div
27
28
  ref={ ref }
28
29
  className={ clsx(
30
+ defenseStyles.div,
29
31
  resetStyles[ 'box-sizing' ],
30
32
  styles[ 'input-layout' ],
31
33
  styles[ `is-size-${ size }` ],
@@ -11,13 +11,13 @@
11
11
  border-style: solid;
12
12
  border-color: var(--wpds-color-stroke-interactive-neutral);
13
13
  border-radius: var(--wpds-border-radius-sm);
14
- font-family: var(--wpds-font-family-body);
15
- font-size: max(var(--wpds-font-size-md), 16px); /* avoid mobile zoom */
14
+ font-family: var(--wpds-typography-font-family-body);
15
+ font-size: max(var(--wpds-typography-font-size-md), 16px); /* avoid mobile zoom */
16
16
  line-height: 1;
17
17
  color: var(--wpds-color-fg-interactive-neutral);
18
18
 
19
19
  @media (min-width: 600px) {
20
- font-size: var(--wpds-font-size-md);
20
+ font-size: var(--wpds-typography-font-size-md);
21
21
  }
22
22
 
23
23
  &.is-size-compact {
@@ -16,9 +16,12 @@ const ThemeProvider: typeof ThemeProviderType =
16
16
  unlock( themePrivateApis ).ThemeProvider;
17
17
 
18
18
  export const Popup = forwardRef< HTMLDivElement, SelectPopupProps >(
19
- function Popup( { className, children, style, ...restProps }, ref ) {
19
+ function Popup(
20
+ { className, container, children, style, ...restProps },
21
+ ref
22
+ ) {
20
23
  return (
21
- <_Select.Portal>
24
+ <_Select.Portal container={ container }>
22
25
  <_Select.Positioner
23
26
  { ...ITEM_POPUP_POSITIONER_PROPS }
24
27
  alignItemWithTrigger={ false }
@@ -1,4 +1,4 @@
1
- import { render } from '@testing-library/react';
1
+ import { render, screen } from '@testing-library/react';
2
2
  import userEvent from '@testing-library/user-event';
3
3
  import { createRef } from '@wordpress/element';
4
4
  import * as Select from '../index';
@@ -30,4 +30,63 @@ describe( 'Select', () => {
30
30
  expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
31
31
  expect( itemRef.current ).toBeInstanceOf( HTMLDivElement );
32
32
  } );
33
+
34
+ describe( 'container', () => {
35
+ it( 'should render inside the container when provided', async () => {
36
+ const user = userEvent.setup();
37
+ const containerRef = createRef< HTMLDivElement >();
38
+
39
+ render(
40
+ <div data-testid="wrapper">
41
+ <Select.Root>
42
+ <Select.Trigger />
43
+ <div
44
+ ref={ containerRef }
45
+ data-testid="custom-container"
46
+ />
47
+ <Select.Popup container={ containerRef }>
48
+ <Select.Item value="Item 1" />
49
+ </Select.Popup>
50
+ </Select.Root>
51
+ </div>
52
+ );
53
+
54
+ await user.click( screen.getByRole( 'combobox' ) );
55
+
56
+ const item = await screen.findByRole( 'option', {
57
+ name: 'Item 1',
58
+ } );
59
+ expect( item ).toBeVisible();
60
+
61
+ expect( screen.getByTestId( 'custom-container' ) ).toContainElement(
62
+ item
63
+ );
64
+ } );
65
+
66
+ it( 'should render with a portal by default', async () => {
67
+ const user = userEvent.setup();
68
+
69
+ render(
70
+ <div data-testid="wrapper">
71
+ <Select.Root>
72
+ <Select.Trigger />
73
+ <Select.Popup>
74
+ <Select.Item value="Item 1" />
75
+ </Select.Popup>
76
+ </Select.Root>
77
+ </div>
78
+ );
79
+
80
+ await user.click( screen.getByRole( 'combobox' ) );
81
+
82
+ const item = await screen.findByRole( 'option', {
83
+ name: 'Item 1',
84
+ } );
85
+ expect( item ).toBeVisible();
86
+
87
+ expect( screen.getByTestId( 'wrapper' ) ).not.toContainElement(
88
+ item
89
+ );
90
+ } );
91
+ } );
33
92
  } );
@@ -1,4 +1,5 @@
1
1
  import type { Select as _Select } from '@base-ui/react/select';
2
+ import type { ComponentProps } from '../../../utils/types';
2
3
  import type { InputLayoutProps } from '../input-layout/types';
3
4
 
4
5
  // The second type parameter is the `multiple` flag (currently disabled).
@@ -7,7 +8,7 @@ export type SelectRootProps = Omit<
7
8
  'multiple'
8
9
  >;
9
10
 
10
- export type SelectTriggerProps = Omit< _Select.Trigger.Props, 'children' > & {
11
+ export type SelectTriggerProps = ComponentProps< typeof _Select.Trigger > & {
11
12
  /**
12
13
  * The size of the trigger.
13
14
  *
@@ -27,11 +28,20 @@ export type SelectTriggerProps = Omit< _Select.Trigger.Props, 'children' > & {
27
28
  children?: _Select.Value.Props[ 'children' ];
28
29
  };
29
30
 
30
- export type SelectPopupProps = _Select.Popup.Props;
31
+ export type SelectPopupProps = ComponentProps< typeof _Select.Popup > & {
32
+ /**
33
+ * The content to be rendered inside the popup.
34
+ */
35
+ children?: React.ReactNode;
36
+ /**
37
+ * A parent element to render the portal into.
38
+ */
39
+ container?: _Select.Portal.Props[ 'container' ];
40
+ };
31
41
 
32
42
  export type SelectItemProps = Omit<
33
- _Select.Item.Props,
34
- 'children' | 'value'
43
+ ComponentProps< typeof _Select.Item >,
44
+ 'value'
35
45
  > & {
36
46
  /**
37
47
  * A unique value that identifies this select item.
@@ -4,6 +4,7 @@ import { cloneElement, forwardRef } from '@wordpress/element';
4
4
  import styles from './style.module.css';
5
5
  import type { TextareaProps } from './types';
6
6
  import { Input } from '../input';
7
+ import defenseStyles from '../../../utils/css/global-css-defense.module.css';
7
8
 
8
9
  const wrappedRender = (
9
10
  render: NonNullable< TextareaProps[ 'render' ] >,
@@ -39,7 +40,15 @@ export const Textarea = forwardRef< HTMLTextAreaElement, TextareaProps >(
39
40
  style={ style }
40
41
  render={ wrappedRender(
41
42
  render || ( ( props ) => <textarea { ...props } /> ),
42
- { className: styles.textarea, ref, rows, ...restProps }
43
+ {
44
+ className: clsx(
45
+ defenseStyles.textarea,
46
+ styles.textarea
47
+ ),
48
+ ref,
49
+ rows,
50
+ ...restProps,
51
+ }
43
52
  ) }
44
53
  value={ value }
45
54
  defaultValue={ defaultValue }
@@ -1,3 +1,5 @@
1
+ import { Link } from '../..';
2
+
1
3
  export const WITH_DETAILS_DESCRIPTION = `\
2
4
  To add rich content (such as links) to the description, use the \`details\` prop.
3
5
 
@@ -11,9 +13,9 @@ so the readout is not unnecessarily verbose for screen reader users.`;
11
13
  export const DETAILS_EXAMPLE = (
12
14
  <>
13
15
  Details can include{ ' ' }
14
- <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a">
16
+ <Link href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a">
15
17
  links to more information
16
- </a>{ ' ' }
18
+ </Link>{ ' ' }
17
19
  and other semantic elements.
18
20
  </>
19
21
  );
package/src/index.ts CHANGED
@@ -11,6 +11,7 @@ export * from './icon';
11
11
  export * from './icon-button';
12
12
  export * from './link';
13
13
  export * as Notice from './notice';
14
+ export * as Popover from './popover';
14
15
  export * from './stack';
15
16
  export * as Tabs from './tabs';
16
17
  export * from './text';
package/src/link/link.tsx CHANGED
@@ -6,6 +6,7 @@ import { type LinkProps } from './types';
6
6
  import resetStyles from '../utils/css/resets.module.css';
7
7
  import focusStyles from '../utils/css/focus.module.css';
8
8
  import styles from './style.module.css';
9
+ import defenseStyles from '../utils/css/global-css-defense.module.css';
9
10
 
10
11
  /**
11
12
  * A styled anchor element with support for semantic color tones and an
@@ -39,6 +40,7 @@ export const Link = forwardRef< HTMLAnchorElement, LinkProps >( function Link(
39
40
  ref,
40
41
  props: mergeProps< 'a' >( props, {
41
42
  className: clsx(
43
+ defenseStyles.a,
42
44
  resetStyles[ 'box-sizing' ],
43
45
  focusStyles[ 'outset-ring--focus' ],
44
46
  variant !== 'unstyled' && styles.link,
@@ -9,28 +9,38 @@
9
9
  /* Brand tone */
10
10
  .is-brand,
11
11
  .is-brand:visited {
12
+ --_gcd-a-color: var(--wpds-color-fg-interactive-brand);
13
+
12
14
  color: var(--wpds-color-fg-interactive-brand);
13
15
  }
14
16
 
15
17
  .is-brand:hover,
16
18
  .is-brand:active {
19
+ --_gcd-a-color: var(--wpds-color-fg-interactive-brand-active);
20
+
17
21
  color: var(--wpds-color-fg-interactive-brand-active);
18
22
  }
19
23
 
20
24
  /* Neutral tone */
21
25
  .is-neutral,
22
26
  .is-neutral:visited {
27
+ --_gcd-a-color: var(--wpds-color-fg-interactive-neutral);
28
+
23
29
  color: var(--wpds-color-fg-interactive-neutral);
24
30
  text-decoration-color: var(--wpds-color-stroke-interactive-neutral);
25
31
  }
26
32
 
27
33
  .is-neutral:hover,
28
34
  .is-neutral:active {
35
+ --_gcd-a-color: var(--wpds-color-fg-interactive-neutral-active);
36
+
29
37
  color: var(--wpds-color-fg-interactive-neutral-active);
30
38
  }
31
39
 
32
40
  /* Unstyled variant */
33
41
  .is-unstyled {
42
+ --_gcd-a-color: inherit;
43
+
34
44
  color: inherit;
35
45
  text-decoration: none;
36
46
  }
@@ -55,7 +65,7 @@
55
65
 
56
66
  .link-icon {
57
67
  margin-inline-start: var(--wpds-dimension-padding-xs);
58
- font-weight: var(--wpds-font-weight-regular);
68
+ font-weight: var(--wpds-typography-font-weight-regular);
59
69
  }
60
70
 
61
71
  .link-icon::after {
@@ -3,7 +3,7 @@
3
3
  @layer wp-ui-components {
4
4
  .notice {
5
5
  --icon-height: 24px;
6
- --text-vertical-padding: calc((var(--icon-height) - var(--wpds-font-line-height-sm)) / 2);
6
+ --text-vertical-padding: calc((var(--icon-height) - var(--wpds-typography-line-height-sm)) / 2);
7
7
 
8
8
  --wp-ui-notice-background-color: var(--wpds-color-bg-surface-neutral-weak);
9
9
  --wp-ui-notice-border-color: var(--wpds-color-stroke-surface-neutral);
@@ -64,10 +64,10 @@
64
64
 
65
65
  .action-link {
66
66
  flex-shrink: 0;
67
- font-family: var(--wpds-font-family-body);
68
- font-size: var(--wpds-font-size-md);
69
- font-weight: var(--wpds-font-weight-regular);
70
- line-height: var(--wpds-font-line-height-sm);
67
+ font-family: var(--wpds-typography-font-family-body);
68
+ font-size: var(--wpds-typography-font-size-md);
69
+ font-weight: var(--wpds-typography-font-weight-regular);
70
+ line-height: var(--wpds-typography-line-height-sm);
71
71
  margin-block: auto;
72
72
 
73
73
  /* Add more horizontal space when following another action link/button */
@@ -0,0 +1,49 @@
1
+ import { Popover as _Popover } from '@base-ui/react/popover';
2
+ import clsx from 'clsx';
3
+ import { forwardRef } from '@wordpress/element';
4
+ import styles from './style.module.css';
5
+ import type { ArrowProps } from './types';
6
+
7
+ function DefaultArrowSvg( props: React.ComponentProps< 'svg' > ) {
8
+ return (
9
+ <svg
10
+ width="20"
11
+ height="10"
12
+ viewBox="0 0 20 10"
13
+ fill="none"
14
+ { ...props }
15
+ >
16
+ <path
17
+ d="M20 10H0V8h1.465a4 4 0 0 0 2.676-1.027l5.19-4.388c.378-.341.96-.341 1.338 0l5.19 4.388A4 4 0 0 0 18.535 8H20z"
18
+ className={ styles[ 'arrow-fill' ] }
19
+ />
20
+ <path
21
+ d="M10 3.097 4.81 7.486A5 5 0 0 1 1.465 8.77H0V8h1.465a4 4 0 0 0 2.676-1.027l5.19-4.388c.378-.341.96-.341 1.338 0l5.19 4.388A4 4 0 0 0 18.535 8H20v.77h-1.465a5 5 0 0 1-3.345-1.284z"
22
+ className={ styles[ 'arrow-stroke' ] }
23
+ />
24
+ </svg>
25
+ );
26
+ }
27
+
28
+ /**
29
+ * Renders an optional arrow element that points toward the anchor.
30
+ *
31
+ * Must be placed inside `Popover.Popup`. The arrow automatically rotates
32
+ * to match the current placement side.
33
+ */
34
+ const Arrow = forwardRef< HTMLDivElement, ArrowProps >( function PopoverArrow(
35
+ { children, className, ...props },
36
+ ref
37
+ ) {
38
+ return (
39
+ <_Popover.Arrow
40
+ ref={ ref }
41
+ className={ clsx( styles.arrow, className ) }
42
+ { ...props }
43
+ >
44
+ { children ?? <DefaultArrowSvg /> }
45
+ </_Popover.Arrow>
46
+ );
47
+ } );
48
+
49
+ export { Arrow };
@@ -0,0 +1,24 @@
1
+ import { Popover as _Popover } from '@base-ui/react/popover';
2
+ import { forwardRef } from '@wordpress/element';
3
+ import type { CloseProps } from './types';
4
+
5
+ /**
6
+ * Renders a button that closes the popover when clicked.
7
+ *
8
+ * When the popover opens, initial focus skips this button in favor of
9
+ * the first interactive element inside the popup (unless `initialFocus`
10
+ * on `Popover.Popup` overrides this behavior).
11
+ */
12
+ const Close = forwardRef< HTMLButtonElement, CloseProps >(
13
+ function PopoverClose( props, ref ) {
14
+ return (
15
+ <_Popover.Close
16
+ ref={ ref }
17
+ data-wp-ui-popover-close=""
18
+ { ...props }
19
+ />
20
+ );
21
+ }
22
+ );
23
+
24
+ export { Close };