@wordpress/ui 0.9.1-next.v.202603161435.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 (655) hide show
  1. package/CHANGELOG.md +76 -1
  2. package/CONTRIBUTING.md +180 -0
  3. package/README.md +34 -6
  4. package/build/alert-dialog/context.cjs +39 -0
  5. package/build/alert-dialog/context.cjs.map +7 -0
  6. package/build/alert-dialog/index.cjs +37 -0
  7. package/build/alert-dialog/index.cjs.map +7 -0
  8. package/build/alert-dialog/popup.cjs +165 -0
  9. package/build/alert-dialog/popup.cjs.map +7 -0
  10. package/build/alert-dialog/root.cjs +152 -0
  11. package/build/alert-dialog/root.cjs.map +7 -0
  12. package/build/alert-dialog/trigger.cjs +38 -0
  13. package/build/alert-dialog/trigger.cjs.map +7 -0
  14. package/build/alert-dialog/types.cjs +19 -0
  15. package/build/alert-dialog/types.cjs.map +7 -0
  16. package/build/badge/badge.cjs +14 -14
  17. package/build/badge/badge.cjs.map +2 -2
  18. package/build/button/button.cjs +18 -8
  19. package/build/button/button.cjs.map +3 -3
  20. package/build/card/content.cjs +4 -4
  21. package/build/card/content.cjs.map +2 -2
  22. package/build/card/full-bleed.cjs +4 -4
  23. package/build/card/full-bleed.cjs.map +2 -2
  24. package/build/card/header.cjs +4 -4
  25. package/build/card/header.cjs.map +2 -2
  26. package/build/card/root.cjs +6 -6
  27. package/build/card/root.cjs.map +2 -2
  28. package/build/card/title.cjs +14 -21
  29. package/build/card/title.cjs.map +3 -3
  30. package/build/collapsible-card/content.cjs +24 -3
  31. package/build/collapsible-card/content.cjs.map +4 -4
  32. package/build/collapsible-card/context.cjs +35 -0
  33. package/build/collapsible-card/context.cjs.map +7 -0
  34. package/build/collapsible-card/header-description.cjs +52 -0
  35. package/build/collapsible-card/header-description.cjs.map +7 -0
  36. package/build/collapsible-card/header.cjs +39 -18
  37. package/build/collapsible-card/header.cjs.map +2 -2
  38. package/build/collapsible-card/index.cjs +3 -0
  39. package/build/collapsible-card/index.cjs.map +2 -2
  40. package/build/collapsible-card/types.cjs.map +1 -1
  41. package/build/dialog/action.cjs +4 -2
  42. package/build/dialog/action.cjs.map +2 -2
  43. package/build/dialog/close-icon.cjs +2 -1
  44. package/build/dialog/close-icon.cjs.map +2 -2
  45. package/build/dialog/footer.cjs +3 -3
  46. package/build/dialog/footer.cjs.map +2 -2
  47. package/build/dialog/header.cjs +3 -3
  48. package/build/dialog/header.cjs.map +2 -2
  49. package/build/dialog/popup.cjs +24 -6
  50. package/build/dialog/popup.cjs.map +2 -2
  51. package/build/dialog/title.cjs +10 -19
  52. package/build/dialog/title.cjs.map +3 -3
  53. package/build/dialog/types.cjs.map +1 -1
  54. package/build/empty-state/actions.cjs +66 -0
  55. package/build/empty-state/actions.cjs.map +7 -0
  56. package/build/empty-state/description.cjs +69 -0
  57. package/build/empty-state/description.cjs.map +7 -0
  58. package/build/empty-state/icon.cjs +69 -0
  59. package/build/empty-state/icon.cjs.map +7 -0
  60. package/build/empty-state/index.cjs +46 -0
  61. package/build/empty-state/index.cjs.map +7 -0
  62. package/build/empty-state/root.cjs +66 -0
  63. package/build/empty-state/root.cjs.map +7 -0
  64. package/build/empty-state/title.cjs +71 -0
  65. package/build/empty-state/title.cjs.map +7 -0
  66. package/build/empty-state/types.cjs +19 -0
  67. package/build/empty-state/types.cjs.map +7 -0
  68. package/build/empty-state/visual.cjs +66 -0
  69. package/build/empty-state/visual.cjs.map +7 -0
  70. package/build/form/index.cjs +27 -0
  71. package/build/form/index.cjs.map +7 -0
  72. package/build/form/input-control/index.cjs +31 -0
  73. package/build/form/input-control/index.cjs.map +7 -0
  74. package/build/form/input-control/input-control.cjs +50 -0
  75. package/build/form/input-control/input-control.cjs.map +7 -0
  76. package/build/form/input-control/types.cjs +19 -0
  77. package/build/form/input-control/types.cjs.map +7 -0
  78. package/build/form/primitives/field/description.cjs +17 -4
  79. package/build/form/primitives/field/description.cjs.map +3 -3
  80. package/build/form/primitives/field/details.cjs +4 -4
  81. package/build/form/primitives/field/details.cjs.map +2 -2
  82. package/build/form/primitives/field/label.cjs +8 -8
  83. package/build/form/primitives/field/label.cjs.map +2 -2
  84. package/build/form/primitives/field/root.cjs +2 -2
  85. package/build/form/primitives/field/root.cjs.map +1 -1
  86. package/build/form/primitives/fieldset/description.cjs +20 -4
  87. package/build/form/primitives/fieldset/description.cjs.map +3 -3
  88. package/build/form/primitives/fieldset/details.cjs +3 -3
  89. package/build/form/primitives/fieldset/details.cjs.map +2 -2
  90. package/build/form/primitives/fieldset/legend.cjs +8 -7
  91. package/build/form/primitives/fieldset/legend.cjs.map +2 -2
  92. package/build/form/primitives/fieldset/root.cjs +2 -2
  93. package/build/form/primitives/fieldset/root.cjs.map +1 -1
  94. package/build/form/primitives/input/input.cjs +23 -7
  95. package/build/form/primitives/input/input.cjs.map +3 -3
  96. package/build/form/primitives/input-layout/input-layout.cjs +15 -5
  97. package/build/form/primitives/input-layout/input-layout.cjs.map +3 -3
  98. package/build/form/primitives/input-layout/slot.cjs +6 -5
  99. package/build/form/primitives/input-layout/slot.cjs.map +2 -2
  100. package/build/form/primitives/select/item.cjs +5 -5
  101. package/build/form/primitives/select/item.cjs.map +2 -2
  102. package/build/form/primitives/select/popup.cjs +9 -9
  103. package/build/form/primitives/select/popup.cjs.map +2 -2
  104. package/build/form/primitives/select/trigger.cjs +6 -6
  105. package/build/form/primitives/select/trigger.cjs.map +2 -2
  106. package/build/form/primitives/select/types.cjs.map +1 -1
  107. package/build/form/primitives/textarea/textarea.cjs +23 -4
  108. package/build/form/primitives/textarea/textarea.cjs.map +3 -3
  109. package/build/form/types.cjs +19 -0
  110. package/build/form/types.cjs.map +7 -0
  111. package/build/icon-button/icon-button.cjs +2 -2
  112. package/build/icon-button/icon-button.cjs.map +1 -1
  113. package/build/index.cjs +11 -2
  114. package/build/index.cjs.map +2 -2
  115. package/build/link/link.cjs +18 -8
  116. package/build/link/link.cjs.map +3 -3
  117. package/build/notice/action-button.cjs +3 -3
  118. package/build/notice/action-button.cjs.map +2 -2
  119. package/build/notice/action-link.cjs +3 -3
  120. package/build/notice/action-link.cjs.map +2 -2
  121. package/build/notice/actions.cjs +3 -3
  122. package/build/notice/actions.cjs.map +2 -2
  123. package/build/notice/close-icon.cjs +3 -3
  124. package/build/notice/close-icon.cjs.map +2 -2
  125. package/build/notice/description.cjs +3 -3
  126. package/build/notice/description.cjs.map +2 -2
  127. package/build/notice/index.cjs.map +1 -1
  128. package/build/notice/root.cjs +5 -5
  129. package/build/notice/root.cjs.map +2 -2
  130. package/build/notice/title.cjs +3 -3
  131. package/build/notice/title.cjs.map +2 -2
  132. package/build/popover/arrow.cjs +94 -0
  133. package/build/popover/arrow.cjs.map +7 -0
  134. package/build/popover/close.cjs +45 -0
  135. package/build/popover/close.cjs.map +7 -0
  136. package/build/popover/context.cjs +76 -0
  137. package/build/popover/context.cjs.map +7 -0
  138. package/build/popover/description.cjs +70 -0
  139. package/build/popover/description.cjs.map +7 -0
  140. package/build/popover/index.cjs +49 -0
  141. package/build/popover/index.cjs.map +7 -0
  142. package/build/popover/popup.cjs +138 -0
  143. package/build/popover/popup.cjs.map +7 -0
  144. package/build/popover/root.cjs +35 -0
  145. package/build/popover/root.cjs.map +7 -0
  146. package/build/popover/title.cjs +56 -0
  147. package/build/popover/title.cjs.map +7 -0
  148. package/build/popover/trigger.cjs +38 -0
  149. package/build/popover/trigger.cjs.map +7 -0
  150. package/build/popover/types.cjs +19 -0
  151. package/build/popover/types.cjs.map +7 -0
  152. package/build/stack/stack.cjs +2 -2
  153. package/build/stack/stack.cjs.map +1 -1
  154. package/build/tabs/context.cjs +121 -0
  155. package/build/tabs/context.cjs.map +7 -0
  156. package/build/tabs/list.cjs +3 -4
  157. package/build/tabs/list.cjs.map +2 -2
  158. package/build/tabs/panel.cjs +5 -3
  159. package/build/tabs/panel.cjs.map +2 -2
  160. package/build/tabs/root.cjs +2 -1
  161. package/build/tabs/root.cjs.map +2 -2
  162. package/build/tabs/tab.cjs +5 -3
  163. package/build/tabs/tab.cjs.map +2 -2
  164. package/build/text/text.cjs +20 -5
  165. package/build/text/text.cjs.map +3 -3
  166. package/build/tooltip/popup.cjs +7 -6
  167. package/build/tooltip/popup.cjs.map +2 -2
  168. package/build/tooltip/root.cjs.map +2 -2
  169. package/build/tooltip/types.cjs.map +1 -1
  170. package/build/utils/types.cjs.map +1 -1
  171. package/build/utils/use-deprioritized-initial-focus.cjs +64 -0
  172. package/build/utils/use-deprioritized-initial-focus.cjs.map +7 -0
  173. package/build/visually-hidden/visually-hidden.cjs +2 -2
  174. package/build/visually-hidden/visually-hidden.cjs.map +2 -2
  175. package/build-module/alert-dialog/context.mjs +14 -0
  176. package/build-module/alert-dialog/context.mjs.map +7 -0
  177. package/build-module/alert-dialog/index.mjs +10 -0
  178. package/build-module/alert-dialog/index.mjs.map +7 -0
  179. package/build-module/alert-dialog/popup.mjs +132 -0
  180. package/build-module/alert-dialog/popup.mjs.map +7 -0
  181. package/build-module/alert-dialog/root.mjs +133 -0
  182. package/build-module/alert-dialog/root.mjs.map +7 -0
  183. package/build-module/alert-dialog/trigger.mjs +13 -0
  184. package/build-module/alert-dialog/trigger.mjs.map +7 -0
  185. package/build-module/alert-dialog/types.mjs +1 -0
  186. package/build-module/alert-dialog/types.mjs.map +7 -0
  187. package/build-module/badge/badge.mjs +14 -14
  188. package/build-module/badge/badge.mjs.map +2 -2
  189. package/build-module/button/button.mjs +18 -8
  190. package/build-module/button/button.mjs.map +3 -3
  191. package/build-module/card/content.mjs +4 -4
  192. package/build-module/card/content.mjs.map +2 -2
  193. package/build-module/card/full-bleed.mjs +4 -4
  194. package/build-module/card/full-bleed.mjs.map +2 -2
  195. package/build-module/card/header.mjs +4 -4
  196. package/build-module/card/header.mjs.map +2 -2
  197. package/build-module/card/root.mjs +6 -6
  198. package/build-module/card/root.mjs.map +2 -2
  199. package/build-module/card/title.mjs +14 -21
  200. package/build-module/card/title.mjs.map +3 -3
  201. package/build-module/collapsible-card/content.mjs +24 -3
  202. package/build-module/collapsible-card/content.mjs.map +3 -3
  203. package/build-module/collapsible-card/context.mjs +10 -0
  204. package/build-module/collapsible-card/context.mjs.map +7 -0
  205. package/build-module/collapsible-card/header-description.mjs +27 -0
  206. package/build-module/collapsible-card/header-description.mjs.map +7 -0
  207. package/build-module/collapsible-card/header.mjs +40 -19
  208. package/build-module/collapsible-card/header.mjs.map +2 -2
  209. package/build-module/collapsible-card/index.mjs +2 -0
  210. package/build-module/collapsible-card/index.mjs.map +2 -2
  211. package/build-module/dialog/action.mjs +4 -2
  212. package/build-module/dialog/action.mjs.map +2 -2
  213. package/build-module/dialog/close-icon.mjs +2 -1
  214. package/build-module/dialog/close-icon.mjs.map +2 -2
  215. package/build-module/dialog/footer.mjs +3 -3
  216. package/build-module/dialog/footer.mjs.map +2 -2
  217. package/build-module/dialog/header.mjs +3 -3
  218. package/build-module/dialog/header.mjs.map +2 -2
  219. package/build-module/dialog/popup.mjs +24 -6
  220. package/build-module/dialog/popup.mjs.map +2 -2
  221. package/build-module/dialog/title.mjs +10 -9
  222. package/build-module/dialog/title.mjs.map +2 -2
  223. package/build-module/empty-state/actions.mjs +31 -0
  224. package/build-module/empty-state/actions.mjs.map +7 -0
  225. package/build-module/empty-state/description.mjs +34 -0
  226. package/build-module/empty-state/description.mjs.map +7 -0
  227. package/build-module/empty-state/icon.mjs +34 -0
  228. package/build-module/empty-state/icon.mjs.map +7 -0
  229. package/build-module/empty-state/index.mjs +16 -0
  230. package/build-module/empty-state/index.mjs.map +7 -0
  231. package/build-module/empty-state/root.mjs +31 -0
  232. package/build-module/empty-state/root.mjs.map +7 -0
  233. package/build-module/empty-state/title.mjs +36 -0
  234. package/build-module/empty-state/title.mjs.map +7 -0
  235. package/build-module/empty-state/types.mjs +1 -0
  236. package/build-module/empty-state/types.mjs.map +7 -0
  237. package/build-module/empty-state/visual.mjs +31 -0
  238. package/build-module/empty-state/visual.mjs.map +7 -0
  239. package/build-module/form/index.mjs +4 -0
  240. package/build-module/form/index.mjs.map +7 -0
  241. package/build-module/form/input-control/index.mjs +6 -0
  242. package/build-module/form/input-control/index.mjs.map +7 -0
  243. package/build-module/form/input-control/input-control.mjs +25 -0
  244. package/build-module/form/input-control/input-control.mjs.map +7 -0
  245. package/build-module/form/input-control/types.mjs +1 -0
  246. package/build-module/form/input-control/types.mjs.map +7 -0
  247. package/build-module/form/primitives/field/description.mjs +17 -4
  248. package/build-module/form/primitives/field/description.mjs.map +3 -3
  249. package/build-module/form/primitives/field/details.mjs +4 -4
  250. package/build-module/form/primitives/field/details.mjs.map +2 -2
  251. package/build-module/form/primitives/field/label.mjs +8 -8
  252. package/build-module/form/primitives/field/label.mjs.map +2 -2
  253. package/build-module/form/primitives/field/root.mjs +2 -2
  254. package/build-module/form/primitives/field/root.mjs.map +1 -1
  255. package/build-module/form/primitives/fieldset/description.mjs +20 -4
  256. package/build-module/form/primitives/fieldset/description.mjs.map +3 -3
  257. package/build-module/form/primitives/fieldset/details.mjs +3 -3
  258. package/build-module/form/primitives/fieldset/details.mjs.map +2 -2
  259. package/build-module/form/primitives/fieldset/legend.mjs +8 -7
  260. package/build-module/form/primitives/fieldset/legend.mjs.map +2 -2
  261. package/build-module/form/primitives/fieldset/root.mjs +2 -2
  262. package/build-module/form/primitives/fieldset/root.mjs.map +1 -1
  263. package/build-module/form/primitives/input/input.mjs +23 -7
  264. package/build-module/form/primitives/input/input.mjs.map +3 -3
  265. package/build-module/form/primitives/input-layout/input-layout.mjs +15 -5
  266. package/build-module/form/primitives/input-layout/input-layout.mjs.map +3 -3
  267. package/build-module/form/primitives/input-layout/slot.mjs +6 -5
  268. package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
  269. package/build-module/form/primitives/select/item.mjs +5 -5
  270. package/build-module/form/primitives/select/item.mjs.map +2 -2
  271. package/build-module/form/primitives/select/popup.mjs +9 -9
  272. package/build-module/form/primitives/select/popup.mjs.map +2 -2
  273. package/build-module/form/primitives/select/trigger.mjs +6 -6
  274. package/build-module/form/primitives/select/trigger.mjs.map +2 -2
  275. package/build-module/form/primitives/textarea/textarea.mjs +23 -4
  276. package/build-module/form/primitives/textarea/textarea.mjs.map +3 -3
  277. package/build-module/form/types.mjs +1 -0
  278. package/build-module/form/types.mjs.map +7 -0
  279. package/build-module/icon-button/icon-button.mjs +2 -2
  280. package/build-module/icon-button/icon-button.mjs.map +1 -1
  281. package/build-module/index.mjs +7 -1
  282. package/build-module/index.mjs.map +2 -2
  283. package/build-module/link/link.mjs +18 -8
  284. package/build-module/link/link.mjs.map +3 -3
  285. package/build-module/notice/action-button.mjs +3 -3
  286. package/build-module/notice/action-button.mjs.map +2 -2
  287. package/build-module/notice/action-link.mjs +3 -3
  288. package/build-module/notice/action-link.mjs.map +2 -2
  289. package/build-module/notice/actions.mjs +3 -3
  290. package/build-module/notice/actions.mjs.map +2 -2
  291. package/build-module/notice/close-icon.mjs +3 -3
  292. package/build-module/notice/close-icon.mjs.map +2 -2
  293. package/build-module/notice/description.mjs +3 -3
  294. package/build-module/notice/description.mjs.map +2 -2
  295. package/build-module/notice/index.mjs.map +1 -1
  296. package/build-module/notice/root.mjs +5 -5
  297. package/build-module/notice/root.mjs.map +2 -2
  298. package/build-module/notice/title.mjs +3 -3
  299. package/build-module/notice/title.mjs.map +2 -2
  300. package/build-module/popover/arrow.mjs +59 -0
  301. package/build-module/popover/arrow.mjs.map +7 -0
  302. package/build-module/popover/close.mjs +20 -0
  303. package/build-module/popover/close.mjs.map +7 -0
  304. package/build-module/popover/context.mjs +57 -0
  305. package/build-module/popover/context.mjs.map +7 -0
  306. package/build-module/popover/description.mjs +35 -0
  307. package/build-module/popover/description.mjs.map +7 -0
  308. package/build-module/popover/index.mjs +18 -0
  309. package/build-module/popover/index.mjs.map +7 -0
  310. package/build-module/popover/popup.mjs +105 -0
  311. package/build-module/popover/popup.mjs.map +7 -0
  312. package/build-module/popover/root.mjs +10 -0
  313. package/build-module/popover/root.mjs.map +7 -0
  314. package/build-module/popover/title.mjs +31 -0
  315. package/build-module/popover/title.mjs.map +7 -0
  316. package/build-module/popover/trigger.mjs +13 -0
  317. package/build-module/popover/trigger.mjs.map +7 -0
  318. package/build-module/popover/types.mjs +1 -0
  319. package/build-module/popover/types.mjs.map +7 -0
  320. package/build-module/stack/stack.mjs +2 -2
  321. package/build-module/stack/stack.mjs.map +1 -1
  322. package/build-module/tabs/context.mjs +101 -0
  323. package/build-module/tabs/context.mjs.map +7 -0
  324. package/build-module/tabs/list.mjs +3 -4
  325. package/build-module/tabs/list.mjs.map +2 -2
  326. package/build-module/tabs/panel.mjs +5 -3
  327. package/build-module/tabs/panel.mjs.map +2 -2
  328. package/build-module/tabs/root.mjs +2 -1
  329. package/build-module/tabs/root.mjs.map +2 -2
  330. package/build-module/tabs/tab.mjs +5 -3
  331. package/build-module/tabs/tab.mjs.map +2 -2
  332. package/build-module/text/text.mjs +20 -5
  333. package/build-module/text/text.mjs.map +3 -3
  334. package/build-module/tooltip/popup.mjs +7 -6
  335. package/build-module/tooltip/popup.mjs.map +2 -2
  336. package/build-module/tooltip/root.mjs.map +2 -2
  337. package/build-module/utils/use-deprioritized-initial-focus.mjs +39 -0
  338. package/build-module/utils/use-deprioritized-initial-focus.mjs.map +7 -0
  339. package/build-module/visually-hidden/visually-hidden.mjs +2 -2
  340. package/build-module/visually-hidden/visually-hidden.mjs.map +2 -2
  341. package/build-types/alert-dialog/context.d.ts +11 -0
  342. package/build-types/alert-dialog/context.d.ts.map +1 -0
  343. package/build-types/alert-dialog/index.d.ts +4 -0
  344. package/build-types/alert-dialog/index.d.ts.map +1 -0
  345. package/build-types/alert-dialog/popup.d.ts +4 -0
  346. package/build-types/alert-dialog/popup.d.ts.map +1 -0
  347. package/build-types/alert-dialog/root.d.ts +18 -0
  348. package/build-types/alert-dialog/root.d.ts.map +1 -0
  349. package/build-types/alert-dialog/stories/index.story.d.ts +56 -0
  350. package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -0
  351. package/build-types/alert-dialog/test/index.test.d.ts +2 -0
  352. package/build-types/alert-dialog/test/index.test.d.ts.map +1 -0
  353. package/build-types/alert-dialog/trigger.d.ts +7 -0
  354. package/build-types/alert-dialog/trigger.d.ts.map +1 -0
  355. package/build-types/alert-dialog/types.d.ts +105 -0
  356. package/build-types/alert-dialog/types.d.ts.map +1 -0
  357. package/build-types/badge/badge.d.ts.map +1 -1
  358. package/build-types/button/button.d.ts.map +1 -1
  359. package/build-types/card/stories/index.story.d.ts.map +1 -1
  360. package/build-types/card/title.d.ts.map +1 -1
  361. package/build-types/collapsible/panel.d.ts +2 -1
  362. package/build-types/collapsible/panel.d.ts.map +1 -1
  363. package/build-types/collapsible/root.d.ts +2 -1
  364. package/build-types/collapsible/root.d.ts.map +1 -1
  365. package/build-types/collapsible/trigger.d.ts +2 -1
  366. package/build-types/collapsible/trigger.d.ts.map +1 -1
  367. package/build-types/collapsible-card/content.d.ts.map +1 -1
  368. package/build-types/collapsible-card/context.d.ts +4 -0
  369. package/build-types/collapsible-card/context.d.ts.map +1 -0
  370. package/build-types/collapsible-card/header-description.d.ts +15 -0
  371. package/build-types/collapsible-card/header-description.d.ts.map +1 -0
  372. package/build-types/collapsible-card/header.d.ts.map +1 -1
  373. package/build-types/collapsible-card/index.d.ts +2 -1
  374. package/build-types/collapsible-card/index.d.ts.map +1 -1
  375. package/build-types/collapsible-card/stories/index.story.d.ts +10 -0
  376. package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
  377. package/build-types/collapsible-card/types.d.ts +21 -0
  378. package/build-types/collapsible-card/types.d.ts.map +1 -1
  379. package/build-types/dialog/action.d.ts.map +1 -1
  380. package/build-types/dialog/close-icon.d.ts.map +1 -1
  381. package/build-types/dialog/popup.d.ts.map +1 -1
  382. package/build-types/dialog/stories/index.story.d.ts +8 -6
  383. package/build-types/dialog/stories/index.story.d.ts.map +1 -1
  384. package/build-types/dialog/title.d.ts +12 -2
  385. package/build-types/dialog/title.d.ts.map +1 -1
  386. package/build-types/dialog/types.d.ts +13 -6
  387. package/build-types/dialog/types.d.ts.map +1 -1
  388. package/build-types/empty-state/actions.d.ts +7 -0
  389. package/build-types/empty-state/actions.d.ts.map +1 -0
  390. package/build-types/empty-state/description.d.ts +7 -0
  391. package/build-types/empty-state/description.d.ts.map +1 -0
  392. package/build-types/empty-state/icon.d.ts +7 -0
  393. package/build-types/empty-state/icon.d.ts.map +1 -0
  394. package/build-types/empty-state/index.d.ts +8 -0
  395. package/build-types/empty-state/index.d.ts.map +1 -0
  396. package/build-types/empty-state/root.d.ts +6 -0
  397. package/build-types/empty-state/root.d.ts.map +1 -0
  398. package/build-types/empty-state/stories/index.story.d.ts +8 -0
  399. package/build-types/empty-state/stories/index.story.d.ts.map +1 -0
  400. package/build-types/empty-state/test/actions.test.d.ts +2 -0
  401. package/build-types/empty-state/test/actions.test.d.ts.map +1 -0
  402. package/build-types/empty-state/test/description.test.d.ts +2 -0
  403. package/build-types/empty-state/test/description.test.d.ts.map +1 -0
  404. package/build-types/empty-state/test/icon.test.d.ts +2 -0
  405. package/build-types/empty-state/test/icon.test.d.ts.map +1 -0
  406. package/build-types/empty-state/test/root.test.d.ts +2 -0
  407. package/build-types/empty-state/test/root.test.d.ts.map +1 -0
  408. package/build-types/empty-state/test/title.test.d.ts +2 -0
  409. package/build-types/empty-state/test/title.test.d.ts.map +1 -0
  410. package/build-types/empty-state/test/visual.test.d.ts +2 -0
  411. package/build-types/empty-state/test/visual.test.d.ts.map +1 -0
  412. package/build-types/empty-state/title.d.ts +6 -0
  413. package/build-types/empty-state/title.d.ts.map +1 -0
  414. package/build-types/empty-state/types.d.ts +40 -0
  415. package/build-types/empty-state/types.d.ts.map +1 -0
  416. package/build-types/empty-state/visual.d.ts +7 -0
  417. package/build-types/empty-state/visual.d.ts.map +1 -0
  418. package/build-types/form/index.d.ts +3 -0
  419. package/build-types/form/index.d.ts.map +1 -0
  420. package/build-types/form/input-control/index.d.ts +2 -0
  421. package/build-types/form/input-control/index.d.ts.map +1 -0
  422. package/build-types/form/input-control/input-control.d.ts +6 -0
  423. package/build-types/form/input-control/input-control.d.ts.map +1 -0
  424. package/build-types/form/input-control/stories/index.story.d.ts +16 -0
  425. package/build-types/form/input-control/stories/index.story.d.ts.map +1 -0
  426. package/build-types/form/input-control/test/index.test.d.ts +2 -0
  427. package/build-types/form/input-control/test/index.test.d.ts.map +1 -0
  428. package/build-types/form/input-control/types.d.ts +4 -0
  429. package/build-types/form/input-control/types.d.ts.map +1 -0
  430. package/build-types/form/primitives/field/description.d.ts +2 -1
  431. package/build-types/form/primitives/field/description.d.ts.map +1 -1
  432. package/build-types/form/primitives/field/details.d.ts +2 -1
  433. package/build-types/form/primitives/field/details.d.ts.map +1 -1
  434. package/build-types/form/primitives/field/label.d.ts +2 -1
  435. package/build-types/form/primitives/field/label.d.ts.map +1 -1
  436. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  437. package/build-types/form/primitives/fieldset/description.d.ts +2 -1
  438. package/build-types/form/primitives/fieldset/description.d.ts.map +1 -1
  439. package/build-types/form/primitives/fieldset/details.d.ts +2 -1
  440. package/build-types/form/primitives/fieldset/details.d.ts.map +1 -1
  441. package/build-types/form/primitives/fieldset/legend.d.ts +2 -1
  442. package/build-types/form/primitives/fieldset/legend.d.ts.map +1 -1
  443. package/build-types/form/primitives/fieldset/root.d.ts +2 -1
  444. package/build-types/form/primitives/fieldset/root.d.ts.map +1 -1
  445. package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
  446. package/build-types/form/primitives/input/input.d.ts.map +1 -1
  447. package/build-types/form/primitives/input/stories/index.story.d.ts +2 -0
  448. package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
  449. package/build-types/form/primitives/input-layout/input-layout.d.ts.map +1 -1
  450. package/build-types/form/primitives/input-layout/slot.d.ts.map +1 -1
  451. package/build-types/form/primitives/input-layout/stories/index.story.d.ts +5 -0
  452. package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
  453. package/build-types/form/primitives/select/item.d.ts +6 -2
  454. package/build-types/form/primitives/select/item.d.ts.map +1 -1
  455. package/build-types/form/primitives/select/popup.d.ts +11 -1
  456. package/build-types/form/primitives/select/popup.d.ts.map +1 -1
  457. package/build-types/form/primitives/select/trigger.d.ts +12 -2
  458. package/build-types/form/primitives/select/trigger.d.ts.map +1 -1
  459. package/build-types/form/primitives/select/types.d.ts +13 -3
  460. package/build-types/form/primitives/select/types.d.ts.map +1 -1
  461. package/build-types/form/primitives/textarea/textarea.d.ts.map +1 -1
  462. package/build-types/form/stories/shared.d.ts +3 -0
  463. package/build-types/form/stories/shared.d.ts.map +1 -0
  464. package/build-types/form/types.d.ts +30 -0
  465. package/build-types/form/types.d.ts.map +1 -0
  466. package/build-types/index.d.ts +4 -1
  467. package/build-types/index.d.ts.map +1 -1
  468. package/build-types/link/link.d.ts.map +1 -1
  469. package/build-types/notice/index.d.ts +0 -1
  470. package/build-types/notice/index.d.ts.map +1 -1
  471. package/build-types/popover/arrow.d.ts +10 -0
  472. package/build-types/popover/arrow.d.ts.map +1 -0
  473. package/build-types/popover/close.d.ts +11 -0
  474. package/build-types/popover/close.d.ts.map +1 -0
  475. package/build-types/popover/context.d.ts +22 -0
  476. package/build-types/popover/context.d.ts.map +1 -0
  477. package/build-types/popover/description.d.ts +10 -0
  478. package/build-types/popover/description.d.ts.map +1 -0
  479. package/build-types/popover/index.d.ts +9 -0
  480. package/build-types/popover/index.d.ts.map +1 -0
  481. package/build-types/popover/popup.d.ts +11 -0
  482. package/build-types/popover/popup.d.ts.map +1 -0
  483. package/build-types/popover/root.d.ts +37 -0
  484. package/build-types/popover/root.d.ts.map +1 -0
  485. package/build-types/popover/stories/index.story.d.ts +211 -0
  486. package/build-types/popover/stories/index.story.d.ts.map +1 -0
  487. package/build-types/popover/stories/utils.d.ts +25 -0
  488. package/build-types/popover/stories/utils.d.ts.map +1 -0
  489. package/build-types/popover/test/index.test.d.ts +2 -0
  490. package/build-types/popover/test/index.test.d.ts.map +1 -0
  491. package/build-types/popover/title.d.ts +20 -0
  492. package/build-types/popover/title.d.ts.map +1 -0
  493. package/build-types/popover/trigger.d.ts +10 -0
  494. package/build-types/popover/trigger.d.ts.map +1 -0
  495. package/build-types/popover/types.d.ts +83 -0
  496. package/build-types/popover/types.d.ts.map +1 -0
  497. package/build-types/tabs/context.d.ts +26 -0
  498. package/build-types/tabs/context.d.ts.map +1 -0
  499. package/build-types/tabs/list.d.ts +2 -1
  500. package/build-types/tabs/list.d.ts.map +1 -1
  501. package/build-types/tabs/panel.d.ts +2 -1
  502. package/build-types/tabs/panel.d.ts.map +1 -1
  503. package/build-types/tabs/root.d.ts +2 -1
  504. package/build-types/tabs/root.d.ts.map +1 -1
  505. package/build-types/tabs/tab.d.ts +2 -1
  506. package/build-types/tabs/tab.d.ts.map +1 -1
  507. package/build-types/text/stories/index.story.d.ts +4 -0
  508. package/build-types/text/stories/index.story.d.ts.map +1 -1
  509. package/build-types/text/text.d.ts.map +1 -1
  510. package/build-types/tooltip/popup.d.ts.map +1 -1
  511. package/build-types/tooltip/root.d.ts +13 -0
  512. package/build-types/tooltip/root.d.ts.map +1 -1
  513. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  514. package/build-types/tooltip/stories/usage-guidelines.story.d.ts +21 -0
  515. package/build-types/tooltip/stories/usage-guidelines.story.d.ts.map +1 -0
  516. package/build-types/tooltip/types.d.ts +4 -0
  517. package/build-types/tooltip/types.d.ts.map +1 -1
  518. package/build-types/utils/test/use-deprioritized-initial-focus.test.d.ts +2 -0
  519. package/build-types/utils/test/use-deprioritized-initial-focus.test.d.ts.map +1 -0
  520. package/build-types/utils/types.d.ts +6 -2
  521. package/build-types/utils/types.d.ts.map +1 -1
  522. package/build-types/utils/use-deprioritized-initial-focus.d.ts +36 -0
  523. package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -0
  524. package/build-types/visually-hidden/stories/index.story.d.ts +7 -0
  525. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  526. package/build-types/visually-hidden/visually-hidden.d.ts +34 -0
  527. package/build-types/visually-hidden/visually-hidden.d.ts.map +1 -1
  528. package/package.json +17 -16
  529. package/src/alert-dialog/context.tsx +22 -0
  530. package/src/alert-dialog/index.ts +3 -0
  531. package/src/alert-dialog/popup.tsx +116 -0
  532. package/src/alert-dialog/root.tsx +226 -0
  533. package/src/alert-dialog/stories/index.story.tsx +305 -0
  534. package/src/alert-dialog/style.module.css +21 -0
  535. package/src/alert-dialog/test/index.test.tsx +1509 -0
  536. package/src/alert-dialog/trigger.tsx +15 -0
  537. package/src/alert-dialog/types.ts +119 -0
  538. package/src/badge/badge.tsx +11 -14
  539. package/src/badge/style.module.css +0 -4
  540. package/src/button/button.tsx +2 -0
  541. package/src/button/style.module.css +9 -3
  542. package/src/card/stories/index.story.tsx +4 -5
  543. package/src/card/style.module.css +4 -10
  544. package/src/card/test/index.test.tsx +17 -1
  545. package/src/card/title.tsx +14 -12
  546. package/src/collapsible-card/content.tsx +16 -3
  547. package/src/collapsible-card/context.ts +7 -0
  548. package/src/collapsible-card/header-description.tsx +43 -0
  549. package/src/collapsible-card/header.tsx +47 -24
  550. package/src/collapsible-card/index.ts +2 -1
  551. package/src/collapsible-card/stories/index.story.tsx +102 -4
  552. package/src/collapsible-card/style.module.css +34 -2
  553. package/src/collapsible-card/test/index.test.tsx +96 -9
  554. package/src/collapsible-card/types.ts +22 -0
  555. package/src/dialog/action.tsx +8 -2
  556. package/src/dialog/close-icon.tsx +1 -0
  557. package/src/dialog/popup.tsx +23 -3
  558. package/src/dialog/stories/index.story.tsx +33 -28
  559. package/src/dialog/style.module.css +18 -14
  560. package/src/dialog/test/index.test.tsx +180 -4
  561. package/src/dialog/title.tsx +21 -9
  562. package/src/dialog/types.ts +20 -6
  563. package/src/empty-state/actions.tsx +24 -0
  564. package/src/empty-state/description.tsx +31 -0
  565. package/src/empty-state/icon.tsx +24 -0
  566. package/src/empty-state/index.ts +8 -0
  567. package/src/empty-state/root.tsx +23 -0
  568. package/src/empty-state/stories/index.story.tsx +64 -0
  569. package/src/empty-state/style.module.css +53 -0
  570. package/src/empty-state/test/actions.test.tsx +18 -0
  571. package/src/empty-state/test/description.test.tsx +26 -0
  572. package/src/empty-state/test/icon.test.tsx +13 -0
  573. package/src/empty-state/test/root.test.tsx +13 -0
  574. package/src/empty-state/test/title.test.tsx +26 -0
  575. package/src/empty-state/test/visual.test.tsx +17 -0
  576. package/src/empty-state/title.tsx +29 -0
  577. package/src/empty-state/types.ts +45 -0
  578. package/src/empty-state/visual.tsx +24 -0
  579. package/src/form/index.ts +3 -0
  580. package/src/form/input-control/index.ts +1 -0
  581. package/src/form/input-control/input-control.tsx +33 -0
  582. package/src/form/input-control/stories/index.story.tsx +163 -0
  583. package/src/form/input-control/test/index.test.tsx +53 -0
  584. package/src/form/input-control/types.ts +5 -0
  585. package/src/form/primitives/field/description.tsx +6 -1
  586. package/src/form/primitives/field/details.tsx +4 -2
  587. package/src/form/primitives/field/label.tsx +9 -5
  588. package/src/form/primitives/field/stories/index.story.tsx +2 -7
  589. package/src/form/primitives/field/test/index.test.tsx +11 -0
  590. package/src/form/primitives/fieldset/description.tsx +9 -1
  591. package/src/form/primitives/fieldset/legend.tsx +9 -4
  592. package/src/form/primitives/fieldset/stories/index.story.tsx +2 -7
  593. package/src/form/primitives/fieldset/test/index.test.tsx +22 -0
  594. package/src/form/primitives/input/input.tsx +6 -1
  595. package/src/form/primitives/input/stories/index.story.tsx +7 -0
  596. package/src/form/primitives/input/style.module.css +4 -0
  597. package/src/form/primitives/input-layout/input-layout.tsx +2 -0
  598. package/src/form/primitives/input-layout/slot.tsx +6 -2
  599. package/src/form/primitives/input-layout/stories/index.story.tsx +22 -1
  600. package/src/form/primitives/input-layout/style.module.css +3 -3
  601. package/src/form/primitives/select/popup.tsx +5 -2
  602. package/src/form/primitives/select/test/index.test.tsx +60 -1
  603. package/src/form/primitives/select/types.ts +14 -4
  604. package/src/form/primitives/stories/overview.mdx +15 -0
  605. package/src/form/primitives/textarea/textarea.tsx +11 -2
  606. package/src/form/stories/shared.tsx +21 -0
  607. package/src/form/types.ts +34 -0
  608. package/src/index.ts +4 -1
  609. package/src/link/link.tsx +2 -0
  610. package/src/link/style.module.css +11 -1
  611. package/src/notice/index.ts +0 -2
  612. package/src/notice/style.module.css +6 -6
  613. package/src/popover/arrow.tsx +49 -0
  614. package/src/popover/close.tsx +24 -0
  615. package/src/popover/context.tsx +100 -0
  616. package/src/popover/description.tsx +29 -0
  617. package/src/popover/index.ts +9 -0
  618. package/src/popover/popup.tsx +106 -0
  619. package/src/popover/root.tsx +41 -0
  620. package/src/popover/stories/index.story.tsx +1315 -0
  621. package/src/popover/stories/utils.tsx +91 -0
  622. package/src/popover/style.module.css +64 -0
  623. package/src/popover/test/index.test.tsx +727 -0
  624. package/src/popover/title.tsx +47 -0
  625. package/src/popover/trigger.tsx +17 -0
  626. package/src/popover/types.ts +113 -0
  627. package/src/tabs/context.tsx +170 -0
  628. package/src/tabs/list.tsx +0 -1
  629. package/src/tabs/panel.tsx +3 -0
  630. package/src/tabs/root.tsx +6 -1
  631. package/src/tabs/style.module.css +3 -3
  632. package/src/tabs/tab.tsx +3 -0
  633. package/src/tabs/test/index.test.tsx +162 -0
  634. package/src/text/stories/index.story.tsx +4 -2
  635. package/src/text/style.module.css +62 -36
  636. package/src/text/test/index.test.tsx +1 -4
  637. package/src/text/text.tsx +8 -1
  638. package/src/tooltip/popup.tsx +2 -1
  639. package/src/tooltip/root.tsx +13 -0
  640. package/src/tooltip/stories/index.story.tsx +20 -15
  641. package/src/tooltip/stories/usage-guidelines.mdx +91 -0
  642. package/src/tooltip/stories/usage-guidelines.story.tsx +119 -0
  643. package/src/tooltip/style.module.css +2 -2
  644. package/src/tooltip/test/index.test.tsx +61 -0
  645. package/src/tooltip/types.ts +5 -0
  646. package/src/utils/css/field.module.css +12 -9
  647. package/src/utils/css/focus.module.css +7 -5
  648. package/src/utils/css/global-css-defense.module.css +117 -0
  649. package/src/utils/css/item-popup.module.css +3 -2
  650. package/src/utils/css/select-trigger.module.css +1 -0
  651. package/src/utils/test/use-deprioritized-initial-focus.test.tsx +230 -0
  652. package/src/utils/types.ts +7 -2
  653. package/src/utils/use-deprioritized-initial-focus.ts +84 -0
  654. package/src/visually-hidden/stories/index.story.tsx +25 -0
  655. package/src/visually-hidden/visually-hidden.tsx +34 -0
@@ -1,5 +1,6 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { InputLayout } from '../../../..';
2
+ import { copy } from '@wordpress/icons';
3
+ import { IconButton, InputLayout } from '../../../..';
3
4
 
4
5
  const meta: Meta< typeof InputLayout > = {
5
6
  title: 'Design System/Components/Form/Primitives/InputLayout',
@@ -50,6 +51,26 @@ export const WithPaddedPrefix: Story = {
50
51
  },
51
52
  };
52
53
 
54
+ /**
55
+ * The `padding="minimal"` setting on `InputLayout.Slot` will work best when
56
+ * the slot content is a button or icon.
57
+ */
58
+ export const WithSuffixControl: Story = {
59
+ args: {
60
+ children: <div style={ { flex: 1 } } />,
61
+ suffix: (
62
+ <InputLayout.Slot padding="minimal">
63
+ <IconButton
64
+ size="small"
65
+ variant="minimal"
66
+ icon={ copy }
67
+ label="Copy"
68
+ />
69
+ </InputLayout.Slot>
70
+ ),
71
+ },
72
+ };
73
+
53
74
  export const Compact: Story = {
54
75
  args: {
55
76
  size: 'compact',
@@ -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.
@@ -0,0 +1,15 @@
1
+ import { Meta } from '@storybook/addon-docs/blocks';
2
+
3
+ # Form Primitives
4
+
5
+ <Meta title="Design System/Components/Form/Primitives" name="Overview" />
6
+
7
+ These form primitives are the low-level building blocks for form-related components. Outside of rare, special use cases, a normal developer should not need to use these primitives directly.
8
+
9
+ ## When to use these primitives
10
+
11
+ 1. First check if there is a higher-level `*Control` component that meets your needs, either in this package, or if not, in [`@wordpress/components`](https://wordpress.github.io/gutenberg/?path=/docs/components-introduction--docs). Also consider using [`DataForm`](https://developer.wordpress.org/block-editor/reference-guides/packages/packages-dataviews/#dataform), an even higher-level abstraction.
12
+ 2. If not, discuss with your designer whether the design can be altered to not require these primitives.
13
+ 3. If not, then these primitives are the next best option. Keep in mind that you are responsible for ensuring that your implementation is accessible, and adheres to Design System guidelines.
14
+
15
+ Feel free to reach out to the `#design-system` channel on the [Make WordPress Slack](https://make.wordpress.org/chat/) for guidance.
@@ -4,12 +4,13 @@ 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' ] >,
10
11
  restProps: TextareaProps & { ref: React.Ref< HTMLTextAreaElement > }
11
12
  ) => {
12
- return function Render(
13
+ return function textareaRender(
13
14
  props: React.HTMLAttributes< HTMLTextAreaElement >
14
15
  ) {
15
16
  return typeof render === 'function'
@@ -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 }
@@ -0,0 +1,21 @@
1
+ import { Link } from '../..';
2
+
3
+ export const WITH_DETAILS_DESCRIPTION = `\
4
+ To add rich content (such as links) to the description, use the \`details\` prop.
5
+
6
+ Although this content is not associated with the field using direct semantics,
7
+ it is made discoverable to screen reader users via a visually hidden description,
8
+ alerting them to the presence of additional information below.
9
+
10
+ **Important:** If the content only includes plain text, use \`description\` instead,
11
+ so the readout is not unnecessarily verbose for screen reader users.`;
12
+
13
+ export const DETAILS_EXAMPLE = (
14
+ <>
15
+ Details can include{ ' ' }
16
+ <Link href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a">
17
+ links to more information
18
+ </Link>{ ' ' }
19
+ and other semantic elements.
20
+ </>
21
+ );
@@ -0,0 +1,34 @@
1
+ import type { Field } from './primitives';
2
+
3
+ export type ControlProps = {
4
+ /**
5
+ * The accessible label. All controls must be labeled.
6
+ */
7
+ label: React.ComponentProps< typeof Field.Label >[ 'children' ];
8
+ /**
9
+ * The accessible description, associated using `aria-describedby`.
10
+ *
11
+ * For screen reader accessibility, this should only contain plain text,
12
+ * and no semantics such as links.
13
+ */
14
+ description?: React.ComponentProps<
15
+ typeof Field.Description
16
+ >[ 'children' ];
17
+ /**
18
+ * Additional information about the field, which unlike a normal description,
19
+ * can include links and other semantic elements.
20
+ *
21
+ * Do not use this prop when the content is only plain text;
22
+ * use `description` instead.
23
+ */
24
+ details?: React.ComponentProps< typeof Field.Details >[ 'children' ];
25
+ /**
26
+ * Whether to visually hide the label while keeping it accessible
27
+ * to screen readers.
28
+ *
29
+ * @default false
30
+ */
31
+ hideLabelFromVision?: React.ComponentProps<
32
+ typeof Field.Label
33
+ >[ 'hideFromVision' ];
34
+ };
package/src/index.ts CHANGED
@@ -3,12 +3,15 @@ export * from './button';
3
3
  export * as Card from './card';
4
4
  export * as Collapsible from './collapsible';
5
5
  export * as CollapsibleCard from './collapsible-card';
6
+ export * as AlertDialog from './alert-dialog';
6
7
  export * as Dialog from './dialog';
7
- export * from './form/primitives';
8
+ export * as EmptyState from './empty-state';
9
+ export * from './form';
8
10
  export * from './icon';
9
11
  export * from './icon-button';
10
12
  export * from './link';
11
13
  export * as Notice from './notice';
14
+ export * as Popover from './popover';
12
15
  export * from './stack';
13
16
  export * as Tabs from './tabs';
14
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 {
@@ -15,5 +15,3 @@ export {
15
15
  ActionButton,
16
16
  ActionLink,
17
17
  };
18
-
19
- export type { NoticeIntent } from './types';
@@ -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 */
@@ -115,7 +115,7 @@
115
115
  --wp-ui-notice-decorative-icon-color: var(--wpds-color-fg-content-error-weak);
116
116
  }
117
117
 
118
- /* TODO: Replace 320px with a measure token from the Theme package. */
118
+ /* Matches --wpds-dimension-surface-width-sm (container queries don't support custom properties). */
119
119
  @container (max-width: 320px) {
120
120
  .notice:has(.title) .description,
121
121
  .notice:has(.title) .actions {
@@ -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 };
@@ -0,0 +1,100 @@
1
+ import {
2
+ createContext,
3
+ useCallback,
4
+ useContext,
5
+ useEffect,
6
+ useMemo,
7
+ useRef,
8
+ } from '@wordpress/element';
9
+
10
+ /**
11
+ * Whether validation is enabled. This is a build-time constant that allows
12
+ * bundlers to tree-shake all validation code in production builds.
13
+ */
14
+ const VALIDATION_ENABLED = process.env.NODE_ENV !== 'production';
15
+
16
+ type PopoverValidationContextType = {
17
+ registerTitle: ( element: HTMLElement | null ) => void;
18
+ };
19
+
20
+ const PopoverValidationContext = VALIDATION_ENABLED
21
+ ? createContext< PopoverValidationContextType | null >( null )
22
+ : ( null as unknown as React.Context< PopoverValidationContextType | null > );
23
+
24
+ function usePopoverValidationContextDev() {
25
+ return useContext( PopoverValidationContext );
26
+ }
27
+
28
+ function usePopoverValidationContextProd() {
29
+ return null;
30
+ }
31
+
32
+ /**
33
+ * Hook to access the popover validation context.
34
+ * Returns null in production or if not within a Popover.Popup.
35
+ */
36
+ export const usePopoverValidationContext = VALIDATION_ENABLED
37
+ ? usePopoverValidationContextDev
38
+ : usePopoverValidationContextProd;
39
+
40
+ /**
41
+ * Development-only provider that tracks whether Popover.Title is rendered.
42
+ */
43
+ function PopoverValidationProviderDev( {
44
+ children,
45
+ }: {
46
+ children: React.ReactNode;
47
+ } ) {
48
+ const titleElementRef = useRef< HTMLElement | null >( null );
49
+
50
+ const registerTitle = useCallback( ( element: HTMLElement | null ) => {
51
+ titleElementRef.current = element;
52
+ }, [] );
53
+
54
+ const contextValue = useMemo(
55
+ () => ( { registerTitle } ),
56
+ [ registerTitle ]
57
+ );
58
+
59
+ useEffect( () => {
60
+ const titleElement = titleElementRef.current;
61
+
62
+ if ( ! titleElement ) {
63
+ throw new Error(
64
+ 'Popover: Missing <Popover.Title>. ' +
65
+ 'For accessibility, every popover requires a title. ' +
66
+ 'If needed, the title can be visually hidden but must not be omitted.'
67
+ );
68
+ }
69
+
70
+ const textContent = titleElement.textContent?.trim();
71
+ if ( ! textContent ) {
72
+ throw new Error(
73
+ 'Popover: <Popover.Title> cannot be empty. ' +
74
+ 'Provide meaningful text content for the popover title.'
75
+ );
76
+ }
77
+ }, [] );
78
+
79
+ return (
80
+ <PopoverValidationContext.Provider value={ contextValue }>
81
+ { children }
82
+ </PopoverValidationContext.Provider>
83
+ );
84
+ }
85
+
86
+ function PopoverValidationProviderProd( {
87
+ children,
88
+ }: {
89
+ children: React.ReactNode;
90
+ } ) {
91
+ return <>{ children }</>;
92
+ }
93
+
94
+ /**
95
+ * Provider component that validates Popover.Title presence in development mode.
96
+ * In production, this component is a no-op and just renders children.
97
+ */
98
+ export const PopoverValidationProvider = VALIDATION_ENABLED
99
+ ? PopoverValidationProviderDev
100
+ : PopoverValidationProviderProd;
@@ -0,0 +1,29 @@
1
+ import { Popover as _Popover } from '@base-ui/react/popover';
2
+ import clsx from 'clsx';
3
+ import { forwardRef } from '@wordpress/element';
4
+ import { Text } from '../text';
5
+ import styles from './style.module.css';
6
+ import type { DescriptionProps } from './types';
7
+
8
+ /**
9
+ * Renders an optional paragraph that describes the popover content.
10
+ *
11
+ * The rendered element is linked to the popup via `aria-describedby`.
12
+ * Uses the `body-md` text variant by default.
13
+ */
14
+ const Description = forwardRef< HTMLParagraphElement, DescriptionProps >(
15
+ function PopoverDescription( { className, children, ...props }, ref ) {
16
+ return (
17
+ <Text
18
+ ref={ ref }
19
+ variant="body-md"
20
+ render={ <_Popover.Description { ...props } /> }
21
+ className={ clsx( styles.description, className ) }
22
+ >
23
+ { children }
24
+ </Text>
25
+ );
26
+ }
27
+ );
28
+
29
+ export { Description };
@@ -0,0 +1,9 @@
1
+ import { Arrow } from './arrow';
2
+ import { Close } from './close';
3
+ import { Description } from './description';
4
+ import { Popup } from './popup';
5
+ import { Root } from './root';
6
+ import { Title } from './title';
7
+ import { Trigger } from './trigger';
8
+
9
+ export { Arrow, Close, Description, Popup, Root, Title, Trigger };