@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
@@ -0,0 +1,117 @@
1
+ /*
2
+ * Unlayered defense against wp-admin global CSS (common.css, forms.css).
3
+ *
4
+ * CSS cascade layers always lose to unlayered styles, so @wordpress/ui's
5
+ * layered component styles get overridden by wp-admin's broad bare-element
6
+ * selectors. This file provides unlayered, class-scoped defenses that
7
+ * restore control to the component.
8
+ *
9
+ * Mechanism (custom property bridge):
10
+ * .input { font-size: var(--_gcd-input-font-size, inherit); }
11
+ *
12
+ * - The class selector beats admin bare-element selectors in specificity.
13
+ * - Each property reads a custom property. The fallback values are what
14
+ * makes sense for @wordpress/ui, to minimize the number of overrides
15
+ * in each individual component stylesheet.
16
+ * - Component CSS modules only need to define the custom properties for
17
+ * the specific properties they want to override.
18
+ * - Custom property definitions aren't suppressed by cascade layers, so the
19
+ * layered value propagates through to the unlayered declaration.
20
+ *
21
+ * Usage: apply the element-specific class directly to each element that
22
+ * needs defense (e.g. defenseStyles.input on an <input>).
23
+ */
24
+
25
+ /*
26
+ * ==========================================================================
27
+ * forms.css defense - https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/css/forms.css
28
+ * ==========================================================================
29
+ */
30
+
31
+ .button {
32
+ box-sizing: var(--_gcd-button-box-sizing, border-box);
33
+ font-family: var(--_gcd-button-font-family, inherit);
34
+ font-size: var(--_gcd-button-font-size, inherit);
35
+ font-weight: var(--_gcd-button-font-weight, inherit);
36
+ }
37
+
38
+ .input {
39
+ box-sizing: var(--_gcd-input-box-sizing, border-box);
40
+ font-family: var(--_gcd-input-font-family, inherit);
41
+ font-size: var(--_gcd-input-font-size, inherit);
42
+ font-weight: var(--_gcd-input-font-weight, inherit);
43
+ margin: var(--_gcd-input-margin, 0);
44
+
45
+ /* Also targets textarea elements, which the `Input` primitive can render as. We combine these textarea defenses
46
+ into the input defenses to minimize the number of tokens, but they should be split if it ever becomes necessary. */
47
+ &:is(textarea, [type="text"], [type="password"], [type="color"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="month"], [type="number"], [type="search"], [type="tel"], [type="time"], [type="url"], [type="week"]) {
48
+ box-shadow: var(--_gcd-input-box-shadow, 0 0 0 transparent);
49
+ border-radius: var(--_gcd-input-border-radius, 0);
50
+ border: var(--_gcd-input-border, none);
51
+ background-color: var(--_gcd-input-background-color, transparent);
52
+ color: var(--_gcd-input-color, var(--wpds-color-fg-interactive-neutral));
53
+
54
+ &:focus {
55
+ border-color: var(--_gcd-input-border-color-focus, var(--wp-admin-theme-color));
56
+ box-shadow: var(--_gcd-input-box-shadow-focus, none);
57
+ outline: var(--_gcd-input-outline-focus, none);
58
+ }
59
+
60
+ &:disabled {
61
+ background: var(--_gcd-input-background-disabled, transparent);
62
+ border-color: var(--_gcd-input-border-color-disabled, transparent);
63
+ box-shadow: var(--_gcd-input-box-shadow-disabled, none);
64
+ color: var(--_gcd-input-color-disabled, var(--wpds-color-fg-interactive-neutral-disabled));
65
+ }
66
+
67
+ &::placeholder {
68
+ color: var(--_gcd-input-placeholder-color, var(--wpds-color-fg-interactive-neutral-disabled));
69
+ }
70
+ }
71
+
72
+ &:is(textarea, [type="text"], [type="password"], [type="date"], [type="datetime"], [type="datetime-local"], [type="email"], [type="month"], [type="number"], [type="search"], [type="tel"], [type="time"], [type="url"], [type="week"]) {
73
+ padding: var(--_gcd-input-padding, 0);
74
+ line-height: var(--_gcd-input-line-height, inherit);
75
+ min-height: var(--_gcd-input-min-height, auto);
76
+ }
77
+ }
78
+
79
+ .textarea {
80
+ box-sizing: var(--_gcd-textarea-box-sizing, border-box);
81
+ overflow: var(--_gcd-textarea-overflow, auto);
82
+ resize: var(--_gcd-textarea-resize, block);
83
+ }
84
+
85
+ /*
86
+ * ==========================================================================
87
+ * common.css defense - https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/css/common.css
88
+ * ==========================================================================
89
+ */
90
+
91
+ .div {
92
+ outline: var(--_gcd-div-outline, 0 solid transparent);
93
+ }
94
+
95
+ /* Narrowed down to p elements only, to support element multiplicity of Text component. */
96
+ p.p {
97
+ font-size: var(--_gcd-p-font-size, 13px);
98
+ line-height: var(--_gcd-p-line-height, 1.5);
99
+ margin: var(--_gcd-p-margin, 0);
100
+ }
101
+
102
+ /* Narrowed down to h[1-6] elements only, to support element multiplicity of Text component. */
103
+ :is(h1, h2, h3, h4, h5, h6).heading {
104
+ color: var(--_gcd-heading-color, var(--wpds-color-fg-content-neutral));
105
+ font-size: var(--_gcd-heading-font-size, inherit);
106
+ font-weight: var(--_gcd-heading-font-weight, var(--wpds-typography-font-weight-medium));
107
+ margin: var(--_gcd-heading-margin, 0);
108
+ }
109
+
110
+ .a,
111
+ .a:is(:hover, :focus, :active) {
112
+ outline: var(--_gcd-a-outline, 0 solid transparent);
113
+ color: var(--_gcd-a-color, inherit);
114
+ box-shadow: var(--_gcd-a-box-shadow, none);
115
+ border-radius: var(--_gcd-a-border-radius, 0);
116
+ transition: var(--_gcd-a-transition, none);
117
+ }
@@ -16,8 +16,8 @@
16
16
  border: 1px solid var(--wpds-color-stroke-surface-neutral);
17
17
  box-shadow: var(--wpds-elevation-md);
18
18
  background-color: var(--wpds-color-bg-surface-neutral-strong);
19
- font-family: var(--wpds-font-family-body);
20
- font-size: var(--wpds-font-size-md);
19
+ font-family: var(--wpds-typography-font-family-body);
20
+ font-size: var(--wpds-typography-font-size-md);
21
21
  line-height: 1.4;
22
22
  color: var(--wpds-color-fg-interactive-neutral);
23
23
  }
@@ -60,6 +60,7 @@
60
60
  align-items: center;
61
61
  justify-content: flex-start;
62
62
  gap: var(--wpds-dimension-gap-xs);
63
+ cursor: var(--wpds-cursor-control);
63
64
  min-height: var(--wp-ui-popup-item-height);
64
65
  border-radius: var(--wpds-border-radius-sm);
65
66
  user-select: none;
@@ -26,6 +26,7 @@
26
26
  font-size: inherit;
27
27
  line-height: 1.4;
28
28
  text-align: start;
29
+ cursor: var(--wpds-cursor-control);
29
30
  user-select: none;
30
31
 
31
32
  &.is-minimal {
@@ -0,0 +1,230 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import { createRef, useEffect } from '@wordpress/element';
3
+ import { useDeprioritizedInitialFocus } from '../use-deprioritized-initial-focus';
4
+
5
+ const ATTR = 'data-test-deprioritized';
6
+
7
+ function TestHarness( {
8
+ initialFocus,
9
+ onResolved,
10
+ }: {
11
+ initialFocus?: Parameters<
12
+ typeof useDeprioritizedInitialFocus
13
+ >[ 0 ][ 'initialFocus' ];
14
+ onResolved: (
15
+ result: ReturnType< typeof useDeprioritizedInitialFocus >
16
+ ) => void;
17
+ } ) {
18
+ const result = useDeprioritizedInitialFocus( {
19
+ initialFocus,
20
+ deprioritizedAttribute: ATTR,
21
+ } );
22
+
23
+ useEffect( () => {
24
+ onResolved( result );
25
+ } );
26
+
27
+ return (
28
+ <div ref={ result.popupRef } data-testid="popup">
29
+ <button { ...{ [ ATTR ]: '' } }>Close</button>
30
+ <button>Action</button>
31
+ <input type="text" />
32
+ </div>
33
+ );
34
+ }
35
+
36
+ describe( 'useDeprioritizedInitialFocus', () => {
37
+ describe( 'passthrough', () => {
38
+ it( 'passes through false unchanged', () => {
39
+ let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
40
+
41
+ render(
42
+ <TestHarness
43
+ initialFocus={ false }
44
+ onResolved={ ( r ) => {
45
+ resolved = r;
46
+ } }
47
+ />
48
+ );
49
+
50
+ expect( resolved!.resolvedInitialFocus ).toBe( false );
51
+ } );
52
+
53
+ it( 'passes through a ref unchanged', () => {
54
+ const ref = createRef< HTMLElement >();
55
+ let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
56
+
57
+ render(
58
+ <TestHarness
59
+ initialFocus={ ref }
60
+ onResolved={ ( r ) => {
61
+ resolved = r;
62
+ } }
63
+ />
64
+ );
65
+
66
+ expect( resolved!.resolvedInitialFocus ).toBe( ref );
67
+ } );
68
+
69
+ it( 'passes through a custom callback unchanged', () => {
70
+ const cb = () => true as const;
71
+ let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
72
+
73
+ render(
74
+ <TestHarness
75
+ initialFocus={ cb }
76
+ onResolved={ ( r ) => {
77
+ resolved = r;
78
+ } }
79
+ />
80
+ );
81
+
82
+ expect( resolved!.resolvedInitialFocus ).toBe( cb );
83
+ } );
84
+ } );
85
+
86
+ describe( 'default behavior (initialFocus undefined or true)', () => {
87
+ it.each( [ undefined, true ] )(
88
+ 'returns a callback when initialFocus is %s',
89
+ ( value ) => {
90
+ let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
91
+
92
+ render(
93
+ <TestHarness
94
+ initialFocus={ value }
95
+ onResolved={ ( r ) => {
96
+ resolved = r;
97
+ } }
98
+ />
99
+ );
100
+
101
+ expect( typeof resolved!.resolvedInitialFocus ).toBe(
102
+ 'function'
103
+ );
104
+ }
105
+ );
106
+
107
+ it( 'returns the popup element on touch interactions', () => {
108
+ let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
109
+
110
+ render(
111
+ <TestHarness
112
+ onResolved={ ( r ) => {
113
+ resolved = r;
114
+ } }
115
+ />
116
+ );
117
+
118
+ const callback = resolved!.resolvedInitialFocus as (
119
+ type: string
120
+ ) => HTMLElement | boolean | null;
121
+ const result = callback( 'touch' );
122
+
123
+ expect( result ).toBe( screen.getByTestId( 'popup' ) );
124
+ } );
125
+
126
+ it( 'skips the deprioritized element on non-touch interactions', () => {
127
+ let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
128
+
129
+ render(
130
+ <TestHarness
131
+ onResolved={ ( r ) => {
132
+ resolved = r;
133
+ } }
134
+ />
135
+ );
136
+
137
+ const callback = resolved!.resolvedInitialFocus as (
138
+ type: string
139
+ ) => HTMLElement | boolean | null;
140
+ const result = callback( 'mouse' );
141
+
142
+ // Should return the Action button, skipping Close
143
+ expect( result ).toBeInstanceOf( HTMLButtonElement );
144
+ expect( result as HTMLButtonElement ).toHaveTextContent( 'Action' );
145
+ } );
146
+
147
+ it( 'falls back to default when only deprioritized elements exist', () => {
148
+ let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
149
+
150
+ function OnlyDeprioritized( {
151
+ onResolved: onResolvedProp,
152
+ }: {
153
+ onResolved: (
154
+ r: ReturnType< typeof useDeprioritizedInitialFocus >
155
+ ) => void;
156
+ } ) {
157
+ const result = useDeprioritizedInitialFocus( {
158
+ initialFocus: undefined,
159
+ deprioritizedAttribute: ATTR,
160
+ } );
161
+
162
+ useEffect( () => {
163
+ onResolvedProp( result );
164
+ } );
165
+
166
+ return (
167
+ <div ref={ result.popupRef } data-testid="popup">
168
+ <button { ...{ [ ATTR ]: '' } }>Close</button>
169
+ <p>No other tabbable elements</p>
170
+ </div>
171
+ );
172
+ }
173
+
174
+ render(
175
+ <OnlyDeprioritized
176
+ onResolved={ ( r ) => {
177
+ resolved = r;
178
+ } }
179
+ />
180
+ );
181
+
182
+ const callback = resolved!.resolvedInitialFocus as (
183
+ type: string
184
+ ) => HTMLElement | boolean | null;
185
+ const result = callback( 'keyboard' );
186
+
187
+ // Falls back to Base UI's default
188
+ expect( result ).toBe( true );
189
+ } );
190
+
191
+ it( 'returns true when popupRef is not attached', () => {
192
+ let resolved: ReturnType< typeof useDeprioritizedInitialFocus >;
193
+
194
+ function NoRef( {
195
+ onResolved: onResolvedProp,
196
+ }: {
197
+ onResolved: (
198
+ r: ReturnType< typeof useDeprioritizedInitialFocus >
199
+ ) => void;
200
+ } ) {
201
+ const result = useDeprioritizedInitialFocus( {
202
+ initialFocus: undefined,
203
+ deprioritizedAttribute: ATTR,
204
+ } );
205
+
206
+ useEffect( () => {
207
+ onResolvedProp( result );
208
+ } );
209
+
210
+ // Intentionally not attaching popupRef to any element
211
+ return <div>Nothing</div>;
212
+ }
213
+
214
+ render(
215
+ <NoRef
216
+ onResolved={ ( r ) => {
217
+ resolved = r;
218
+ } }
219
+ />
220
+ );
221
+
222
+ const callback = resolved!.resolvedInitialFocus as (
223
+ type: string
224
+ ) => HTMLElement | boolean | null;
225
+
226
+ expect( callback( 'touch' ) ).toBe( true );
227
+ expect( callback( 'mouse' ) ).toBe( true );
228
+ } );
229
+ } );
230
+ } );
@@ -14,13 +14,18 @@ type ComponentRenderFn< Props > = (
14
14
 
15
15
  export type ComponentProps< E extends ElementType > = Omit<
16
16
  ComponentPropsWithoutRef< E >,
17
- 'className' | 'children' | 'render'
17
+ 'className' | 'children' | 'render' | 'style'
18
18
  > & {
19
19
  /**
20
- * CSS class name to apply to the component.
20
+ * CSS class name to apply to the element.
21
21
  */
22
22
  className?: string;
23
23
 
24
+ /**
25
+ * CSS style to apply to the element.
26
+ */
27
+ style?: React.CSSProperties;
28
+
24
29
  /**
25
30
  * Replaces the component's default HTML element using a given React
26
31
  * element, or a function that returns a React element.
@@ -0,0 +1,84 @@
1
+ import type { Popover as _Popover } from '@base-ui/react/popover';
2
+ import { useMemo, useRef } from '@wordpress/element';
3
+ import { tabbable } from 'tabbable';
4
+
5
+ /**
6
+ * The `initialFocus` type shared by Base UI overlay popups (Dialog, Popover,
7
+ * AlertDialog, etc.). We derive it from `Popover.Popup.Props` here, but it
8
+ * is identical across all overlay components.
9
+ */
10
+ type InitialFocus = _Popover.Popup.Props[ 'initialFocus' ];
11
+
12
+ /**
13
+ * Options matching Base UI's internal tabbable configuration.
14
+ * @see https://github.com/floating-ui/floating-ui/blob/master/packages/react/src/utils/tabbable.ts
15
+ */
16
+ const getTabbableOptions = () => ( {
17
+ getShadowRoot: true,
18
+ displayCheck:
19
+ typeof ResizeObserver === 'function' &&
20
+ ResizeObserver.toString().includes( '[native code]' )
21
+ ? ( 'full' as const )
22
+ : ( 'none' as const ),
23
+ } );
24
+
25
+ /**
26
+ * Returns a resolved `initialFocus` value that deprioritizes elements
27
+ * marked with a given data attribute (e.g. a close icon), and an internal
28
+ * ref that must be merged onto the popup element.
29
+ *
30
+ * When `initialFocus` is `undefined` or `true` (the default behavior),
31
+ * the hook replaces it with a callback that:
32
+ * 1. On touch interactions — focuses the popup element itself (preventing
33
+ * the virtual keyboard on Android), matching Base UI's default.
34
+ * 2. On other interactions — returns the first tabbable element that does
35
+ * *not* carry `deprioritizedAttribute`. Falls back to Base UI's default
36
+ * when the deprioritized element is the only tabbable element.
37
+ *
38
+ * All other `initialFocus` values (`false`, `RefObject`, callback) pass
39
+ * through unchanged.
40
+ *
41
+ * @param props
42
+ * @param props.initialFocus The consumer-provided `initialFocus` value.
43
+ * @param props.deprioritizedAttribute The data attribute whose elements should be deprioritized.
44
+ */
45
+ export function useDeprioritizedInitialFocus( {
46
+ initialFocus,
47
+ deprioritizedAttribute,
48
+ }: {
49
+ initialFocus: InitialFocus;
50
+ deprioritizedAttribute: string;
51
+ } ) {
52
+ const popupRef = useRef< HTMLDivElement >( null );
53
+
54
+ const resolvedInitialFocus = useMemo( (): InitialFocus => {
55
+ if ( initialFocus !== undefined && initialFocus !== true ) {
56
+ return initialFocus;
57
+ }
58
+
59
+ return ( interactionType ): HTMLElement | boolean | null => {
60
+ if ( interactionType === 'touch' ) {
61
+ return popupRef.current ?? true;
62
+ }
63
+
64
+ const popup = popupRef.current;
65
+ if ( ! popup ) {
66
+ return true;
67
+ }
68
+
69
+ const tabbables = tabbable( popup, getTabbableOptions() );
70
+ for ( const el of tabbables ) {
71
+ if (
72
+ el instanceof HTMLElement &&
73
+ ! el.hasAttribute( deprioritizedAttribute )
74
+ ) {
75
+ return el;
76
+ }
77
+ }
78
+
79
+ return true;
80
+ };
81
+ }, [ initialFocus, deprioritizedAttribute ] );
82
+
83
+ return { resolvedInitialFocus, popupRef };
84
+ }
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { useId } from '@wordpress/element';
2
3
  import { VisuallyHidden } from '../';
3
4
 
4
5
  const meta: Meta< typeof VisuallyHidden > = {
@@ -20,3 +21,27 @@ export const Default: Story = {
20
21
  </>
21
22
  ),
22
23
  };
24
+
25
+ /**
26
+ * Use the `render` prop to change the underlying HTML element.
27
+ * By default, `VisuallyHidden` renders a `<div>`. Here it renders
28
+ * a `<label>` instead, keeping the native label–input association
29
+ * while hiding the label text visually.
30
+ */
31
+ export const WithCustomElement: Story = {
32
+ render: function WithCustomElementStory() {
33
+ const inputId = useId();
34
+ return (
35
+ <>
36
+ { /* eslint-disable-next-line jsx-a11y/label-has-associated-control */ }
37
+ <VisuallyHidden render={ <label htmlFor={ inputId } /> }>
38
+ Accessible label
39
+ </VisuallyHidden>
40
+ <input
41
+ id={ inputId }
42
+ placeholder="This input has a visually hidden label"
43
+ />
44
+ </>
45
+ );
46
+ },
47
+ };
@@ -6,6 +6,40 @@ import styles from './style.module.css';
6
6
  /**
7
7
  * Visually hides content while keeping it accessible to screen readers.
8
8
  * Useful when providing context that's only meaningful to assistive technology.
9
+ *
10
+ * Renders a `<div>` by default. Use the `render` prop to swap the
11
+ * underlying element while preserving the visually-hidden behavior.
12
+ *
13
+ * ## Composing with other components
14
+ *
15
+ * When composing with another component that uses the `render` prop
16
+ * pattern, there are two directions — and they produce different results.
17
+ *
18
+ * Most of the time you'll want `VisuallyHidden` as the **host** (outer
19
+ * component) and pass the other component via `render`. This keeps the
20
+ * other component's HTML element and semantics intact, while
21
+ * `VisuallyHidden` only adds its hiding styles:
22
+ *
23
+ * ```jsx
24
+ * // OtherComponent keeps its semantic element (e.g. <h2>).
25
+ * <VisuallyHidden render={ <OtherComponent /> }>
26
+ * Accessible text
27
+ * </VisuallyHidden>
28
+ * ```
29
+ *
30
+ * The opposite direction is also possible, but be aware that it replaces
31
+ * the other component's element with VisuallyHidden's default `<div>`:
32
+ *
33
+ * ```jsx
34
+ * // OtherComponent's element becomes a <div>.
35
+ * <OtherComponent render={ <VisuallyHidden /> }>
36
+ * Accessible text
37
+ * </OtherComponent>
38
+ * ```
39
+ *
40
+ * Choose based on what you need: if the other component's semantic
41
+ * element matters (e.g. `<label>`, `<legend>`, `<h2>`), keep
42
+ * `VisuallyHidden` as the host so the element is preserved.
9
43
  */
10
44
  export const VisuallyHidden = forwardRef< HTMLDivElement, VisuallyHiddenProps >(
11
45
  function VisuallyHidden( { render, ...restProps }, ref ) {