@wordpress/ui 0.11.0 → 0.12.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 (660) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +4 -4
  3. package/build/alert-dialog/index.cjs +3 -0
  4. package/build/alert-dialog/index.cjs.map +2 -2
  5. package/build/alert-dialog/popup.cjs +120 -55
  6. package/build/alert-dialog/popup.cjs.map +3 -3
  7. package/build/alert-dialog/portal.cjs +38 -0
  8. package/build/alert-dialog/portal.cjs.map +7 -0
  9. package/build/alert-dialog/types.cjs.map +1 -1
  10. package/build/collapsible-card/content.cjs +9 -5
  11. package/build/collapsible-card/content.cjs.map +2 -2
  12. package/build/collapsible-card/header.cjs +14 -4
  13. package/build/collapsible-card/header.cjs.map +3 -3
  14. package/build/dialog/content.cjs +85 -0
  15. package/build/dialog/content.cjs.map +7 -0
  16. package/build/dialog/context.cjs +12 -44
  17. package/build/dialog/context.cjs.map +2 -2
  18. package/build/dialog/description.cjs +59 -0
  19. package/build/dialog/description.cjs.map +7 -0
  20. package/build/dialog/footer.cjs +5 -4
  21. package/build/dialog/footer.cjs.map +2 -2
  22. package/build/dialog/header.cjs +5 -4
  23. package/build/dialog/header.cjs.map +2 -2
  24. package/build/dialog/index.cjs +9 -0
  25. package/build/dialog/index.cjs.map +2 -2
  26. package/build/dialog/popup.cjs +21 -9
  27. package/build/dialog/popup.cjs.map +2 -2
  28. package/build/dialog/portal.cjs +38 -0
  29. package/build/dialog/portal.cjs.map +7 -0
  30. package/build/dialog/root.cjs +3 -2
  31. package/build/dialog/root.cjs.map +2 -2
  32. package/build/dialog/title.cjs +9 -6
  33. package/build/dialog/title.cjs.map +2 -2
  34. package/build/dialog/types.cjs.map +1 -1
  35. package/build/drawer/action.cjs +48 -0
  36. package/build/drawer/action.cjs.map +7 -0
  37. package/build/drawer/close-icon.cjs +58 -0
  38. package/build/drawer/close-icon.cjs.map +7 -0
  39. package/build/drawer/content.cjs +86 -0
  40. package/build/drawer/content.cjs.map +7 -0
  41. package/build/drawer/context.cjs +44 -0
  42. package/build/drawer/context.cjs.map +7 -0
  43. package/build/drawer/description.cjs +47 -0
  44. package/build/drawer/description.cjs.map +7 -0
  45. package/build/drawer/footer.cjs +65 -0
  46. package/build/drawer/footer.cjs.map +7 -0
  47. package/build/drawer/header.cjs +65 -0
  48. package/build/drawer/header.cjs.map +7 -0
  49. package/build/drawer/index.cjs +61 -0
  50. package/build/drawer/index.cjs.map +7 -0
  51. package/build/drawer/popup.cjs +103 -0
  52. package/build/drawer/popup.cjs.map +7 -0
  53. package/build/drawer/portal.cjs +38 -0
  54. package/build/drawer/portal.cjs.map +7 -0
  55. package/build/drawer/root.cjs +49 -0
  56. package/build/drawer/root.cjs.map +7 -0
  57. package/build/drawer/title.cjs +70 -0
  58. package/build/drawer/title.cjs.map +7 -0
  59. package/build/drawer/trigger.cjs +38 -0
  60. package/build/drawer/trigger.cjs.map +7 -0
  61. package/build/drawer/types.cjs +19 -0
  62. package/build/drawer/types.cjs.map +7 -0
  63. package/build/form/primitives/autocomplete/clear.cjs +62 -0
  64. package/build/form/primitives/autocomplete/clear.cjs.map +7 -0
  65. package/build/form/primitives/autocomplete/collection.cjs +38 -0
  66. package/build/form/primitives/autocomplete/collection.cjs.map +7 -0
  67. package/build/form/primitives/autocomplete/empty.cjs +67 -0
  68. package/build/form/primitives/autocomplete/empty.cjs.map +7 -0
  69. package/build/form/primitives/autocomplete/index.cjs +64 -0
  70. package/build/form/primitives/autocomplete/index.cjs.map +7 -0
  71. package/build/form/primitives/autocomplete/input-group.cjs +36 -0
  72. package/build/form/primitives/autocomplete/input-group.cjs.map +7 -0
  73. package/build/form/primitives/autocomplete/input.cjs +47 -0
  74. package/build/form/primitives/autocomplete/input.cjs.map +7 -0
  75. package/build/form/primitives/autocomplete/item.cjs +81 -0
  76. package/build/form/primitives/autocomplete/item.cjs.map +7 -0
  77. package/build/form/primitives/autocomplete/list-body.cjs +57 -0
  78. package/build/form/primitives/autocomplete/list-body.cjs.map +7 -0
  79. package/build/form/primitives/autocomplete/list.cjs +67 -0
  80. package/build/form/primitives/autocomplete/list.cjs.map +7 -0
  81. package/build/form/primitives/autocomplete/popup.cjs +102 -0
  82. package/build/form/primitives/autocomplete/popup.cjs.map +7 -0
  83. package/build/form/primitives/autocomplete/portal.cjs +38 -0
  84. package/build/form/primitives/autocomplete/portal.cjs.map +7 -0
  85. package/build/form/primitives/autocomplete/root.cjs +35 -0
  86. package/build/form/primitives/autocomplete/root.cjs.map +7 -0
  87. package/build/form/primitives/autocomplete/types.cjs +19 -0
  88. package/build/form/primitives/autocomplete/types.cjs.map +7 -0
  89. package/build/form/primitives/autocomplete/value.cjs +35 -0
  90. package/build/form/primitives/autocomplete/value.cjs.map +7 -0
  91. package/build/form/primitives/index.cjs +3 -0
  92. package/build/form/primitives/index.cjs.map +2 -2
  93. package/build/form/primitives/select/index.cjs +3 -0
  94. package/build/form/primitives/select/index.cjs.map +2 -2
  95. package/build/form/primitives/select/item.cjs +4 -5
  96. package/build/form/primitives/select/item.cjs.map +2 -2
  97. package/build/form/primitives/select/popup.cjs +12 -11
  98. package/build/form/primitives/select/popup.cjs.map +2 -2
  99. package/build/form/primitives/select/portal.cjs +38 -0
  100. package/build/form/primitives/select/portal.cjs.map +7 -0
  101. package/build/form/primitives/select/types.cjs.map +1 -1
  102. package/build/index.cjs +3 -0
  103. package/build/index.cjs.map +2 -2
  104. package/build/link/link.cjs +8 -18
  105. package/build/link/link.cjs.map +2 -2
  106. package/build/link/types.cjs.map +1 -1
  107. package/build/notice/action-button.cjs +3 -3
  108. package/build/notice/action-button.cjs.map +2 -2
  109. package/build/notice/action-link.cjs +8 -7
  110. package/build/notice/action-link.cjs.map +2 -2
  111. package/build/notice/actions.cjs +3 -3
  112. package/build/notice/actions.cjs.map +2 -2
  113. package/build/notice/close-icon.cjs +3 -3
  114. package/build/notice/close-icon.cjs.map +2 -2
  115. package/build/notice/description.cjs +3 -3
  116. package/build/notice/description.cjs.map +2 -2
  117. package/build/notice/root.cjs +3 -3
  118. package/build/notice/root.cjs.map +2 -2
  119. package/build/notice/title.cjs +3 -3
  120. package/build/notice/title.cjs.map +2 -2
  121. package/build/popover/arrow.cjs +4 -4
  122. package/build/popover/arrow.cjs.map +2 -2
  123. package/build/popover/context.cjs +4 -44
  124. package/build/popover/context.cjs.map +2 -2
  125. package/build/popover/description.cjs +1 -24
  126. package/build/popover/description.cjs.map +4 -4
  127. package/build/popover/index.cjs +3 -0
  128. package/build/popover/index.cjs.map +2 -2
  129. package/build/popover/popup.cjs +15 -15
  130. package/build/popover/popup.cjs.map +2 -2
  131. package/build/popover/portal.cjs +38 -0
  132. package/build/popover/portal.cjs.map +7 -0
  133. package/build/popover/root.cjs.map +1 -1
  134. package/build/popover/title.cjs +18 -4
  135. package/build/popover/title.cjs.map +3 -3
  136. package/build/popover/types.cjs.map +1 -1
  137. package/build/tabs/context.cjs +9 -22
  138. package/build/tabs/context.cjs.map +2 -2
  139. package/build/tabs/list.cjs +4 -4
  140. package/build/tabs/list.cjs.map +2 -2
  141. package/build/tabs/panel.cjs +19 -6
  142. package/build/tabs/panel.cjs.map +3 -3
  143. package/build/tabs/tab.cjs +4 -4
  144. package/build/tabs/tab.cjs.map +2 -2
  145. package/build/text/text.cjs +2 -2
  146. package/build/text/text.cjs.map +2 -2
  147. package/build/tooltip/index.cjs +3 -0
  148. package/build/tooltip/index.cjs.map +2 -2
  149. package/build/tooltip/popup.cjs +11 -14
  150. package/build/tooltip/popup.cjs.map +3 -3
  151. package/build/tooltip/portal.cjs +38 -0
  152. package/build/tooltip/portal.cjs.map +7 -0
  153. package/build/tooltip/provider.cjs +2 -2
  154. package/build/tooltip/provider.cjs.map +3 -3
  155. package/build/tooltip/root.cjs.map +3 -3
  156. package/build/tooltip/trigger.cjs +2 -2
  157. package/build/tooltip/trigger.cjs.map +3 -3
  158. package/build/tooltip/types.cjs.map +1 -1
  159. package/build/utils/create-overlay-modal-context.cjs +48 -0
  160. package/build/utils/create-overlay-modal-context.cjs.map +7 -0
  161. package/build/utils/create-overlay-title-validation.cjs +93 -0
  162. package/build/utils/create-overlay-title-validation.cjs.map +7 -0
  163. package/build/utils/render-portal-with-children.cjs +37 -0
  164. package/build/utils/render-portal-with-children.cjs.map +7 -0
  165. package/build/utils/use-deprioritized-initial-focus.cjs +8 -8
  166. package/build/utils/use-deprioritized-initial-focus.cjs.map +2 -2
  167. package/build/utils/use-overlay-scroll-state-attributes.cjs +140 -0
  168. package/build/utils/use-overlay-scroll-state-attributes.cjs.map +7 -0
  169. package/build/utils/use-schedule-validation.cjs +59 -0
  170. package/build/utils/use-schedule-validation.cjs.map +7 -0
  171. package/build/visually-hidden/visually-hidden.cjs +5 -1
  172. package/build/visually-hidden/visually-hidden.cjs.map +2 -2
  173. package/build-module/alert-dialog/index.mjs +2 -0
  174. package/build-module/alert-dialog/index.mjs.map +2 -2
  175. package/build-module/alert-dialog/popup.mjs +124 -56
  176. package/build-module/alert-dialog/popup.mjs.map +3 -3
  177. package/build-module/alert-dialog/portal.mjs +13 -0
  178. package/build-module/alert-dialog/portal.mjs.map +7 -0
  179. package/build-module/collapsible-card/content.mjs +9 -5
  180. package/build-module/collapsible-card/content.mjs.map +2 -2
  181. package/build-module/collapsible-card/header.mjs +14 -4
  182. package/build-module/collapsible-card/header.mjs.map +3 -3
  183. package/build-module/dialog/content.mjs +50 -0
  184. package/build-module/dialog/content.mjs.map +7 -0
  185. package/build-module/dialog/context.mjs +10 -51
  186. package/build-module/dialog/context.mjs.map +2 -2
  187. package/build-module/dialog/description.mjs +34 -0
  188. package/build-module/dialog/description.mjs.map +7 -0
  189. package/build-module/dialog/footer.mjs +5 -4
  190. package/build-module/dialog/footer.mjs.map +2 -2
  191. package/build-module/dialog/header.mjs +5 -4
  192. package/build-module/dialog/header.mjs.map +2 -2
  193. package/build-module/dialog/index.mjs +6 -0
  194. package/build-module/dialog/index.mjs.map +2 -2
  195. package/build-module/dialog/popup.mjs +23 -11
  196. package/build-module/dialog/popup.mjs.map +2 -2
  197. package/build-module/dialog/portal.mjs +13 -0
  198. package/build-module/dialog/portal.mjs.map +7 -0
  199. package/build-module/dialog/root.mjs +3 -2
  200. package/build-module/dialog/root.mjs.map +2 -2
  201. package/build-module/dialog/title.mjs +10 -7
  202. package/build-module/dialog/title.mjs.map +2 -2
  203. package/build-module/drawer/action.mjs +23 -0
  204. package/build-module/drawer/action.mjs.map +7 -0
  205. package/build-module/drawer/close-icon.mjs +33 -0
  206. package/build-module/drawer/close-icon.mjs.map +7 -0
  207. package/build-module/drawer/content.mjs +51 -0
  208. package/build-module/drawer/content.mjs.map +7 -0
  209. package/build-module/drawer/context.mjs +16 -0
  210. package/build-module/drawer/context.mjs.map +7 -0
  211. package/build-module/drawer/description.mjs +22 -0
  212. package/build-module/drawer/description.mjs.map +7 -0
  213. package/build-module/drawer/footer.mjs +30 -0
  214. package/build-module/drawer/footer.mjs.map +7 -0
  215. package/build-module/drawer/header.mjs +30 -0
  216. package/build-module/drawer/header.mjs.map +7 -0
  217. package/build-module/drawer/index.mjs +26 -0
  218. package/build-module/drawer/index.mjs.map +7 -0
  219. package/build-module/drawer/popup.mjs +70 -0
  220. package/build-module/drawer/popup.mjs.map +7 -0
  221. package/build-module/drawer/portal.mjs +13 -0
  222. package/build-module/drawer/portal.mjs.map +7 -0
  223. package/build-module/drawer/root.mjs +24 -0
  224. package/build-module/drawer/root.mjs.map +7 -0
  225. package/build-module/drawer/title.mjs +45 -0
  226. package/build-module/drawer/title.mjs.map +7 -0
  227. package/build-module/drawer/trigger.mjs +13 -0
  228. package/build-module/drawer/trigger.mjs.map +7 -0
  229. package/build-module/drawer/types.mjs +1 -0
  230. package/build-module/form/primitives/autocomplete/clear.mjs +37 -0
  231. package/build-module/form/primitives/autocomplete/clear.mjs.map +7 -0
  232. package/build-module/form/primitives/autocomplete/collection.mjs +13 -0
  233. package/build-module/form/primitives/autocomplete/collection.mjs.map +7 -0
  234. package/build-module/form/primitives/autocomplete/empty.mjs +32 -0
  235. package/build-module/form/primitives/autocomplete/empty.mjs.map +7 -0
  236. package/build-module/form/primitives/autocomplete/index.mjs +28 -0
  237. package/build-module/form/primitives/autocomplete/index.mjs.map +7 -0
  238. package/build-module/form/primitives/autocomplete/input-group.mjs +11 -0
  239. package/build-module/form/primitives/autocomplete/input-group.mjs.map +7 -0
  240. package/build-module/form/primitives/autocomplete/input.mjs +22 -0
  241. package/build-module/form/primitives/autocomplete/input.mjs.map +7 -0
  242. package/build-module/form/primitives/autocomplete/item.mjs +46 -0
  243. package/build-module/form/primitives/autocomplete/item.mjs.map +7 -0
  244. package/build-module/form/primitives/autocomplete/list-body.mjs +32 -0
  245. package/build-module/form/primitives/autocomplete/list-body.mjs.map +7 -0
  246. package/build-module/form/primitives/autocomplete/list.mjs +32 -0
  247. package/build-module/form/primitives/autocomplete/list.mjs.map +7 -0
  248. package/build-module/form/primitives/autocomplete/popup.mjs +69 -0
  249. package/build-module/form/primitives/autocomplete/popup.mjs.map +7 -0
  250. package/build-module/form/primitives/autocomplete/portal.mjs +13 -0
  251. package/build-module/form/primitives/autocomplete/portal.mjs.map +7 -0
  252. package/build-module/form/primitives/autocomplete/root.mjs +10 -0
  253. package/build-module/form/primitives/autocomplete/root.mjs.map +7 -0
  254. package/build-module/form/primitives/autocomplete/types.mjs +1 -0
  255. package/build-module/form/primitives/autocomplete/value.mjs +10 -0
  256. package/build-module/form/primitives/autocomplete/value.mjs.map +7 -0
  257. package/build-module/form/primitives/index.mjs +2 -0
  258. package/build-module/form/primitives/index.mjs.map +2 -2
  259. package/build-module/form/primitives/select/index.mjs +2 -0
  260. package/build-module/form/primitives/select/index.mjs.map +2 -2
  261. package/build-module/form/primitives/select/item.mjs +4 -5
  262. package/build-module/form/primitives/select/item.mjs.map +2 -2
  263. package/build-module/form/primitives/select/popup.mjs +12 -11
  264. package/build-module/form/primitives/select/popup.mjs.map +2 -2
  265. package/build-module/form/primitives/select/portal.mjs +13 -0
  266. package/build-module/form/primitives/select/portal.mjs.map +7 -0
  267. package/build-module/index.mjs +2 -0
  268. package/build-module/index.mjs.map +2 -2
  269. package/build-module/link/link.mjs +8 -18
  270. package/build-module/link/link.mjs.map +2 -2
  271. package/build-module/notice/action-button.mjs +3 -3
  272. package/build-module/notice/action-button.mjs.map +2 -2
  273. package/build-module/notice/action-link.mjs +8 -7
  274. package/build-module/notice/action-link.mjs.map +2 -2
  275. package/build-module/notice/actions.mjs +3 -3
  276. package/build-module/notice/actions.mjs.map +2 -2
  277. package/build-module/notice/close-icon.mjs +3 -3
  278. package/build-module/notice/close-icon.mjs.map +2 -2
  279. package/build-module/notice/description.mjs +3 -3
  280. package/build-module/notice/description.mjs.map +2 -2
  281. package/build-module/notice/root.mjs +3 -3
  282. package/build-module/notice/root.mjs.map +2 -2
  283. package/build-module/notice/title.mjs +3 -3
  284. package/build-module/notice/title.mjs.map +2 -2
  285. package/build-module/popover/arrow.mjs +4 -4
  286. package/build-module/popover/arrow.mjs.map +2 -2
  287. package/build-module/popover/context.mjs +4 -51
  288. package/build-module/popover/context.mjs.map +2 -2
  289. package/build-module/popover/description.mjs +1 -14
  290. package/build-module/popover/description.mjs.map +3 -3
  291. package/build-module/popover/index.mjs +2 -0
  292. package/build-module/popover/index.mjs.map +2 -2
  293. package/build-module/popover/popup.mjs +16 -16
  294. package/build-module/popover/popup.mjs.map +2 -2
  295. package/build-module/popover/portal.mjs +13 -0
  296. package/build-module/popover/portal.mjs.map +7 -0
  297. package/build-module/popover/root.mjs.map +1 -1
  298. package/build-module/popover/title.mjs +19 -5
  299. package/build-module/popover/title.mjs.map +3 -3
  300. package/build-module/tabs/context.mjs +11 -24
  301. package/build-module/tabs/context.mjs.map +2 -2
  302. package/build-module/tabs/list.mjs +4 -4
  303. package/build-module/tabs/list.mjs.map +2 -2
  304. package/build-module/tabs/panel.mjs +19 -6
  305. package/build-module/tabs/panel.mjs.map +3 -3
  306. package/build-module/tabs/tab.mjs +4 -4
  307. package/build-module/tabs/tab.mjs.map +2 -2
  308. package/build-module/text/text.mjs +2 -2
  309. package/build-module/text/text.mjs.map +2 -2
  310. package/build-module/tooltip/index.mjs +2 -0
  311. package/build-module/tooltip/index.mjs.map +2 -2
  312. package/build-module/tooltip/popup.mjs +14 -17
  313. package/build-module/tooltip/popup.mjs.map +2 -2
  314. package/build-module/tooltip/portal.mjs +13 -0
  315. package/build-module/tooltip/portal.mjs.map +7 -0
  316. package/build-module/tooltip/provider.mjs +3 -3
  317. package/build-module/tooltip/provider.mjs.map +2 -2
  318. package/build-module/tooltip/root.mjs +2 -2
  319. package/build-module/tooltip/root.mjs.map +2 -2
  320. package/build-module/tooltip/trigger.mjs +3 -3
  321. package/build-module/tooltip/trigger.mjs.map +2 -2
  322. package/build-module/utils/create-overlay-modal-context.mjs +23 -0
  323. package/build-module/utils/create-overlay-modal-context.mjs.map +7 -0
  324. package/build-module/utils/create-overlay-title-validation.mjs +75 -0
  325. package/build-module/utils/create-overlay-title-validation.mjs.map +7 -0
  326. package/build-module/utils/render-portal-with-children.mjs +12 -0
  327. package/build-module/utils/render-portal-with-children.mjs.map +7 -0
  328. package/build-module/utils/use-deprioritized-initial-focus.mjs +9 -9
  329. package/build-module/utils/use-deprioritized-initial-focus.mjs.map +2 -2
  330. package/build-module/utils/use-overlay-scroll-state-attributes.mjs +114 -0
  331. package/build-module/utils/use-overlay-scroll-state-attributes.mjs.map +7 -0
  332. package/build-module/utils/use-schedule-validation.mjs +34 -0
  333. package/build-module/utils/use-schedule-validation.mjs.map +7 -0
  334. package/build-module/visually-hidden/visually-hidden.mjs +5 -1
  335. package/build-module/visually-hidden/visually-hidden.mjs.map +2 -2
  336. package/build-types/alert-dialog/index.d.ts +1 -0
  337. package/build-types/alert-dialog/index.d.ts.map +1 -1
  338. package/build-types/alert-dialog/popup.d.ts.map +1 -1
  339. package/build-types/alert-dialog/portal.d.ts +9 -0
  340. package/build-types/alert-dialog/portal.d.ts.map +1 -0
  341. package/build-types/alert-dialog/stories/index.story.d.ts +29 -1
  342. package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -1
  343. package/build-types/alert-dialog/types.d.ts +25 -3
  344. package/build-types/alert-dialog/types.d.ts.map +1 -1
  345. package/build-types/badge/stories/index.story.d.ts.map +1 -1
  346. package/build-types/card/stories/index.story.d.ts.map +1 -1
  347. package/build-types/collapsible/stories/index.story.d.ts.map +1 -1
  348. package/build-types/collapsible-card/content.d.ts.map +1 -1
  349. package/build-types/collapsible-card/header.d.ts.map +1 -1
  350. package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
  351. package/build-types/dialog/content.d.ts +17 -0
  352. package/build-types/dialog/content.d.ts.map +1 -0
  353. package/build-types/dialog/context.d.ts +11 -16
  354. package/build-types/dialog/context.d.ts.map +1 -1
  355. package/build-types/dialog/description.d.ts +9 -0
  356. package/build-types/dialog/description.d.ts.map +1 -0
  357. package/build-types/dialog/footer.d.ts +8 -1
  358. package/build-types/dialog/footer.d.ts.map +1 -1
  359. package/build-types/dialog/header.d.ts +8 -1
  360. package/build-types/dialog/header.d.ts.map +1 -1
  361. package/build-types/dialog/index.d.ts +4 -1
  362. package/build-types/dialog/index.d.ts.map +1 -1
  363. package/build-types/dialog/popup.d.ts +3 -0
  364. package/build-types/dialog/popup.d.ts.map +1 -1
  365. package/build-types/dialog/portal.d.ts +10 -0
  366. package/build-types/dialog/portal.d.ts.map +1 -0
  367. package/build-types/dialog/root.d.ts +14 -4
  368. package/build-types/dialog/root.d.ts.map +1 -1
  369. package/build-types/dialog/stories/index.story.d.ts +29 -6
  370. package/build-types/dialog/stories/index.story.d.ts.map +1 -1
  371. package/build-types/dialog/title.d.ts.map +1 -1
  372. package/build-types/dialog/types.d.ts +60 -7
  373. package/build-types/dialog/types.d.ts.map +1 -1
  374. package/build-types/drawer/action.d.ts +8 -0
  375. package/build-types/drawer/action.d.ts.map +1 -0
  376. package/build-types/drawer/close-icon.d.ts +8 -0
  377. package/build-types/drawer/close-icon.d.ts.map +1 -0
  378. package/build-types/drawer/content.d.ts +21 -0
  379. package/build-types/drawer/content.d.ts.map +1 -0
  380. package/build-types/drawer/context.d.ts +20 -0
  381. package/build-types/drawer/context.d.ts.map +1 -0
  382. package/build-types/drawer/description.d.ts +9 -0
  383. package/build-types/drawer/description.d.ts.map +1 -0
  384. package/build-types/drawer/footer.d.ts +15 -0
  385. package/build-types/drawer/footer.d.ts.map +1 -0
  386. package/build-types/drawer/header.d.ts +15 -0
  387. package/build-types/drawer/header.d.ts.map +1 -0
  388. package/build-types/drawer/index.d.ts +13 -0
  389. package/build-types/drawer/index.d.ts.map +1 -0
  390. package/build-types/drawer/popup.d.ts +16 -0
  391. package/build-types/drawer/popup.d.ts.map +1 -0
  392. package/build-types/drawer/portal.d.ts +10 -0
  393. package/build-types/drawer/portal.d.ts.map +1 -0
  394. package/build-types/drawer/root.d.ts +21 -0
  395. package/build-types/drawer/root.d.ts.map +1 -0
  396. package/build-types/drawer/stories/index.story.d.ts +63 -0
  397. package/build-types/drawer/stories/index.story.d.ts.map +1 -0
  398. package/build-types/drawer/test/index.test.d.ts +2 -0
  399. package/build-types/drawer/test/index.test.d.ts.map +1 -0
  400. package/build-types/drawer/title.d.ts +22 -0
  401. package/build-types/drawer/title.d.ts.map +1 -0
  402. package/build-types/drawer/trigger.d.ts +7 -0
  403. package/build-types/drawer/trigger.d.ts.map +1 -0
  404. package/build-types/drawer/types.d.ts +146 -0
  405. package/build-types/drawer/types.d.ts.map +1 -0
  406. package/build-types/empty-state/stories/index.story.d.ts +1 -1
  407. package/build-types/empty-state/stories/index.story.d.ts.map +1 -1
  408. package/build-types/form/input-control/stories/index.story.d.ts +1 -1
  409. package/build-types/form/input-control/stories/index.story.d.ts.map +1 -1
  410. package/build-types/form/primitives/autocomplete/clear.d.ts +13 -0
  411. package/build-types/form/primitives/autocomplete/clear.d.ts.map +1 -0
  412. package/build-types/form/primitives/autocomplete/collection.d.ts +3 -0
  413. package/build-types/form/primitives/autocomplete/collection.d.ts.map +1 -0
  414. package/build-types/form/primitives/autocomplete/empty.d.ts +10 -0
  415. package/build-types/form/primitives/autocomplete/empty.d.ts.map +1 -0
  416. package/build-types/form/primitives/autocomplete/index.d.ts +13 -0
  417. package/build-types/form/primitives/autocomplete/index.d.ts.map +1 -0
  418. package/build-types/form/primitives/autocomplete/input-group.d.ts +16 -0
  419. package/build-types/form/primitives/autocomplete/input-group.d.ts.map +1 -0
  420. package/build-types/form/primitives/autocomplete/input.d.ts +3 -0
  421. package/build-types/form/primitives/autocomplete/input.d.ts.map +1 -0
  422. package/build-types/form/primitives/autocomplete/item.d.ts +10 -0
  423. package/build-types/form/primitives/autocomplete/item.d.ts.map +1 -0
  424. package/build-types/form/primitives/autocomplete/list-body.d.ts +13 -0
  425. package/build-types/form/primitives/autocomplete/list-body.d.ts.map +1 -0
  426. package/build-types/form/primitives/autocomplete/list.d.ts +11 -0
  427. package/build-types/form/primitives/autocomplete/list.d.ts.map +1 -0
  428. package/build-types/form/primitives/autocomplete/popup.d.ts +11 -0
  429. package/build-types/form/primitives/autocomplete/popup.d.ts.map +1 -0
  430. package/build-types/form/primitives/autocomplete/portal.d.ts +8 -0
  431. package/build-types/form/primitives/autocomplete/portal.d.ts.map +1 -0
  432. package/build-types/form/primitives/autocomplete/root.d.ts +8 -0
  433. package/build-types/form/primitives/autocomplete/root.d.ts.map +1 -0
  434. package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts +8 -0
  435. package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts.map +1 -0
  436. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts +41 -0
  437. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts.map +1 -0
  438. package/build-types/form/primitives/autocomplete/test/index.test.d.ts +2 -0
  439. package/build-types/form/primitives/autocomplete/test/index.test.d.ts.map +1 -0
  440. package/build-types/form/primitives/autocomplete/types.d.ts +44 -0
  441. package/build-types/form/primitives/autocomplete/types.d.ts.map +1 -0
  442. package/build-types/form/primitives/autocomplete/value.d.ts +3 -0
  443. package/build-types/form/primitives/autocomplete/value.d.ts.map +1 -0
  444. package/build-types/form/primitives/field/stories/index.story.d.ts +1 -1
  445. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  446. package/build-types/form/primitives/fieldset/stories/index.story.d.ts +1 -1
  447. package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
  448. package/build-types/form/primitives/index.d.ts +1 -0
  449. package/build-types/form/primitives/index.d.ts.map +1 -1
  450. package/build-types/form/primitives/input/stories/index.story.d.ts +1 -1
  451. package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
  452. package/build-types/form/primitives/input-layout/stories/index.story.d.ts +1 -1
  453. package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
  454. package/build-types/form/primitives/select/index.d.ts +1 -0
  455. package/build-types/form/primitives/select/index.d.ts.map +1 -1
  456. package/build-types/form/primitives/select/item.d.ts.map +1 -1
  457. package/build-types/form/primitives/select/popup.d.ts +1 -2
  458. package/build-types/form/primitives/select/popup.d.ts.map +1 -1
  459. package/build-types/form/primitives/select/portal.d.ts +8 -0
  460. package/build-types/form/primitives/select/portal.d.ts.map +1 -0
  461. package/build-types/form/primitives/select/stories/index.story.d.ts +14 -6
  462. package/build-types/form/primitives/select/stories/index.story.d.ts.map +1 -1
  463. package/build-types/form/primitives/select/types.d.ts +7 -2
  464. package/build-types/form/primitives/select/types.d.ts.map +1 -1
  465. package/build-types/index.d.ts +1 -0
  466. package/build-types/index.d.ts.map +1 -1
  467. package/build-types/link/link.d.ts.map +1 -1
  468. package/build-types/link/stories/index.story.d.ts +2 -3
  469. package/build-types/link/stories/index.story.d.ts.map +1 -1
  470. package/build-types/link/types.d.ts +1 -2
  471. package/build-types/link/types.d.ts.map +1 -1
  472. package/build-types/notice/action-link.d.ts.map +1 -1
  473. package/build-types/popover/context.d.ts +6 -13
  474. package/build-types/popover/context.d.ts.map +1 -1
  475. package/build-types/popover/description.d.ts +0 -1
  476. package/build-types/popover/description.d.ts.map +1 -1
  477. package/build-types/popover/index.d.ts +2 -1
  478. package/build-types/popover/index.d.ts.map +1 -1
  479. package/build-types/popover/popup.d.ts +3 -2
  480. package/build-types/popover/popup.d.ts.map +1 -1
  481. package/build-types/popover/portal.d.ts +9 -0
  482. package/build-types/popover/portal.d.ts.map +1 -0
  483. package/build-types/popover/root.d.ts +2 -2
  484. package/build-types/popover/stories/index.story.d.ts +23 -15
  485. package/build-types/popover/stories/index.story.d.ts.map +1 -1
  486. package/build-types/popover/title.d.ts.map +1 -1
  487. package/build-types/popover/types.d.ts +8 -15
  488. package/build-types/popover/types.d.ts.map +1 -1
  489. package/build-types/stack/stories/index.story.d.ts.map +1 -1
  490. package/build-types/tabs/context.d.ts.map +1 -1
  491. package/build-types/tabs/panel.d.ts.map +1 -1
  492. package/build-types/tabs/stories/index.story.d.ts +1 -1
  493. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  494. package/build-types/text/stories/index.story.d.ts.map +1 -1
  495. package/build-types/tooltip/index.d.ts +2 -1
  496. package/build-types/tooltip/index.d.ts.map +1 -1
  497. package/build-types/tooltip/popup.d.ts.map +1 -1
  498. package/build-types/tooltip/portal.d.ts +8 -0
  499. package/build-types/tooltip/portal.d.ts.map +1 -0
  500. package/build-types/tooltip/provider.d.ts +1 -1
  501. package/build-types/tooltip/provider.d.ts.map +1 -1
  502. package/build-types/tooltip/stories/index.story.d.ts +18 -1
  503. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  504. package/build-types/tooltip/stories/usage-guidelines.story.d.ts.map +1 -1
  505. package/build-types/tooltip/trigger.d.ts.map +1 -1
  506. package/build-types/tooltip/types.d.ts +11 -7
  507. package/build-types/tooltip/types.d.ts.map +1 -1
  508. package/build-types/utils/create-overlay-modal-context.d.ts +14 -0
  509. package/build-types/utils/create-overlay-modal-context.d.ts.map +1 -0
  510. package/build-types/utils/create-overlay-title-validation.d.ts +15 -0
  511. package/build-types/utils/create-overlay-title-validation.d.ts.map +1 -0
  512. package/build-types/utils/render-portal-with-children.d.ts +16 -0
  513. package/build-types/utils/render-portal-with-children.d.ts.map +1 -0
  514. package/build-types/utils/use-deprioritized-initial-focus.d.ts +9 -8
  515. package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -1
  516. package/build-types/utils/use-overlay-scroll-state-attributes.d.ts +85 -0
  517. package/build-types/utils/use-overlay-scroll-state-attributes.d.ts.map +1 -0
  518. package/build-types/utils/use-schedule-validation.d.ts +13 -0
  519. package/build-types/utils/use-schedule-validation.d.ts.map +1 -0
  520. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  521. package/build-types/visually-hidden/visually-hidden.d.ts +4 -20
  522. package/build-types/visually-hidden/visually-hidden.d.ts.map +1 -1
  523. package/package.json +12 -12
  524. package/src/alert-dialog/index.ts +1 -0
  525. package/src/alert-dialog/popup.tsx +114 -45
  526. package/src/alert-dialog/portal.tsx +17 -0
  527. package/src/alert-dialog/stories/index.story.tsx +123 -3
  528. package/src/alert-dialog/style.module.css +13 -4
  529. package/src/alert-dialog/test/index.test.tsx +329 -3
  530. package/src/alert-dialog/types.ts +30 -3
  531. package/src/badge/stories/choosing-intent.story.tsx +1 -1
  532. package/src/badge/stories/index.story.tsx +1 -0
  533. package/src/card/stories/index.story.tsx +1 -0
  534. package/src/collapsible/stories/index.story.tsx +1 -0
  535. package/src/collapsible-card/content.tsx +12 -1
  536. package/src/collapsible-card/header.tsx +2 -0
  537. package/src/collapsible-card/stories/index.story.tsx +1 -0
  538. package/src/collapsible-card/style.module.css +16 -4
  539. package/src/dialog/content.tsx +47 -0
  540. package/src/dialog/context.tsx +14 -98
  541. package/src/dialog/description.tsx +27 -0
  542. package/src/dialog/footer.tsx +10 -2
  543. package/src/dialog/header.tsx +10 -2
  544. package/src/dialog/index.ts +16 -1
  545. package/src/dialog/popup.tsx +28 -8
  546. package/src/dialog/portal.tsx +18 -0
  547. package/src/dialog/root.tsx +22 -5
  548. package/src/dialog/stories/index.story.tsx +195 -51
  549. package/src/dialog/style.module.css +73 -23
  550. package/src/dialog/test/index.test.tsx +849 -149
  551. package/src/dialog/title.tsx +6 -4
  552. package/src/dialog/types.ts +64 -6
  553. package/src/drawer/action.tsx +28 -0
  554. package/src/drawer/close-icon.tsx +33 -0
  555. package/src/drawer/content.tsx +50 -0
  556. package/src/drawer/context.tsx +29 -0
  557. package/src/drawer/description.tsx +25 -0
  558. package/src/drawer/footer.tsx +34 -0
  559. package/src/drawer/header.tsx +34 -0
  560. package/src/drawer/index.ts +25 -0
  561. package/src/drawer/popup.tsx +100 -0
  562. package/src/drawer/portal.tsx +18 -0
  563. package/src/drawer/root.tsx +41 -0
  564. package/src/drawer/stories/index.story.tsx +543 -0
  565. package/src/drawer/style.module.css +324 -0
  566. package/src/drawer/test/index.test.tsx +1097 -0
  567. package/src/drawer/title.tsx +53 -0
  568. package/src/drawer/trigger.tsx +14 -0
  569. package/src/drawer/types.ts +174 -0
  570. package/src/empty-state/stories/index.story.tsx +2 -1
  571. package/src/form/input-control/stories/index.story.tsx +4 -1
  572. package/src/form/primitives/autocomplete/clear.tsx +35 -0
  573. package/src/form/primitives/autocomplete/collection.tsx +13 -0
  574. package/src/form/primitives/autocomplete/empty.tsx +17 -0
  575. package/src/form/primitives/autocomplete/index.ts +12 -0
  576. package/src/form/primitives/autocomplete/input-group.tsx +16 -0
  577. package/src/form/primitives/autocomplete/input.tsx +20 -0
  578. package/src/form/primitives/autocomplete/item.tsx +24 -0
  579. package/src/form/primitives/autocomplete/list-body.tsx +23 -0
  580. package/src/form/primitives/autocomplete/list.tsx +17 -0
  581. package/src/form/primitives/autocomplete/popup.tsx +42 -0
  582. package/src/form/primitives/autocomplete/portal.tsx +16 -0
  583. package/src/form/primitives/autocomplete/root.tsx +11 -0
  584. package/src/form/primitives/autocomplete/stories/fixtures.ts +35 -0
  585. package/src/form/primitives/autocomplete/stories/index.story.tsx +437 -0
  586. package/src/form/primitives/autocomplete/style.module.css +7 -0
  587. package/src/form/primitives/autocomplete/test/index.test.tsx +162 -0
  588. package/src/form/primitives/autocomplete/types.ts +74 -0
  589. package/src/form/primitives/autocomplete/value.tsx +6 -0
  590. package/src/form/primitives/field/stories/index.story.tsx +1 -1
  591. package/src/form/primitives/fieldset/stories/index.story.tsx +1 -1
  592. package/src/form/primitives/index.ts +1 -0
  593. package/src/form/primitives/input/stories/index.story.tsx +2 -1
  594. package/src/form/primitives/input-layout/stories/index.story.tsx +2 -1
  595. package/src/form/primitives/select/index.ts +1 -0
  596. package/src/form/primitives/select/item.tsx +0 -1
  597. package/src/form/primitives/select/popup.tsx +34 -37
  598. package/src/form/primitives/select/portal.tsx +16 -0
  599. package/src/form/primitives/select/stories/index.story.tsx +21 -7
  600. package/src/form/primitives/select/test/index.test.tsx +7 -3
  601. package/src/form/primitives/select/types.ts +9 -2
  602. package/src/index.ts +1 -0
  603. package/src/link/link.tsx +12 -26
  604. package/src/link/stories/index.story.tsx +6 -11
  605. package/src/link/style.module.css +5 -17
  606. package/src/link/test/index.test.tsx +31 -27
  607. package/src/link/types.ts +1 -2
  608. package/src/notice/action-link.tsx +7 -4
  609. package/src/notice/style.module.css +5 -5
  610. package/src/popover/context.tsx +6 -89
  611. package/src/popover/description.tsx +1 -5
  612. package/src/popover/index.ts +2 -1
  613. package/src/popover/popup.tsx +17 -15
  614. package/src/popover/portal.tsx +17 -0
  615. package/src/popover/root.tsx +2 -2
  616. package/src/popover/stories/index.story.tsx +56 -25
  617. package/src/popover/style.module.css +33 -4
  618. package/src/popover/test/index.test.tsx +189 -74
  619. package/src/popover/title.tsx +9 -5
  620. package/src/popover/types.ts +10 -15
  621. package/src/stack/stories/index.story.tsx +1 -0
  622. package/src/tabs/context.tsx +14 -34
  623. package/src/tabs/panel.tsx +7 -2
  624. package/src/tabs/stories/index.story.tsx +2 -1
  625. package/src/tabs/style.module.css +0 -17
  626. package/src/tabs/test/index.test.tsx +7 -3
  627. package/src/text/stories/index.story.tsx +1 -0
  628. package/src/text/text.tsx +2 -2
  629. package/src/tooltip/index.ts +2 -1
  630. package/src/tooltip/popup.tsx +24 -28
  631. package/src/tooltip/portal.tsx +16 -0
  632. package/src/tooltip/provider.tsx +3 -3
  633. package/src/tooltip/root.tsx +2 -2
  634. package/src/tooltip/stories/index.story.tsx +39 -1
  635. package/src/tooltip/stories/usage-guidelines.story.tsx +5 -1
  636. package/src/tooltip/style.module.css +12 -0
  637. package/src/tooltip/test/index.test.tsx +9 -3
  638. package/src/tooltip/trigger.tsx +3 -7
  639. package/src/tooltip/types.ts +13 -7
  640. package/src/utils/create-overlay-modal-context.tsx +34 -0
  641. package/src/utils/create-overlay-title-validation.tsx +116 -0
  642. package/src/utils/css/item-popup.module.css +9 -11
  643. package/src/utils/css/overlay-chrome.module.css +222 -0
  644. package/src/utils/render-portal-with-children.ts +27 -0
  645. package/src/utils/test/use-deprioritized-initial-focus.test.tsx +3 -3
  646. package/src/utils/use-deprioritized-initial-focus.ts +23 -17
  647. package/src/utils/use-overlay-scroll-state-attributes.ts +272 -0
  648. package/src/utils/use-schedule-validation.ts +45 -0
  649. package/src/visually-hidden/stories/index.story.tsx +1 -0
  650. package/src/visually-hidden/visually-hidden.tsx +9 -21
  651. package/build/types/css-modules.d.cjs +0 -2
  652. package/build/types/react.d.cjs +0 -5
  653. package/build/types/react.d.cjs.map +0 -7
  654. package/build-module/types/css-modules.d.mjs +0 -1
  655. package/build-module/types/react.d.mjs +0 -3
  656. package/build-module/types/react.d.mjs.map +0 -7
  657. package/src/types/css-modules.d.ts +0 -4
  658. package/src/types/react.d.ts +0 -7
  659. /package/build-module/{types/css-modules.d.mjs.map → drawer/types.mjs.map} +0 -0
  660. /package/{build/types/css-modules.d.cjs.map → build-module/form/primitives/autocomplete/types.mjs.map} +0 -0
@@ -3,8 +3,9 @@ import { useId, useState } from '@wordpress/element';
3
3
  import type { Meta, StoryObj } from '@storybook/react-vite';
4
4
  import { action } from 'storybook/actions';
5
5
  import { fn } from 'storybook/test';
6
-
7
- import { AlertDialog, Text } from '../..';
6
+ import * as AlertDialog from '../';
7
+ import { Stack } from '../../stack';
8
+ import { Text } from '../../text';
8
9
 
9
10
  const meta: Meta< typeof AlertDialog.Root > = {
10
11
  title: 'Design System/Components/AlertDialog',
@@ -97,7 +98,7 @@ export const WithCustomContent: Story = {
97
98
  >
98
99
  <ul
99
100
  style={ {
100
- margin: 0,
101
+ margin: 'var(--wpds-dimension-gap-sm) 0 0',
101
102
  paddingInlineStart: 'var(--wpds-dimension-gap-lg)',
102
103
  } }
103
104
  >
@@ -111,6 +112,43 @@ export const WithCustomContent: Story = {
111
112
  },
112
113
  };
113
114
 
115
+ /**
116
+ * Popovers in Gutenberg are managed with explicit z-index values, which can
117
+ * create situations where an alert dialog renders below another popover when
118
+ * you want it above.
119
+ *
120
+ * `AlertDialog` reuses `Dialog`'s styles, so the same
121
+ * `--wp-ui-dialog-z-index` CSS variable controls the z-index of the alert
122
+ * dialog's backdrop and popup. Override it either:
123
+ *
124
+ * - **Globally**, by setting the variable on `:root` or `body` (raises every
125
+ * dialog and alert dialog in the page), or
126
+ * - **Per instance**, by passing an `AlertDialog.Portal` with a `style` (or
127
+ * `className`) to `AlertDialog.Popup`'s `portal` prop. The variable
128
+ * cascades from the portal wrapper to everything rendered inside it.
129
+ *
130
+ * This story demonstrates the per-instance approach.
131
+ */
132
+ export const WithCustomZIndex: Story = {
133
+ name: 'With Custom z-index',
134
+ args: {
135
+ children: (
136
+ <>
137
+ <AlertDialog.Trigger>Move to trash</AlertDialog.Trigger>
138
+ <AlertDialog.Popup
139
+ title="Move to trash?"
140
+ description="This post will be moved to trash. You can restore it later."
141
+ portal={
142
+ <AlertDialog.Portal
143
+ style={ { '--wp-ui-dialog-z-index': '9999' } }
144
+ />
145
+ }
146
+ />
147
+ </>
148
+ ),
149
+ },
150
+ };
151
+
114
152
  const menuPopupStyles: React.CSSProperties = {
115
153
  background: 'var(--wpds-color-bg-surface-neutral-strong)',
116
154
  border: '1px solid var(--wpds-color-stroke-surface-neutral)',
@@ -274,6 +312,88 @@ export const AsyncConfirm: Story = {
274
312
  },
275
313
  };
276
314
 
315
+ function StickyToggle( {
316
+ label,
317
+ value,
318
+ onChange,
319
+ }: {
320
+ label: string;
321
+ value: boolean;
322
+ onChange: ( value: boolean ) => void;
323
+ } ) {
324
+ const id = useId();
325
+ return (
326
+ <Stack direction="row" gap="sm" align="center">
327
+ <input
328
+ id={ id }
329
+ type="checkbox"
330
+ checked={ value }
331
+ onChange={ ( event ) => onChange( event.target.checked ) }
332
+ />
333
+ <label htmlFor={ id }>{ label }</label>
334
+ </Stack>
335
+ );
336
+ }
337
+
338
+ function ScrollableContent() {
339
+ const [ stickyHeader, setStickyHeader ] = useState( true );
340
+ const [ stickyFooter, setStickyFooter ] = useState( true );
341
+ return (
342
+ <>
343
+ <Stack direction="column" gap="lg" align="start">
344
+ <Stack direction="row" gap="lg" align="center">
345
+ <StickyToggle
346
+ label="Sticky header"
347
+ value={ stickyHeader }
348
+ onChange={ setStickyHeader }
349
+ />
350
+ <StickyToggle
351
+ label="Sticky footer"
352
+ value={ stickyFooter }
353
+ onChange={ setStickyFooter }
354
+ />
355
+ </Stack>
356
+ <AlertDialog.Trigger>Review terms</AlertDialog.Trigger>
357
+ </Stack>
358
+ <AlertDialog.Popup
359
+ title="Terms of service"
360
+ description="Please review the terms before continuing."
361
+ confirmButtonText="Accept"
362
+ cancelButtonText="Decline"
363
+ stickyHeader={ stickyHeader }
364
+ stickyFooter={ stickyFooter }
365
+ >
366
+ <Stack direction="column" gap="lg">
367
+ { Array.from( { length: 20 } ).map( ( _, index ) => (
368
+ <p key={ index } style={ { margin: 0 } }>
369
+ Paragraph { index + 1 }: Lorem ipsum dolor sit amet,
370
+ consectetur adipiscing elit. Sed do eiusmod tempor
371
+ incididunt ut labore et dolore magna aliqua. Ut enim
372
+ ad minim veniam, quis nostrud exercitation ullamco
373
+ laboris nisi ut aliquip ex ea commodo consequat.
374
+ </p>
375
+ ) ) }
376
+ </Stack>
377
+ </AlertDialog.Popup>
378
+ </>
379
+ );
380
+ }
381
+
382
+ /**
383
+ * When the dialog's body overflows the available height, the title/description
384
+ * area stays pinned to the top of the popup and the action buttons stay pinned
385
+ * to the bottom so users keep sight of the context and primary actions while
386
+ * scrolling. Separator borders appear only when there is off-screen content
387
+ * above or below. Pass `stickyHeader={ false }` or `stickyFooter={ false }` on
388
+ * `AlertDialog.Popup` to opt out — the toggles in this story drive both props
389
+ * independently.
390
+ */
391
+ export const Scrollable: Story = {
392
+ args: {
393
+ children: <ScrollableContent />,
394
+ },
395
+ };
396
+
277
397
  /**
278
398
  * The `AlertDialog.Trigger` element is not necessary when the open state is
279
399
  * controlled externally. This is useful when the dialog needs to be opened
@@ -1,14 +1,23 @@
1
1
  @layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;
2
2
 
3
3
  @layer wp-ui-components {
4
- .header {
5
- margin-bottom: var(--wpds-dimension-gap-lg);
6
- }
7
-
8
4
  .error-message {
9
5
  align-self: flex-end;
10
6
  color: var(--wpds-color-fg-content-error);
11
7
  }
8
+
9
+ /*
10
+ * AlertDialog stacks an actions row and an optional error message in
11
+ * its footer. Override the shared `.footer` row layout to a column so
12
+ * both children lay out vertically while inheriting the chrome
13
+ * padding + separator from `overlay-chrome.module.css`.
14
+ */
15
+ .footer-column {
16
+ flex-direction: column;
17
+ align-items: stretch;
18
+ justify-content: flex-start;
19
+ gap: var(--wpds-dimension-gap-md);
20
+ }
12
21
  }
13
22
 
14
23
  @layer wp-ui-compositions {
@@ -1453,8 +1453,8 @@ describe( 'AlertDialog', () => {
1453
1453
  } );
1454
1454
  } );
1455
1455
 
1456
- describe( 'container', () => {
1457
- it( 'should render inside the container when provided', async () => {
1456
+ describe( 'portal', () => {
1457
+ it( 'should render inside the portal container when a custom target is provided', async () => {
1458
1458
  const user = userEvent.setup();
1459
1459
  const containerRef = createRef< HTMLDivElement >();
1460
1460
 
@@ -1468,7 +1468,11 @@ describe( 'AlertDialog', () => {
1468
1468
  />
1469
1469
  <AlertDialog.Popup
1470
1470
  title="Confirm"
1471
- container={ containerRef }
1471
+ portal={
1472
+ <AlertDialog.Portal
1473
+ container={ containerRef }
1474
+ />
1475
+ }
1472
1476
  />
1473
1477
  </AlertDialog.Root>
1474
1478
  </div>
@@ -1506,4 +1510,326 @@ describe( 'AlertDialog', () => {
1506
1510
  );
1507
1511
  } );
1508
1512
  } );
1513
+
1514
+ describe( 'overlay scroll container', () => {
1515
+ // AlertDialog's scroll container is a library-internal `<div>` with
1516
+ // no role or testid — a `querySelector` is the only way to reach
1517
+ // it from a test. The Testing Library rule is disabled for this
1518
+ // helper because that's exactly what it's flagging.
1519
+ const findScroller = ( popup: HTMLElement | null ): HTMLDivElement => {
1520
+ if ( ! popup ) {
1521
+ throw new Error(
1522
+ 'Popup ref not attached — did AlertDialog.Popup render?'
1523
+ );
1524
+ }
1525
+ // eslint-disable-next-line testing-library/no-node-access
1526
+ const el = popup.querySelector(
1527
+ '[data-wp-ui-overlay-scroll-container]'
1528
+ );
1529
+ if ( ! ( el instanceof HTMLDivElement ) ) {
1530
+ throw new Error(
1531
+ 'Scroll container not found inside AlertDialog popup'
1532
+ );
1533
+ }
1534
+ return el;
1535
+ };
1536
+
1537
+ it( 'renders an internal scroll container with data-wp-ui-overlay-scroll-container', async () => {
1538
+ const popupRef = createRef< HTMLDivElement >();
1539
+
1540
+ render(
1541
+ <AlertDialog.Root defaultOpen>
1542
+ <AlertDialog.Trigger>Open</AlertDialog.Trigger>
1543
+ <AlertDialog.Popup ref={ popupRef } title="Title">
1544
+ Body
1545
+ </AlertDialog.Popup>
1546
+ </AlertDialog.Root>
1547
+ );
1548
+
1549
+ await waitFor( () => {
1550
+ expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
1551
+ } );
1552
+
1553
+ expect( findScroller( popupRef.current ) ).toBeInstanceOf(
1554
+ HTMLDivElement
1555
+ );
1556
+ } );
1557
+
1558
+ it( 'is always modal (data-wp-ui-overlay-modal present on popup)', async () => {
1559
+ const popupRef = createRef< HTMLDivElement >();
1560
+
1561
+ render(
1562
+ <AlertDialog.Root defaultOpen>
1563
+ <AlertDialog.Trigger>Open</AlertDialog.Trigger>
1564
+ <AlertDialog.Popup ref={ popupRef } title="Title">
1565
+ Body
1566
+ </AlertDialog.Popup>
1567
+ </AlertDialog.Root>
1568
+ );
1569
+
1570
+ await waitFor( () => {
1571
+ expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
1572
+ } );
1573
+
1574
+ expect( popupRef.current ).toHaveAttribute(
1575
+ 'data-wp-ui-overlay-modal'
1576
+ );
1577
+ } );
1578
+
1579
+ it( 'pins header and footer outside the scroller when sticky props are true (default)', async () => {
1580
+ const popupRef = createRef< HTMLDivElement >();
1581
+
1582
+ render(
1583
+ <AlertDialog.Root defaultOpen>
1584
+ <AlertDialog.Trigger>Open</AlertDialog.Trigger>
1585
+ <AlertDialog.Popup ref={ popupRef } title="Title">
1586
+ Body
1587
+ </AlertDialog.Popup>
1588
+ </AlertDialog.Root>
1589
+ );
1590
+
1591
+ await waitFor( () => {
1592
+ expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
1593
+ } );
1594
+
1595
+ const scroller = findScroller( popupRef.current );
1596
+ const title = screen.getByRole( 'heading', { name: 'Title' } );
1597
+ const ok = screen.getByRole( 'button', { name: 'OK' } );
1598
+
1599
+ // Default: chrome sits outside the scroll container.
1600
+ expect( scroller ).not.toContainElement( title );
1601
+ expect( scroller ).not.toContainElement( ok );
1602
+ } );
1603
+
1604
+ it( 'nests header and footer inside the scroller when stickyHeader and stickyFooter are false', async () => {
1605
+ const popupRef = createRef< HTMLDivElement >();
1606
+
1607
+ render(
1608
+ <AlertDialog.Root defaultOpen>
1609
+ <AlertDialog.Trigger>Open</AlertDialog.Trigger>
1610
+ <AlertDialog.Popup
1611
+ ref={ popupRef }
1612
+ title="Title"
1613
+ stickyHeader={ false }
1614
+ stickyFooter={ false }
1615
+ >
1616
+ Body
1617
+ </AlertDialog.Popup>
1618
+ </AlertDialog.Root>
1619
+ );
1620
+
1621
+ await waitFor( () => {
1622
+ expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
1623
+ } );
1624
+
1625
+ const scroller = findScroller( popupRef.current );
1626
+ const title = screen.getByRole( 'heading', { name: 'Title' } );
1627
+ const ok = screen.getByRole( 'button', { name: 'OK' } );
1628
+
1629
+ expect( scroller ).toContainElement( title );
1630
+ expect( scroller ).toContainElement( ok );
1631
+ } );
1632
+
1633
+ it( 'toggles tabindex="0" on the scroller based on overflow', async () => {
1634
+ const popupRef = createRef< HTMLDivElement >();
1635
+
1636
+ render(
1637
+ <AlertDialog.Root defaultOpen>
1638
+ <AlertDialog.Trigger>Open</AlertDialog.Trigger>
1639
+ <AlertDialog.Popup ref={ popupRef } title="Title">
1640
+ Body
1641
+ </AlertDialog.Popup>
1642
+ </AlertDialog.Root>
1643
+ );
1644
+
1645
+ await waitFor( () => {
1646
+ expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
1647
+ } );
1648
+
1649
+ const scroller = findScroller( popupRef.current );
1650
+
1651
+ Object.defineProperty( scroller, 'scrollHeight', {
1652
+ configurable: true,
1653
+ value: 500,
1654
+ } );
1655
+ Object.defineProperty( scroller, 'clientHeight', {
1656
+ configurable: true,
1657
+ value: 100,
1658
+ } );
1659
+ Object.defineProperty( scroller, 'scrollTop', {
1660
+ configurable: true,
1661
+ value: 0,
1662
+ } );
1663
+
1664
+ act( () => {
1665
+ scroller.dispatchEvent(
1666
+ new Event( 'scroll', { bubbles: true } )
1667
+ );
1668
+ } );
1669
+
1670
+ expect( scroller ).toHaveAttribute( 'tabindex', '0' );
1671
+
1672
+ Object.defineProperty( scroller, 'scrollHeight', {
1673
+ configurable: true,
1674
+ value: 100,
1675
+ } );
1676
+
1677
+ act( () => {
1678
+ scroller.dispatchEvent(
1679
+ new Event( 'scroll', { bubbles: true } )
1680
+ );
1681
+ } );
1682
+
1683
+ expect( scroller ).not.toHaveAttribute( 'tabindex' );
1684
+ } );
1685
+
1686
+ it( 'toggles data-wp-ui-overlay-scrolled-from-* on the scroller based on scroll position', async () => {
1687
+ const popupRef = createRef< HTMLDivElement >();
1688
+
1689
+ render(
1690
+ <AlertDialog.Root defaultOpen>
1691
+ <AlertDialog.Trigger>Open</AlertDialog.Trigger>
1692
+ <AlertDialog.Popup ref={ popupRef } title="Title">
1693
+ Body
1694
+ </AlertDialog.Popup>
1695
+ </AlertDialog.Root>
1696
+ );
1697
+
1698
+ await waitFor( () => {
1699
+ expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
1700
+ } );
1701
+
1702
+ // JSDOM doesn't lay out elements, so we simulate an
1703
+ // overflowing scroll container by stubbing layout metrics
1704
+ // per scenario and dispatching a scroll event.
1705
+ const scroller = findScroller( popupRef.current );
1706
+ Object.defineProperty( scroller, 'scrollHeight', {
1707
+ configurable: true,
1708
+ value: 500,
1709
+ } );
1710
+ Object.defineProperty( scroller, 'clientHeight', {
1711
+ configurable: true,
1712
+ value: 100,
1713
+ } );
1714
+
1715
+ const setScrollTop = ( value: number ) => {
1716
+ Object.defineProperty( scroller, 'scrollTop', {
1717
+ configurable: true,
1718
+ value,
1719
+ } );
1720
+ act( () => {
1721
+ scroller.dispatchEvent(
1722
+ new Event( 'scroll', { bubbles: true } )
1723
+ );
1724
+ } );
1725
+ };
1726
+
1727
+ setScrollTop( 0 );
1728
+ expect( scroller ).not.toHaveAttribute(
1729
+ 'data-wp-ui-overlay-scrolled-from-top'
1730
+ );
1731
+ expect( scroller ).toHaveAttribute(
1732
+ 'data-wp-ui-overlay-scrolled-from-bottom'
1733
+ );
1734
+
1735
+ setScrollTop( 200 );
1736
+ expect( scroller ).toHaveAttribute(
1737
+ 'data-wp-ui-overlay-scrolled-from-top'
1738
+ );
1739
+ expect( scroller ).toHaveAttribute(
1740
+ 'data-wp-ui-overlay-scrolled-from-bottom'
1741
+ );
1742
+
1743
+ setScrollTop( 400 );
1744
+ expect( scroller ).toHaveAttribute(
1745
+ 'data-wp-ui-overlay-scrolled-from-top'
1746
+ );
1747
+ expect( scroller ).not.toHaveAttribute(
1748
+ 'data-wp-ui-overlay-scrolled-from-bottom'
1749
+ );
1750
+ } );
1751
+
1752
+ it( 'does not focus the scroll container on open even when it is keyboard-tabbable', async () => {
1753
+ // JSDOM reports `scrollHeight`/`clientHeight` as 0 by default,
1754
+ // so the scroll container would never overflow on its own and
1755
+ // would never become `tabindex="0"`. Forcing both prototype
1756
+ // getters to overflow values here makes the scroller
1757
+ // keyboard-reachable at the moment Base UI resolves
1758
+ // `initialFocus` — exactly the configuration that, without
1759
+ // `useDeprioritizedInitialFocus` wired up, lets the scroller
1760
+ // steal focus from the action buttons.
1761
+ const originalScrollHeight = Object.getOwnPropertyDescriptor(
1762
+ Element.prototype,
1763
+ 'scrollHeight'
1764
+ );
1765
+ const originalClientHeight = Object.getOwnPropertyDescriptor(
1766
+ Element.prototype,
1767
+ 'clientHeight'
1768
+ );
1769
+ Object.defineProperty( Element.prototype, 'scrollHeight', {
1770
+ configurable: true,
1771
+ get() {
1772
+ return 500;
1773
+ },
1774
+ } );
1775
+ Object.defineProperty( Element.prototype, 'clientHeight', {
1776
+ configurable: true,
1777
+ get() {
1778
+ return 100;
1779
+ },
1780
+ } );
1781
+
1782
+ try {
1783
+ const user = userEvent.setup();
1784
+ const popupRef = createRef< HTMLDivElement >();
1785
+
1786
+ render(
1787
+ <AlertDialog.Root>
1788
+ <AlertDialog.Trigger>Open</AlertDialog.Trigger>
1789
+ <AlertDialog.Popup ref={ popupRef } title="Title">
1790
+ Body that overflows
1791
+ </AlertDialog.Popup>
1792
+ </AlertDialog.Root>
1793
+ );
1794
+
1795
+ await user.click(
1796
+ screen.getByRole( 'button', { name: 'Open' } )
1797
+ );
1798
+
1799
+ await waitFor( () => {
1800
+ expect( popupRef.current ).toBeInstanceOf( HTMLDivElement );
1801
+ } );
1802
+
1803
+ // The scroll container (overflow forced via the
1804
+ // prototype stubs above) must not steal focus from the
1805
+ // action buttons — that's exactly what the
1806
+ // `useDeprioritizedInitialFocus` wiring on
1807
+ // `AlertDialog.Popup` is there to prevent. The Cancel
1808
+ // button is the first non-deprioritized tabbable, so
1809
+ // focus should settle on it.
1810
+ const scroller = findScroller( popupRef.current );
1811
+ await waitFor( () => {
1812
+ expect(
1813
+ screen.getByRole( 'button', { name: 'Cancel' } )
1814
+ ).toHaveFocus();
1815
+ } );
1816
+ expect( scroller ).not.toHaveFocus();
1817
+ } finally {
1818
+ if ( originalScrollHeight ) {
1819
+ Object.defineProperty(
1820
+ Element.prototype,
1821
+ 'scrollHeight',
1822
+ originalScrollHeight
1823
+ );
1824
+ }
1825
+ if ( originalClientHeight ) {
1826
+ Object.defineProperty(
1827
+ Element.prototype,
1828
+ 'clientHeight',
1829
+ originalClientHeight
1830
+ );
1831
+ }
1832
+ }
1833
+ } );
1834
+ } );
1509
1835
  } );
@@ -1,8 +1,12 @@
1
1
  import type { AlertDialog as _AlertDialog } from '@base-ui/react/alert-dialog';
2
- import type { ReactNode } from 'react';
2
+ import type { ComponentPropsWithoutRef, ReactElement, ReactNode } from 'react';
3
3
 
4
4
  import type { ComponentProps } from '../utils/types';
5
5
 
6
+ export type PortalProps = ComponentPropsWithoutRef<
7
+ typeof _AlertDialog.Portal
8
+ >;
9
+
6
10
  /**
7
11
  * The return type of `onConfirm`. Return `void` (or nothing) to auto-close
8
12
  * the dialog after the confirm handler completes. Return `{ close: false }`
@@ -63,9 +67,15 @@ export interface PopupProps
63
67
  extends ComponentProps< 'div' >,
64
68
  Pick< _AlertDialog.Popup.Props, 'initialFocus' | 'finalFocus' > {
65
69
  /**
66
- * A parent element to render the portal into.
70
+ * Optional portal element, typically `<AlertDialog.Portal />` with
71
+ * custom `container`, `className`, or `style`. Overlay content is
72
+ * rendered as this portal's children (do not pass `children` on the portal
73
+ * element; they would be ignored).
74
+ *
75
+ * When omitted, `AlertDialog.Popup` uses `AlertDialog.Portal` with default
76
+ * props.
67
77
  */
68
- container?: _AlertDialog.Portal.Props[ 'container' ];
78
+ portal?: ReactElement< Omit< PortalProps, 'children' > >;
69
79
 
70
80
  /**
71
81
  * The semantic intent of the dialog, which determines its styling.
@@ -116,4 +126,21 @@ export interface PopupProps
116
126
  * @default 'Cancel'
117
127
  */
118
128
  cancelButtonText?: string;
129
+
130
+ /**
131
+ * When `true`, the dialog's title stays pinned to the top of the popup
132
+ * as the body scrolls. When `false`, the title scrolls with the body.
133
+ *
134
+ * @default true
135
+ */
136
+ stickyHeader?: boolean;
137
+
138
+ /**
139
+ * When `true`, the dialog's action buttons (and error message, if any)
140
+ * stay pinned to the bottom of the popup as the body scrolls. When
141
+ * `false`, they scroll with the body.
142
+ *
143
+ * @default true
144
+ */
145
+ stickyFooter?: boolean;
119
146
  }
@@ -15,7 +15,7 @@ const meta: Meta< typeof Badge > = {
15
15
  parameters: {
16
16
  controls: { disable: true },
17
17
  },
18
- tags: [ '!dev' /* Hide individual story pages from sidebar */ ],
18
+ tags: [ '!dev' /* Hide individual story pages from sidebar */, 'manifest' ],
19
19
  };
20
20
  export default meta;
21
21
 
@@ -3,6 +3,7 @@ import { Fragment } from '@wordpress/element';
3
3
  import { Badge } from '../index';
4
4
 
5
5
  const meta: Meta< typeof Badge > = {
6
+ tags: [ 'manifest' ],
6
7
  title: 'Design System/Components/Badge',
7
8
  component: Badge,
8
9
  };
@@ -24,6 +24,7 @@ function Text( { children }: { children: React.ReactNode } ) {
24
24
  }
25
25
 
26
26
  const meta: Meta< typeof Card.Root > = {
27
+ tags: [ 'manifest' ],
27
28
  title: 'Design System/Components/Card',
28
29
  component: Card.Root,
29
30
  subcomponents: {
@@ -3,6 +3,7 @@ import { useState } from '@wordpress/element';
3
3
  import * as Collapsible from '../index';
4
4
 
5
5
  const meta: Meta< typeof Collapsible.Root > = {
6
+ tags: [ 'manifest' ],
6
7
  title: 'Design System/Components/Collapsible',
7
8
  component: Collapsible.Root,
8
9
  subcomponents: {
@@ -17,7 +17,18 @@ export const Content = forwardRef< HTMLDivElement, ContentProps >(
17
17
  return (
18
18
  <Collapsible.Panel
19
19
  ref={ ref }
20
- className={ clsx( styles.content, className ) }
20
+ // @ts-expect-error Base UI supports the callback-style
21
+ // version of the `className` prop, but we're purposefully
22
+ // not advertising it in our `@wordpress/ui` re-export.
23
+ className={ ( state ) =>
24
+ clsx(
25
+ styles.content,
26
+ state.open &&
27
+ state.transitionStatus === 'idle' &&
28
+ styles.overflowVisible,
29
+ className
30
+ )
31
+ }
21
32
  hiddenUntilFound={ hiddenUntilFound }
22
33
  { ...restProps }
23
34
  >
@@ -5,6 +5,7 @@ import * as Card from '../card';
5
5
  import * as Collapsible from '../collapsible';
6
6
  import { Icon } from '../icon';
7
7
  import styles from './style.module.css';
8
+ import defenseStyles from '../utils/css/global-css-defense.module.css';
8
9
  import focusStyles from '../utils/css/focus.module.css';
9
10
  import { HeaderDescriptionIdContext } from './context';
10
11
  import type { HeaderProps } from './types';
@@ -55,6 +56,7 @@ export const Header = forwardRef< HTMLDivElement, HeaderProps >(
55
56
  <div
56
57
  className={ clsx(
57
58
  styles[ 'header-trigger-wrapper' ],
59
+ defenseStyles.div,
58
60
  // While the interactive trigger element is the whole header,
59
61
  // the focus ring will be displayed only on the icon to visually
60
62
  // emulate it being the button.
@@ -26,6 +26,7 @@ function Text( { children }: { children: React.ReactNode } ) {
26
26
  }
27
27
 
28
28
  const meta: Meta< typeof CollapsibleCard.Root > = {
29
+ tags: [ 'manifest' ],
29
30
  title: 'Design System/Components/CollapsibleCard',
30
31
  component: CollapsibleCard.Root,
31
32
  subcomponents: {