@wordpress/ui 0.11.1-next.v.202604091042.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 (827) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/CONTRIBUTING.md +124 -0
  3. package/README.md +17 -9
  4. package/build/alert-dialog/index.cjs +3 -0
  5. package/build/alert-dialog/index.cjs.map +2 -2
  6. package/build/alert-dialog/popup.cjs +120 -55
  7. package/build/alert-dialog/popup.cjs.map +3 -3
  8. package/build/alert-dialog/portal.cjs +38 -0
  9. package/build/alert-dialog/portal.cjs.map +7 -0
  10. package/build/alert-dialog/types.cjs.map +1 -1
  11. package/build/badge/badge.cjs +14 -14
  12. package/build/badge/badge.cjs.map +2 -2
  13. package/build/button/button.cjs +6 -6
  14. package/build/button/button.cjs.map +2 -2
  15. package/build/card/content.cjs +4 -4
  16. package/build/card/content.cjs.map +2 -2
  17. package/build/card/full-bleed.cjs +4 -4
  18. package/build/card/full-bleed.cjs.map +2 -2
  19. package/build/card/header.cjs +4 -4
  20. package/build/card/header.cjs.map +2 -2
  21. package/build/card/root.cjs +4 -4
  22. package/build/card/root.cjs.map +2 -2
  23. package/build/card/title.cjs +5 -25
  24. package/build/card/title.cjs.map +4 -4
  25. package/build/collapsible-card/content.cjs +9 -5
  26. package/build/collapsible-card/content.cjs.map +2 -2
  27. package/build/collapsible-card/header.cjs +14 -4
  28. package/build/collapsible-card/header.cjs.map +3 -3
  29. package/build/dialog/content.cjs +85 -0
  30. package/build/dialog/content.cjs.map +7 -0
  31. package/build/dialog/context.cjs +12 -44
  32. package/build/dialog/context.cjs.map +2 -2
  33. package/build/dialog/description.cjs +59 -0
  34. package/build/dialog/description.cjs.map +7 -0
  35. package/build/dialog/footer.cjs +5 -4
  36. package/build/dialog/footer.cjs.map +2 -2
  37. package/build/dialog/header.cjs +5 -4
  38. package/build/dialog/header.cjs.map +2 -2
  39. package/build/dialog/index.cjs +9 -0
  40. package/build/dialog/index.cjs.map +2 -2
  41. package/build/dialog/popup.cjs +21 -8
  42. package/build/dialog/popup.cjs.map +2 -2
  43. package/build/dialog/portal.cjs +38 -0
  44. package/build/dialog/portal.cjs.map +7 -0
  45. package/build/dialog/root.cjs +3 -2
  46. package/build/dialog/root.cjs.map +2 -2
  47. package/build/dialog/title.cjs +16 -22
  48. package/build/dialog/title.cjs.map +3 -3
  49. package/build/dialog/types.cjs.map +1 -1
  50. package/build/drawer/action.cjs +48 -0
  51. package/build/drawer/action.cjs.map +7 -0
  52. package/build/drawer/close-icon.cjs +58 -0
  53. package/build/drawer/close-icon.cjs.map +7 -0
  54. package/build/drawer/content.cjs +86 -0
  55. package/build/drawer/content.cjs.map +7 -0
  56. package/build/drawer/context.cjs +44 -0
  57. package/build/drawer/context.cjs.map +7 -0
  58. package/build/drawer/description.cjs +47 -0
  59. package/build/drawer/description.cjs.map +7 -0
  60. package/build/drawer/footer.cjs +65 -0
  61. package/build/drawer/footer.cjs.map +7 -0
  62. package/build/drawer/header.cjs +65 -0
  63. package/build/drawer/header.cjs.map +7 -0
  64. package/build/drawer/index.cjs +61 -0
  65. package/build/drawer/index.cjs.map +7 -0
  66. package/build/drawer/popup.cjs +103 -0
  67. package/build/drawer/popup.cjs.map +7 -0
  68. package/build/drawer/portal.cjs +38 -0
  69. package/build/drawer/portal.cjs.map +7 -0
  70. package/build/drawer/root.cjs +49 -0
  71. package/build/drawer/root.cjs.map +7 -0
  72. package/build/drawer/title.cjs +70 -0
  73. package/build/drawer/title.cjs.map +7 -0
  74. package/build/drawer/trigger.cjs +38 -0
  75. package/build/drawer/trigger.cjs.map +7 -0
  76. package/build/drawer/types.cjs +19 -0
  77. package/build/drawer/types.cjs.map +7 -0
  78. package/build/empty-state/actions.cjs +3 -3
  79. package/build/empty-state/actions.cjs.map +2 -2
  80. package/build/empty-state/description.cjs +8 -5
  81. package/build/empty-state/description.cjs.map +2 -2
  82. package/build/empty-state/icon.cjs +3 -3
  83. package/build/empty-state/icon.cjs.map +2 -2
  84. package/build/empty-state/root.cjs +3 -3
  85. package/build/empty-state/root.cjs.map +2 -2
  86. package/build/empty-state/title.cjs +8 -5
  87. package/build/empty-state/title.cjs.map +2 -2
  88. package/build/empty-state/visual.cjs +3 -3
  89. package/build/empty-state/visual.cjs.map +2 -2
  90. package/build/form/primitives/autocomplete/clear.cjs +62 -0
  91. package/build/form/primitives/autocomplete/clear.cjs.map +7 -0
  92. package/build/form/primitives/autocomplete/collection.cjs +38 -0
  93. package/build/form/primitives/autocomplete/collection.cjs.map +7 -0
  94. package/build/form/primitives/autocomplete/empty.cjs +67 -0
  95. package/build/form/primitives/autocomplete/empty.cjs.map +7 -0
  96. package/build/form/primitives/autocomplete/index.cjs +64 -0
  97. package/build/form/primitives/autocomplete/index.cjs.map +7 -0
  98. package/build/form/primitives/autocomplete/input-group.cjs +36 -0
  99. package/build/form/primitives/autocomplete/input-group.cjs.map +7 -0
  100. package/build/form/primitives/autocomplete/input.cjs +47 -0
  101. package/build/form/primitives/autocomplete/input.cjs.map +7 -0
  102. package/build/form/primitives/autocomplete/item.cjs +81 -0
  103. package/build/form/primitives/autocomplete/item.cjs.map +7 -0
  104. package/build/form/primitives/autocomplete/list-body.cjs +57 -0
  105. package/build/form/primitives/autocomplete/list-body.cjs.map +7 -0
  106. package/build/form/primitives/autocomplete/list.cjs +67 -0
  107. package/build/form/primitives/autocomplete/list.cjs.map +7 -0
  108. package/build/form/primitives/autocomplete/popup.cjs +102 -0
  109. package/build/form/primitives/autocomplete/popup.cjs.map +7 -0
  110. package/build/form/primitives/autocomplete/portal.cjs +38 -0
  111. package/build/form/primitives/autocomplete/portal.cjs.map +7 -0
  112. package/build/form/primitives/autocomplete/root.cjs +35 -0
  113. package/build/form/primitives/autocomplete/root.cjs.map +7 -0
  114. package/build/form/primitives/autocomplete/types.cjs +19 -0
  115. package/build/form/primitives/autocomplete/types.cjs.map +7 -0
  116. package/build/form/primitives/autocomplete/value.cjs +35 -0
  117. package/build/form/primitives/autocomplete/value.cjs.map +7 -0
  118. package/build/form/primitives/field/description.cjs +6 -6
  119. package/build/form/primitives/field/description.cjs.map +2 -2
  120. package/build/form/primitives/field/details.cjs +4 -4
  121. package/build/form/primitives/field/details.cjs.map +2 -2
  122. package/build/form/primitives/field/label.cjs +8 -8
  123. package/build/form/primitives/field/label.cjs.map +2 -2
  124. package/build/form/primitives/field/root.cjs +2 -2
  125. package/build/form/primitives/field/root.cjs.map +2 -2
  126. package/build/form/primitives/fieldset/description.cjs +6 -6
  127. package/build/form/primitives/fieldset/description.cjs.map +2 -2
  128. package/build/form/primitives/fieldset/details.cjs +3 -3
  129. package/build/form/primitives/fieldset/details.cjs.map +2 -2
  130. package/build/form/primitives/fieldset/legend.cjs +8 -7
  131. package/build/form/primitives/fieldset/legend.cjs.map +2 -2
  132. package/build/form/primitives/index.cjs +3 -0
  133. package/build/form/primitives/index.cjs.map +2 -2
  134. package/build/form/primitives/input/input.cjs +6 -6
  135. package/build/form/primitives/input/input.cjs.map +2 -2
  136. package/build/form/primitives/input-layout/input-layout.cjs +6 -6
  137. package/build/form/primitives/input-layout/input-layout.cjs.map +2 -2
  138. package/build/form/primitives/input-layout/slot.cjs +3 -3
  139. package/build/form/primitives/input-layout/slot.cjs.map +2 -2
  140. package/build/form/primitives/select/index.cjs +3 -0
  141. package/build/form/primitives/select/index.cjs.map +2 -2
  142. package/build/form/primitives/select/item.cjs +4 -5
  143. package/build/form/primitives/select/item.cjs.map +2 -2
  144. package/build/form/primitives/select/popup.cjs +12 -11
  145. package/build/form/primitives/select/popup.cjs.map +2 -2
  146. package/build/form/primitives/select/portal.cjs +38 -0
  147. package/build/form/primitives/select/portal.cjs.map +7 -0
  148. package/build/form/primitives/select/trigger.cjs +3 -3
  149. package/build/form/primitives/select/trigger.cjs.map +1 -1
  150. package/build/form/primitives/select/types.cjs.map +1 -1
  151. package/build/form/primitives/textarea/textarea.cjs +3 -3
  152. package/build/form/primitives/textarea/textarea.cjs.map +2 -2
  153. package/build/index.cjs +3 -0
  154. package/build/index.cjs.map +2 -2
  155. package/build/link/link.cjs +11 -21
  156. package/build/link/link.cjs.map +2 -2
  157. package/build/link/types.cjs.map +1 -1
  158. package/build/notice/action-button.cjs +3 -3
  159. package/build/notice/action-button.cjs.map +2 -2
  160. package/build/notice/action-link.cjs +8 -7
  161. package/build/notice/action-link.cjs.map +2 -2
  162. package/build/notice/actions.cjs +3 -3
  163. package/build/notice/actions.cjs.map +2 -2
  164. package/build/notice/close-icon.cjs +3 -3
  165. package/build/notice/close-icon.cjs.map +2 -2
  166. package/build/notice/description.cjs +3 -3
  167. package/build/notice/description.cjs.map +2 -2
  168. package/build/notice/root.cjs +3 -3
  169. package/build/notice/root.cjs.map +2 -2
  170. package/build/notice/title.cjs +3 -3
  171. package/build/notice/title.cjs.map +2 -2
  172. package/build/popover/arrow.cjs +4 -4
  173. package/build/popover/arrow.cjs.map +2 -2
  174. package/build/popover/context.cjs +4 -44
  175. package/build/popover/context.cjs.map +2 -2
  176. package/build/popover/description.cjs +2 -25
  177. package/build/popover/description.cjs.map +4 -4
  178. package/build/popover/index.cjs +3 -0
  179. package/build/popover/index.cjs.map +2 -2
  180. package/build/popover/popup.cjs +15 -15
  181. package/build/popover/popup.cjs.map +2 -2
  182. package/build/popover/portal.cjs +38 -0
  183. package/build/popover/portal.cjs.map +7 -0
  184. package/build/popover/root.cjs.map +1 -1
  185. package/build/popover/title.cjs +19 -5
  186. package/build/popover/title.cjs.map +3 -3
  187. package/build/popover/types.cjs.map +1 -1
  188. package/build/tabs/context.cjs +9 -22
  189. package/build/tabs/context.cjs.map +2 -2
  190. package/build/tabs/list.cjs +4 -5
  191. package/build/tabs/list.cjs.map +2 -2
  192. package/build/tabs/panel.cjs +19 -6
  193. package/build/tabs/panel.cjs.map +3 -3
  194. package/build/tabs/tab.cjs +4 -4
  195. package/build/tabs/tab.cjs.map +2 -2
  196. package/build/text/text.cjs +8 -8
  197. package/build/text/text.cjs.map +2 -2
  198. package/build/tooltip/index.cjs +3 -0
  199. package/build/tooltip/index.cjs.map +2 -2
  200. package/build/tooltip/popup.cjs +11 -13
  201. package/build/tooltip/popup.cjs.map +3 -3
  202. package/build/tooltip/portal.cjs +38 -0
  203. package/build/tooltip/portal.cjs.map +7 -0
  204. package/build/tooltip/provider.cjs +2 -2
  205. package/build/tooltip/provider.cjs.map +3 -3
  206. package/build/tooltip/root.cjs.map +3 -3
  207. package/build/tooltip/trigger.cjs +2 -2
  208. package/build/tooltip/trigger.cjs.map +3 -3
  209. package/build/tooltip/types.cjs.map +1 -1
  210. package/build/utils/create-overlay-modal-context.cjs +48 -0
  211. package/build/utils/create-overlay-modal-context.cjs.map +7 -0
  212. package/build/utils/create-overlay-title-validation.cjs +93 -0
  213. package/build/utils/create-overlay-title-validation.cjs.map +7 -0
  214. package/build/utils/render-portal-with-children.cjs +37 -0
  215. package/build/utils/render-portal-with-children.cjs.map +7 -0
  216. package/build/utils/types.cjs.map +1 -1
  217. package/build/utils/use-deprioritized-initial-focus.cjs +8 -8
  218. package/build/utils/use-deprioritized-initial-focus.cjs.map +2 -2
  219. package/build/utils/use-overlay-scroll-state-attributes.cjs +140 -0
  220. package/build/utils/use-overlay-scroll-state-attributes.cjs.map +7 -0
  221. package/build/utils/use-schedule-validation.cjs +59 -0
  222. package/build/utils/use-schedule-validation.cjs.map +7 -0
  223. package/build/visually-hidden/visually-hidden.cjs +5 -1
  224. package/build/visually-hidden/visually-hidden.cjs.map +2 -2
  225. package/build-module/alert-dialog/index.mjs +2 -0
  226. package/build-module/alert-dialog/index.mjs.map +2 -2
  227. package/build-module/alert-dialog/popup.mjs +124 -56
  228. package/build-module/alert-dialog/popup.mjs.map +3 -3
  229. package/build-module/alert-dialog/portal.mjs +13 -0
  230. package/build-module/alert-dialog/portal.mjs.map +7 -0
  231. package/build-module/badge/badge.mjs +14 -14
  232. package/build-module/badge/badge.mjs.map +2 -2
  233. package/build-module/button/button.mjs +6 -6
  234. package/build-module/button/button.mjs.map +2 -2
  235. package/build-module/card/content.mjs +4 -4
  236. package/build-module/card/content.mjs.map +2 -2
  237. package/build-module/card/full-bleed.mjs +4 -4
  238. package/build-module/card/full-bleed.mjs.map +2 -2
  239. package/build-module/card/header.mjs +4 -4
  240. package/build-module/card/header.mjs.map +2 -2
  241. package/build-module/card/root.mjs +4 -4
  242. package/build-module/card/root.mjs.map +2 -2
  243. package/build-module/card/title.mjs +5 -15
  244. package/build-module/card/title.mjs.map +3 -3
  245. package/build-module/collapsible-card/content.mjs +9 -5
  246. package/build-module/collapsible-card/content.mjs.map +2 -2
  247. package/build-module/collapsible-card/header.mjs +14 -4
  248. package/build-module/collapsible-card/header.mjs.map +3 -3
  249. package/build-module/dialog/content.mjs +50 -0
  250. package/build-module/dialog/content.mjs.map +7 -0
  251. package/build-module/dialog/context.mjs +10 -51
  252. package/build-module/dialog/context.mjs.map +2 -2
  253. package/build-module/dialog/description.mjs +34 -0
  254. package/build-module/dialog/description.mjs.map +7 -0
  255. package/build-module/dialog/footer.mjs +5 -4
  256. package/build-module/dialog/footer.mjs.map +2 -2
  257. package/build-module/dialog/header.mjs +5 -4
  258. package/build-module/dialog/header.mjs.map +2 -2
  259. package/build-module/dialog/index.mjs +6 -0
  260. package/build-module/dialog/index.mjs.map +2 -2
  261. package/build-module/dialog/popup.mjs +23 -10
  262. package/build-module/dialog/popup.mjs.map +2 -2
  263. package/build-module/dialog/portal.mjs +13 -0
  264. package/build-module/dialog/portal.mjs.map +7 -0
  265. package/build-module/dialog/root.mjs +3 -2
  266. package/build-module/dialog/root.mjs.map +2 -2
  267. package/build-module/dialog/title.mjs +17 -13
  268. package/build-module/dialog/title.mjs.map +2 -2
  269. package/build-module/drawer/action.mjs +23 -0
  270. package/build-module/drawer/action.mjs.map +7 -0
  271. package/build-module/drawer/close-icon.mjs +33 -0
  272. package/build-module/drawer/close-icon.mjs.map +7 -0
  273. package/build-module/drawer/content.mjs +51 -0
  274. package/build-module/drawer/content.mjs.map +7 -0
  275. package/build-module/drawer/context.mjs +16 -0
  276. package/build-module/drawer/context.mjs.map +7 -0
  277. package/build-module/drawer/description.mjs +22 -0
  278. package/build-module/drawer/description.mjs.map +7 -0
  279. package/build-module/drawer/footer.mjs +30 -0
  280. package/build-module/drawer/footer.mjs.map +7 -0
  281. package/build-module/drawer/header.mjs +30 -0
  282. package/build-module/drawer/header.mjs.map +7 -0
  283. package/build-module/drawer/index.mjs +26 -0
  284. package/build-module/drawer/index.mjs.map +7 -0
  285. package/build-module/drawer/popup.mjs +70 -0
  286. package/build-module/drawer/popup.mjs.map +7 -0
  287. package/build-module/drawer/portal.mjs +13 -0
  288. package/build-module/drawer/portal.mjs.map +7 -0
  289. package/build-module/drawer/root.mjs +24 -0
  290. package/build-module/drawer/root.mjs.map +7 -0
  291. package/build-module/drawer/title.mjs +45 -0
  292. package/build-module/drawer/title.mjs.map +7 -0
  293. package/build-module/drawer/trigger.mjs +13 -0
  294. package/build-module/drawer/trigger.mjs.map +7 -0
  295. package/build-module/drawer/types.mjs +1 -0
  296. package/build-module/empty-state/actions.mjs +3 -3
  297. package/build-module/empty-state/actions.mjs.map +2 -2
  298. package/build-module/empty-state/description.mjs +8 -5
  299. package/build-module/empty-state/description.mjs.map +2 -2
  300. package/build-module/empty-state/icon.mjs +3 -3
  301. package/build-module/empty-state/icon.mjs.map +2 -2
  302. package/build-module/empty-state/root.mjs +3 -3
  303. package/build-module/empty-state/root.mjs.map +2 -2
  304. package/build-module/empty-state/title.mjs +8 -5
  305. package/build-module/empty-state/title.mjs.map +2 -2
  306. package/build-module/empty-state/visual.mjs +3 -3
  307. package/build-module/empty-state/visual.mjs.map +2 -2
  308. package/build-module/form/primitives/autocomplete/clear.mjs +37 -0
  309. package/build-module/form/primitives/autocomplete/clear.mjs.map +7 -0
  310. package/build-module/form/primitives/autocomplete/collection.mjs +13 -0
  311. package/build-module/form/primitives/autocomplete/collection.mjs.map +7 -0
  312. package/build-module/form/primitives/autocomplete/empty.mjs +32 -0
  313. package/build-module/form/primitives/autocomplete/empty.mjs.map +7 -0
  314. package/build-module/form/primitives/autocomplete/index.mjs +28 -0
  315. package/build-module/form/primitives/autocomplete/index.mjs.map +7 -0
  316. package/build-module/form/primitives/autocomplete/input-group.mjs +11 -0
  317. package/build-module/form/primitives/autocomplete/input-group.mjs.map +7 -0
  318. package/build-module/form/primitives/autocomplete/input.mjs +22 -0
  319. package/build-module/form/primitives/autocomplete/input.mjs.map +7 -0
  320. package/build-module/form/primitives/autocomplete/item.mjs +46 -0
  321. package/build-module/form/primitives/autocomplete/item.mjs.map +7 -0
  322. package/build-module/form/primitives/autocomplete/list-body.mjs +32 -0
  323. package/build-module/form/primitives/autocomplete/list-body.mjs.map +7 -0
  324. package/build-module/form/primitives/autocomplete/list.mjs +32 -0
  325. package/build-module/form/primitives/autocomplete/list.mjs.map +7 -0
  326. package/build-module/form/primitives/autocomplete/popup.mjs +69 -0
  327. package/build-module/form/primitives/autocomplete/popup.mjs.map +7 -0
  328. package/build-module/form/primitives/autocomplete/portal.mjs +13 -0
  329. package/build-module/form/primitives/autocomplete/portal.mjs.map +7 -0
  330. package/build-module/form/primitives/autocomplete/root.mjs +10 -0
  331. package/build-module/form/primitives/autocomplete/root.mjs.map +7 -0
  332. package/build-module/form/primitives/autocomplete/types.mjs +1 -0
  333. package/build-module/form/primitives/autocomplete/value.mjs +10 -0
  334. package/build-module/form/primitives/autocomplete/value.mjs.map +7 -0
  335. package/build-module/form/primitives/field/description.mjs +6 -6
  336. package/build-module/form/primitives/field/description.mjs.map +2 -2
  337. package/build-module/form/primitives/field/details.mjs +4 -4
  338. package/build-module/form/primitives/field/details.mjs.map +2 -2
  339. package/build-module/form/primitives/field/label.mjs +8 -8
  340. package/build-module/form/primitives/field/label.mjs.map +2 -2
  341. package/build-module/form/primitives/field/root.mjs +2 -2
  342. package/build-module/form/primitives/field/root.mjs.map +2 -2
  343. package/build-module/form/primitives/fieldset/description.mjs +6 -6
  344. package/build-module/form/primitives/fieldset/description.mjs.map +2 -2
  345. package/build-module/form/primitives/fieldset/details.mjs +3 -3
  346. package/build-module/form/primitives/fieldset/details.mjs.map +2 -2
  347. package/build-module/form/primitives/fieldset/legend.mjs +8 -7
  348. package/build-module/form/primitives/fieldset/legend.mjs.map +2 -2
  349. package/build-module/form/primitives/index.mjs +2 -0
  350. package/build-module/form/primitives/index.mjs.map +2 -2
  351. package/build-module/form/primitives/input/input.mjs +6 -6
  352. package/build-module/form/primitives/input/input.mjs.map +2 -2
  353. package/build-module/form/primitives/input-layout/input-layout.mjs +6 -6
  354. package/build-module/form/primitives/input-layout/input-layout.mjs.map +2 -2
  355. package/build-module/form/primitives/input-layout/slot.mjs +3 -3
  356. package/build-module/form/primitives/input-layout/slot.mjs.map +2 -2
  357. package/build-module/form/primitives/select/index.mjs +2 -0
  358. package/build-module/form/primitives/select/index.mjs.map +2 -2
  359. package/build-module/form/primitives/select/item.mjs +4 -5
  360. package/build-module/form/primitives/select/item.mjs.map +2 -2
  361. package/build-module/form/primitives/select/popup.mjs +12 -11
  362. package/build-module/form/primitives/select/popup.mjs.map +2 -2
  363. package/build-module/form/primitives/select/portal.mjs +13 -0
  364. package/build-module/form/primitives/select/portal.mjs.map +7 -0
  365. package/build-module/form/primitives/select/trigger.mjs +3 -3
  366. package/build-module/form/primitives/select/trigger.mjs.map +1 -1
  367. package/build-module/form/primitives/textarea/textarea.mjs +3 -3
  368. package/build-module/form/primitives/textarea/textarea.mjs.map +2 -2
  369. package/build-module/index.mjs +2 -0
  370. package/build-module/index.mjs.map +2 -2
  371. package/build-module/link/link.mjs +11 -21
  372. package/build-module/link/link.mjs.map +2 -2
  373. package/build-module/notice/action-button.mjs +3 -3
  374. package/build-module/notice/action-button.mjs.map +2 -2
  375. package/build-module/notice/action-link.mjs +8 -7
  376. package/build-module/notice/action-link.mjs.map +2 -2
  377. package/build-module/notice/actions.mjs +3 -3
  378. package/build-module/notice/actions.mjs.map +2 -2
  379. package/build-module/notice/close-icon.mjs +3 -3
  380. package/build-module/notice/close-icon.mjs.map +2 -2
  381. package/build-module/notice/description.mjs +3 -3
  382. package/build-module/notice/description.mjs.map +2 -2
  383. package/build-module/notice/root.mjs +3 -3
  384. package/build-module/notice/root.mjs.map +2 -2
  385. package/build-module/notice/title.mjs +3 -3
  386. package/build-module/notice/title.mjs.map +2 -2
  387. package/build-module/popover/arrow.mjs +4 -4
  388. package/build-module/popover/arrow.mjs.map +2 -2
  389. package/build-module/popover/context.mjs +4 -51
  390. package/build-module/popover/context.mjs.map +2 -2
  391. package/build-module/popover/description.mjs +2 -15
  392. package/build-module/popover/description.mjs.map +3 -3
  393. package/build-module/popover/index.mjs +2 -0
  394. package/build-module/popover/index.mjs.map +2 -2
  395. package/build-module/popover/popup.mjs +16 -16
  396. package/build-module/popover/popup.mjs.map +2 -2
  397. package/build-module/popover/portal.mjs +13 -0
  398. package/build-module/popover/portal.mjs.map +7 -0
  399. package/build-module/popover/root.mjs.map +1 -1
  400. package/build-module/popover/title.mjs +20 -6
  401. package/build-module/popover/title.mjs.map +3 -3
  402. package/build-module/tabs/context.mjs +11 -24
  403. package/build-module/tabs/context.mjs.map +2 -2
  404. package/build-module/tabs/list.mjs +4 -5
  405. package/build-module/tabs/list.mjs.map +2 -2
  406. package/build-module/tabs/panel.mjs +19 -6
  407. package/build-module/tabs/panel.mjs.map +3 -3
  408. package/build-module/tabs/tab.mjs +4 -4
  409. package/build-module/tabs/tab.mjs.map +2 -2
  410. package/build-module/text/text.mjs +8 -8
  411. package/build-module/text/text.mjs.map +2 -2
  412. package/build-module/tooltip/index.mjs +2 -0
  413. package/build-module/tooltip/index.mjs.map +2 -2
  414. package/build-module/tooltip/popup.mjs +14 -16
  415. package/build-module/tooltip/popup.mjs.map +2 -2
  416. package/build-module/tooltip/portal.mjs +13 -0
  417. package/build-module/tooltip/portal.mjs.map +7 -0
  418. package/build-module/tooltip/provider.mjs +3 -3
  419. package/build-module/tooltip/provider.mjs.map +2 -2
  420. package/build-module/tooltip/root.mjs +2 -2
  421. package/build-module/tooltip/root.mjs.map +2 -2
  422. package/build-module/tooltip/trigger.mjs +3 -3
  423. package/build-module/tooltip/trigger.mjs.map +2 -2
  424. package/build-module/utils/create-overlay-modal-context.mjs +23 -0
  425. package/build-module/utils/create-overlay-modal-context.mjs.map +7 -0
  426. package/build-module/utils/create-overlay-title-validation.mjs +75 -0
  427. package/build-module/utils/create-overlay-title-validation.mjs.map +7 -0
  428. package/build-module/utils/render-portal-with-children.mjs +12 -0
  429. package/build-module/utils/render-portal-with-children.mjs.map +7 -0
  430. package/build-module/utils/use-deprioritized-initial-focus.mjs +9 -9
  431. package/build-module/utils/use-deprioritized-initial-focus.mjs.map +2 -2
  432. package/build-module/utils/use-overlay-scroll-state-attributes.mjs +114 -0
  433. package/build-module/utils/use-overlay-scroll-state-attributes.mjs.map +7 -0
  434. package/build-module/utils/use-schedule-validation.mjs +34 -0
  435. package/build-module/utils/use-schedule-validation.mjs.map +7 -0
  436. package/build-module/visually-hidden/visually-hidden.mjs +5 -1
  437. package/build-module/visually-hidden/visually-hidden.mjs.map +2 -2
  438. package/build-types/alert-dialog/index.d.ts +1 -0
  439. package/build-types/alert-dialog/index.d.ts.map +1 -1
  440. package/build-types/alert-dialog/popup.d.ts.map +1 -1
  441. package/build-types/alert-dialog/portal.d.ts +9 -0
  442. package/build-types/alert-dialog/portal.d.ts.map +1 -0
  443. package/build-types/alert-dialog/stories/index.story.d.ts +29 -1
  444. package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -1
  445. package/build-types/alert-dialog/types.d.ts +27 -1
  446. package/build-types/alert-dialog/types.d.ts.map +1 -1
  447. package/build-types/badge/badge.d.ts.map +1 -1
  448. package/build-types/badge/stories/index.story.d.ts.map +1 -1
  449. package/build-types/card/stories/index.story.d.ts.map +1 -1
  450. package/build-types/card/title.d.ts.map +1 -1
  451. package/build-types/collapsible/panel.d.ts +2 -1
  452. package/build-types/collapsible/panel.d.ts.map +1 -1
  453. package/build-types/collapsible/root.d.ts +2 -1
  454. package/build-types/collapsible/root.d.ts.map +1 -1
  455. package/build-types/collapsible/stories/index.story.d.ts.map +1 -1
  456. package/build-types/collapsible/trigger.d.ts +2 -1
  457. package/build-types/collapsible/trigger.d.ts.map +1 -1
  458. package/build-types/collapsible-card/content.d.ts.map +1 -1
  459. package/build-types/collapsible-card/header.d.ts.map +1 -1
  460. package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
  461. package/build-types/dialog/content.d.ts +17 -0
  462. package/build-types/dialog/content.d.ts.map +1 -0
  463. package/build-types/dialog/context.d.ts +11 -16
  464. package/build-types/dialog/context.d.ts.map +1 -1
  465. package/build-types/dialog/description.d.ts +9 -0
  466. package/build-types/dialog/description.d.ts.map +1 -0
  467. package/build-types/dialog/footer.d.ts +8 -1
  468. package/build-types/dialog/footer.d.ts.map +1 -1
  469. package/build-types/dialog/header.d.ts +8 -1
  470. package/build-types/dialog/header.d.ts.map +1 -1
  471. package/build-types/dialog/index.d.ts +4 -1
  472. package/build-types/dialog/index.d.ts.map +1 -1
  473. package/build-types/dialog/popup.d.ts +3 -0
  474. package/build-types/dialog/popup.d.ts.map +1 -1
  475. package/build-types/dialog/portal.d.ts +10 -0
  476. package/build-types/dialog/portal.d.ts.map +1 -0
  477. package/build-types/dialog/root.d.ts +14 -4
  478. package/build-types/dialog/root.d.ts.map +1 -1
  479. package/build-types/dialog/stories/index.story.d.ts +37 -6
  480. package/build-types/dialog/stories/index.story.d.ts.map +1 -1
  481. package/build-types/dialog/title.d.ts +12 -2
  482. package/build-types/dialog/title.d.ts.map +1 -1
  483. package/build-types/dialog/types.d.ts +66 -6
  484. package/build-types/dialog/types.d.ts.map +1 -1
  485. package/build-types/drawer/action.d.ts +8 -0
  486. package/build-types/drawer/action.d.ts.map +1 -0
  487. package/build-types/drawer/close-icon.d.ts +8 -0
  488. package/build-types/drawer/close-icon.d.ts.map +1 -0
  489. package/build-types/drawer/content.d.ts +21 -0
  490. package/build-types/drawer/content.d.ts.map +1 -0
  491. package/build-types/drawer/context.d.ts +20 -0
  492. package/build-types/drawer/context.d.ts.map +1 -0
  493. package/build-types/drawer/description.d.ts +9 -0
  494. package/build-types/drawer/description.d.ts.map +1 -0
  495. package/build-types/drawer/footer.d.ts +15 -0
  496. package/build-types/drawer/footer.d.ts.map +1 -0
  497. package/build-types/drawer/header.d.ts +15 -0
  498. package/build-types/drawer/header.d.ts.map +1 -0
  499. package/build-types/drawer/index.d.ts +13 -0
  500. package/build-types/drawer/index.d.ts.map +1 -0
  501. package/build-types/drawer/popup.d.ts +16 -0
  502. package/build-types/drawer/popup.d.ts.map +1 -0
  503. package/build-types/drawer/portal.d.ts +10 -0
  504. package/build-types/drawer/portal.d.ts.map +1 -0
  505. package/build-types/drawer/root.d.ts +21 -0
  506. package/build-types/drawer/root.d.ts.map +1 -0
  507. package/build-types/drawer/stories/index.story.d.ts +63 -0
  508. package/build-types/drawer/stories/index.story.d.ts.map +1 -0
  509. package/build-types/drawer/test/index.test.d.ts +2 -0
  510. package/build-types/drawer/test/index.test.d.ts.map +1 -0
  511. package/build-types/drawer/title.d.ts +22 -0
  512. package/build-types/drawer/title.d.ts.map +1 -0
  513. package/build-types/drawer/trigger.d.ts +7 -0
  514. package/build-types/drawer/trigger.d.ts.map +1 -0
  515. package/build-types/drawer/types.d.ts +146 -0
  516. package/build-types/drawer/types.d.ts.map +1 -0
  517. package/build-types/empty-state/description.d.ts.map +1 -1
  518. package/build-types/empty-state/stories/index.story.d.ts +1 -1
  519. package/build-types/empty-state/stories/index.story.d.ts.map +1 -1
  520. package/build-types/empty-state/title.d.ts.map +1 -1
  521. package/build-types/form/input-control/stories/index.story.d.ts +1 -1
  522. package/build-types/form/input-control/stories/index.story.d.ts.map +1 -1
  523. package/build-types/form/primitives/autocomplete/clear.d.ts +13 -0
  524. package/build-types/form/primitives/autocomplete/clear.d.ts.map +1 -0
  525. package/build-types/form/primitives/autocomplete/collection.d.ts +3 -0
  526. package/build-types/form/primitives/autocomplete/collection.d.ts.map +1 -0
  527. package/build-types/form/primitives/autocomplete/empty.d.ts +10 -0
  528. package/build-types/form/primitives/autocomplete/empty.d.ts.map +1 -0
  529. package/build-types/form/primitives/autocomplete/index.d.ts +13 -0
  530. package/build-types/form/primitives/autocomplete/index.d.ts.map +1 -0
  531. package/build-types/form/primitives/autocomplete/input-group.d.ts +16 -0
  532. package/build-types/form/primitives/autocomplete/input-group.d.ts.map +1 -0
  533. package/build-types/form/primitives/autocomplete/input.d.ts +3 -0
  534. package/build-types/form/primitives/autocomplete/input.d.ts.map +1 -0
  535. package/build-types/form/primitives/autocomplete/item.d.ts +10 -0
  536. package/build-types/form/primitives/autocomplete/item.d.ts.map +1 -0
  537. package/build-types/form/primitives/autocomplete/list-body.d.ts +13 -0
  538. package/build-types/form/primitives/autocomplete/list-body.d.ts.map +1 -0
  539. package/build-types/form/primitives/autocomplete/list.d.ts +11 -0
  540. package/build-types/form/primitives/autocomplete/list.d.ts.map +1 -0
  541. package/build-types/form/primitives/autocomplete/popup.d.ts +11 -0
  542. package/build-types/form/primitives/autocomplete/popup.d.ts.map +1 -0
  543. package/build-types/form/primitives/autocomplete/portal.d.ts +8 -0
  544. package/build-types/form/primitives/autocomplete/portal.d.ts.map +1 -0
  545. package/build-types/form/primitives/autocomplete/root.d.ts +8 -0
  546. package/build-types/form/primitives/autocomplete/root.d.ts.map +1 -0
  547. package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts +8 -0
  548. package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts.map +1 -0
  549. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts +41 -0
  550. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts.map +1 -0
  551. package/build-types/form/primitives/autocomplete/test/index.test.d.ts +2 -0
  552. package/build-types/form/primitives/autocomplete/test/index.test.d.ts.map +1 -0
  553. package/build-types/form/primitives/autocomplete/types.d.ts +44 -0
  554. package/build-types/form/primitives/autocomplete/types.d.ts.map +1 -0
  555. package/build-types/form/primitives/autocomplete/value.d.ts +3 -0
  556. package/build-types/form/primitives/autocomplete/value.d.ts.map +1 -0
  557. package/build-types/form/primitives/field/description.d.ts +2 -1
  558. package/build-types/form/primitives/field/description.d.ts.map +1 -1
  559. package/build-types/form/primitives/field/details.d.ts +2 -1
  560. package/build-types/form/primitives/field/details.d.ts.map +1 -1
  561. package/build-types/form/primitives/field/label.d.ts +2 -1
  562. package/build-types/form/primitives/field/label.d.ts.map +1 -1
  563. package/build-types/form/primitives/field/stories/index.story.d.ts +1 -1
  564. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  565. package/build-types/form/primitives/fieldset/description.d.ts +2 -1
  566. package/build-types/form/primitives/fieldset/description.d.ts.map +1 -1
  567. package/build-types/form/primitives/fieldset/details.d.ts +2 -1
  568. package/build-types/form/primitives/fieldset/details.d.ts.map +1 -1
  569. package/build-types/form/primitives/fieldset/legend.d.ts +2 -1
  570. package/build-types/form/primitives/fieldset/legend.d.ts.map +1 -1
  571. package/build-types/form/primitives/fieldset/root.d.ts +2 -1
  572. package/build-types/form/primitives/fieldset/root.d.ts.map +1 -1
  573. package/build-types/form/primitives/fieldset/stories/index.story.d.ts +1 -1
  574. package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
  575. package/build-types/form/primitives/index.d.ts +1 -0
  576. package/build-types/form/primitives/index.d.ts.map +1 -1
  577. package/build-types/form/primitives/input/stories/index.story.d.ts +1 -1
  578. package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
  579. package/build-types/form/primitives/input-layout/stories/index.story.d.ts +1 -1
  580. package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
  581. package/build-types/form/primitives/select/index.d.ts +1 -0
  582. package/build-types/form/primitives/select/index.d.ts.map +1 -1
  583. package/build-types/form/primitives/select/item.d.ts +6 -2
  584. package/build-types/form/primitives/select/item.d.ts.map +1 -1
  585. package/build-types/form/primitives/select/popup.d.ts +10 -1
  586. package/build-types/form/primitives/select/popup.d.ts.map +1 -1
  587. package/build-types/form/primitives/select/portal.d.ts +8 -0
  588. package/build-types/form/primitives/select/portal.d.ts.map +1 -0
  589. package/build-types/form/primitives/select/stories/index.story.d.ts +14 -6
  590. package/build-types/form/primitives/select/stories/index.story.d.ts.map +1 -1
  591. package/build-types/form/primitives/select/trigger.d.ts +12 -2
  592. package/build-types/form/primitives/select/trigger.d.ts.map +1 -1
  593. package/build-types/form/primitives/select/types.d.ts +18 -3
  594. package/build-types/form/primitives/select/types.d.ts.map +1 -1
  595. package/build-types/index.d.ts +1 -0
  596. package/build-types/index.d.ts.map +1 -1
  597. package/build-types/link/link.d.ts.map +1 -1
  598. package/build-types/link/stories/index.story.d.ts +2 -3
  599. package/build-types/link/stories/index.story.d.ts.map +1 -1
  600. package/build-types/link/types.d.ts +1 -2
  601. package/build-types/link/types.d.ts.map +1 -1
  602. package/build-types/notice/action-link.d.ts.map +1 -1
  603. package/build-types/popover/context.d.ts +6 -13
  604. package/build-types/popover/context.d.ts.map +1 -1
  605. package/build-types/popover/description.d.ts +0 -1
  606. package/build-types/popover/description.d.ts.map +1 -1
  607. package/build-types/popover/index.d.ts +2 -1
  608. package/build-types/popover/index.d.ts.map +1 -1
  609. package/build-types/popover/popup.d.ts +3 -2
  610. package/build-types/popover/popup.d.ts.map +1 -1
  611. package/build-types/popover/portal.d.ts +9 -0
  612. package/build-types/popover/portal.d.ts.map +1 -0
  613. package/build-types/popover/root.d.ts +2 -2
  614. package/build-types/popover/stories/index.story.d.ts +24 -16
  615. package/build-types/popover/stories/index.story.d.ts.map +1 -1
  616. package/build-types/popover/title.d.ts.map +1 -1
  617. package/build-types/popover/types.d.ts +8 -15
  618. package/build-types/popover/types.d.ts.map +1 -1
  619. package/build-types/stack/stories/index.story.d.ts.map +1 -1
  620. package/build-types/tabs/context.d.ts.map +1 -1
  621. package/build-types/tabs/list.d.ts +2 -1
  622. package/build-types/tabs/list.d.ts.map +1 -1
  623. package/build-types/tabs/panel.d.ts +2 -1
  624. package/build-types/tabs/panel.d.ts.map +1 -1
  625. package/build-types/tabs/root.d.ts +2 -1
  626. package/build-types/tabs/root.d.ts.map +1 -1
  627. package/build-types/tabs/stories/index.story.d.ts +1 -1
  628. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  629. package/build-types/tabs/tab.d.ts +2 -1
  630. package/build-types/tabs/tab.d.ts.map +1 -1
  631. package/build-types/text/stories/index.story.d.ts.map +1 -1
  632. package/build-types/tooltip/index.d.ts +2 -1
  633. package/build-types/tooltip/index.d.ts.map +1 -1
  634. package/build-types/tooltip/popup.d.ts.map +1 -1
  635. package/build-types/tooltip/portal.d.ts +8 -0
  636. package/build-types/tooltip/portal.d.ts.map +1 -0
  637. package/build-types/tooltip/provider.d.ts +1 -1
  638. package/build-types/tooltip/provider.d.ts.map +1 -1
  639. package/build-types/tooltip/root.d.ts +9 -8
  640. package/build-types/tooltip/root.d.ts.map +1 -1
  641. package/build-types/tooltip/stories/index.story.d.ts +18 -1
  642. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  643. package/build-types/tooltip/stories/usage-guidelines.story.d.ts +21 -0
  644. package/build-types/tooltip/stories/usage-guidelines.story.d.ts.map +1 -0
  645. package/build-types/tooltip/trigger.d.ts.map +1 -1
  646. package/build-types/tooltip/types.d.ts +13 -5
  647. package/build-types/tooltip/types.d.ts.map +1 -1
  648. package/build-types/utils/create-overlay-modal-context.d.ts +14 -0
  649. package/build-types/utils/create-overlay-modal-context.d.ts.map +1 -0
  650. package/build-types/utils/create-overlay-title-validation.d.ts +15 -0
  651. package/build-types/utils/create-overlay-title-validation.d.ts.map +1 -0
  652. package/build-types/utils/render-portal-with-children.d.ts +16 -0
  653. package/build-types/utils/render-portal-with-children.d.ts.map +1 -0
  654. package/build-types/utils/types.d.ts +6 -2
  655. package/build-types/utils/types.d.ts.map +1 -1
  656. package/build-types/utils/use-deprioritized-initial-focus.d.ts +9 -8
  657. package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -1
  658. package/build-types/utils/use-overlay-scroll-state-attributes.d.ts +85 -0
  659. package/build-types/utils/use-overlay-scroll-state-attributes.d.ts.map +1 -0
  660. package/build-types/utils/use-schedule-validation.d.ts +13 -0
  661. package/build-types/utils/use-schedule-validation.d.ts.map +1 -0
  662. package/build-types/visually-hidden/stories/index.story.d.ts +7 -0
  663. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  664. package/build-types/visually-hidden/visually-hidden.d.ts +18 -0
  665. package/build-types/visually-hidden/visually-hidden.d.ts.map +1 -1
  666. package/package.json +12 -12
  667. package/src/alert-dialog/index.ts +1 -0
  668. package/src/alert-dialog/popup.tsx +114 -45
  669. package/src/alert-dialog/portal.tsx +17 -0
  670. package/src/alert-dialog/stories/index.story.tsx +123 -3
  671. package/src/alert-dialog/style.module.css +13 -4
  672. package/src/alert-dialog/test/index.test.tsx +380 -0
  673. package/src/alert-dialog/types.ts +33 -1
  674. package/src/badge/badge.tsx +11 -14
  675. package/src/badge/stories/choosing-intent.story.tsx +1 -1
  676. package/src/badge/stories/index.story.tsx +1 -0
  677. package/src/badge/style.module.css +0 -4
  678. package/src/button/style.module.css +4 -4
  679. package/src/card/stories/index.story.tsx +5 -4
  680. package/src/card/style.module.css +0 -4
  681. package/src/card/test/index.test.tsx +17 -0
  682. package/src/card/title.tsx +6 -5
  683. package/src/collapsible/stories/index.story.tsx +1 -0
  684. package/src/collapsible-card/content.tsx +12 -1
  685. package/src/collapsible-card/header.tsx +2 -0
  686. package/src/collapsible-card/stories/index.story.tsx +6 -5
  687. package/src/collapsible-card/style.module.css +16 -4
  688. package/src/dialog/content.tsx +47 -0
  689. package/src/dialog/context.tsx +14 -98
  690. package/src/dialog/description.tsx +27 -0
  691. package/src/dialog/footer.tsx +10 -2
  692. package/src/dialog/header.tsx +10 -2
  693. package/src/dialog/index.ts +16 -1
  694. package/src/dialog/popup.tsx +28 -7
  695. package/src/dialog/portal.tsx +18 -0
  696. package/src/dialog/root.tsx +22 -5
  697. package/src/dialog/stories/index.story.tsx +224 -47
  698. package/src/dialog/style.module.css +78 -24
  699. package/src/dialog/test/index.test.tsx +907 -148
  700. package/src/dialog/title.tsx +27 -13
  701. package/src/dialog/types.ts +71 -5
  702. package/src/drawer/action.tsx +28 -0
  703. package/src/drawer/close-icon.tsx +33 -0
  704. package/src/drawer/content.tsx +50 -0
  705. package/src/drawer/context.tsx +29 -0
  706. package/src/drawer/description.tsx +25 -0
  707. package/src/drawer/footer.tsx +34 -0
  708. package/src/drawer/header.tsx +34 -0
  709. package/src/drawer/index.ts +25 -0
  710. package/src/drawer/popup.tsx +100 -0
  711. package/src/drawer/portal.tsx +18 -0
  712. package/src/drawer/root.tsx +41 -0
  713. package/src/drawer/stories/index.story.tsx +543 -0
  714. package/src/drawer/style.module.css +324 -0
  715. package/src/drawer/test/index.test.tsx +1097 -0
  716. package/src/drawer/title.tsx +53 -0
  717. package/src/drawer/trigger.tsx +14 -0
  718. package/src/drawer/types.ts +174 -0
  719. package/src/empty-state/description.tsx +6 -2
  720. package/src/empty-state/stories/index.story.tsx +2 -1
  721. package/src/empty-state/style.module.css +1 -1
  722. package/src/empty-state/test/description.test.tsx +13 -0
  723. package/src/empty-state/test/title.test.tsx +13 -0
  724. package/src/empty-state/title.tsx +9 -2
  725. package/src/form/input-control/stories/index.story.tsx +4 -1
  726. package/src/form/primitives/autocomplete/clear.tsx +35 -0
  727. package/src/form/primitives/autocomplete/collection.tsx +13 -0
  728. package/src/form/primitives/autocomplete/empty.tsx +17 -0
  729. package/src/form/primitives/autocomplete/index.ts +12 -0
  730. package/src/form/primitives/autocomplete/input-group.tsx +16 -0
  731. package/src/form/primitives/autocomplete/input.tsx +20 -0
  732. package/src/form/primitives/autocomplete/item.tsx +24 -0
  733. package/src/form/primitives/autocomplete/list-body.tsx +23 -0
  734. package/src/form/primitives/autocomplete/list.tsx +17 -0
  735. package/src/form/primitives/autocomplete/popup.tsx +42 -0
  736. package/src/form/primitives/autocomplete/portal.tsx +16 -0
  737. package/src/form/primitives/autocomplete/root.tsx +11 -0
  738. package/src/form/primitives/autocomplete/stories/fixtures.ts +35 -0
  739. package/src/form/primitives/autocomplete/stories/index.story.tsx +437 -0
  740. package/src/form/primitives/autocomplete/style.module.css +7 -0
  741. package/src/form/primitives/autocomplete/test/index.test.tsx +162 -0
  742. package/src/form/primitives/autocomplete/types.ts +74 -0
  743. package/src/form/primitives/autocomplete/value.tsx +6 -0
  744. package/src/form/primitives/field/details.tsx +4 -2
  745. package/src/form/primitives/field/label.tsx +9 -5
  746. package/src/form/primitives/field/root.tsx +2 -2
  747. package/src/form/primitives/field/stories/index.story.tsx +1 -1
  748. package/src/form/primitives/field/test/index.test.tsx +11 -0
  749. package/src/form/primitives/fieldset/legend.tsx +9 -4
  750. package/src/form/primitives/fieldset/stories/index.story.tsx +1 -1
  751. package/src/form/primitives/fieldset/test/index.test.tsx +22 -0
  752. package/src/form/primitives/index.ts +1 -0
  753. package/src/form/primitives/input/stories/index.story.tsx +2 -1
  754. package/src/form/primitives/input-layout/stories/index.story.tsx +2 -1
  755. package/src/form/primitives/input-layout/style.module.css +3 -3
  756. package/src/form/primitives/select/index.ts +1 -0
  757. package/src/form/primitives/select/item.tsx +0 -1
  758. package/src/form/primitives/select/popup.tsx +34 -34
  759. package/src/form/primitives/select/portal.tsx +16 -0
  760. package/src/form/primitives/select/stories/index.story.tsx +21 -7
  761. package/src/form/primitives/select/test/index.test.tsx +64 -1
  762. package/src/form/primitives/select/types.ts +21 -4
  763. package/src/index.ts +1 -0
  764. package/src/link/link.tsx +12 -26
  765. package/src/link/stories/index.story.tsx +6 -11
  766. package/src/link/style.module.css +6 -18
  767. package/src/link/test/index.test.tsx +31 -27
  768. package/src/link/types.ts +1 -2
  769. package/src/notice/action-link.tsx +7 -4
  770. package/src/notice/style.module.css +6 -6
  771. package/src/popover/context.tsx +6 -89
  772. package/src/popover/description.tsx +2 -11
  773. package/src/popover/index.ts +2 -1
  774. package/src/popover/popup.tsx +17 -15
  775. package/src/popover/portal.tsx +17 -0
  776. package/src/popover/root.tsx +2 -2
  777. package/src/popover/stories/index.story.tsx +57 -26
  778. package/src/popover/style.module.css +36 -7
  779. package/src/popover/test/index.test.tsx +189 -74
  780. package/src/popover/title.tsx +10 -9
  781. package/src/popover/types.ts +10 -15
  782. package/src/stack/stories/index.story.tsx +1 -0
  783. package/src/tabs/context.tsx +14 -34
  784. package/src/tabs/list.tsx +0 -1
  785. package/src/tabs/panel.tsx +7 -2
  786. package/src/tabs/stories/index.story.tsx +2 -1
  787. package/src/tabs/style.module.css +2 -19
  788. package/src/tabs/test/index.test.tsx +7 -3
  789. package/src/text/stories/index.story.tsx +1 -0
  790. package/src/text/style.module.css +49 -49
  791. package/src/text/text.tsx +2 -2
  792. package/src/tooltip/index.ts +2 -1
  793. package/src/tooltip/popup.tsx +24 -27
  794. package/src/tooltip/portal.tsx +16 -0
  795. package/src/tooltip/provider.tsx +3 -3
  796. package/src/tooltip/root.tsx +11 -10
  797. package/src/tooltip/stories/index.story.tsx +39 -1
  798. package/src/tooltip/stories/usage-guidelines.mdx +91 -0
  799. package/src/tooltip/stories/usage-guidelines.story.tsx +123 -0
  800. package/src/tooltip/style.module.css +14 -2
  801. package/src/tooltip/test/index.test.tsx +67 -0
  802. package/src/tooltip/trigger.tsx +3 -7
  803. package/src/tooltip/types.ts +16 -5
  804. package/src/utils/create-overlay-modal-context.tsx +34 -0
  805. package/src/utils/create-overlay-title-validation.tsx +116 -0
  806. package/src/utils/css/field.module.css +10 -10
  807. package/src/utils/css/global-css-defense.module.css +1 -1
  808. package/src/utils/css/item-popup.module.css +11 -13
  809. package/src/utils/css/overlay-chrome.module.css +222 -0
  810. package/src/utils/render-portal-with-children.ts +27 -0
  811. package/src/utils/test/use-deprioritized-initial-focus.test.tsx +3 -3
  812. package/src/utils/types.ts +7 -2
  813. package/src/utils/use-deprioritized-initial-focus.ts +23 -17
  814. package/src/utils/use-overlay-scroll-state-attributes.ts +272 -0
  815. package/src/utils/use-schedule-validation.ts +45 -0
  816. package/src/visually-hidden/stories/index.story.tsx +26 -0
  817. package/src/visually-hidden/visually-hidden.tsx +23 -1
  818. package/build/types/css-modules.d.cjs +0 -2
  819. package/build/types/react.d.cjs +0 -5
  820. package/build/types/react.d.cjs.map +0 -7
  821. package/build-module/types/css-modules.d.mjs +0 -1
  822. package/build-module/types/react.d.mjs +0 -3
  823. package/build-module/types/react.d.mjs.map +0 -7
  824. package/src/types/css-modules.d.ts +0 -4
  825. package/src/types/react.d.ts +0 -7
  826. /package/build-module/{types/css-modules.d.mjs.map → drawer/types.mjs.map} +0 -0
  827. /package/{build/types/css-modules.d.cjs.map → build-module/form/primitives/autocomplete/types.mjs.map} +0 -0
@@ -84,4 +84,71 @@ describe( 'Tooltip', () => {
84
84
  screen.queryByText( 'Tooltip content' )
85
85
  ).not.toBeInTheDocument();
86
86
  } );
87
+
88
+ describe( 'portal', () => {
89
+ it( 'should render inside the portal container when a custom target is provided', async () => {
90
+ const user = userEvent.setup();
91
+ const containerRef = createRef< HTMLDivElement >();
92
+
93
+ render(
94
+ <TestProvider>
95
+ <div data-testid="wrapper">
96
+ <Tooltip.Root>
97
+ <Tooltip.Trigger>Hover me</Tooltip.Trigger>
98
+ <div
99
+ ref={ containerRef }
100
+ data-testid="custom-container"
101
+ />
102
+ <Tooltip.Popup
103
+ portal={
104
+ <Tooltip.Portal
105
+ container={ containerRef }
106
+ />
107
+ }
108
+ >
109
+ Tooltip content
110
+ </Tooltip.Popup>
111
+ </Tooltip.Root>
112
+ </div>
113
+ </TestProvider>
114
+ );
115
+
116
+ await user.hover(
117
+ screen.getByRole( 'button', { name: 'Hover me' } )
118
+ );
119
+
120
+ const content = await screen.findByText( 'Tooltip content' );
121
+ expect( content ).toBeVisible();
122
+
123
+ expect( screen.getByTestId( 'custom-container' ) ).toContainElement(
124
+ content
125
+ );
126
+ } );
127
+
128
+ it( 'should render with a portal by default', async () => {
129
+ const user = userEvent.setup();
130
+
131
+ render(
132
+ <TestProvider>
133
+ <div data-testid="wrapper">
134
+ <Tooltip.Root>
135
+ <Tooltip.Trigger>Hover me</Tooltip.Trigger>
136
+ <Tooltip.Popup>Tooltip content</Tooltip.Popup>
137
+ </Tooltip.Root>
138
+ </div>
139
+ </TestProvider>
140
+ );
141
+
142
+ await user.hover(
143
+ screen.getByRole( 'button', { name: 'Hover me' } )
144
+ );
145
+
146
+ const content = await screen.findByText( 'Tooltip content' );
147
+ expect( content ).toBeVisible();
148
+
149
+ expect( screen.getByTestId( 'wrapper' ) ).not.toContainElement(
150
+ content
151
+ );
152
+ } );
153
+ } );
87
154
  } );
@@ -1,14 +1,10 @@
1
- import { Tooltip } from '@base-ui/react/tooltip';
1
+ import { Tooltip as _Tooltip } from '@base-ui/react/tooltip';
2
2
  import { forwardRef } from '@wordpress/element';
3
3
  import type { TriggerProps } from './types';
4
4
 
5
5
  const Trigger = forwardRef< HTMLButtonElement, TriggerProps >(
6
- function TooltipTrigger( { children, ...props }, ref ) {
7
- return (
8
- <Tooltip.Trigger ref={ ref } { ...props }>
9
- { children }
10
- </Tooltip.Trigger>
11
- );
6
+ function TooltipTrigger( props, ref ) {
7
+ return <_Tooltip.Trigger ref={ ref } { ...props } />;
12
8
  }
13
9
  );
14
10
 
@@ -1,11 +1,14 @@
1
- import type { ReactNode } from 'react';
2
- import type { Tooltip } from '@base-ui/react/tooltip';
1
+ import type { ComponentPropsWithoutRef, ReactElement, ReactNode } from 'react';
2
+ import type { Tooltip as _Tooltip } from '@base-ui/react/tooltip';
3
+
3
4
  import type { ComponentProps } from '../utils/types';
4
5
 
5
- export type RootProps = Pick< Tooltip.Root.Props, 'disabled' | 'children' >;
6
+ export type PortalProps = ComponentPropsWithoutRef< typeof _Tooltip.Portal >;
7
+
8
+ export type RootProps = Pick< _Tooltip.Root.Props, 'disabled' | 'children' >;
6
9
 
7
10
  export type ProviderProps = Pick<
8
- Tooltip.Provider.Props,
11
+ _Tooltip.Provider.Props,
9
12
  'delay' | 'children'
10
13
  >;
11
14
 
@@ -18,9 +21,17 @@ export interface TriggerProps extends ComponentProps< 'button' > {
18
21
 
19
22
  export interface PopupProps
20
23
  extends ComponentProps< 'div' >,
21
- Pick< Tooltip.Positioner.Props, 'align' | 'side' | 'sideOffset' > {
24
+ Pick< _Tooltip.Positioner.Props, 'align' | 'side' | 'sideOffset' > {
22
25
  /**
23
26
  * The content to be rendered inside the component.
24
27
  */
25
28
  children?: ReactNode;
29
+
30
+ /**
31
+ * Optional portal element, typically `<Tooltip.Portal />` with custom
32
+ * `container`. When omitted, `Tooltip.Popup` uses `Tooltip.Portal` with
33
+ * default props. Do not pass `children` on the portal element; they would
34
+ * be ignored.
35
+ */
36
+ portal?: ReactElement< Omit< PortalProps, 'children' > >;
26
37
  }
@@ -0,0 +1,34 @@
1
+ import { createContext, useContext } from '@wordpress/element';
2
+
3
+ type OverlayModalProviderProps< Modal > = {
4
+ modal: Modal;
5
+ children: React.ReactNode;
6
+ };
7
+
8
+ /**
9
+ * Creates a modal context pair (`Provider` + `useModal`) for overlay
10
+ * primitives like Dialog and Drawer.
11
+ */
12
+ export function createOverlayModalContext< Modal >( initialValue: Modal ) {
13
+ const OverlayModalContext = createContext< Modal >( initialValue );
14
+
15
+ function OverlayModalProvider( {
16
+ modal,
17
+ children,
18
+ }: OverlayModalProviderProps< Modal > ) {
19
+ return (
20
+ <OverlayModalContext.Provider value={ modal }>
21
+ { children }
22
+ </OverlayModalContext.Provider>
23
+ );
24
+ }
25
+
26
+ function useOverlayModal() {
27
+ return useContext( OverlayModalContext );
28
+ }
29
+
30
+ return {
31
+ Provider: OverlayModalProvider,
32
+ useModal: useOverlayModal,
33
+ };
34
+ }
@@ -0,0 +1,116 @@
1
+ import {
2
+ createContext,
3
+ useCallback,
4
+ useContext,
5
+ useEffect,
6
+ useMemo,
7
+ useRef,
8
+ } from '@wordpress/element';
9
+ import { useScheduleValidation } from './use-schedule-validation';
10
+
11
+ /**
12
+ * Whether validation is enabled. This is a build-time constant that allows
13
+ * bundlers to tree-shake all validation code in production builds.
14
+ */
15
+ const VALIDATION_ENABLED = process.env.NODE_ENV !== 'production';
16
+
17
+ type OverlayValidationContextType = {
18
+ registerTitle: ( element: HTMLElement | null ) => () => void;
19
+ };
20
+
21
+ type OverlayValidationProviderProps = {
22
+ children: React.ReactNode;
23
+ };
24
+
25
+ /**
26
+ * Creates development-only title validation helpers for overlay primitives.
27
+ */
28
+ export function createOverlayTitleValidation( componentName: string ) {
29
+ const componentNameLowerCase = componentName.toLowerCase();
30
+ const OverlayValidationContext = VALIDATION_ENABLED
31
+ ? createContext< OverlayValidationContextType | null >( null )
32
+ : ( null as unknown as React.Context< OverlayValidationContextType | null > );
33
+
34
+ function useValidationContextDev() {
35
+ return useContext( OverlayValidationContext );
36
+ }
37
+
38
+ function useValidationContextProd() {
39
+ return null;
40
+ }
41
+
42
+ const useValidationContext = VALIDATION_ENABLED
43
+ ? useValidationContextDev
44
+ : useValidationContextProd;
45
+
46
+ function ValidationProviderDev( {
47
+ children,
48
+ }: OverlayValidationProviderProps ) {
49
+ const titleElementRef = useRef< HTMLElement | null >( null );
50
+
51
+ const scheduleValidation = useScheduleValidation( () => {
52
+ const titleElement = titleElementRef.current;
53
+
54
+ if ( ! titleElement ) {
55
+ throw new Error(
56
+ `${ componentName }: Missing <${ componentName }.Title>. ` +
57
+ `For accessibility, every ${ componentNameLowerCase } requires a title. ` +
58
+ 'If needed, the title can be visually hidden but must not be omitted.'
59
+ );
60
+ }
61
+
62
+ const textContent = titleElement.textContent?.trim();
63
+ if ( ! textContent ) {
64
+ throw new Error(
65
+ `${ componentName }: <${ componentName }.Title> cannot be empty. ` +
66
+ `Provide meaningful text content for the ${ componentNameLowerCase } title.`
67
+ );
68
+ }
69
+ } );
70
+
71
+ const registerTitle = useCallback(
72
+ ( element: HTMLElement | null ) => {
73
+ titleElementRef.current = element;
74
+ scheduleValidation();
75
+
76
+ return () => {
77
+ titleElementRef.current = null;
78
+ scheduleValidation();
79
+ };
80
+ },
81
+ [ scheduleValidation ]
82
+ );
83
+
84
+ const contextValue = useMemo(
85
+ () => ( { registerTitle } ),
86
+ [ registerTitle ]
87
+ );
88
+
89
+ // Schedule an initial validation on mount to catch missing titles
90
+ // (when no Title component is rendered, registerTitle is never called).
91
+ useEffect( () => {
92
+ scheduleValidation();
93
+ }, [ scheduleValidation ] );
94
+
95
+ return (
96
+ <OverlayValidationContext.Provider value={ contextValue }>
97
+ { children }
98
+ </OverlayValidationContext.Provider>
99
+ );
100
+ }
101
+
102
+ function ValidationProviderProd( {
103
+ children,
104
+ }: OverlayValidationProviderProps ) {
105
+ return <>{ children }</>;
106
+ }
107
+
108
+ const ValidationProvider = VALIDATION_ENABLED
109
+ ? ValidationProviderDev
110
+ : ValidationProviderProd;
111
+
112
+ return {
113
+ ValidationProvider,
114
+ useValidationContext,
115
+ };
116
+ }
@@ -2,29 +2,29 @@
2
2
 
3
3
  @layer wp-ui-utilities {
4
4
  .label {
5
- --wp-ui-field-label-line-height: var(--wpds-font-line-height-xs);
5
+ --wp-ui-field-label-line-height: var(--wpds-typography-line-height-xs);
6
6
 
7
- font-family: var(--wpds-font-family-body);
8
- font-size: var(--wpds-font-size-xs);
7
+ font-family: var(--wpds-typography-font-family-body);
8
+ font-size: var(--wpds-typography-font-size-xs);
9
9
  line-height: var(--wp-ui-field-label-line-height);
10
- font-weight: var(--wpds-font-weight-medium);
10
+ font-weight: var(--wpds-typography-font-weight-medium);
11
11
  text-transform: uppercase;
12
12
  color: var(--wpds-color-fg-content-neutral);
13
13
 
14
14
  &.is-plain {
15
- font-size: var(--wpds-font-size-md);
15
+ font-size: var(--wpds-typography-font-size-md);
16
16
  text-transform: none;
17
17
  }
18
18
  }
19
19
 
20
20
  .description {
21
- --_gcd-p-font-size: var(--wpds-font-size-sm);
22
- --_gcd-p-line-height: var(--wpds-font-line-height-xs);
21
+ --_gcd-p-font-size: var(--wpds-typography-font-size-sm);
22
+ --_gcd-p-line-height: var(--wpds-typography-line-height-xs);
23
23
  --_gcd-p-margin: 0;
24
24
 
25
- font-family: var(--wpds-font-family-body);
26
- font-size: var(--wpds-font-size-sm);
27
- line-height: var(--wpds-font-line-height-xs);
25
+ font-family: var(--wpds-typography-font-family-body);
26
+ font-size: var(--wpds-typography-font-size-sm);
27
+ line-height: var(--wpds-typography-line-height-xs);
28
28
  color: var(--wpds-color-fg-content-neutral-weak);
29
29
  }
30
30
  }
@@ -103,7 +103,7 @@ p.p {
103
103
  :is(h1, h2, h3, h4, h5, h6).heading {
104
104
  color: var(--_gcd-heading-color, var(--wpds-color-fg-content-neutral));
105
105
  font-size: var(--_gcd-heading-font-size, inherit);
106
- font-weight: var(--_gcd-heading-font-weight, var(--wpds-font-weight-medium));
106
+ font-weight: var(--_gcd-heading-font-weight, var(--wpds-typography-font-weight-medium));
107
107
  margin: var(--_gcd-heading-margin, 0);
108
108
  }
109
109
 
@@ -13,11 +13,11 @@
13
13
  min-width: var(--anchor-width);
14
14
  max-width: var(--available-width);
15
15
  border-radius: var(--wpds-border-radius-md);
16
- border: 1px solid var(--wpds-color-stroke-surface-neutral);
16
+ border: var(--wpds-border-width-xs) solid var(--wpds-color-stroke-surface-neutral);
17
17
  box-shadow: var(--wpds-elevation-md);
18
18
  background-color: var(--wpds-color-bg-surface-neutral-strong);
19
- font-family: var(--wpds-font-family-body);
20
- font-size: var(--wpds-font-size-md);
19
+ font-family: var(--wpds-typography-font-family-body);
20
+ font-size: var(--wpds-typography-font-size-md);
21
21
  line-height: 1.4;
22
22
  color: var(--wpds-color-fg-interactive-neutral);
23
23
  }
@@ -45,7 +45,7 @@
45
45
  padding-block: var(--wp-ui-popup-padding);
46
46
 
47
47
  .list-scrollable-container:not(:empty) + & {
48
- border-block-start: 1px solid var(--wpds-color-stroke-surface-neutral);
48
+ border-block-start: var(--wpds-border-width-xs) solid var(--wpds-color-stroke-surface-neutral);
49
49
  }
50
50
  }
51
51
 
@@ -55,8 +55,7 @@
55
55
  --wp-ui-popup-item-padding-inline: 12px;
56
56
  --wp-ui-popup-item-padding-block: 4px;
57
57
 
58
- display: grid;
59
- grid-template-columns: 24px 1fr;
58
+ display: flex;
60
59
  align-items: center;
61
60
  justify-content: flex-start;
62
61
  gap: var(--wpds-dimension-gap-xs);
@@ -106,23 +105,22 @@
106
105
  }
107
106
  }
108
107
 
109
- .item-indicator {
110
- justify-self: center;
108
+ .item-indicator-icon {
109
+ flex-shrink: 0;
111
110
  }
112
111
 
113
- .empty {
112
+ /* Only style when there is content, because otherwise the element would block clicks
113
+ on the .list beneath it (both share grid-area: main and overlap). */
114
+ .empty:not(:empty) {
114
115
  --wp-ui-popup-empty-min-height: 40px;
115
116
  --wp-ui-popup-empty-padding-inline: 12px;
116
117
 
117
118
  grid-area: main;
118
119
  display: flex;
119
120
  align-items: center;
121
+ min-height: var(--wp-ui-popup-empty-min-height);
120
122
  padding-inline: var(--wp-ui-popup-empty-padding-inline);
121
123
  color: var(--wpds-color-fg-content-neutral-weak);
122
-
123
- &:not(:empty) {
124
- min-height: var(--wp-ui-popup-empty-min-height);
125
- }
126
124
  }
127
125
 
128
126
  }
@@ -0,0 +1,222 @@
1
+ @layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;
2
+
3
+ @layer wp-ui-components {
4
+ /*
5
+ * Shared chrome + scroll-container primitives for overlay popups
6
+ * (Dialog, AlertDialog, Drawer).
7
+ *
8
+ * Layout model: the popup is a vertical flex column with three regions
9
+ * — `.header`, `.content`, `.footer`. Only `.content` scrolls; the
10
+ * chrome sits at the popup's block-axis edges as natural flex siblings.
11
+ *
12
+ * Sticky opt-out for `Dialog` / `Drawer` is expressed in the DOM by
13
+ * placing `Dialog.Header` / `Dialog.Footer` (or the Drawer equivalents)
14
+ * inside `Dialog.Content` / `Drawer.Content` so they scroll with the
15
+ * body; AlertDialog exposes the same choice via `stickyHeader` /
16
+ * `stickyFooter` props, since it owns its internal DOM.
17
+ */
18
+
19
+ /*
20
+ * Chrome: flex row, no background (the popup already paints it), no
21
+ * sticky positioning. Block-axis padding is asymmetric: the outer
22
+ * side (popup edge) uses `padding-2xl` to match the inset that used
23
+ * to live on the popup; the inner side (toward `.content`) uses the
24
+ * tokenized `gap-lg` in full.
25
+ *
26
+ * No separator border here — the base chrome has none. The pinned
27
+ * case (where a separator is needed) adds a `border-block-*: 1px
28
+ * solid transparent` on the inner side and subtracts 1px from that
29
+ * same padding so the chrome's overall border-box height stays
30
+ * identical to the non-pinned case. See the `:has(~ .content)` /
31
+ * `.content ~` rules below.
32
+ *
33
+ * `min-height` on `.header` keeps the header footprint stable whether
34
+ * or not a close icon is rendered (notably the AlertDialog case, which
35
+ * has no close button).
36
+ */
37
+ .header {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: var(--wpds-dimension-gap-sm);
41
+ padding-block: var(--wpds-dimension-padding-2xl) var(--wpds-dimension-gap-lg);
42
+ padding-inline: var(--wpds-dimension-padding-2xl);
43
+ /* TODO: refactor to a DS element size token when available. */
44
+ min-height: 32px;
45
+ }
46
+
47
+ .footer {
48
+ display: flex;
49
+ justify-content: flex-end;
50
+ align-items: center;
51
+ gap: var(--wpds-dimension-gap-sm);
52
+ padding-block: var(--wpds-dimension-gap-lg) var(--wpds-dimension-padding-2xl);
53
+ padding-inline: var(--wpds-dimension-padding-2xl);
54
+ }
55
+
56
+ /*
57
+ * Overlay heading defaults: anchor the title to the inline start and
58
+ * set the neutral text color explicitly. `--_gcd-heading-color` and
59
+ * `--_gcd-heading-margin` defend against the heading-reset rules in
60
+ * `global-css-defense.module.css`, which would otherwise take over a
61
+ * `<h2>` rendered via `Text`.
62
+ */
63
+ .title {
64
+ color: var(--wpds-color-fg-content-neutral);
65
+ --_gcd-heading-color: var(--wpds-color-fg-content-neutral);
66
+
67
+ margin-inline-end: auto;
68
+ --_gcd-heading-margin: 0 auto 0 0;
69
+
70
+ &:dir(rtl) {
71
+ --_gcd-heading-margin: 0 0 0 auto;
72
+ }
73
+ }
74
+
75
+ /*
76
+ * Scroll container. `flex: 1 1 auto` + `min-block-size: 0` lets it
77
+ * shrink below its content size so `overflow-block: auto` can actually
78
+ * show a scrollbar when content exceeds the available space. Default
79
+ * padding is `padding-2xl` on all sides; the yield rules below strip
80
+ * block padding when chrome occupies that edge.
81
+ *
82
+ * Scrolling is intentionally block-axis-only. `overflow-inline: hidden`
83
+ * clips wide content instead of introducing a horizontal scrollbar:
84
+ * the sibling chrome doesn't scroll inline, the popup edge already
85
+ * clips, and `useOverlayScrollStateAttributes` only tracks block-axis
86
+ * overflow (tabindex + separator state). Overlay consumers should
87
+ * constrain content width rather than rely on horizontal scroll.
88
+ */
89
+ .content {
90
+ flex: 1 1 auto;
91
+ min-block-size: 0;
92
+ overflow-block: auto;
93
+ overflow-inline: hidden;
94
+ padding: var(--wpds-dimension-padding-2xl);
95
+
96
+ /*
97
+ * The shared `outset-ring--focus-visible` utility (composed by
98
+ * the Content components) uses an `outline-offset` of `+1px`,
99
+ * which for this scroll container would put the ring outside
100
+ * the popup's rounded corners and have it clipped by the
101
+ * popup's `overflow: hidden`. Inset the ring by the focus
102
+ * width instead, so it sits flush inside the content box.
103
+ *
104
+ * The shared utility's transition shorthand (`transition:
105
+ * outline …`) only animates outline-color and outline-width,
106
+ * not outline-offset, so the negative offset applied here is
107
+ * static — visually, the ring still fades in/out via color
108
+ * change while the offset stays put.
109
+ */
110
+ &:focus-visible {
111
+ outline-offset: calc(var(--wpds-border-width-focus) * -1);
112
+ }
113
+ }
114
+
115
+ /*
116
+ * Pinned chrome: reserve 1px on the inner side for the separator
117
+ * border and subtract that same 1px from the adjacent padding. Net
118
+ * effect on block-axis height is zero — the chrome's overall
119
+ * border-box matches the non-pinned case — while the border provides
120
+ * a fixed slot that the scroll-state rules below colorize.
121
+ *
122
+ * `.content` then drops its matching block-axis padding on that
123
+ * edge, because the chrome already supplies the popup-edge
124
+ * `padding-2xl` + inner `gap-lg`.
125
+ *
126
+ * Sibling relationships intentionally use the general-sibling
127
+ * combinator (`~`) and `:has(~ …)` instead of the adjacent
128
+ * combinator, so an extra element between header / content / footer
129
+ * (custom wrappers, an a11y live region, etc.) doesn't silently
130
+ * break the pinned layout. The expected DOM shape is still
131
+ * header → content → footer; additional siblings in between are
132
+ * tolerated.
133
+ */
134
+ .header:has(~ .content) {
135
+ padding-block-end: calc(var(--wpds-dimension-gap-lg) - 1px);
136
+ border-block-end: 1px solid transparent;
137
+ }
138
+
139
+ .header ~ .content {
140
+ padding-block-start: 0;
141
+ }
142
+
143
+ .content ~ .footer {
144
+ padding-block-start: calc(var(--wpds-dimension-gap-lg) - 1px);
145
+ border-block-start: 1px solid transparent;
146
+ }
147
+
148
+ .content:has(~ .footer) {
149
+ padding-block-end: 0;
150
+ }
151
+
152
+ /*
153
+ * Non-pinned case: when `.header` / `.footer` live inside `.content`
154
+ * (scrolls with body). The scroll container already supplies the
155
+ * inline popup-edge padding, so nested chrome always collapses its
156
+ * own `padding-inline` regardless of its position inside `.content`
157
+ * (no `:first-child` / `:last-child` guard). Block-axis padding is
158
+ * only collapsed at the scroll edges — the `:first-child` /
159
+ * `:last-child` rules keep the body's `gap-lg` visual separation
160
+ * between the chrome and any preceding / following siblings inside
161
+ * `.content`. No border — the separator is specific to the pinned
162
+ * case.
163
+ */
164
+ .content > .header {
165
+ padding-inline: 0;
166
+ }
167
+
168
+ .content > .header:first-child {
169
+ padding-block-start: 0;
170
+ }
171
+
172
+ .content > .footer {
173
+ padding-inline: 0;
174
+ }
175
+
176
+ .content > .footer:last-child {
177
+ padding-block-end: 0;
178
+ }
179
+
180
+ /*
181
+ * Separator coloring. The transparent border on the pinned chrome is
182
+ * colorized when the adjacent scroll container reports off-screen
183
+ * content in that direction. Toggling the color (not the border's
184
+ * existence) means no layout shift on scroll.
185
+ *
186
+ * `useOverlayScrollStateAttributes` owns the
187
+ * `data-wp-ui-overlay-scrolled-from-*` toggles, so CSS handles the
188
+ * visual state without React re-rendering on scroll.
189
+ *
190
+ * Forced-colors note: `border-color: transparent` is preserved as-is
191
+ * in forced-colors mode per spec, so the default (non-scrolled)
192
+ * state stays invisible. When the color toggles to a token value
193
+ * below, the UA substitutes a system color (typically `CanvasText`),
194
+ * so the separator remains visible in forced-colors mode without
195
+ * any additional rules.
196
+ */
197
+ .header:has(~ [data-wp-ui-overlay-scroll-container][data-wp-ui-overlay-scrolled-from-top]) {
198
+ border-block-end-color: var(--wpds-color-stroke-surface-neutral);
199
+ }
200
+
201
+ [data-wp-ui-overlay-scroll-container][data-wp-ui-overlay-scrolled-from-bottom] ~ .footer {
202
+ border-block-start-color: var(--wpds-color-stroke-surface-neutral);
203
+ }
204
+
205
+ /*
206
+ * `overscroll-behavior: contain` stops scroll chaining from the overlay
207
+ * to whatever sits behind it. We only want that when the overlay is
208
+ * modal: a non-modal overlay lets the page underneath remain
209
+ * interactive, and chaining scroll to the page there is the intuitive
210
+ * behavior.
211
+ *
212
+ * `data-wp-ui-overlay-modal` is toggled on the popup by each component
213
+ * (Dialog / Drawer mirror their `modal` prop; AlertDialog is always
214
+ * modal). The scroll container always lives inside the popup —
215
+ * `Dialog.Content` / `Drawer.Content` for the public API, or an
216
+ * internal container for AlertDialog — so a single descendant
217
+ * selector anchored at the modal popup covers all three.
218
+ */
219
+ [data-wp-ui-overlay-modal] [data-wp-ui-overlay-scroll-container] {
220
+ overscroll-behavior: contain;
221
+ }
222
+ }
@@ -0,0 +1,27 @@
1
+ import { cloneElement } from '@wordpress/element';
2
+ import type { ReactElement, ReactNode } from 'react';
3
+
4
+ /**
5
+ * Renders overlay markup (`children`) through an optional `portal` element from
6
+ * `portal={ <Component.Portal … /> }`, or through the package default portal.
7
+ *
8
+ * Shared by overlay `Popup` components so portal merge behavior stays consistent.
9
+ *
10
+ * @param portal Optional element from the `portal` prop (should have no
11
+ * `children`; callers type this via `Omit<PortalProps,'children'>`).
12
+ * When omitted, `defaultPortal` is used. Injected `children`
13
+ * replace any subtree on the portal element.
14
+ * @param defaultPortal Unpopulated default portal element (e.g. `<Dialog.Portal />`).
15
+ * @param children Popup subtree (backdrop, positioner, etc.) to inject as the portal’s children.
16
+ */
17
+ export function renderPortalWithChildren(
18
+ portal: ReactElement | undefined,
19
+ defaultPortal: ReactElement,
20
+ children: ReactNode
21
+ ): ReactElement {
22
+ const rootPortal = portal ?? defaultPortal;
23
+
24
+ return cloneElement( rootPortal, {
25
+ children,
26
+ } );
27
+ }
@@ -17,7 +17,7 @@ function TestHarness( {
17
17
  } ) {
18
18
  const result = useDeprioritizedInitialFocus( {
19
19
  initialFocus,
20
- deprioritizedAttribute: ATTR,
20
+ deprioritizedAttributes: [ ATTR ],
21
21
  } );
22
22
 
23
23
  useEffect( () => {
@@ -156,7 +156,7 @@ describe( 'useDeprioritizedInitialFocus', () => {
156
156
  } ) {
157
157
  const result = useDeprioritizedInitialFocus( {
158
158
  initialFocus: undefined,
159
- deprioritizedAttribute: ATTR,
159
+ deprioritizedAttributes: [ ATTR ],
160
160
  } );
161
161
 
162
162
  useEffect( () => {
@@ -200,7 +200,7 @@ describe( 'useDeprioritizedInitialFocus', () => {
200
200
  } ) {
201
201
  const result = useDeprioritizedInitialFocus( {
202
202
  initialFocus: undefined,
203
- deprioritizedAttribute: ATTR,
203
+ deprioritizedAttributes: [ ATTR ],
204
204
  } );
205
205
 
206
206
  useEffect( () => {
@@ -14,13 +14,18 @@ type ComponentRenderFn< Props > = (
14
14
 
15
15
  export type ComponentProps< E extends ElementType > = Omit<
16
16
  ComponentPropsWithoutRef< E >,
17
- 'className' | 'children' | 'render'
17
+ 'className' | 'children' | 'render' | 'style'
18
18
  > & {
19
19
  /**
20
- * CSS class name to apply to the component.
20
+ * CSS class name to apply to the element.
21
21
  */
22
22
  className?: string;
23
23
 
24
+ /**
25
+ * CSS style to apply to the element.
26
+ */
27
+ style?: React.CSSProperties;
28
+
24
29
  /**
25
30
  * Replaces the component's default HTML element using a given React
26
31
  * element, or a function that returns a React element.