@wordpress/ui 0.9.1-next.v.202603102151.0 → 0.10.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 (529) hide show
  1. package/CHANGELOG.md +42 -1
  2. package/CONTRIBUTING.md +31 -0
  3. package/README.md +106 -0
  4. package/build/alert-dialog/context.cjs +34 -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 +93 -0
  9. package/build/alert-dialog/popup.cjs.map +7 -0
  10. package/build/alert-dialog/root.cjs +52 -0
  11. package/build/alert-dialog/root.cjs.map +7 -0
  12. package/build/alert-dialog/trigger.cjs +48 -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 +3 -3
  17. package/build/badge/badge.cjs.map +2 -2
  18. package/build/button/button.cjs +9 -9
  19. package/build/button/button.cjs.map +2 -2
  20. package/build/card/content.cjs +3 -3
  21. package/build/card/content.cjs.map +2 -2
  22. package/build/card/full-bleed.cjs +3 -3
  23. package/build/card/full-bleed.cjs.map +2 -2
  24. package/build/card/header.cjs +3 -3
  25. package/build/card/header.cjs.map +2 -2
  26. package/build/card/root.cjs +5 -5
  27. package/build/card/root.cjs.map +2 -2
  28. package/build/card/title.cjs +26 -13
  29. package/build/card/title.cjs.map +3 -3
  30. package/build/collapsible/index.cjs +37 -0
  31. package/build/collapsible/index.cjs.map +7 -0
  32. package/build/collapsible/panel.cjs +38 -0
  33. package/build/collapsible/panel.cjs.map +7 -0
  34. package/build/collapsible/root.cjs +38 -0
  35. package/build/collapsible/root.cjs.map +7 -0
  36. package/build/collapsible/trigger.cjs +38 -0
  37. package/build/collapsible/trigger.cjs.map +7 -0
  38. package/build/collapsible/types.cjs +19 -0
  39. package/build/collapsible/types.cjs.map +7 -0
  40. package/build/collapsible-card/content.cjs +26 -5
  41. package/build/collapsible-card/content.cjs.map +4 -4
  42. package/build/collapsible-card/context.cjs +35 -0
  43. package/build/collapsible-card/context.cjs.map +7 -0
  44. package/build/collapsible-card/header-description.cjs +52 -0
  45. package/build/collapsible-card/header-description.cjs.map +7 -0
  46. package/build/collapsible-card/header.cjs +57 -38
  47. package/build/collapsible-card/header.cjs.map +3 -3
  48. package/build/collapsible-card/index.cjs +3 -0
  49. package/build/collapsible-card/index.cjs.map +2 -2
  50. package/build/collapsible-card/root.cjs +4 -4
  51. package/build/collapsible-card/root.cjs.map +2 -2
  52. package/build/collapsible-card/types.cjs.map +1 -1
  53. package/build/dialog/action.cjs +4 -2
  54. package/build/dialog/action.cjs.map +2 -2
  55. package/build/dialog/close-icon.cjs +2 -1
  56. package/build/dialog/close-icon.cjs.map +2 -2
  57. package/build/dialog/footer.cjs +3 -3
  58. package/build/dialog/footer.cjs.map +2 -2
  59. package/build/dialog/header.cjs +3 -3
  60. package/build/dialog/header.cjs.map +2 -2
  61. package/build/dialog/popup.cjs +22 -5
  62. package/build/dialog/popup.cjs.map +2 -2
  63. package/build/dialog/title.cjs +3 -3
  64. package/build/dialog/title.cjs.map +2 -2
  65. package/build/dialog/types.cjs.map +1 -1
  66. package/build/empty-state/actions.cjs +66 -0
  67. package/build/empty-state/actions.cjs.map +7 -0
  68. package/build/empty-state/description.cjs +66 -0
  69. package/build/empty-state/description.cjs.map +7 -0
  70. package/build/empty-state/icon.cjs +69 -0
  71. package/build/empty-state/icon.cjs.map +7 -0
  72. package/build/empty-state/index.cjs +46 -0
  73. package/build/empty-state/index.cjs.map +7 -0
  74. package/build/empty-state/root.cjs +66 -0
  75. package/build/empty-state/root.cjs.map +7 -0
  76. package/build/empty-state/title.cjs +68 -0
  77. package/build/empty-state/title.cjs.map +7 -0
  78. package/build/empty-state/types.cjs +19 -0
  79. package/build/empty-state/types.cjs.map +7 -0
  80. package/build/empty-state/visual.cjs +66 -0
  81. package/build/empty-state/visual.cjs.map +7 -0
  82. package/build/form/index.cjs +27 -0
  83. package/build/form/index.cjs.map +7 -0
  84. package/build/form/input-control/index.cjs +31 -0
  85. package/build/form/input-control/index.cjs.map +7 -0
  86. package/build/form/input-control/input-control.cjs +50 -0
  87. package/build/form/input-control/input-control.cjs.map +7 -0
  88. package/build/form/input-control/types.cjs +19 -0
  89. package/build/form/input-control/types.cjs.map +7 -0
  90. package/build/form/primitives/field/description.cjs +2 -2
  91. package/build/form/primitives/field/description.cjs.map +1 -1
  92. package/build/form/primitives/field/details.cjs +2 -2
  93. package/build/form/primitives/field/details.cjs.map +1 -1
  94. package/build/form/primitives/field/label.cjs +2 -2
  95. package/build/form/primitives/field/label.cjs.map +1 -1
  96. package/build/form/primitives/field/root.cjs +4 -4
  97. package/build/form/primitives/field/root.cjs.map +2 -2
  98. package/build/form/primitives/fieldset/description.cjs +2 -2
  99. package/build/form/primitives/fieldset/description.cjs.map +1 -1
  100. package/build/form/primitives/fieldset/details.cjs +2 -2
  101. package/build/form/primitives/fieldset/details.cjs.map +1 -1
  102. package/build/form/primitives/fieldset/legend.cjs +2 -2
  103. package/build/form/primitives/fieldset/legend.cjs.map +1 -1
  104. package/build/form/primitives/fieldset/root.cjs +2 -2
  105. package/build/form/primitives/fieldset/root.cjs.map +1 -1
  106. package/build/form/primitives/input/input.cjs +6 -6
  107. package/build/form/primitives/input/input.cjs.map +2 -2
  108. package/build/form/primitives/input-layout/input-layout.cjs +4 -4
  109. package/build/form/primitives/input-layout/input-layout.cjs.map +1 -1
  110. package/build/form/primitives/input-layout/slot.cjs +5 -4
  111. package/build/form/primitives/input-layout/slot.cjs.map +2 -2
  112. package/build/form/primitives/select/item.cjs +5 -5
  113. package/build/form/primitives/select/item.cjs.map +2 -2
  114. package/build/form/primitives/select/popup.cjs +7 -7
  115. package/build/form/primitives/select/popup.cjs.map +2 -2
  116. package/build/form/primitives/select/trigger.cjs +7 -7
  117. package/build/form/primitives/select/trigger.cjs.map +2 -2
  118. package/build/form/primitives/textarea/textarea.cjs +3 -3
  119. package/build/form/primitives/textarea/textarea.cjs.map +2 -2
  120. package/build/form/types.cjs +19 -0
  121. package/build/form/types.cjs.map +7 -0
  122. package/build/icon-button/icon-button.cjs +2 -2
  123. package/build/icon-button/icon-button.cjs.map +1 -1
  124. package/build/index.cjs +11 -2
  125. package/build/index.cjs.map +2 -2
  126. package/build/link/link.cjs +8 -8
  127. package/build/link/link.cjs.map +2 -2
  128. package/build/notice/action-button.cjs +2 -2
  129. package/build/notice/action-button.cjs.map +1 -1
  130. package/build/notice/action-link.cjs +2 -2
  131. package/build/notice/action-link.cjs.map +1 -1
  132. package/build/notice/actions.cjs +2 -2
  133. package/build/notice/actions.cjs.map +1 -1
  134. package/build/notice/close-icon.cjs +2 -2
  135. package/build/notice/close-icon.cjs.map +1 -1
  136. package/build/notice/description.cjs +2 -2
  137. package/build/notice/description.cjs.map +1 -1
  138. package/build/notice/index.cjs.map +1 -1
  139. package/build/notice/root.cjs +4 -4
  140. package/build/notice/root.cjs.map +1 -1
  141. package/build/notice/title.cjs +2 -2
  142. package/build/notice/title.cjs.map +1 -1
  143. package/build/stack/stack.cjs +2 -2
  144. package/build/stack/stack.cjs.map +1 -1
  145. package/build/tabs/context.cjs +121 -0
  146. package/build/tabs/context.cjs.map +7 -0
  147. package/build/tabs/list.cjs +3 -3
  148. package/build/tabs/list.cjs.map +2 -2
  149. package/build/tabs/panel.cjs +5 -3
  150. package/build/tabs/panel.cjs.map +2 -2
  151. package/build/tabs/root.cjs +2 -1
  152. package/build/tabs/root.cjs.map +2 -2
  153. package/build/tabs/tab.cjs +5 -3
  154. package/build/tabs/tab.cjs.map +2 -2
  155. package/build/text/text.cjs +2 -2
  156. package/build/text/text.cjs.map +1 -1
  157. package/build/tooltip/popup.cjs +4 -4
  158. package/build/tooltip/popup.cjs.map +1 -1
  159. package/build/tooltip/root.cjs.map +2 -2
  160. package/build/utils/use-deprioritized-initial-focus.cjs +64 -0
  161. package/build/utils/use-deprioritized-initial-focus.cjs.map +7 -0
  162. package/build/visually-hidden/visually-hidden.cjs +2 -2
  163. package/build/visually-hidden/visually-hidden.cjs.map +1 -1
  164. package/build-module/alert-dialog/context.mjs +9 -0
  165. package/build-module/alert-dialog/context.mjs.map +7 -0
  166. package/build-module/alert-dialog/index.mjs +10 -0
  167. package/build-module/alert-dialog/index.mjs.map +7 -0
  168. package/build-module/alert-dialog/popup.mjs +58 -0
  169. package/build-module/alert-dialog/popup.mjs.map +7 -0
  170. package/build-module/alert-dialog/root.mjs +27 -0
  171. package/build-module/alert-dialog/root.mjs.map +7 -0
  172. package/build-module/alert-dialog/trigger.mjs +13 -0
  173. package/build-module/alert-dialog/trigger.mjs.map +7 -0
  174. package/build-module/alert-dialog/types.mjs +1 -0
  175. package/build-module/alert-dialog/types.mjs.map +7 -0
  176. package/build-module/badge/badge.mjs +3 -3
  177. package/build-module/badge/badge.mjs.map +2 -2
  178. package/build-module/button/button.mjs +9 -9
  179. package/build-module/button/button.mjs.map +2 -2
  180. package/build-module/card/content.mjs +3 -3
  181. package/build-module/card/content.mjs.map +2 -2
  182. package/build-module/card/full-bleed.mjs +3 -3
  183. package/build-module/card/full-bleed.mjs.map +2 -2
  184. package/build-module/card/header.mjs +3 -3
  185. package/build-module/card/header.mjs.map +2 -2
  186. package/build-module/card/root.mjs +5 -5
  187. package/build-module/card/root.mjs.map +2 -2
  188. package/build-module/card/title.mjs +16 -13
  189. package/build-module/card/title.mjs.map +2 -2
  190. package/build-module/collapsible/index.mjs +10 -0
  191. package/build-module/collapsible/index.mjs.map +7 -0
  192. package/build-module/collapsible/panel.mjs +13 -0
  193. package/build-module/collapsible/panel.mjs.map +7 -0
  194. package/build-module/collapsible/root.mjs +13 -0
  195. package/build-module/collapsible/root.mjs.map +7 -0
  196. package/build-module/collapsible/trigger.mjs +13 -0
  197. package/build-module/collapsible/trigger.mjs.map +7 -0
  198. package/build-module/collapsible/types.mjs +1 -0
  199. package/build-module/collapsible/types.mjs.map +7 -0
  200. package/build-module/collapsible-card/content.mjs +25 -4
  201. package/build-module/collapsible-card/content.mjs.map +3 -3
  202. package/build-module/collapsible-card/context.mjs +10 -0
  203. package/build-module/collapsible-card/context.mjs.map +7 -0
  204. package/build-module/collapsible-card/header-description.mjs +27 -0
  205. package/build-module/collapsible-card/header-description.mjs.map +7 -0
  206. package/build-module/collapsible-card/header.mjs +59 -40
  207. package/build-module/collapsible-card/header.mjs.map +3 -3
  208. package/build-module/collapsible-card/index.mjs +2 -0
  209. package/build-module/collapsible-card/index.mjs.map +2 -2
  210. package/build-module/collapsible-card/root.mjs +3 -3
  211. package/build-module/collapsible-card/root.mjs.map +2 -2
  212. package/build-module/dialog/action.mjs +4 -2
  213. package/build-module/dialog/action.mjs.map +2 -2
  214. package/build-module/dialog/close-icon.mjs +2 -1
  215. package/build-module/dialog/close-icon.mjs.map +2 -2
  216. package/build-module/dialog/footer.mjs +3 -3
  217. package/build-module/dialog/footer.mjs.map +2 -2
  218. package/build-module/dialog/header.mjs +3 -3
  219. package/build-module/dialog/header.mjs.map +2 -2
  220. package/build-module/dialog/popup.mjs +22 -5
  221. package/build-module/dialog/popup.mjs.map +2 -2
  222. package/build-module/dialog/title.mjs +3 -3
  223. package/build-module/dialog/title.mjs.map +2 -2
  224. package/build-module/empty-state/actions.mjs +31 -0
  225. package/build-module/empty-state/actions.mjs.map +7 -0
  226. package/build-module/empty-state/description.mjs +31 -0
  227. package/build-module/empty-state/description.mjs.map +7 -0
  228. package/build-module/empty-state/icon.mjs +34 -0
  229. package/build-module/empty-state/icon.mjs.map +7 -0
  230. package/build-module/empty-state/index.mjs +16 -0
  231. package/build-module/empty-state/index.mjs.map +7 -0
  232. package/build-module/empty-state/root.mjs +31 -0
  233. package/build-module/empty-state/root.mjs.map +7 -0
  234. package/build-module/empty-state/title.mjs +33 -0
  235. package/build-module/empty-state/title.mjs.map +7 -0
  236. package/build-module/empty-state/types.mjs +1 -0
  237. package/build-module/empty-state/types.mjs.map +7 -0
  238. package/build-module/empty-state/visual.mjs +31 -0
  239. package/build-module/empty-state/visual.mjs.map +7 -0
  240. package/build-module/form/index.mjs +4 -0
  241. package/build-module/form/index.mjs.map +7 -0
  242. package/build-module/form/input-control/index.mjs +6 -0
  243. package/build-module/form/input-control/index.mjs.map +7 -0
  244. package/build-module/form/input-control/input-control.mjs +25 -0
  245. package/build-module/form/input-control/input-control.mjs.map +7 -0
  246. package/build-module/form/input-control/types.mjs +1 -0
  247. package/build-module/form/input-control/types.mjs.map +7 -0
  248. package/build-module/form/primitives/field/description.mjs +2 -2
  249. package/build-module/form/primitives/field/description.mjs.map +1 -1
  250. package/build-module/form/primitives/field/details.mjs +2 -2
  251. package/build-module/form/primitives/field/details.mjs.map +1 -1
  252. package/build-module/form/primitives/field/label.mjs +2 -2
  253. package/build-module/form/primitives/field/label.mjs.map +1 -1
  254. package/build-module/form/primitives/field/root.mjs +4 -4
  255. package/build-module/form/primitives/field/root.mjs.map +2 -2
  256. package/build-module/form/primitives/fieldset/description.mjs +2 -2
  257. package/build-module/form/primitives/fieldset/description.mjs.map +1 -1
  258. package/build-module/form/primitives/fieldset/details.mjs +2 -2
  259. package/build-module/form/primitives/fieldset/details.mjs.map +1 -1
  260. package/build-module/form/primitives/fieldset/legend.mjs +2 -2
  261. package/build-module/form/primitives/fieldset/legend.mjs.map +1 -1
  262. package/build-module/form/primitives/fieldset/root.mjs +2 -2
  263. package/build-module/form/primitives/fieldset/root.mjs.map +1 -1
  264. package/build-module/form/primitives/input/input.mjs +6 -6
  265. package/build-module/form/primitives/input/input.mjs.map +2 -2
  266. package/build-module/form/primitives/input-layout/input-layout.mjs +4 -4
  267. package/build-module/form/primitives/input-layout/input-layout.mjs.map +1 -1
  268. package/build-module/form/primitives/input-layout/slot.mjs +5 -4
  269. package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
  270. package/build-module/form/primitives/select/item.mjs +5 -5
  271. package/build-module/form/primitives/select/item.mjs.map +2 -2
  272. package/build-module/form/primitives/select/popup.mjs +7 -7
  273. package/build-module/form/primitives/select/popup.mjs.map +2 -2
  274. package/build-module/form/primitives/select/trigger.mjs +7 -7
  275. package/build-module/form/primitives/select/trigger.mjs.map +2 -2
  276. package/build-module/form/primitives/textarea/textarea.mjs +3 -3
  277. package/build-module/form/primitives/textarea/textarea.mjs.map +2 -2
  278. package/build-module/form/types.mjs +1 -0
  279. package/build-module/form/types.mjs.map +7 -0
  280. package/build-module/icon-button/icon-button.mjs +2 -2
  281. package/build-module/icon-button/icon-button.mjs.map +1 -1
  282. package/build-module/index.mjs +7 -1
  283. package/build-module/index.mjs.map +2 -2
  284. package/build-module/link/link.mjs +8 -8
  285. package/build-module/link/link.mjs.map +2 -2
  286. package/build-module/notice/action-button.mjs +2 -2
  287. package/build-module/notice/action-button.mjs.map +1 -1
  288. package/build-module/notice/action-link.mjs +2 -2
  289. package/build-module/notice/action-link.mjs.map +1 -1
  290. package/build-module/notice/actions.mjs +2 -2
  291. package/build-module/notice/actions.mjs.map +1 -1
  292. package/build-module/notice/close-icon.mjs +2 -2
  293. package/build-module/notice/close-icon.mjs.map +1 -1
  294. package/build-module/notice/description.mjs +2 -2
  295. package/build-module/notice/description.mjs.map +1 -1
  296. package/build-module/notice/index.mjs.map +1 -1
  297. package/build-module/notice/root.mjs +4 -4
  298. package/build-module/notice/root.mjs.map +1 -1
  299. package/build-module/notice/title.mjs +2 -2
  300. package/build-module/notice/title.mjs.map +1 -1
  301. package/build-module/stack/stack.mjs +2 -2
  302. package/build-module/stack/stack.mjs.map +1 -1
  303. package/build-module/tabs/context.mjs +101 -0
  304. package/build-module/tabs/context.mjs.map +7 -0
  305. package/build-module/tabs/list.mjs +3 -3
  306. package/build-module/tabs/list.mjs.map +2 -2
  307. package/build-module/tabs/panel.mjs +5 -3
  308. package/build-module/tabs/panel.mjs.map +2 -2
  309. package/build-module/tabs/root.mjs +2 -1
  310. package/build-module/tabs/root.mjs.map +2 -2
  311. package/build-module/tabs/tab.mjs +5 -3
  312. package/build-module/tabs/tab.mjs.map +2 -2
  313. package/build-module/text/text.mjs +2 -2
  314. package/build-module/text/text.mjs.map +1 -1
  315. package/build-module/tooltip/popup.mjs +4 -4
  316. package/build-module/tooltip/popup.mjs.map +1 -1
  317. package/build-module/tooltip/root.mjs.map +2 -2
  318. package/build-module/utils/use-deprioritized-initial-focus.mjs +39 -0
  319. package/build-module/utils/use-deprioritized-initial-focus.mjs.map +7 -0
  320. package/build-module/visually-hidden/visually-hidden.mjs +2 -2
  321. package/build-module/visually-hidden/visually-hidden.mjs.map +1 -1
  322. package/build-types/alert-dialog/context.d.ts +8 -0
  323. package/build-types/alert-dialog/context.d.ts.map +1 -0
  324. package/build-types/alert-dialog/index.d.ts +4 -0
  325. package/build-types/alert-dialog/index.d.ts.map +1 -0
  326. package/build-types/alert-dialog/popup.d.ts +4 -0
  327. package/build-types/alert-dialog/popup.d.ts.map +1 -0
  328. package/build-types/alert-dialog/root.d.ts +24 -0
  329. package/build-types/alert-dialog/root.d.ts.map +1 -0
  330. package/build-types/alert-dialog/stories/index.story.d.ts +44 -0
  331. package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -0
  332. package/build-types/alert-dialog/test/index.test.d.ts +2 -0
  333. package/build-types/alert-dialog/test/index.test.d.ts.map +1 -0
  334. package/build-types/alert-dialog/trigger.d.ts +6 -0
  335. package/build-types/alert-dialog/trigger.d.ts.map +1 -0
  336. package/build-types/alert-dialog/types.d.ts +70 -0
  337. package/build-types/alert-dialog/types.d.ts.map +1 -0
  338. package/build-types/card/title.d.ts.map +1 -1
  339. package/build-types/collapsible/index.d.ts +5 -0
  340. package/build-types/collapsible/index.d.ts.map +1 -0
  341. package/build-types/collapsible/panel.d.ts +16 -0
  342. package/build-types/collapsible/panel.d.ts.map +1 -0
  343. package/build-types/collapsible/root.d.ts +15 -0
  344. package/build-types/collapsible/root.d.ts.map +1 -0
  345. package/build-types/collapsible/stories/index.story.d.ts +18 -0
  346. package/build-types/collapsible/stories/index.story.d.ts.map +1 -0
  347. package/build-types/collapsible/test/index.test.d.ts +2 -0
  348. package/build-types/collapsible/test/index.test.d.ts.map +1 -0
  349. package/build-types/collapsible/trigger.d.ts +15 -0
  350. package/build-types/collapsible/trigger.d.ts.map +1 -0
  351. package/build-types/collapsible/types.d.ts +22 -0
  352. package/build-types/collapsible/types.d.ts.map +1 -0
  353. package/build-types/collapsible-card/content.d.ts.map +1 -1
  354. package/build-types/collapsible-card/context.d.ts +4 -0
  355. package/build-types/collapsible-card/context.d.ts.map +1 -0
  356. package/build-types/collapsible-card/header-description.d.ts +15 -0
  357. package/build-types/collapsible-card/header-description.d.ts.map +1 -0
  358. package/build-types/collapsible-card/header.d.ts.map +1 -1
  359. package/build-types/collapsible-card/index.d.ts +2 -1
  360. package/build-types/collapsible-card/index.d.ts.map +1 -1
  361. package/build-types/collapsible-card/stories/index.story.d.ts +10 -0
  362. package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
  363. package/build-types/collapsible-card/types.d.ts +21 -0
  364. package/build-types/collapsible-card/types.d.ts.map +1 -1
  365. package/build-types/dialog/action.d.ts.map +1 -1
  366. package/build-types/dialog/close-icon.d.ts.map +1 -1
  367. package/build-types/dialog/popup.d.ts.map +1 -1
  368. package/build-types/dialog/stories/index.story.d.ts +0 -6
  369. package/build-types/dialog/stories/index.story.d.ts.map +1 -1
  370. package/build-types/dialog/types.d.ts +5 -5
  371. package/build-types/dialog/types.d.ts.map +1 -1
  372. package/build-types/empty-state/actions.d.ts +7 -0
  373. package/build-types/empty-state/actions.d.ts.map +1 -0
  374. package/build-types/empty-state/description.d.ts +7 -0
  375. package/build-types/empty-state/description.d.ts.map +1 -0
  376. package/build-types/empty-state/icon.d.ts +7 -0
  377. package/build-types/empty-state/icon.d.ts.map +1 -0
  378. package/build-types/empty-state/index.d.ts +8 -0
  379. package/build-types/empty-state/index.d.ts.map +1 -0
  380. package/build-types/empty-state/root.d.ts +6 -0
  381. package/build-types/empty-state/root.d.ts.map +1 -0
  382. package/build-types/empty-state/stories/index.story.d.ts +8 -0
  383. package/build-types/empty-state/stories/index.story.d.ts.map +1 -0
  384. package/build-types/empty-state/test/actions.test.d.ts +2 -0
  385. package/build-types/empty-state/test/actions.test.d.ts.map +1 -0
  386. package/build-types/empty-state/test/description.test.d.ts +2 -0
  387. package/build-types/empty-state/test/description.test.d.ts.map +1 -0
  388. package/build-types/empty-state/test/icon.test.d.ts +2 -0
  389. package/build-types/empty-state/test/icon.test.d.ts.map +1 -0
  390. package/build-types/empty-state/test/root.test.d.ts +2 -0
  391. package/build-types/empty-state/test/root.test.d.ts.map +1 -0
  392. package/build-types/empty-state/test/title.test.d.ts +2 -0
  393. package/build-types/empty-state/test/title.test.d.ts.map +1 -0
  394. package/build-types/empty-state/test/visual.test.d.ts +2 -0
  395. package/build-types/empty-state/test/visual.test.d.ts.map +1 -0
  396. package/build-types/empty-state/title.d.ts +6 -0
  397. package/build-types/empty-state/title.d.ts.map +1 -0
  398. package/build-types/empty-state/types.d.ts +40 -0
  399. package/build-types/empty-state/types.d.ts.map +1 -0
  400. package/build-types/empty-state/visual.d.ts +7 -0
  401. package/build-types/empty-state/visual.d.ts.map +1 -0
  402. package/build-types/form/index.d.ts +3 -0
  403. package/build-types/form/index.d.ts.map +1 -0
  404. package/build-types/form/input-control/index.d.ts +2 -0
  405. package/build-types/form/input-control/index.d.ts.map +1 -0
  406. package/build-types/form/input-control/input-control.d.ts +6 -0
  407. package/build-types/form/input-control/input-control.d.ts.map +1 -0
  408. package/build-types/form/input-control/stories/index.story.d.ts +16 -0
  409. package/build-types/form/input-control/stories/index.story.d.ts.map +1 -0
  410. package/build-types/form/input-control/test/index.test.d.ts +2 -0
  411. package/build-types/form/input-control/test/index.test.d.ts.map +1 -0
  412. package/build-types/form/input-control/types.d.ts +4 -0
  413. package/build-types/form/input-control/types.d.ts.map +1 -0
  414. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  415. package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
  416. package/build-types/form/primitives/input/stories/index.story.d.ts +2 -0
  417. package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
  418. package/build-types/form/primitives/input-layout/slot.d.ts.map +1 -1
  419. package/build-types/form/primitives/input-layout/stories/index.story.d.ts +5 -0
  420. package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
  421. package/build-types/form/stories/shared.d.ts +3 -0
  422. package/build-types/form/stories/shared.d.ts.map +1 -0
  423. package/build-types/form/types.d.ts +30 -0
  424. package/build-types/form/types.d.ts.map +1 -0
  425. package/build-types/index.d.ts +4 -1
  426. package/build-types/index.d.ts.map +1 -1
  427. package/build-types/notice/index.d.ts +0 -1
  428. package/build-types/notice/index.d.ts.map +1 -1
  429. package/build-types/tabs/context.d.ts +26 -0
  430. package/build-types/tabs/context.d.ts.map +1 -0
  431. package/build-types/tabs/panel.d.ts.map +1 -1
  432. package/build-types/tabs/root.d.ts.map +1 -1
  433. package/build-types/tabs/tab.d.ts.map +1 -1
  434. package/build-types/tooltip/root.d.ts +12 -0
  435. package/build-types/tooltip/root.d.ts.map +1 -1
  436. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  437. package/build-types/utils/test/use-deprioritized-initial-focus.test.d.ts +2 -0
  438. package/build-types/utils/test/use-deprioritized-initial-focus.test.d.ts.map +1 -0
  439. package/build-types/utils/use-deprioritized-initial-focus.d.ts +35 -0
  440. package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -0
  441. package/package.json +17 -16
  442. package/src/alert-dialog/context.tsx +14 -0
  443. package/src/alert-dialog/index.ts +3 -0
  444. package/src/alert-dialog/popup.tsx +58 -0
  445. package/src/alert-dialog/root.tsx +48 -0
  446. package/src/alert-dialog/stories/index.story.tsx +254 -0
  447. package/src/alert-dialog/style.module.css +10 -0
  448. package/src/alert-dialog/test/index.test.tsx +537 -0
  449. package/src/alert-dialog/trigger.tsx +15 -0
  450. package/src/alert-dialog/types.ts +83 -0
  451. package/src/badge/style.module.css +5 -2
  452. package/src/button/style.module.css +2 -0
  453. package/src/card/stories/index.story.tsx +1 -1
  454. package/src/card/style.module.css +5 -7
  455. package/src/card/title.tsx +12 -11
  456. package/src/collapsible/index.ts +5 -0
  457. package/src/collapsible/panel.tsx +16 -0
  458. package/src/collapsible/root.tsx +15 -0
  459. package/src/collapsible/stories/index.story.tsx +108 -0
  460. package/src/collapsible/test/index.test.tsx +228 -0
  461. package/src/collapsible/trigger.tsx +15 -0
  462. package/src/collapsible/types.ts +24 -0
  463. package/src/collapsible-card/content.tsx +17 -4
  464. package/src/collapsible-card/context.ts +7 -0
  465. package/src/collapsible-card/header-description.tsx +43 -0
  466. package/src/collapsible-card/header.tsx +50 -45
  467. package/src/collapsible-card/index.ts +2 -1
  468. package/src/collapsible-card/root.tsx +1 -1
  469. package/src/collapsible-card/stories/index.story.tsx +99 -1
  470. package/src/collapsible-card/style.module.css +49 -4
  471. package/src/collapsible-card/test/index.test.tsx +107 -40
  472. package/src/collapsible-card/types.ts +22 -0
  473. package/src/dialog/action.tsx +8 -2
  474. package/src/dialog/close-icon.tsx +1 -0
  475. package/src/dialog/popup.tsx +21 -2
  476. package/src/dialog/stories/index.story.tsx +0 -28
  477. package/src/dialog/style.module.css +5 -5
  478. package/src/dialog/test/index.test.tsx +117 -0
  479. package/src/dialog/types.ts +11 -5
  480. package/src/empty-state/actions.tsx +24 -0
  481. package/src/empty-state/description.tsx +27 -0
  482. package/src/empty-state/icon.tsx +24 -0
  483. package/src/empty-state/index.ts +8 -0
  484. package/src/empty-state/root.tsx +23 -0
  485. package/src/empty-state/stories/index.story.tsx +64 -0
  486. package/src/empty-state/style.module.css +53 -0
  487. package/src/empty-state/test/actions.test.tsx +18 -0
  488. package/src/empty-state/test/description.test.tsx +13 -0
  489. package/src/empty-state/test/icon.test.tsx +13 -0
  490. package/src/empty-state/test/root.test.tsx +13 -0
  491. package/src/empty-state/test/title.test.tsx +13 -0
  492. package/src/empty-state/test/visual.test.tsx +17 -0
  493. package/src/empty-state/title.tsx +23 -0
  494. package/src/empty-state/types.ts +45 -0
  495. package/src/empty-state/visual.tsx +24 -0
  496. package/src/form/index.ts +3 -0
  497. package/src/form/input-control/index.ts +1 -0
  498. package/src/form/input-control/input-control.tsx +33 -0
  499. package/src/form/input-control/stories/index.story.tsx +163 -0
  500. package/src/form/input-control/test/index.test.tsx +53 -0
  501. package/src/form/input-control/types.ts +5 -0
  502. package/src/form/primitives/field/root.tsx +2 -2
  503. package/src/form/primitives/field/stories/index.story.tsx +2 -7
  504. package/src/form/primitives/fieldset/stories/index.story.tsx +2 -7
  505. package/src/form/primitives/input/stories/index.story.tsx +7 -0
  506. package/src/form/primitives/input-layout/slot.tsx +6 -2
  507. package/src/form/primitives/input-layout/stories/index.story.tsx +22 -1
  508. package/src/form/primitives/stories/overview.mdx +15 -0
  509. package/src/form/primitives/textarea/textarea.tsx +1 -1
  510. package/src/form/stories/shared.tsx +19 -0
  511. package/src/form/types.ts +34 -0
  512. package/src/index.ts +4 -1
  513. package/src/notice/index.ts +0 -2
  514. package/src/notice/style.module.css +1 -1
  515. package/src/tabs/context.tsx +170 -0
  516. package/src/tabs/panel.tsx +3 -0
  517. package/src/tabs/root.tsx +6 -1
  518. package/src/tabs/style.module.css +1 -1
  519. package/src/tabs/tab.tsx +3 -0
  520. package/src/tabs/test/index.test.tsx +162 -0
  521. package/src/tooltip/root.tsx +12 -0
  522. package/src/tooltip/stories/index.story.tsx +20 -15
  523. package/src/utils/css/focus.module.css +4 -2
  524. package/src/utils/css/item-popup.module.css +1 -0
  525. package/src/utils/css/select-trigger.module.css +1 -0
  526. package/src/utils/test/use-deprioritized-initial-focus.test.tsx +230 -0
  527. package/src/utils/use-deprioritized-initial-focus.ts +83 -0
  528. package/AGENTS.md +0 -9
  529. package/CLAUDE.md +0 -1
@@ -1,6 +1,7 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import * as Card from '../../card';
3
3
  import * as CollapsibleCard from '../index';
4
+ import { Stack } from '../../stack';
4
5
 
5
6
  /**
6
7
  * Temporary text component for story examples. This will be replaced by an
@@ -11,7 +12,7 @@ function Text( { children }: { children: React.ReactNode } ) {
11
12
  <p
12
13
  style={ {
13
14
  margin: 0,
14
- fontFamily: [ 'var(--wp', 'ds-font-family-body)' ].join( '' ),
15
+ fontFamily: 'var(--wpds-font-family-body)',
15
16
  fontSize: 'var(--wpds-font-size-md)',
16
17
  fontWeight: 'var(--wpds-font-weight-regular)',
17
18
  lineHeight: 'var(--wpds-font-line-height-sm)',
@@ -29,6 +30,7 @@ const meta: Meta< typeof CollapsibleCard.Root > = {
29
30
  component: CollapsibleCard.Root,
30
31
  subcomponents: {
31
32
  'CollapsibleCard.Header': CollapsibleCard.Header,
33
+ 'CollapsibleCard.HeaderDescription': CollapsibleCard.HeaderDescription,
32
34
  'CollapsibleCard.Content': CollapsibleCard.Content,
33
35
  },
34
36
  };
@@ -105,6 +107,102 @@ export const Disabled: Story = {
105
107
  },
106
108
  };
107
109
 
110
+ /**
111
+ * Multiple collapsible cards stacked vertically, simulating a typical
112
+ * settings-panel or FAQ-style layout.
113
+ */
114
+ export const Stacked: Story = {
115
+ parameters: { controls: { disable: true } },
116
+ render: () => (
117
+ <div
118
+ style={ {
119
+ display: 'flex',
120
+ flexDirection: 'column',
121
+ gap: 'var(--wpds-dimension-gap-lg)',
122
+ } }
123
+ >
124
+ { [
125
+ 'General',
126
+ 'Advanced',
127
+ 'Accessibility',
128
+ 'Performance',
129
+ 'Privacy',
130
+ 'Notifications',
131
+ ].map( ( title ) => (
132
+ <CollapsibleCard.Root key={ title }>
133
+ <CollapsibleCard.Header>
134
+ <Card.Title>{ title }</Card.Title>
135
+ </CollapsibleCard.Header>
136
+ <CollapsibleCard.Content>
137
+ <Text>
138
+ Configure all { title.toLowerCase() } settings for
139
+ your site. Changes here affect how your site behaves
140
+ across all pages and posts.
141
+ </Text>
142
+ <Text>
143
+ Review each option carefully before saving. Some
144
+ changes may require a page reload to take effect.
145
+ Hover over individual options for more details about
146
+ what they control.
147
+ </Text>
148
+ <Text>
149
+ If you&apos;re unsure about a setting, you can
150
+ always reset to defaults using the button at the
151
+ bottom of this section. Your previous configuration
152
+ will be saved as a backup.
153
+ </Text>
154
+ </CollapsibleCard.Content>
155
+ </CollapsibleCard.Root>
156
+ ) ) }
157
+ </div>
158
+ ),
159
+ };
160
+
161
+ /**
162
+ * A collapsible card with a `HeaderDescription` that provides supplementary
163
+ * information (e.g. status, summary) as an `aria-describedby` relationship.
164
+ */
165
+ export const WithHeaderDescription: Story = {
166
+ // `defaultOpen` (uncontrolled) and `open` (controlled) should not be
167
+ // used together — disable the `open` control to avoid confusion.
168
+ argTypes: { open: { control: false } },
169
+ args: {
170
+ defaultOpen: true,
171
+ },
172
+ render: ( { open, defaultOpen, onOpenChange, disabled, ...restArgs } ) => (
173
+ <CollapsibleCard.Root
174
+ open={ open }
175
+ defaultOpen={ defaultOpen }
176
+ onOpenChange={ onOpenChange }
177
+ disabled={ disabled }
178
+ { ...restArgs }
179
+ >
180
+ <CollapsibleCard.Header>
181
+ <Stack justify="space-between">
182
+ <Card.Title>Settings</Card.Title>
183
+ <CollapsibleCard.HeaderDescription>
184
+ <span
185
+ style={ {
186
+ fontSize: 'var(--wpds-font-size-sm)',
187
+ color: 'var(--wpds-color-fg-content-neutral-weak)',
188
+ } }
189
+ >
190
+ 3 items configured
191
+ </span>
192
+ </CollapsibleCard.HeaderDescription>
193
+ </Stack>
194
+ </CollapsibleCard.Header>
195
+ <CollapsibleCard.Content>
196
+ <Text>
197
+ The header description provides supplementary context to the
198
+ trigger button. Assistive technologies will announce the
199
+ description alongside the button label.
200
+ </Text>
201
+ </CollapsibleCard.Content>
202
+ </CollapsibleCard.Root>
203
+ ),
204
+ };
205
+
108
206
  /**
109
207
  * Visual comparison: a `CollapsibleCard` (open) next to a regular `Card`
110
208
  * to verify identical spacing and layout.
@@ -6,7 +6,7 @@
6
6
  min-width: 0;
7
7
  }
8
8
 
9
- .header-trigger-wrapper {
9
+ .header-trigger-positioner {
10
10
  flex-shrink: 0;
11
11
  align-self: center;
12
12
  /* Prevent the trigger from making the header taller than its content,
@@ -15,22 +15,67 @@
15
15
  overflow: visible;
16
16
  }
17
17
 
18
- .header-trigger {
18
+ .header-trigger-wrapper {
19
+ display: flex;
20
+
19
21
  /* Offset by half the button's own height so it visually centers
20
22
  at the wrapper's midpoint (which `align-self: center` places at
21
23
  the vertical center of the header). */
22
- transform: translateY(-50%);
24
+ translate: 0 -50%;
25
+
26
+ /* For an outline that looks like `IconButton`'s */
27
+ border-radius: var(--wpds-border-radius-sm);
23
28
  }
29
+
30
+ .header-trigger {
31
+ @media not (prefers-reduced-motion) {
32
+ transition: rotate 0.15s ease-out;
33
+ }
34
+ }
35
+
36
+ .header[data-panel-open] .header-trigger {
37
+ rotate: 180deg;
38
+ }
39
+
40
+ /* Simulate disabled button styles */
41
+ .header[data-disabled] .header-trigger {
42
+ color: var(--wpds-color-fg-interactive-neutral-disabled);
43
+ }
44
+
45
+ .content {
46
+ height: var(--collapsible-panel-height);
47
+ overflow: hidden;
48
+ margin-block-start: var(--wp-ui-card-header-content-margin);
49
+
50
+ &[hidden]:not([hidden="until-found"]) {
51
+ display: none;
52
+ }
53
+
54
+ &[data-starting-style],
55
+ &[data-ending-style] {
56
+ height: 0;
57
+ }
58
+
59
+ @media not (prefers-reduced-motion) {
60
+ transition: all 150ms ease-out;
61
+ }
62
+ }
63
+
24
64
  }
25
65
 
26
66
  @layer wp-ui-compositions {
67
+ .content-inner {
68
+ padding-block-start: 0;
69
+ }
70
+
27
71
  .header {
28
72
  display: flex;
29
73
  flex-direction: row;
30
74
  align-items: stretch;
31
75
  gap: var(--wpds-dimension-gap-sm);
76
+ outline: none;
32
77
 
33
- &:has(.header-trigger:not([data-disabled])) {
78
+ &:not([data-disabled]) {
34
79
  cursor: var(--wpds-cursor-control);
35
80
  }
36
81
  }
@@ -53,9 +53,7 @@ describe( 'CollapsibleCard', () => {
53
53
  </CollapsibleCard.Root>
54
54
  );
55
55
 
56
- expect(
57
- screen.queryByText( 'Hidden content' )
58
- ).not.toBeInTheDocument();
56
+ expect( screen.getByText( 'Hidden content' ) ).not.toBeVisible();
59
57
  } );
60
58
 
61
59
  it( 'shows content when defaultOpen is true', () => {
@@ -87,13 +85,12 @@ describe( 'CollapsibleCard', () => {
87
85
  </CollapsibleCard.Root>
88
86
  );
89
87
 
90
- expect(
91
- screen.queryByText( 'Toggle content' )
92
- ).not.toBeInTheDocument();
88
+ expect( screen.getByText( 'Toggle content' ) ).not.toBeVisible();
93
89
 
94
90
  await user.click(
95
91
  screen.getByRole( 'button', {
96
- name: 'Expand or collapse card',
92
+ name: 'Title',
93
+ expanded: false,
97
94
  } )
98
95
  );
99
96
 
@@ -101,38 +98,12 @@ describe( 'CollapsibleCard', () => {
101
98
 
102
99
  await user.click(
103
100
  screen.getByRole( 'button', {
104
- name: 'Expand or collapse card',
101
+ name: 'Title',
102
+ expanded: true,
105
103
  } )
106
104
  );
107
105
 
108
- expect(
109
- screen.queryByText( 'Toggle content' )
110
- ).not.toBeInTheDocument();
111
- } );
112
-
113
- it( 'toggles content when clicking the header area', async () => {
114
- const user = userEvent.setup();
115
-
116
- render(
117
- <CollapsibleCard.Root>
118
- <CollapsibleCard.Header>
119
- <Card.Title>Header click test</Card.Title>
120
- </CollapsibleCard.Header>
121
- <CollapsibleCard.Content>
122
- <p>Header toggled content</p>
123
- </CollapsibleCard.Content>
124
- </CollapsibleCard.Root>
125
- );
126
-
127
- expect(
128
- screen.queryByText( 'Header toggled content' )
129
- ).not.toBeInTheDocument();
130
-
131
- await user.click( screen.getByText( 'Header click test' ) );
132
-
133
- expect(
134
- screen.getByText( 'Header toggled content' )
135
- ).toBeVisible();
106
+ expect( screen.getByText( 'Toggle content' ) ).not.toBeVisible();
136
107
  } );
137
108
 
138
109
  it( 'calls onOpenChange when toggled', async () => {
@@ -152,7 +123,8 @@ describe( 'CollapsibleCard', () => {
152
123
 
153
124
  await user.click(
154
125
  screen.getByRole( 'button', {
155
- name: 'Expand or collapse card',
126
+ name: 'Title',
127
+ expanded: false,
156
128
  } )
157
129
  );
158
130
 
@@ -179,7 +151,8 @@ describe( 'CollapsibleCard', () => {
179
151
 
180
152
  await user.click(
181
153
  screen.getByRole( 'button', {
182
- name: 'Expand or collapse card',
154
+ name: 'Title',
155
+ expanded: true,
183
156
  } )
184
157
  );
185
158
 
@@ -188,7 +161,7 @@ describe( 'CollapsibleCard', () => {
188
161
  } );
189
162
 
190
163
  describe( 'trigger', () => {
191
- it( 'renders a toggle button', () => {
164
+ it( 'renders the header as a toggle button', () => {
192
165
  render(
193
166
  <CollapsibleCard.Root>
194
167
  <CollapsibleCard.Header>
@@ -199,9 +172,103 @@ describe( 'CollapsibleCard', () => {
199
172
 
200
173
  expect(
201
174
  screen.getByRole( 'button', {
202
- name: 'Expand or collapse card',
175
+ name: 'Title',
176
+ expanded: false,
203
177
  } )
204
178
  ).toBeVisible();
205
179
  } );
206
180
  } );
181
+
182
+ describe( 'HeaderDescription', () => {
183
+ it( 'sets aria-describedby on the trigger pointing to the description', () => {
184
+ render(
185
+ <CollapsibleCard.Root>
186
+ <CollapsibleCard.Header>
187
+ <Card.Title>Settings</Card.Title>
188
+ <CollapsibleCard.HeaderDescription data-testid="desc">
189
+ 3 errors
190
+ </CollapsibleCard.HeaderDescription>
191
+ </CollapsibleCard.Header>
192
+ <CollapsibleCard.Content>
193
+ <p>Content</p>
194
+ </CollapsibleCard.Content>
195
+ </CollapsibleCard.Root>
196
+ );
197
+
198
+ const trigger = screen.getByRole( 'button', {
199
+ name: 'Settings',
200
+ } );
201
+ const descriptionElement = screen.getByTestId( 'desc' );
202
+
203
+ expect( descriptionElement ).toHaveAttribute( 'id' );
204
+ expect( trigger ).toHaveAttribute(
205
+ 'aria-describedby',
206
+ descriptionElement.id
207
+ );
208
+ } );
209
+
210
+ it( 'marks the description content as aria-hidden', () => {
211
+ render(
212
+ <CollapsibleCard.Root>
213
+ <CollapsibleCard.Header>
214
+ <Card.Title>Settings</Card.Title>
215
+ <CollapsibleCard.HeaderDescription data-testid="desc">
216
+ <span>Status: OK</span>
217
+ </CollapsibleCard.HeaderDescription>
218
+ </CollapsibleCard.Header>
219
+ </CollapsibleCard.Root>
220
+ );
221
+
222
+ const descriptionWrapper = screen.getByTestId( 'desc' );
223
+ expect( descriptionWrapper ).toHaveAttribute(
224
+ 'aria-hidden',
225
+ 'true'
226
+ );
227
+ } );
228
+
229
+ it( 'does not set aria-describedby when HeaderDescription is absent', () => {
230
+ render(
231
+ <CollapsibleCard.Root>
232
+ <CollapsibleCard.Header>
233
+ <Card.Title>Title</Card.Title>
234
+ </CollapsibleCard.Header>
235
+ </CollapsibleCard.Root>
236
+ );
237
+
238
+ const trigger = screen.getByRole( 'button', { name: 'Title' } );
239
+ expect( trigger ).not.toHaveAttribute( 'aria-describedby' );
240
+ } );
241
+
242
+ it( 'forwards ref on HeaderDescription', () => {
243
+ const descRef = createRef< HTMLDivElement >();
244
+
245
+ render(
246
+ <CollapsibleCard.Root>
247
+ <CollapsibleCard.Header>
248
+ <Card.Title>Title</Card.Title>
249
+ <CollapsibleCard.HeaderDescription ref={ descRef }>
250
+ Description
251
+ </CollapsibleCard.HeaderDescription>
252
+ </CollapsibleCard.Header>
253
+ </CollapsibleCard.Root>
254
+ );
255
+
256
+ expect( descRef.current ).toBeInstanceOf( HTMLDivElement );
257
+ } );
258
+
259
+ it( 'renders description content visually', () => {
260
+ render(
261
+ <CollapsibleCard.Root>
262
+ <CollapsibleCard.Header>
263
+ <Card.Title>Title</Card.Title>
264
+ <CollapsibleCard.HeaderDescription>
265
+ Badge content
266
+ </CollapsibleCard.HeaderDescription>
267
+ </CollapsibleCard.Header>
268
+ </CollapsibleCard.Root>
269
+ );
270
+
271
+ expect( screen.getByText( 'Badge content' ) ).toBeVisible();
272
+ } );
273
+ } );
207
274
  } );
@@ -1,4 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
+ import type { PanelProps } from '../collapsible/types';
2
3
  import type { ComponentProps } from '../utils/types';
3
4
 
4
5
  export interface RootProps extends ComponentProps< 'div' > {
@@ -36,9 +37,30 @@ export interface HeaderProps extends ComponentProps< 'div' > {
36
37
  children?: ReactNode;
37
38
  }
38
39
 
40
+ export interface HeaderDescriptionProps extends ComponentProps< 'div' > {
41
+ /**
42
+ * Secondary content that describes the header trigger via
43
+ * `aria-describedby`. Rendered visually but marked `aria-hidden`
44
+ * so assistive technologies consume it only through the description
45
+ * relationship, avoiding double announcements.
46
+ *
47
+ * Avoid interactive elements — the entire header is the toggle trigger.
48
+ */
49
+ children?: ReactNode;
50
+ }
51
+
39
52
  export interface ContentProps extends ComponentProps< 'div' > {
40
53
  /**
41
54
  * The content to be rendered inside the collapsible content area.
42
55
  */
43
56
  children?: ReactNode;
57
+ /**
58
+ * Allows the browser’s built-in page search to find and expand the panel contents.
59
+ *
60
+ * Overrides the `keepMounted` prop and uses `hidden="until-found"`
61
+ * to hide the element without removing it from the DOM.
62
+ *
63
+ * @default true
64
+ */
65
+ hiddenUntilFound?: PanelProps[ 'hiddenUntilFound' ];
44
66
  }
@@ -8,11 +8,17 @@ import type { ActionProps } from './types';
8
8
  * Accepts all Button component props for styling.
9
9
  */
10
10
  const Action = forwardRef< HTMLButtonElement, ActionProps >(
11
- function DialogAction( { render, ...props }, ref ) {
11
+ function DialogAction( { render, disabled, loading, ...props }, ref ) {
12
+ // Resolve `disabled` the same way Button does so that
13
+ // _Dialog.Close's internal useButton (which controls
14
+ // aria-disabled) stays in sync with the rendered Button.
15
+ const resolvedDisabled = disabled ?? loading;
16
+
12
17
  return (
13
18
  <_Dialog.Close
14
19
  ref={ ref }
15
- render={ <Button render={ render } /> }
20
+ render={ <Button render={ render } loading={ loading } /> }
21
+ disabled={ resolvedDisabled }
16
22
  { ...props }
17
23
  />
18
24
  );
@@ -22,6 +22,7 @@ const CloseIcon = forwardRef< HTMLButtonElement, CloseIconProps >(
22
22
  { ...props }
23
23
  icon={ icon ?? close }
24
24
  label={ label ?? __( 'Close' ) }
25
+ data-wp-ui-dialog-close-icon=""
25
26
  />
26
27
  }
27
28
  />
@@ -1,11 +1,13 @@
1
1
  import { Dialog as _Dialog } from '@base-ui/react/dialog';
2
2
  import clsx from 'clsx';
3
3
  import { forwardRef } from '@wordpress/element';
4
+ import { useMergeRefs } from '@wordpress/compose';
4
5
  import {
5
6
  type ThemeProvider as ThemeProviderType,
6
7
  privateApis as themePrivateApis,
7
8
  } from '@wordpress/theme';
8
9
  import { unlock } from '../lock-unlock';
10
+ import { useDeprioritizedInitialFocus } from '../utils/use-deprioritized-initial-focus';
9
11
  import { DialogValidationProvider } from './context';
10
12
  import styles from './style.module.css';
11
13
  import type { PopupProps } from './types';
@@ -13,25 +15,42 @@ import type { PopupProps } from './types';
13
15
  const ThemeProvider: typeof ThemeProviderType =
14
16
  unlock( themePrivateApis ).ThemeProvider;
15
17
 
18
+ const CLOSE_ICON_ATTR = 'data-wp-ui-dialog-close-icon';
19
+
16
20
  /**
17
21
  * Renders the dialog popup element that contains the dialog content.
18
22
  * Uses a portal to render outside the DOM hierarchy.
19
23
  */
20
24
  const Popup = forwardRef< HTMLDivElement, PopupProps >( function DialogPopup(
21
- { className, size = 'medium', children, ...props },
25
+ {
26
+ className,
27
+ size = 'medium',
28
+ initialFocus,
29
+ finalFocus,
30
+ children,
31
+ ...props
32
+ },
22
33
  ref
23
34
  ) {
35
+ const { resolvedInitialFocus, popupRef } = useDeprioritizedInitialFocus( {
36
+ initialFocus,
37
+ deprioritizedAttribute: CLOSE_ICON_ATTR,
38
+ } );
39
+ const mergedRef = useMergeRefs( [ ref, popupRef ] );
40
+
24
41
  return (
25
42
  <_Dialog.Portal>
26
43
  <_Dialog.Backdrop className={ styles.backdrop } />
27
44
  <ThemeProvider>
28
45
  <_Dialog.Popup
29
- ref={ ref }
46
+ ref={ mergedRef }
30
47
  className={ clsx(
31
48
  styles.popup,
32
49
  className,
33
50
  styles[ `is-${ size }` ]
34
51
  ) }
52
+ initialFocus={ resolvedInitialFocus }
53
+ finalFocus={ finalFocus }
35
54
  { ...props }
36
55
  >
37
56
  <DialogValidationProvider>
@@ -73,34 +73,6 @@ export const _Default: Story = {
73
73
  },
74
74
  };
75
75
 
76
- /**
77
- * A confirmation dialog that intentionally omits the close icon. The user
78
- * must explicitly choose "Cancel" or "Confirm" to make their intent clear,
79
- * since it is not obvious what would happen when clicking a close icon.
80
- */
81
- export const ConfirmDialog: Story = {
82
- args: {
83
- children: (
84
- <>
85
- <Dialog.Trigger>Confirm Action</Dialog.Trigger>
86
- <Dialog.Popup>
87
- <Dialog.Header>
88
- <Dialog.Title>Confirm Action</Dialog.Title>
89
- </Dialog.Header>
90
- <p>
91
- Are you sure you want to proceed? This action cannot be
92
- undone.
93
- </p>
94
- <Dialog.Footer>
95
- <Dialog.Action variant="outline">Cancel</Dialog.Action>
96
- <Dialog.Action>Confirm</Dialog.Action>
97
- </Dialog.Footer>
98
- </Dialog.Popup>
99
- </>
100
- ),
101
- },
102
- };
103
-
104
76
  const ALL_SIZES = [ 'small', 'medium', 'large', 'stretch', 'full' ] as const;
105
77
 
106
78
  function SizeSelector( {
@@ -29,7 +29,7 @@
29
29
  z-index: var(--wp-ui-dialog-z-index, initial);
30
30
  transform: translate(-50%, -50%);
31
31
  box-sizing: border-box;
32
- min-width: 320px;
32
+ min-width: var(--wpds-dimension-surface-width-sm);
33
33
  width: calc(100vw - 2 * var(--wpds-dimension-padding-2xl));
34
34
  max-height: calc(100vh - 2 * var(--wpds-dimension-padding-2xl));
35
35
  padding: var(--wpds-dimension-padding-2xl);
@@ -61,19 +61,19 @@
61
61
  }
62
62
 
63
63
  @media (min-width: 480px) {
64
- min-width: 384px;
64
+ min-width: var(--wpds-dimension-surface-width-md);
65
65
  }
66
66
 
67
67
  &.is-small {
68
- max-width: 384px;
68
+ max-width: var(--wpds-dimension-surface-width-md);
69
69
  }
70
70
 
71
71
  &.is-medium {
72
- max-width: 512px;
72
+ max-width: var(--wpds-dimension-surface-width-lg);
73
73
  }
74
74
 
75
75
  &.is-large {
76
- max-width: 840px;
76
+ max-width: var(--wpds-dimension-surface-width-2xl);
77
77
  }
78
78
 
79
79
  &.is-stretch {