@wordpress/ui 0.12.1-next.v.202604201441.0 → 0.13.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 (857) hide show
  1. package/CHANGELOG.md +59 -2
  2. package/CONTRIBUTING.md +34 -0
  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 +194 -59
  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/badge/badge.cjs +84 -5
  11. package/build/badge/badge.cjs.map +3 -3
  12. package/build/button/button.cjs +90 -20
  13. package/build/button/button.cjs.map +3 -3
  14. package/build/button/icon.cjs.map +2 -2
  15. package/build/button/index.cjs +1 -0
  16. package/build/button/index.cjs.map +3 -3
  17. package/build/button/types.cjs.map +1 -1
  18. package/build/card/content.cjs +84 -5
  19. package/build/card/content.cjs.map +3 -3
  20. package/build/card/full-bleed.cjs +84 -5
  21. package/build/card/full-bleed.cjs.map +3 -3
  22. package/build/card/header.cjs +84 -5
  23. package/build/card/header.cjs.map +3 -3
  24. package/build/card/root.cjs +86 -10
  25. package/build/card/root.cjs.map +3 -3
  26. package/build/collapsible-card/content.cjs +90 -7
  27. package/build/collapsible-card/content.cjs.map +3 -3
  28. package/build/collapsible-card/header.cjs +131 -52
  29. package/build/collapsible-card/header.cjs.map +3 -3
  30. package/build/dialog/content.cjs +161 -0
  31. package/build/dialog/content.cjs.map +7 -0
  32. package/build/dialog/context.cjs +12 -56
  33. package/build/dialog/context.cjs.map +2 -2
  34. package/build/dialog/description.cjs +138 -0
  35. package/build/dialog/description.cjs.map +7 -0
  36. package/build/dialog/footer.cjs +86 -6
  37. package/build/dialog/footer.cjs.map +3 -3
  38. package/build/dialog/header.cjs +86 -6
  39. package/build/dialog/header.cjs.map +3 -3
  40. package/build/dialog/index.cjs +9 -0
  41. package/build/dialog/index.cjs.map +2 -2
  42. package/build/dialog/popup.cjs +102 -11
  43. package/build/dialog/popup.cjs.map +3 -3
  44. package/build/dialog/portal.cjs +38 -0
  45. package/build/dialog/portal.cjs.map +7 -0
  46. package/build/dialog/root.cjs +3 -2
  47. package/build/dialog/root.cjs.map +2 -2
  48. package/build/dialog/title.cjs +85 -6
  49. package/build/dialog/title.cjs.map +3 -3
  50. package/build/dialog/types.cjs.map +1 -1
  51. package/build/drawer/action.cjs +48 -0
  52. package/build/drawer/action.cjs.map +7 -0
  53. package/build/drawer/close-icon.cjs +58 -0
  54. package/build/drawer/close-icon.cjs.map +7 -0
  55. package/build/drawer/content.cjs +170 -0
  56. package/build/drawer/content.cjs.map +7 -0
  57. package/build/drawer/context.cjs +44 -0
  58. package/build/drawer/context.cjs.map +7 -0
  59. package/build/drawer/description.cjs +47 -0
  60. package/build/drawer/description.cjs.map +7 -0
  61. package/build/drawer/footer.cjs +144 -0
  62. package/build/drawer/footer.cjs.map +7 -0
  63. package/build/drawer/header.cjs +144 -0
  64. package/build/drawer/header.cjs.map +7 -0
  65. package/build/drawer/index.cjs +61 -0
  66. package/build/drawer/index.cjs.map +7 -0
  67. package/build/drawer/popup.cjs +182 -0
  68. package/build/drawer/popup.cjs.map +7 -0
  69. package/build/drawer/portal.cjs +38 -0
  70. package/build/drawer/portal.cjs.map +7 -0
  71. package/build/drawer/root.cjs +49 -0
  72. package/build/drawer/root.cjs.map +7 -0
  73. package/build/drawer/title.cjs +149 -0
  74. package/build/drawer/title.cjs.map +7 -0
  75. package/build/drawer/trigger.cjs +38 -0
  76. package/build/drawer/trigger.cjs.map +7 -0
  77. package/build/drawer/types.cjs +19 -0
  78. package/build/drawer/types.cjs.map +7 -0
  79. package/build/empty-state/actions.cjs +84 -5
  80. package/build/empty-state/actions.cjs.map +3 -3
  81. package/build/empty-state/description.cjs +84 -5
  82. package/build/empty-state/description.cjs.map +3 -3
  83. package/build/empty-state/icon.cjs +84 -5
  84. package/build/empty-state/icon.cjs.map +3 -3
  85. package/build/empty-state/root.cjs +84 -5
  86. package/build/empty-state/root.cjs.map +3 -3
  87. package/build/empty-state/title.cjs +84 -5
  88. package/build/empty-state/title.cjs.map +3 -3
  89. package/build/empty-state/visual.cjs +84 -5
  90. package/build/empty-state/visual.cjs.map +3 -3
  91. package/build/form/index.cjs +3 -1
  92. package/build/form/index.cjs.map +2 -2
  93. package/build/form/primitives/autocomplete/clear.cjs +62 -0
  94. package/build/form/primitives/autocomplete/clear.cjs.map +7 -0
  95. package/build/form/primitives/autocomplete/collection.cjs +38 -0
  96. package/build/form/primitives/autocomplete/collection.cjs.map +7 -0
  97. package/build/form/primitives/autocomplete/empty.cjs +146 -0
  98. package/build/form/primitives/autocomplete/empty.cjs.map +7 -0
  99. package/build/form/primitives/autocomplete/index.cjs +64 -0
  100. package/build/form/primitives/autocomplete/index.cjs.map +7 -0
  101. package/build/form/primitives/autocomplete/input-group.cjs +36 -0
  102. package/build/form/primitives/autocomplete/input-group.cjs.map +7 -0
  103. package/build/form/primitives/autocomplete/input.cjs +47 -0
  104. package/build/form/primitives/autocomplete/input.cjs.map +7 -0
  105. package/build/form/primitives/autocomplete/item.cjs +157 -0
  106. package/build/form/primitives/autocomplete/item.cjs.map +7 -0
  107. package/build/form/primitives/autocomplete/list-body.cjs +136 -0
  108. package/build/form/primitives/autocomplete/list-body.cjs.map +7 -0
  109. package/build/form/primitives/autocomplete/list.cjs +146 -0
  110. package/build/form/primitives/autocomplete/list.cjs.map +7 -0
  111. package/build/form/primitives/autocomplete/popup.cjs +175 -0
  112. package/build/form/primitives/autocomplete/popup.cjs.map +7 -0
  113. package/build/form/primitives/autocomplete/portal.cjs +38 -0
  114. package/build/form/primitives/autocomplete/portal.cjs.map +7 -0
  115. package/build/form/primitives/autocomplete/root.cjs +35 -0
  116. package/build/form/primitives/autocomplete/root.cjs.map +7 -0
  117. package/build/form/primitives/autocomplete/types.cjs +19 -0
  118. package/build/form/primitives/autocomplete/types.cjs.map +7 -0
  119. package/build/form/primitives/autocomplete/value.cjs +35 -0
  120. package/build/form/primitives/autocomplete/value.cjs.map +7 -0
  121. package/build/form/primitives/field/description.cjs +86 -10
  122. package/build/form/primitives/field/description.cjs.map +3 -3
  123. package/build/form/primitives/field/details.cjs +84 -5
  124. package/build/form/primitives/field/details.cjs.map +3 -3
  125. package/build/form/primitives/field/label.cjs +84 -5
  126. package/build/form/primitives/field/label.cjs.map +3 -3
  127. package/build/form/primitives/field/root.cjs +84 -5
  128. package/build/form/primitives/field/root.cjs.map +3 -3
  129. package/build/form/primitives/fieldset/description.cjs +86 -10
  130. package/build/form/primitives/fieldset/description.cjs.map +3 -3
  131. package/build/form/primitives/fieldset/details.cjs +84 -5
  132. package/build/form/primitives/fieldset/details.cjs.map +3 -3
  133. package/build/form/primitives/fieldset/legend.cjs +84 -5
  134. package/build/form/primitives/fieldset/legend.cjs.map +3 -3
  135. package/build/form/primitives/fieldset/root.cjs +84 -5
  136. package/build/form/primitives/fieldset/root.cjs.map +3 -3
  137. package/build/form/primitives/index.cjs +3 -0
  138. package/build/form/primitives/index.cjs.map +2 -2
  139. package/build/form/primitives/input/input.cjs +88 -15
  140. package/build/form/primitives/input/input.cjs.map +3 -3
  141. package/build/form/primitives/input-layout/input-layout.cjs +88 -15
  142. package/build/form/primitives/input-layout/input-layout.cjs.map +3 -3
  143. package/build/form/primitives/input-layout/slot.cjs +84 -5
  144. package/build/form/primitives/input-layout/slot.cjs.map +3 -3
  145. package/build/form/primitives/select/index.cjs +3 -0
  146. package/build/form/primitives/select/index.cjs.map +2 -2
  147. package/build/form/primitives/select/item.cjs +88 -13
  148. package/build/form/primitives/select/item.cjs.map +3 -3
  149. package/build/form/primitives/select/popup.cjs +97 -23
  150. package/build/form/primitives/select/popup.cjs.map +3 -3
  151. package/build/form/primitives/select/portal.cjs +38 -0
  152. package/build/form/primitives/select/portal.cjs.map +7 -0
  153. package/build/form/primitives/select/root.cjs.map +2 -2
  154. package/build/form/primitives/select/trigger.cjs +98 -16
  155. package/build/form/primitives/select/trigger.cjs.map +3 -3
  156. package/build/form/primitives/select/types.cjs.map +1 -1
  157. package/build/form/primitives/textarea/textarea.cjs +86 -10
  158. package/build/form/primitives/textarea/textarea.cjs.map +3 -3
  159. package/build/form/select-control/context.cjs +37 -0
  160. package/build/form/select-control/context.cjs.map +7 -0
  161. package/build/form/select-control/index.cjs +39 -0
  162. package/build/form/select-control/index.cjs.map +7 -0
  163. package/build/form/select-control/item.cjs +41 -0
  164. package/build/form/select-control/item.cjs.map +7 -0
  165. package/build/form/select-control/select-control.cjs +75 -0
  166. package/build/form/select-control/select-control.cjs.map +7 -0
  167. package/build/form/select-control/types.cjs +19 -0
  168. package/build/form/select-control/types.cjs.map +7 -0
  169. package/build/form/types.cjs.map +1 -1
  170. package/build/icon-button/icon-button.cjs +86 -6
  171. package/build/icon-button/icon-button.cjs.map +3 -3
  172. package/build/icon-button/types.cjs.map +1 -1
  173. package/build/index.cjs +3 -0
  174. package/build/index.cjs.map +2 -2
  175. package/build/link/link.cjs +90 -20
  176. package/build/link/link.cjs.map +3 -3
  177. package/build/notice/action-button.cjs +84 -5
  178. package/build/notice/action-button.cjs.map +3 -3
  179. package/build/notice/action-link.cjs +84 -5
  180. package/build/notice/action-link.cjs.map +3 -3
  181. package/build/notice/actions.cjs +84 -5
  182. package/build/notice/actions.cjs.map +3 -3
  183. package/build/notice/close-icon.cjs +84 -5
  184. package/build/notice/close-icon.cjs.map +3 -3
  185. package/build/notice/description.cjs +84 -5
  186. package/build/notice/description.cjs.map +3 -3
  187. package/build/notice/root.cjs +86 -10
  188. package/build/notice/root.cjs.map +3 -3
  189. package/build/notice/title.cjs +84 -5
  190. package/build/notice/title.cjs.map +3 -3
  191. package/build/popover/arrow.cjs +85 -6
  192. package/build/popover/arrow.cjs.map +3 -3
  193. package/build/popover/context.cjs +4 -56
  194. package/build/popover/context.cjs.map +2 -2
  195. package/build/popover/description.cjs +1 -24
  196. package/build/popover/description.cjs.map +4 -4
  197. package/build/popover/index.cjs +3 -0
  198. package/build/popover/index.cjs.map +2 -2
  199. package/build/popover/popup.cjs +96 -23
  200. package/build/popover/popup.cjs.map +3 -3
  201. package/build/popover/portal.cjs +38 -0
  202. package/build/popover/portal.cjs.map +7 -0
  203. package/build/popover/root.cjs.map +1 -1
  204. package/build/popover/title.cjs +92 -2
  205. package/build/popover/title.cjs.map +3 -3
  206. package/build/popover/types.cjs.map +1 -1
  207. package/build/stack/stack.cjs +84 -5
  208. package/build/stack/stack.cjs.map +3 -3
  209. package/build/tabs/list.cjs +84 -5
  210. package/build/tabs/list.cjs.map +3 -3
  211. package/build/tabs/panel.cjs +86 -10
  212. package/build/tabs/panel.cjs.map +3 -3
  213. package/build/tabs/tab.cjs +84 -5
  214. package/build/tabs/tab.cjs.map +3 -3
  215. package/build/text/text.cjs +88 -12
  216. package/build/text/text.cjs.map +3 -3
  217. package/build/tooltip/index.cjs +6 -0
  218. package/build/tooltip/index.cjs.map +2 -2
  219. package/build/tooltip/popup.cjs +114 -46
  220. package/build/tooltip/popup.cjs.map +4 -4
  221. package/build/tooltip/portal.cjs +38 -0
  222. package/build/tooltip/portal.cjs.map +7 -0
  223. package/build/tooltip/positioner.cjs +159 -0
  224. package/build/tooltip/positioner.cjs.map +7 -0
  225. package/build/tooltip/provider.cjs +2 -2
  226. package/build/tooltip/provider.cjs.map +3 -3
  227. package/build/tooltip/root.cjs.map +3 -3
  228. package/build/tooltip/trigger.cjs +2 -2
  229. package/build/tooltip/trigger.cjs.map +3 -3
  230. package/build/tooltip/types.cjs.map +1 -1
  231. package/build/utils/create-overlay-modal-context.cjs +48 -0
  232. package/build/utils/create-overlay-modal-context.cjs.map +7 -0
  233. package/build/utils/create-overlay-title-validation.cjs +93 -0
  234. package/build/utils/create-overlay-title-validation.cjs.map +7 -0
  235. package/build/utils/render-slot-with-children.cjs +34 -0
  236. package/build/utils/render-slot-with-children.cjs.map +7 -0
  237. package/build/utils/use-deprioritized-initial-focus.cjs +8 -8
  238. package/build/utils/use-deprioritized-initial-focus.cjs.map +2 -2
  239. package/build/utils/use-overlay-scroll-state-attributes.cjs +140 -0
  240. package/build/utils/use-overlay-scroll-state-attributes.cjs.map +7 -0
  241. package/build/visually-hidden/visually-hidden.cjs +89 -6
  242. package/build/visually-hidden/visually-hidden.cjs.map +3 -3
  243. package/build-module/alert-dialog/index.mjs +2 -0
  244. package/build-module/alert-dialog/index.mjs.map +2 -2
  245. package/build-module/alert-dialog/popup.mjs +198 -60
  246. package/build-module/alert-dialog/popup.mjs.map +3 -3
  247. package/build-module/alert-dialog/portal.mjs +13 -0
  248. package/build-module/alert-dialog/portal.mjs.map +7 -0
  249. package/build-module/badge/badge.mjs +84 -5
  250. package/build-module/badge/badge.mjs.map +3 -3
  251. package/build-module/button/button.mjs +90 -20
  252. package/build-module/button/button.mjs.map +3 -3
  253. package/build-module/button/icon.mjs.map +2 -2
  254. package/build-module/button/index.mjs +3 -2
  255. package/build-module/button/index.mjs.map +2 -2
  256. package/build-module/card/content.mjs +84 -5
  257. package/build-module/card/content.mjs.map +3 -3
  258. package/build-module/card/full-bleed.mjs +84 -5
  259. package/build-module/card/full-bleed.mjs.map +3 -3
  260. package/build-module/card/header.mjs +84 -5
  261. package/build-module/card/header.mjs.map +3 -3
  262. package/build-module/card/root.mjs +86 -10
  263. package/build-module/card/root.mjs.map +3 -3
  264. package/build-module/collapsible-card/content.mjs +90 -7
  265. package/build-module/collapsible-card/content.mjs.map +3 -3
  266. package/build-module/collapsible-card/header.mjs +131 -52
  267. package/build-module/collapsible-card/header.mjs.map +3 -3
  268. package/build-module/dialog/content.mjs +126 -0
  269. package/build-module/dialog/content.mjs.map +7 -0
  270. package/build-module/dialog/context.mjs +10 -63
  271. package/build-module/dialog/context.mjs.map +2 -2
  272. package/build-module/dialog/description.mjs +113 -0
  273. package/build-module/dialog/description.mjs.map +7 -0
  274. package/build-module/dialog/footer.mjs +86 -6
  275. package/build-module/dialog/footer.mjs.map +3 -3
  276. package/build-module/dialog/header.mjs +86 -6
  277. package/build-module/dialog/header.mjs.map +3 -3
  278. package/build-module/dialog/index.mjs +6 -0
  279. package/build-module/dialog/index.mjs.map +2 -2
  280. package/build-module/dialog/popup.mjs +104 -13
  281. package/build-module/dialog/popup.mjs.map +3 -3
  282. package/build-module/dialog/portal.mjs +13 -0
  283. package/build-module/dialog/portal.mjs.map +7 -0
  284. package/build-module/dialog/root.mjs +3 -2
  285. package/build-module/dialog/root.mjs.map +2 -2
  286. package/build-module/dialog/title.mjs +85 -6
  287. package/build-module/dialog/title.mjs.map +3 -3
  288. package/build-module/drawer/action.mjs +23 -0
  289. package/build-module/drawer/action.mjs.map +7 -0
  290. package/build-module/drawer/close-icon.mjs +33 -0
  291. package/build-module/drawer/close-icon.mjs.map +7 -0
  292. package/build-module/drawer/content.mjs +135 -0
  293. package/build-module/drawer/content.mjs.map +7 -0
  294. package/build-module/drawer/context.mjs +16 -0
  295. package/build-module/drawer/context.mjs.map +7 -0
  296. package/build-module/drawer/description.mjs +22 -0
  297. package/build-module/drawer/description.mjs.map +7 -0
  298. package/build-module/drawer/footer.mjs +109 -0
  299. package/build-module/drawer/footer.mjs.map +7 -0
  300. package/build-module/drawer/header.mjs +109 -0
  301. package/build-module/drawer/header.mjs.map +7 -0
  302. package/build-module/drawer/index.mjs +26 -0
  303. package/build-module/drawer/index.mjs.map +7 -0
  304. package/build-module/drawer/popup.mjs +149 -0
  305. package/build-module/drawer/popup.mjs.map +7 -0
  306. package/build-module/drawer/portal.mjs +13 -0
  307. package/build-module/drawer/portal.mjs.map +7 -0
  308. package/build-module/drawer/root.mjs +24 -0
  309. package/build-module/drawer/root.mjs.map +7 -0
  310. package/build-module/drawer/title.mjs +124 -0
  311. package/build-module/drawer/title.mjs.map +7 -0
  312. package/build-module/drawer/trigger.mjs +13 -0
  313. package/build-module/drawer/trigger.mjs.map +7 -0
  314. package/build-module/drawer/types.mjs +1 -0
  315. package/build-module/drawer/types.mjs.map +7 -0
  316. package/build-module/empty-state/actions.mjs +84 -5
  317. package/build-module/empty-state/actions.mjs.map +3 -3
  318. package/build-module/empty-state/description.mjs +84 -5
  319. package/build-module/empty-state/description.mjs.map +3 -3
  320. package/build-module/empty-state/icon.mjs +84 -5
  321. package/build-module/empty-state/icon.mjs.map +3 -3
  322. package/build-module/empty-state/root.mjs +84 -5
  323. package/build-module/empty-state/root.mjs.map +3 -3
  324. package/build-module/empty-state/title.mjs +84 -5
  325. package/build-module/empty-state/title.mjs.map +3 -3
  326. package/build-module/empty-state/visual.mjs +84 -5
  327. package/build-module/empty-state/visual.mjs.map +3 -3
  328. package/build-module/form/index.mjs +1 -0
  329. package/build-module/form/index.mjs.map +2 -2
  330. package/build-module/form/primitives/autocomplete/clear.mjs +37 -0
  331. package/build-module/form/primitives/autocomplete/clear.mjs.map +7 -0
  332. package/build-module/form/primitives/autocomplete/collection.mjs +13 -0
  333. package/build-module/form/primitives/autocomplete/collection.mjs.map +7 -0
  334. package/build-module/form/primitives/autocomplete/empty.mjs +111 -0
  335. package/build-module/form/primitives/autocomplete/empty.mjs.map +7 -0
  336. package/build-module/form/primitives/autocomplete/index.mjs +28 -0
  337. package/build-module/form/primitives/autocomplete/index.mjs.map +7 -0
  338. package/build-module/form/primitives/autocomplete/input-group.mjs +11 -0
  339. package/build-module/form/primitives/autocomplete/input-group.mjs.map +7 -0
  340. package/build-module/form/primitives/autocomplete/input.mjs +22 -0
  341. package/build-module/form/primitives/autocomplete/input.mjs.map +7 -0
  342. package/build-module/form/primitives/autocomplete/item.mjs +122 -0
  343. package/build-module/form/primitives/autocomplete/item.mjs.map +7 -0
  344. package/build-module/form/primitives/autocomplete/list-body.mjs +111 -0
  345. package/build-module/form/primitives/autocomplete/list-body.mjs.map +7 -0
  346. package/build-module/form/primitives/autocomplete/list.mjs +111 -0
  347. package/build-module/form/primitives/autocomplete/list.mjs.map +7 -0
  348. package/build-module/form/primitives/autocomplete/popup.mjs +142 -0
  349. package/build-module/form/primitives/autocomplete/popup.mjs.map +7 -0
  350. package/build-module/form/primitives/autocomplete/portal.mjs +13 -0
  351. package/build-module/form/primitives/autocomplete/portal.mjs.map +7 -0
  352. package/build-module/form/primitives/autocomplete/root.mjs +10 -0
  353. package/build-module/form/primitives/autocomplete/root.mjs.map +7 -0
  354. package/build-module/form/primitives/autocomplete/types.mjs +1 -0
  355. package/build-module/form/primitives/autocomplete/types.mjs.map +7 -0
  356. package/build-module/form/primitives/autocomplete/value.mjs +10 -0
  357. package/build-module/form/primitives/autocomplete/value.mjs.map +7 -0
  358. package/build-module/form/primitives/field/description.mjs +86 -10
  359. package/build-module/form/primitives/field/description.mjs.map +3 -3
  360. package/build-module/form/primitives/field/details.mjs +84 -5
  361. package/build-module/form/primitives/field/details.mjs.map +3 -3
  362. package/build-module/form/primitives/field/label.mjs +84 -5
  363. package/build-module/form/primitives/field/label.mjs.map +3 -3
  364. package/build-module/form/primitives/field/root.mjs +84 -5
  365. package/build-module/form/primitives/field/root.mjs.map +3 -3
  366. package/build-module/form/primitives/fieldset/description.mjs +86 -10
  367. package/build-module/form/primitives/fieldset/description.mjs.map +3 -3
  368. package/build-module/form/primitives/fieldset/details.mjs +84 -5
  369. package/build-module/form/primitives/fieldset/details.mjs.map +3 -3
  370. package/build-module/form/primitives/fieldset/legend.mjs +84 -5
  371. package/build-module/form/primitives/fieldset/legend.mjs.map +3 -3
  372. package/build-module/form/primitives/fieldset/root.mjs +84 -5
  373. package/build-module/form/primitives/fieldset/root.mjs.map +3 -3
  374. package/build-module/form/primitives/index.mjs +2 -0
  375. package/build-module/form/primitives/index.mjs.map +2 -2
  376. package/build-module/form/primitives/input/input.mjs +88 -15
  377. package/build-module/form/primitives/input/input.mjs.map +3 -3
  378. package/build-module/form/primitives/input-layout/input-layout.mjs +88 -15
  379. package/build-module/form/primitives/input-layout/input-layout.mjs.map +3 -3
  380. package/build-module/form/primitives/input-layout/slot.mjs +84 -5
  381. package/build-module/form/primitives/input-layout/slot.mjs.map +3 -3
  382. package/build-module/form/primitives/select/index.mjs +2 -0
  383. package/build-module/form/primitives/select/index.mjs.map +2 -2
  384. package/build-module/form/primitives/select/item.mjs +88 -13
  385. package/build-module/form/primitives/select/item.mjs.map +3 -3
  386. package/build-module/form/primitives/select/popup.mjs +97 -23
  387. package/build-module/form/primitives/select/popup.mjs.map +3 -3
  388. package/build-module/form/primitives/select/portal.mjs +13 -0
  389. package/build-module/form/primitives/select/portal.mjs.map +7 -0
  390. package/build-module/form/primitives/select/root.mjs.map +2 -2
  391. package/build-module/form/primitives/select/trigger.mjs +98 -16
  392. package/build-module/form/primitives/select/trigger.mjs.map +3 -3
  393. package/build-module/form/primitives/textarea/textarea.mjs +86 -10
  394. package/build-module/form/primitives/textarea/textarea.mjs.map +3 -3
  395. package/build-module/form/select-control/context.mjs +11 -0
  396. package/build-module/form/select-control/context.mjs.map +7 -0
  397. package/build-module/form/select-control/index.mjs +14 -0
  398. package/build-module/form/select-control/index.mjs.map +7 -0
  399. package/build-module/form/select-control/item.mjs +16 -0
  400. package/build-module/form/select-control/item.mjs.map +7 -0
  401. package/build-module/form/select-control/select-control.mjs +50 -0
  402. package/build-module/form/select-control/select-control.mjs.map +7 -0
  403. package/build-module/form/select-control/types.mjs +1 -0
  404. package/build-module/form/select-control/types.mjs.map +7 -0
  405. package/build-module/icon-button/icon-button.mjs +86 -6
  406. package/build-module/icon-button/icon-button.mjs.map +3 -3
  407. package/build-module/index.mjs +2 -0
  408. package/build-module/index.mjs.map +2 -2
  409. package/build-module/link/link.mjs +90 -20
  410. package/build-module/link/link.mjs.map +3 -3
  411. package/build-module/notice/action-button.mjs +84 -5
  412. package/build-module/notice/action-button.mjs.map +3 -3
  413. package/build-module/notice/action-link.mjs +84 -5
  414. package/build-module/notice/action-link.mjs.map +3 -3
  415. package/build-module/notice/actions.mjs +84 -5
  416. package/build-module/notice/actions.mjs.map +3 -3
  417. package/build-module/notice/close-icon.mjs +84 -5
  418. package/build-module/notice/close-icon.mjs.map +3 -3
  419. package/build-module/notice/description.mjs +84 -5
  420. package/build-module/notice/description.mjs.map +3 -3
  421. package/build-module/notice/root.mjs +86 -10
  422. package/build-module/notice/root.mjs.map +3 -3
  423. package/build-module/notice/title.mjs +84 -5
  424. package/build-module/notice/title.mjs.map +3 -3
  425. package/build-module/popover/arrow.mjs +85 -6
  426. package/build-module/popover/arrow.mjs.map +3 -3
  427. package/build-module/popover/context.mjs +4 -63
  428. package/build-module/popover/context.mjs.map +2 -2
  429. package/build-module/popover/description.mjs +1 -14
  430. package/build-module/popover/description.mjs.map +3 -3
  431. package/build-module/popover/index.mjs +2 -0
  432. package/build-module/popover/index.mjs.map +2 -2
  433. package/build-module/popover/popup.mjs +97 -24
  434. package/build-module/popover/popup.mjs.map +3 -3
  435. package/build-module/popover/portal.mjs +13 -0
  436. package/build-module/popover/portal.mjs.map +7 -0
  437. package/build-module/popover/root.mjs.map +1 -1
  438. package/build-module/popover/title.mjs +92 -2
  439. package/build-module/popover/title.mjs.map +3 -3
  440. package/build-module/stack/stack.mjs +84 -5
  441. package/build-module/stack/stack.mjs.map +3 -3
  442. package/build-module/tabs/list.mjs +84 -5
  443. package/build-module/tabs/list.mjs.map +3 -3
  444. package/build-module/tabs/panel.mjs +86 -10
  445. package/build-module/tabs/panel.mjs.map +3 -3
  446. package/build-module/tabs/tab.mjs +84 -5
  447. package/build-module/tabs/tab.mjs.map +3 -3
  448. package/build-module/text/text.mjs +88 -12
  449. package/build-module/text/text.mjs.map +3 -3
  450. package/build-module/tooltip/index.mjs +4 -0
  451. package/build-module/tooltip/index.mjs.map +2 -2
  452. package/build-module/tooltip/popup.mjs +115 -47
  453. package/build-module/tooltip/popup.mjs.map +3 -3
  454. package/build-module/tooltip/portal.mjs +13 -0
  455. package/build-module/tooltip/portal.mjs.map +7 -0
  456. package/build-module/tooltip/positioner.mjs +124 -0
  457. package/build-module/tooltip/positioner.mjs.map +7 -0
  458. package/build-module/tooltip/provider.mjs +3 -3
  459. package/build-module/tooltip/provider.mjs.map +2 -2
  460. package/build-module/tooltip/root.mjs +2 -2
  461. package/build-module/tooltip/root.mjs.map +2 -2
  462. package/build-module/tooltip/trigger.mjs +3 -3
  463. package/build-module/tooltip/trigger.mjs.map +2 -2
  464. package/build-module/utils/create-overlay-modal-context.mjs +23 -0
  465. package/build-module/utils/create-overlay-modal-context.mjs.map +7 -0
  466. package/build-module/utils/create-overlay-title-validation.mjs +75 -0
  467. package/build-module/utils/create-overlay-title-validation.mjs.map +7 -0
  468. package/build-module/utils/render-slot-with-children.mjs +9 -0
  469. package/build-module/utils/render-slot-with-children.mjs.map +7 -0
  470. package/build-module/utils/use-deprioritized-initial-focus.mjs +9 -9
  471. package/build-module/utils/use-deprioritized-initial-focus.mjs.map +2 -2
  472. package/build-module/utils/use-overlay-scroll-state-attributes.mjs +114 -0
  473. package/build-module/utils/use-overlay-scroll-state-attributes.mjs.map +7 -0
  474. package/build-module/visually-hidden/visually-hidden.mjs +89 -6
  475. package/build-module/visually-hidden/visually-hidden.mjs.map +3 -3
  476. package/build-types/alert-dialog/index.d.ts +1 -0
  477. package/build-types/alert-dialog/index.d.ts.map +1 -1
  478. package/build-types/alert-dialog/popup.d.ts.map +1 -1
  479. package/build-types/alert-dialog/portal.d.ts +9 -0
  480. package/build-types/alert-dialog/portal.d.ts.map +1 -0
  481. package/build-types/alert-dialog/root.d.ts +1 -1
  482. package/build-types/alert-dialog/root.d.ts.map +1 -1
  483. package/build-types/alert-dialog/stories/index.story.d.ts +28 -0
  484. package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -1
  485. package/build-types/alert-dialog/types.d.ts +25 -3
  486. package/build-types/alert-dialog/types.d.ts.map +1 -1
  487. package/build-types/badge/stories/choosing-intent.story.d.ts.map +1 -1
  488. package/build-types/badge/stories/index.story.d.ts.map +1 -1
  489. package/build-types/button/button.d.ts +3 -0
  490. package/build-types/button/button.d.ts.map +1 -1
  491. package/build-types/button/icon.d.ts +1 -8
  492. package/build-types/button/icon.d.ts.map +1 -1
  493. package/build-types/button/index.d.ts +6 -5
  494. package/build-types/button/index.d.ts.map +1 -1
  495. package/build-types/button/stories/index.story.d.ts.map +1 -1
  496. package/build-types/button/types.d.ts +7 -0
  497. package/build-types/button/types.d.ts.map +1 -1
  498. package/build-types/card/stories/index.story.d.ts.map +1 -1
  499. package/build-types/collapsible/panel.d.ts +1 -1
  500. package/build-types/collapsible/root.d.ts +1 -1
  501. package/build-types/collapsible/stories/index.story.d.ts.map +1 -1
  502. package/build-types/collapsible/trigger.d.ts +1 -1
  503. package/build-types/collapsible-card/content.d.ts.map +1 -1
  504. package/build-types/collapsible-card/header.d.ts +6 -0
  505. package/build-types/collapsible-card/header.d.ts.map +1 -1
  506. package/build-types/collapsible-card/stories/index.story.d.ts +8 -0
  507. package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
  508. package/build-types/dialog/content.d.ts +17 -0
  509. package/build-types/dialog/content.d.ts.map +1 -0
  510. package/build-types/dialog/context.d.ts +11 -16
  511. package/build-types/dialog/context.d.ts.map +1 -1
  512. package/build-types/dialog/description.d.ts +9 -0
  513. package/build-types/dialog/description.d.ts.map +1 -0
  514. package/build-types/dialog/footer.d.ts +8 -1
  515. package/build-types/dialog/footer.d.ts.map +1 -1
  516. package/build-types/dialog/header.d.ts +8 -1
  517. package/build-types/dialog/header.d.ts.map +1 -1
  518. package/build-types/dialog/index.d.ts +4 -1
  519. package/build-types/dialog/index.d.ts.map +1 -1
  520. package/build-types/dialog/popup.d.ts +2 -0
  521. package/build-types/dialog/popup.d.ts.map +1 -1
  522. package/build-types/dialog/portal.d.ts +10 -0
  523. package/build-types/dialog/portal.d.ts.map +1 -0
  524. package/build-types/dialog/root.d.ts +14 -4
  525. package/build-types/dialog/root.d.ts.map +1 -1
  526. package/build-types/dialog/stories/index.story.d.ts +29 -6
  527. package/build-types/dialog/stories/index.story.d.ts.map +1 -1
  528. package/build-types/dialog/types.d.ts +60 -7
  529. package/build-types/dialog/types.d.ts.map +1 -1
  530. package/build-types/drawer/action.d.ts +8 -0
  531. package/build-types/drawer/action.d.ts.map +1 -0
  532. package/build-types/drawer/close-icon.d.ts +8 -0
  533. package/build-types/drawer/close-icon.d.ts.map +1 -0
  534. package/build-types/drawer/content.d.ts +24 -0
  535. package/build-types/drawer/content.d.ts.map +1 -0
  536. package/build-types/drawer/context.d.ts +20 -0
  537. package/build-types/drawer/context.d.ts.map +1 -0
  538. package/build-types/drawer/description.d.ts +9 -0
  539. package/build-types/drawer/description.d.ts.map +1 -0
  540. package/build-types/drawer/footer.d.ts +15 -0
  541. package/build-types/drawer/footer.d.ts.map +1 -0
  542. package/build-types/drawer/header.d.ts +15 -0
  543. package/build-types/drawer/header.d.ts.map +1 -0
  544. package/build-types/drawer/index.d.ts +13 -0
  545. package/build-types/drawer/index.d.ts.map +1 -0
  546. package/build-types/drawer/popup.d.ts +15 -0
  547. package/build-types/drawer/popup.d.ts.map +1 -0
  548. package/build-types/drawer/portal.d.ts +10 -0
  549. package/build-types/drawer/portal.d.ts.map +1 -0
  550. package/build-types/drawer/root.d.ts +21 -0
  551. package/build-types/drawer/root.d.ts.map +1 -0
  552. package/build-types/drawer/stories/index.story.d.ts +63 -0
  553. package/build-types/drawer/stories/index.story.d.ts.map +1 -0
  554. package/build-types/drawer/test/index.test.d.ts +2 -0
  555. package/build-types/drawer/test/index.test.d.ts.map +1 -0
  556. package/build-types/drawer/title.d.ts +22 -0
  557. package/build-types/drawer/title.d.ts.map +1 -0
  558. package/build-types/drawer/trigger.d.ts +7 -0
  559. package/build-types/drawer/trigger.d.ts.map +1 -0
  560. package/build-types/drawer/types.d.ts +146 -0
  561. package/build-types/drawer/types.d.ts.map +1 -0
  562. package/build-types/empty-state/stories/index.story.d.ts.map +1 -1
  563. package/build-types/form/index.d.ts +1 -0
  564. package/build-types/form/index.d.ts.map +1 -1
  565. package/build-types/form/input-control/stories/index.story.d.ts.map +1 -1
  566. package/build-types/form/primitives/autocomplete/clear.d.ts +13 -0
  567. package/build-types/form/primitives/autocomplete/clear.d.ts.map +1 -0
  568. package/build-types/form/primitives/autocomplete/collection.d.ts +3 -0
  569. package/build-types/form/primitives/autocomplete/collection.d.ts.map +1 -0
  570. package/build-types/form/primitives/autocomplete/empty.d.ts +10 -0
  571. package/build-types/form/primitives/autocomplete/empty.d.ts.map +1 -0
  572. package/build-types/form/primitives/autocomplete/index.d.ts +13 -0
  573. package/build-types/form/primitives/autocomplete/index.d.ts.map +1 -0
  574. package/build-types/form/primitives/autocomplete/input-group.d.ts +16 -0
  575. package/build-types/form/primitives/autocomplete/input-group.d.ts.map +1 -0
  576. package/build-types/form/primitives/autocomplete/input.d.ts +3 -0
  577. package/build-types/form/primitives/autocomplete/input.d.ts.map +1 -0
  578. package/build-types/form/primitives/autocomplete/item.d.ts +10 -0
  579. package/build-types/form/primitives/autocomplete/item.d.ts.map +1 -0
  580. package/build-types/form/primitives/autocomplete/list-body.d.ts +13 -0
  581. package/build-types/form/primitives/autocomplete/list-body.d.ts.map +1 -0
  582. package/build-types/form/primitives/autocomplete/list.d.ts +11 -0
  583. package/build-types/form/primitives/autocomplete/list.d.ts.map +1 -0
  584. package/build-types/form/primitives/autocomplete/popup.d.ts +11 -0
  585. package/build-types/form/primitives/autocomplete/popup.d.ts.map +1 -0
  586. package/build-types/form/primitives/autocomplete/portal.d.ts +8 -0
  587. package/build-types/form/primitives/autocomplete/portal.d.ts.map +1 -0
  588. package/build-types/form/primitives/autocomplete/root.d.ts +8 -0
  589. package/build-types/form/primitives/autocomplete/root.d.ts.map +1 -0
  590. package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts +8 -0
  591. package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts.map +1 -0
  592. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts +41 -0
  593. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts.map +1 -0
  594. package/build-types/form/primitives/autocomplete/test/index.test.d.ts +2 -0
  595. package/build-types/form/primitives/autocomplete/test/index.test.d.ts.map +1 -0
  596. package/build-types/form/primitives/autocomplete/types.d.ts +44 -0
  597. package/build-types/form/primitives/autocomplete/types.d.ts.map +1 -0
  598. package/build-types/form/primitives/autocomplete/value.d.ts +3 -0
  599. package/build-types/form/primitives/autocomplete/value.d.ts.map +1 -0
  600. package/build-types/form/primitives/field/control.d.ts +2 -2
  601. package/build-types/form/primitives/field/description.d.ts +1 -1
  602. package/build-types/form/primitives/field/details.d.ts +1 -1
  603. package/build-types/form/primitives/field/label.d.ts +3 -3
  604. package/build-types/form/primitives/field/root.d.ts +3 -3
  605. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  606. package/build-types/form/primitives/fieldset/description.d.ts +1 -1
  607. package/build-types/form/primitives/fieldset/details.d.ts +1 -1
  608. package/build-types/form/primitives/fieldset/legend.d.ts +1 -1
  609. package/build-types/form/primitives/fieldset/root.d.ts +1 -1
  610. package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
  611. package/build-types/form/primitives/index.d.ts +1 -0
  612. package/build-types/form/primitives/index.d.ts.map +1 -1
  613. package/build-types/form/primitives/input/input.d.ts +5 -5
  614. package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
  615. package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
  616. package/build-types/form/primitives/select/index.d.ts +1 -0
  617. package/build-types/form/primitives/select/index.d.ts.map +1 -1
  618. package/build-types/form/primitives/select/item.d.ts +3 -3
  619. package/build-types/form/primitives/select/item.d.ts.map +1 -1
  620. package/build-types/form/primitives/select/popup.d.ts +2 -3
  621. package/build-types/form/primitives/select/popup.d.ts.map +1 -1
  622. package/build-types/form/primitives/select/portal.d.ts +8 -0
  623. package/build-types/form/primitives/select/portal.d.ts.map +1 -0
  624. package/build-types/form/primitives/select/root.d.ts +12 -1
  625. package/build-types/form/primitives/select/root.d.ts.map +1 -1
  626. package/build-types/form/primitives/select/stories/index.story.d.ts +22 -11
  627. package/build-types/form/primitives/select/stories/index.story.d.ts.map +1 -1
  628. package/build-types/form/primitives/select/trigger.d.ts +5 -4
  629. package/build-types/form/primitives/select/trigger.d.ts.map +1 -1
  630. package/build-types/form/primitives/select/types.d.ts +19 -6
  631. package/build-types/form/primitives/select/types.d.ts.map +1 -1
  632. package/build-types/form/primitives/textarea/stories/index.story.d.ts.map +1 -1
  633. package/build-types/form/primitives/textarea/textarea.d.ts +2 -2
  634. package/build-types/form/select-control/context.d.ts +3 -0
  635. package/build-types/form/select-control/context.d.ts.map +1 -0
  636. package/build-types/form/select-control/index.d.ts +20 -0
  637. package/build-types/form/select-control/index.d.ts.map +1 -0
  638. package/build-types/form/select-control/item.d.ts +6 -0
  639. package/build-types/form/select-control/item.d.ts.map +1 -0
  640. package/build-types/form/select-control/select-control.d.ts +11 -0
  641. package/build-types/form/select-control/select-control.d.ts.map +1 -0
  642. package/build-types/form/select-control/stories/index.story.d.ts +40 -0
  643. package/build-types/form/select-control/stories/index.story.d.ts.map +1 -0
  644. package/build-types/form/select-control/test/index.test.d.ts +2 -0
  645. package/build-types/form/select-control/test/index.test.d.ts.map +1 -0
  646. package/build-types/form/select-control/types.d.ts +40 -0
  647. package/build-types/form/select-control/types.d.ts.map +1 -0
  648. package/build-types/form/types.d.ts +1 -1
  649. package/build-types/form/types.d.ts.map +1 -1
  650. package/build-types/icon/stories/index.story.d.ts.map +1 -1
  651. package/build-types/icon-button/icon-button.d.ts +2 -1
  652. package/build-types/icon-button/icon-button.d.ts.map +1 -1
  653. package/build-types/icon-button/stories/index.story.d.ts +5 -0
  654. package/build-types/icon-button/stories/index.story.d.ts.map +1 -1
  655. package/build-types/icon-button/types.d.ts +8 -0
  656. package/build-types/icon-button/types.d.ts.map +1 -1
  657. package/build-types/index.d.ts +1 -0
  658. package/build-types/index.d.ts.map +1 -1
  659. package/build-types/link/stories/index.story.d.ts +2 -3
  660. package/build-types/link/stories/index.story.d.ts.map +1 -1
  661. package/build-types/notice/stories/index.story.d.ts.map +1 -1
  662. package/build-types/popover/context.d.ts +6 -13
  663. package/build-types/popover/context.d.ts.map +1 -1
  664. package/build-types/popover/description.d.ts +0 -1
  665. package/build-types/popover/description.d.ts.map +1 -1
  666. package/build-types/popover/index.d.ts +2 -1
  667. package/build-types/popover/index.d.ts.map +1 -1
  668. package/build-types/popover/popup.d.ts +3 -2
  669. package/build-types/popover/popup.d.ts.map +1 -1
  670. package/build-types/popover/portal.d.ts +9 -0
  671. package/build-types/popover/portal.d.ts.map +1 -0
  672. package/build-types/popover/root.d.ts +2 -2
  673. package/build-types/popover/stories/index.story.d.ts +22 -14
  674. package/build-types/popover/stories/index.story.d.ts.map +1 -1
  675. package/build-types/popover/title.d.ts.map +1 -1
  676. package/build-types/popover/types.d.ts +8 -15
  677. package/build-types/popover/types.d.ts.map +1 -1
  678. package/build-types/stack/stories/index.story.d.ts.map +1 -1
  679. package/build-types/tabs/context.d.ts +1 -1
  680. package/build-types/tabs/context.d.ts.map +1 -1
  681. package/build-types/tabs/list.d.ts +2 -2
  682. package/build-types/tabs/panel.d.ts +1 -1
  683. package/build-types/tabs/root.d.ts +1 -1
  684. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  685. package/build-types/tabs/tab.d.ts +1 -1
  686. package/build-types/text/stories/index.story.d.ts.map +1 -1
  687. package/build-types/tooltip/index.d.ts +3 -1
  688. package/build-types/tooltip/index.d.ts.map +1 -1
  689. package/build-types/tooltip/popup.d.ts.map +1 -1
  690. package/build-types/tooltip/portal.d.ts +8 -0
  691. package/build-types/tooltip/portal.d.ts.map +1 -0
  692. package/build-types/tooltip/positioner.d.ts +9 -0
  693. package/build-types/tooltip/positioner.d.ts.map +1 -0
  694. package/build-types/tooltip/provider.d.ts +1 -1
  695. package/build-types/tooltip/provider.d.ts.map +1 -1
  696. package/build-types/tooltip/stories/index.story.d.ts +28 -2
  697. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  698. package/build-types/tooltip/stories/usage-guidelines.story.d.ts.map +1 -1
  699. package/build-types/tooltip/trigger.d.ts.map +1 -1
  700. package/build-types/tooltip/types.d.ts +20 -7
  701. package/build-types/tooltip/types.d.ts.map +1 -1
  702. package/build-types/utils/create-overlay-modal-context.d.ts +14 -0
  703. package/build-types/utils/create-overlay-modal-context.d.ts.map +1 -0
  704. package/build-types/utils/create-overlay-title-validation.d.ts +15 -0
  705. package/build-types/utils/create-overlay-title-validation.d.ts.map +1 -0
  706. package/build-types/utils/render-slot-with-children.d.ts +24 -0
  707. package/build-types/utils/render-slot-with-children.d.ts.map +1 -0
  708. package/build-types/utils/use-deprioritized-initial-focus.d.ts +9 -8
  709. package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -1
  710. package/build-types/utils/use-overlay-scroll-state-attributes.d.ts +85 -0
  711. package/build-types/utils/use-overlay-scroll-state-attributes.d.ts.map +1 -0
  712. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  713. package/build-types/visually-hidden/visually-hidden.d.ts +4 -20
  714. package/build-types/visually-hidden/visually-hidden.d.ts.map +1 -1
  715. package/package.json +14 -13
  716. package/src/alert-dialog/index.ts +1 -0
  717. package/src/alert-dialog/popup.tsx +114 -45
  718. package/src/alert-dialog/portal.tsx +17 -0
  719. package/src/alert-dialog/stories/index.story.tsx +129 -1
  720. package/src/alert-dialog/style.module.css +13 -4
  721. package/src/alert-dialog/test/index.test.tsx +329 -3
  722. package/src/alert-dialog/types.ts +30 -3
  723. package/src/badge/stories/index.story.tsx +6 -0
  724. package/src/button/button.tsx +3 -0
  725. package/src/button/icon.tsx +1 -8
  726. package/src/button/index.ts +5 -6
  727. package/src/button/stories/index.story.tsx +10 -0
  728. package/src/button/types.ts +8 -0
  729. package/src/card/stories/index.story.tsx +7 -0
  730. package/src/collapsible/stories/index.story.tsx +7 -0
  731. package/src/collapsible-card/content.tsx +12 -1
  732. package/src/collapsible-card/header.tsx +55 -42
  733. package/src/collapsible-card/stories/index.story.tsx +62 -0
  734. package/src/collapsible-card/style.module.css +36 -4
  735. package/src/collapsible-card/test/index.test.tsx +60 -1
  736. package/src/dialog/content.tsx +47 -0
  737. package/src/dialog/context.tsx +14 -111
  738. package/src/dialog/description.tsx +27 -0
  739. package/src/dialog/footer.tsx +10 -2
  740. package/src/dialog/header.tsx +10 -2
  741. package/src/dialog/index.ts +16 -1
  742. package/src/dialog/popup.tsx +27 -8
  743. package/src/dialog/portal.tsx +18 -0
  744. package/src/dialog/root.tsx +22 -5
  745. package/src/dialog/stories/index.story.tsx +200 -48
  746. package/src/dialog/style.module.css +76 -44
  747. package/src/dialog/test/index.test.tsx +632 -12
  748. package/src/dialog/types.ts +64 -6
  749. package/src/drawer/action.tsx +28 -0
  750. package/src/drawer/close-icon.tsx +33 -0
  751. package/src/drawer/content.tsx +65 -0
  752. package/src/drawer/context.tsx +29 -0
  753. package/src/drawer/description.tsx +25 -0
  754. package/src/drawer/footer.tsx +34 -0
  755. package/src/drawer/header.tsx +34 -0
  756. package/src/drawer/index.ts +25 -0
  757. package/src/drawer/popup.tsx +99 -0
  758. package/src/drawer/portal.tsx +18 -0
  759. package/src/drawer/root.tsx +41 -0
  760. package/src/drawer/stories/index.story.tsx +550 -0
  761. package/src/drawer/style.module.css +356 -0
  762. package/src/drawer/test/index.test.tsx +1153 -0
  763. package/src/drawer/title.tsx +53 -0
  764. package/src/drawer/trigger.tsx +14 -0
  765. package/src/drawer/types.ts +174 -0
  766. package/src/empty-state/stories/index.story.tsx +7 -0
  767. package/src/form/index.ts +1 -0
  768. package/src/form/input-control/stories/index.story.tsx +7 -0
  769. package/src/form/primitives/autocomplete/clear.tsx +35 -0
  770. package/src/form/primitives/autocomplete/collection.tsx +13 -0
  771. package/src/form/primitives/autocomplete/empty.tsx +17 -0
  772. package/src/form/primitives/autocomplete/index.ts +12 -0
  773. package/src/form/primitives/autocomplete/input-group.tsx +16 -0
  774. package/src/form/primitives/autocomplete/input.tsx +20 -0
  775. package/src/form/primitives/autocomplete/item.tsx +24 -0
  776. package/src/form/primitives/autocomplete/list-body.tsx +23 -0
  777. package/src/form/primitives/autocomplete/list.tsx +17 -0
  778. package/src/form/primitives/autocomplete/popup.tsx +42 -0
  779. package/src/form/primitives/autocomplete/portal.tsx +16 -0
  780. package/src/form/primitives/autocomplete/root.tsx +11 -0
  781. package/src/form/primitives/autocomplete/stories/fixtures.ts +35 -0
  782. package/src/form/primitives/autocomplete/stories/index.story.tsx +445 -0
  783. package/src/form/primitives/autocomplete/style.module.css +7 -0
  784. package/src/form/primitives/autocomplete/test/index.test.tsx +162 -0
  785. package/src/form/primitives/autocomplete/types.ts +74 -0
  786. package/src/form/primitives/autocomplete/value.tsx +6 -0
  787. package/src/form/primitives/field/stories/index.story.tsx +12 -5
  788. package/src/form/primitives/fieldset/stories/index.story.tsx +10 -3
  789. package/src/form/primitives/index.ts +1 -0
  790. package/src/form/primitives/input/stories/index.story.tsx +7 -0
  791. package/src/form/primitives/input-layout/stories/index.story.tsx +8 -1
  792. package/src/form/primitives/select/index.ts +1 -0
  793. package/src/form/primitives/select/item.tsx +1 -2
  794. package/src/form/primitives/select/popup.tsx +34 -37
  795. package/src/form/primitives/select/portal.tsx +16 -0
  796. package/src/form/primitives/select/root.tsx +13 -2
  797. package/src/form/primitives/select/stories/index.story.tsx +152 -67
  798. package/src/form/primitives/select/test/index.test.tsx +130 -8
  799. package/src/form/primitives/select/trigger.tsx +11 -8
  800. package/src/form/primitives/select/types.ts +22 -7
  801. package/src/form/primitives/textarea/stories/index.story.tsx +7 -0
  802. package/src/form/select-control/context.tsx +9 -0
  803. package/src/form/select-control/index.ts +14 -0
  804. package/src/form/select-control/item.tsx +13 -0
  805. package/src/form/select-control/select-control.tsx +65 -0
  806. package/src/form/select-control/stories/index.story.tsx +220 -0
  807. package/src/form/select-control/test/index.test.tsx +196 -0
  808. package/src/form/select-control/types.ts +50 -0
  809. package/src/form/types.ts +1 -1
  810. package/src/icon/stories/index.story.tsx +7 -0
  811. package/src/icon-button/icon-button.tsx +2 -1
  812. package/src/icon-button/stories/index.story.tsx +20 -0
  813. package/src/icon-button/types.ts +9 -0
  814. package/src/index.ts +1 -0
  815. package/src/link/stories/index.story.tsx +12 -11
  816. package/src/link/style.module.css +2 -1
  817. package/src/notice/stories/index.story.tsx +7 -0
  818. package/src/popover/context.tsx +6 -105
  819. package/src/popover/description.tsx +1 -5
  820. package/src/popover/index.ts +2 -1
  821. package/src/popover/popup.tsx +15 -16
  822. package/src/popover/portal.tsx +17 -0
  823. package/src/popover/root.tsx +2 -2
  824. package/src/popover/stories/index.story.tsx +61 -24
  825. package/src/popover/style.module.css +34 -27
  826. package/src/popover/test/index.test.tsx +46 -7
  827. package/src/popover/title.tsx +3 -2
  828. package/src/popover/types.ts +10 -15
  829. package/src/stack/stories/index.story.tsx +6 -0
  830. package/src/tabs/stories/index.story.tsx +15 -1
  831. package/src/text/stories/index.story.tsx +6 -0
  832. package/src/text/style.module.css +25 -0
  833. package/src/text/text.tsx +2 -2
  834. package/src/tooltip/index.ts +3 -1
  835. package/src/tooltip/popup.tsx +32 -44
  836. package/src/tooltip/portal.tsx +16 -0
  837. package/src/tooltip/positioner.tsx +36 -0
  838. package/src/tooltip/provider.tsx +3 -3
  839. package/src/tooltip/root.tsx +2 -2
  840. package/src/tooltip/stories/index.story.tsx +97 -9
  841. package/src/tooltip/stories/usage-guidelines.story.tsx +5 -0
  842. package/src/tooltip/style.module.css +12 -12
  843. package/src/tooltip/test/index.test.tsx +9 -3
  844. package/src/tooltip/trigger.tsx +3 -7
  845. package/src/tooltip/types.ts +26 -9
  846. package/src/utils/create-overlay-modal-context.tsx +34 -0
  847. package/src/utils/create-overlay-title-validation.tsx +116 -0
  848. package/src/utils/css/dropdown-motion.module.css +3 -3
  849. package/src/utils/css/item-popup.module.css +14 -24
  850. package/src/utils/css/overlay-chrome.module.css +239 -0
  851. package/src/utils/css/select-trigger.module.css +5 -2
  852. package/src/utils/render-slot-with-children.ts +31 -0
  853. package/src/utils/test/use-deprioritized-initial-focus.test.tsx +3 -3
  854. package/src/utils/use-deprioritized-initial-focus.ts +23 -17
  855. package/src/utils/use-overlay-scroll-state-attributes.ts +272 -0
  856. package/src/visually-hidden/stories/index.story.tsx +7 -0
  857. package/src/visually-hidden/visually-hidden.tsx +9 -21
@@ -0,0 +1,9 @@
1
+ // packages/ui/src/utils/render-slot-with-children.ts
2
+ import { cloneElement } from "@wordpress/element";
3
+ function renderSlotWithChildren(slot, defaultSlot, children) {
4
+ return cloneElement(slot ?? defaultSlot, { children });
5
+ }
6
+ export {
7
+ renderSlotWithChildren
8
+ };
9
+ //# sourceMappingURL=render-slot-with-children.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/render-slot-with-children.ts"],
4
+ "sourcesContent": ["import { cloneElement } from '@wordpress/element';\nimport type { ReactElement, ReactNode } from 'react';\n\n/**\n * Fills an optional \"slot\" element prop with content by cloning it and\n * injecting the given `children`. When `slot` is undefined, the provided\n * `defaultSlot` is used in its place.\n *\n * Shared by overlay `Popup` components for their slot-shaped customization\n * props (e.g. `portal`, `positioner`), so the merge behavior \u2014 defaults,\n * children injection \u2014 stays consistent across all of them.\n *\n * Callers should type the slot prop as `ReactElement<Omit<Props, 'children'>>`:\n * any subtree passed on the slot element is overwritten by `children`.\n *\n * @param slot Optional element from the slot prop (e.g. `<Tooltip.Portal \u2026 />`\n * or `<Tooltip.Positioner \u2026 />`). When omitted, `defaultSlot`\n * is used. Injected `children` replace any subtree the caller\n * may have passed on the slot element.\n * @param defaultSlot Unpopulated default element used when `slot` is omitted\n * (e.g. `<Tooltip.Portal />`).\n * @param children Content to inject as the slot's children (backdrop,\n * positioner, popup subtree, etc.).\n */\nexport function renderSlotWithChildren(\n\tslot: ReactElement | undefined,\n\tdefaultSlot: ReactElement,\n\tchildren: ReactNode\n): ReactElement {\n\treturn cloneElement( slot ?? defaultSlot, { children } );\n}\n"],
5
+ "mappings": ";AAAA,SAAS,oBAAoB;AAwBtB,SAAS,uBACf,MACA,aACA,UACe;AACf,SAAO,aAAc,QAAQ,aAAa,EAAE,SAAS,CAAE;AACxD;",
6
+ "names": []
7
+ }
@@ -1,5 +1,5 @@
1
1
  // packages/ui/src/utils/use-deprioritized-initial-focus.ts
2
- import { useMemo, useRef } from "@wordpress/element";
2
+ import { useRef } from "@wordpress/element";
3
3
  import { tabbable } from "tabbable";
4
4
  var getTabbableOptions = () => ({
5
5
  getShadowRoot: true,
@@ -7,14 +7,12 @@ var getTabbableOptions = () => ({
7
7
  });
8
8
  function useDeprioritizedInitialFocus({
9
9
  initialFocus,
10
- deprioritizedAttribute
10
+ deprioritizedAttributes
11
11
  }) {
12
12
  const popupRef = useRef(null);
13
- const resolvedInitialFocus = useMemo(() => {
14
- if (initialFocus !== void 0 && initialFocus !== true) {
15
- return initialFocus;
16
- }
17
- return (interactionType) => {
13
+ let resolvedInitialFocus = initialFocus;
14
+ if (initialFocus === void 0 || initialFocus === true) {
15
+ resolvedInitialFocus = (interactionType) => {
18
16
  if (interactionType === "touch") {
19
17
  return popupRef.current ?? true;
20
18
  }
@@ -24,13 +22,15 @@ function useDeprioritizedInitialFocus({
24
22
  }
25
23
  const tabbables = tabbable(popup, getTabbableOptions());
26
24
  for (const el of tabbables) {
27
- if (el instanceof HTMLElement && !el.hasAttribute(deprioritizedAttribute)) {
25
+ if (el instanceof HTMLElement && !deprioritizedAttributes.some(
26
+ (attr) => el.hasAttribute(attr)
27
+ )) {
28
28
  return el;
29
29
  }
30
30
  }
31
31
  return true;
32
32
  };
33
- }, [initialFocus, deprioritizedAttribute]);
33
+ }
34
34
  return { resolvedInitialFocus, popupRef };
35
35
  }
36
36
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/use-deprioritized-initial-focus.ts"],
4
- "sourcesContent": ["import type { Popover as _Popover } from '@base-ui/react/popover';\nimport { useMemo, useRef } from '@wordpress/element';\nimport { tabbable } from 'tabbable';\n\n/**\n * The `initialFocus` type shared by Base UI overlay popups (Dialog, Popover,\n * AlertDialog, etc.). We derive it from `Popover.Popup.Props` here, but it\n * is identical across all overlay components.\n */\ntype InitialFocus = _Popover.Popup.Props[ 'initialFocus' ];\n\n/**\n * Options matching Base UI's internal tabbable configuration.\n * @see https://github.com/floating-ui/floating-ui/blob/master/packages/react/src/utils/tabbable.ts\n */\nconst getTabbableOptions = () => ( {\n\tgetShadowRoot: true,\n\tdisplayCheck:\n\t\ttypeof ResizeObserver === 'function' &&\n\t\tResizeObserver.toString().includes( '[native code]' )\n\t\t\t? ( 'full' as const )\n\t\t\t: ( 'none' as const ),\n} );\n\n/**\n * Returns a resolved `initialFocus` value that deprioritizes elements\n * marked with a given data attribute (e.g. a close icon), and an internal\n * ref that must be merged onto the popup element.\n *\n * When `initialFocus` is `undefined` or `true` (the default behavior),\n * the hook replaces it with a callback that:\n * 1. On touch interactions \u2014 focuses the popup element itself (preventing\n * the virtual keyboard on Android), matching Base UI's default.\n * 2. On other interactions \u2014 returns the first tabbable element that does\n * *not* carry `deprioritizedAttribute`. Falls back to Base UI's default\n * when the deprioritized element is the only tabbable element.\n *\n * All other `initialFocus` values (`false`, `RefObject`, callback) pass\n * through unchanged.\n *\n * @param props\n * @param props.initialFocus The consumer-provided `initialFocus` value.\n * @param props.deprioritizedAttribute The data attribute whose elements should be deprioritized.\n */\nexport function useDeprioritizedInitialFocus( {\n\tinitialFocus,\n\tdeprioritizedAttribute,\n}: {\n\tinitialFocus: InitialFocus;\n\tdeprioritizedAttribute: string;\n} ) {\n\tconst popupRef = useRef< HTMLDivElement >( null );\n\n\tconst resolvedInitialFocus = useMemo( (): InitialFocus => {\n\t\tif ( initialFocus !== undefined && initialFocus !== true ) {\n\t\t\treturn initialFocus;\n\t\t}\n\n\t\treturn ( interactionType ): HTMLElement | boolean | null => {\n\t\t\tif ( interactionType === 'touch' ) {\n\t\t\t\treturn popupRef.current ?? true;\n\t\t\t}\n\n\t\t\tconst popup = popupRef.current;\n\t\t\tif ( ! popup ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst tabbables = tabbable( popup, getTabbableOptions() );\n\t\t\tfor ( const el of tabbables ) {\n\t\t\t\tif (\n\t\t\t\t\tel instanceof HTMLElement &&\n\t\t\t\t\t! el.hasAttribute( deprioritizedAttribute )\n\t\t\t\t) {\n\t\t\t\t\treturn el;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\t}, [ initialFocus, deprioritizedAttribute ] );\n\n\treturn { resolvedInitialFocus, popupRef };\n}\n"],
5
- "mappings": ";AACA,SAAS,SAAS,cAAc;AAChC,SAAS,gBAAgB;AAazB,IAAM,qBAAqB,OAAQ;AAAA,EAClC,eAAe;AAAA,EACf,cACC,OAAO,mBAAmB,cAC1B,eAAe,SAAS,EAAE,SAAU,eAAgB,IAC/C,SACA;AACP;AAsBO,SAAS,6BAA8B;AAAA,EAC7C;AAAA,EACA;AACD,GAGI;AACH,QAAM,WAAW,OAA0B,IAAK;AAEhD,QAAM,uBAAuB,QAAS,MAAoB;AACzD,QAAK,iBAAiB,UAAa,iBAAiB,MAAO;AAC1D,aAAO;AAAA,IACR;AAEA,WAAO,CAAE,oBAAmD;AAC3D,UAAK,oBAAoB,SAAU;AAClC,eAAO,SAAS,WAAW;AAAA,MAC5B;AAEA,YAAM,QAAQ,SAAS;AACvB,UAAK,CAAE,OAAQ;AACd,eAAO;AAAA,MACR;AAEA,YAAM,YAAY,SAAU,OAAO,mBAAmB,CAAE;AACxD,iBAAY,MAAM,WAAY;AAC7B,YACC,cAAc,eACd,CAAE,GAAG,aAAc,sBAAuB,GACzC;AACD,iBAAO;AAAA,QACR;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA,EACD,GAAG,CAAE,cAAc,sBAAuB,CAAE;AAE5C,SAAO,EAAE,sBAAsB,SAAS;AACzC;",
4
+ "sourcesContent": ["import type { Popover as _Popover } from '@base-ui/react/popover';\nimport { useRef } from '@wordpress/element';\nimport { tabbable } from 'tabbable';\n\n/**\n * The `initialFocus` type shared by Base UI overlay popups (Dialog, Popover,\n * AlertDialog, etc.). We derive it from `Popover.Popup.Props` here, but it\n * is identical across all overlay components.\n */\ntype InitialFocus = _Popover.Popup.Props[ 'initialFocus' ];\n\n/**\n * Options matching Base UI's internal tabbable configuration.\n * @see https://github.com/floating-ui/floating-ui/blob/master/packages/react/src/utils/tabbable.ts\n */\nconst getTabbableOptions = () => ( {\n\tgetShadowRoot: true,\n\tdisplayCheck:\n\t\ttypeof ResizeObserver === 'function' &&\n\t\tResizeObserver.toString().includes( '[native code]' )\n\t\t\t? ( 'full' as const )\n\t\t\t: ( 'none' as const ),\n} );\n\n/**\n * Returns a resolved `initialFocus` value that deprioritizes elements\n * marked with any of the given data attributes (e.g. a close icon, a\n * library-managed scroll container), and an internal ref that must be\n * merged onto the popup element.\n *\n * When `initialFocus` is `undefined` or `true` (the default behavior),\n * the hook replaces it with a callback that:\n * 1. On touch interactions \u2014 focuses the popup element itself (preventing\n * the virtual keyboard on Android), matching Base UI's default.\n * 2. On other interactions \u2014 returns the first tabbable element that does\n * *not* carry any of `deprioritizedAttributes`. Falls back to Base\n * UI's default when every tabbable element is deprioritized.\n *\n * All other `initialFocus` values (`false`, `RefObject`, callback) pass\n * through unchanged.\n *\n * @param props\n * @param props.initialFocus The consumer-provided `initialFocus` value.\n * @param props.deprioritizedAttributes The data attributes whose elements should be deprioritized.\n */\nexport function useDeprioritizedInitialFocus( {\n\tinitialFocus,\n\tdeprioritizedAttributes,\n}: {\n\tinitialFocus: InitialFocus;\n\tdeprioritizedAttributes: string[];\n} ) {\n\tconst popupRef = useRef< HTMLDivElement >( null );\n\n\t// Returning a fresh callback on every render is intentional. Base UI\n\t// stores `initialFocus` via `useValueAsRef` (see its FloatingFocusManager\n\t// source) and reads it through `ref.current` only at open time, so\n\t// reference identity doesn't affect behavior. Skipping `useMemo` also\n\t// avoids either forcing callers to memoize their attributes array or\n\t// fighting the React Compiler with a stringified dep key.\n\tlet resolvedInitialFocus: InitialFocus = initialFocus;\n\tif ( initialFocus === undefined || initialFocus === true ) {\n\t\tresolvedInitialFocus = ( interactionType ) => {\n\t\t\tif ( interactionType === 'touch' ) {\n\t\t\t\treturn popupRef.current ?? true;\n\t\t\t}\n\n\t\t\tconst popup = popupRef.current;\n\t\t\tif ( ! popup ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst tabbables = tabbable( popup, getTabbableOptions() );\n\t\t\tfor ( const el of tabbables ) {\n\t\t\t\tif (\n\t\t\t\t\tel instanceof HTMLElement &&\n\t\t\t\t\t! deprioritizedAttributes.some( ( attr ) =>\n\t\t\t\t\t\tel.hasAttribute( attr )\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn el;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\t}\n\n\treturn { resolvedInitialFocus, popupRef };\n}\n"],
5
+ "mappings": ";AACA,SAAS,cAAc;AACvB,SAAS,gBAAgB;AAazB,IAAM,qBAAqB,OAAQ;AAAA,EAClC,eAAe;AAAA,EACf,cACC,OAAO,mBAAmB,cAC1B,eAAe,SAAS,EAAE,SAAU,eAAgB,IAC/C,SACA;AACP;AAuBO,SAAS,6BAA8B;AAAA,EAC7C;AAAA,EACA;AACD,GAGI;AACH,QAAM,WAAW,OAA0B,IAAK;AAQhD,MAAI,uBAAqC;AACzC,MAAK,iBAAiB,UAAa,iBAAiB,MAAO;AAC1D,2BAAuB,CAAE,oBAAqB;AAC7C,UAAK,oBAAoB,SAAU;AAClC,eAAO,SAAS,WAAW;AAAA,MAC5B;AAEA,YAAM,QAAQ,SAAS;AACvB,UAAK,CAAE,OAAQ;AACd,eAAO;AAAA,MACR;AAEA,YAAM,YAAY,SAAU,OAAO,mBAAmB,CAAE;AACxD,iBAAY,MAAM,WAAY;AAC7B,YACC,cAAc,eACd,CAAE,wBAAwB;AAAA,UAAM,CAAE,SACjC,GAAG,aAAc,IAAK;AAAA,QACvB,GACC;AACD,iBAAO;AAAA,QACR;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO,EAAE,sBAAsB,SAAS;AACzC;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,114 @@
1
+ // packages/ui/src/utils/use-overlay-scroll-state-attributes.ts
2
+ import { useCallback, useLayoutEffect, useState } from "@wordpress/element";
3
+ var SCROLL_CONTAINER_ATTR = "data-wp-ui-overlay-scroll-container";
4
+ var SCROLLED_FROM_TOP_ATTR = "data-wp-ui-overlay-scrolled-from-top";
5
+ var SCROLLED_FROM_BOTTOM_ATTR = "data-wp-ui-overlay-scrolled-from-bottom";
6
+ var SCROLL_TABBABLE_FLAG_ATTR = "data-wp-ui-overlay-scroll-tabbable";
7
+ var SCROLL_END_EPSILON = 1;
8
+ function reconcileTabbableFlag(el) {
9
+ if (el.hasAttribute(SCROLL_TABBABLE_FLAG_ATTR) && el.getAttribute("tabindex") !== "0") {
10
+ el.removeAttribute(SCROLL_TABBABLE_FLAG_ATTR);
11
+ }
12
+ }
13
+ function updateScrollAttributes(el) {
14
+ const { scrollTop, clientHeight, scrollHeight } = el;
15
+ const overflows = scrollHeight - clientHeight > SCROLL_END_EPSILON;
16
+ el.toggleAttribute(SCROLLED_FROM_TOP_ATTR, scrollTop > 0);
17
+ el.toggleAttribute(
18
+ SCROLLED_FROM_BOTTOM_ATTR,
19
+ scrollTop + clientHeight < scrollHeight - SCROLL_END_EPSILON
20
+ );
21
+ reconcileTabbableFlag(el);
22
+ if (overflows) {
23
+ if (!el.hasAttribute(SCROLL_TABBABLE_FLAG_ATTR) && el.getAttribute("tabindex") === null) {
24
+ el.setAttribute("tabindex", "0");
25
+ el.setAttribute(SCROLL_TABBABLE_FLAG_ATTR, "");
26
+ }
27
+ } else if (el.hasAttribute(SCROLL_TABBABLE_FLAG_ATTR)) {
28
+ el.removeAttribute("tabindex");
29
+ el.removeAttribute(SCROLL_TABBABLE_FLAG_ATTR);
30
+ }
31
+ }
32
+ var HOOK_OWNED_ATTRS = [
33
+ SCROLL_CONTAINER_ATTR,
34
+ SCROLLED_FROM_TOP_ATTR,
35
+ SCROLLED_FROM_BOTTOM_ATTR
36
+ ];
37
+ function cleanupScrollAttributes(el) {
38
+ for (const attr of HOOK_OWNED_ATTRS) {
39
+ el.removeAttribute(attr);
40
+ }
41
+ reconcileTabbableFlag(el);
42
+ if (el.hasAttribute(SCROLL_TABBABLE_FLAG_ATTR)) {
43
+ el.removeAttribute("tabindex");
44
+ el.removeAttribute(SCROLL_TABBABLE_FLAG_ATTR);
45
+ }
46
+ }
47
+ function useOverlayScrollStateAttributes(onScroll) {
48
+ const [node, setNode] = useState(null);
49
+ const ref = useCallback((el) => {
50
+ setNode(el);
51
+ }, []);
52
+ useLayoutEffect(() => {
53
+ if (!node) {
54
+ return;
55
+ }
56
+ node.setAttribute(SCROLL_CONTAINER_ATTR, "");
57
+ updateScrollAttributes(node);
58
+ if (typeof ResizeObserver === "undefined") {
59
+ return () => {
60
+ cleanupScrollAttributes(node);
61
+ };
62
+ }
63
+ const resizeObserver = new ResizeObserver(() => {
64
+ updateScrollAttributes(node);
65
+ });
66
+ resizeObserver.observe(node);
67
+ for (const child of Array.from(node.children)) {
68
+ resizeObserver.observe(child);
69
+ }
70
+ let mutationObserver;
71
+ if (typeof MutationObserver !== "undefined") {
72
+ mutationObserver = new MutationObserver((records) => {
73
+ for (const record of records) {
74
+ if (record.target === node) {
75
+ for (const added of Array.from(record.addedNodes)) {
76
+ if (added instanceof Element) {
77
+ resizeObserver.observe(added);
78
+ }
79
+ }
80
+ for (const removed of Array.from(
81
+ record.removedNodes
82
+ )) {
83
+ if (removed instanceof Element) {
84
+ resizeObserver.unobserve(removed);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ updateScrollAttributes(node);
90
+ });
91
+ mutationObserver.observe(node, {
92
+ childList: true
93
+ });
94
+ }
95
+ return () => {
96
+ resizeObserver.disconnect();
97
+ mutationObserver?.disconnect();
98
+ cleanupScrollAttributes(node);
99
+ };
100
+ }, [node]);
101
+ const handleScroll = useCallback(
102
+ (event) => {
103
+ updateScrollAttributes(event.currentTarget);
104
+ onScroll?.(event);
105
+ },
106
+ [onScroll]
107
+ );
108
+ return { ref, onScroll: handleScroll };
109
+ }
110
+ export {
111
+ SCROLL_CONTAINER_ATTR,
112
+ useOverlayScrollStateAttributes
113
+ };
114
+ //# sourceMappingURL=use-overlay-scroll-state-attributes.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/use-overlay-scroll-state-attributes.ts"],
4
+ "sourcesContent": ["import type { UIEvent, UIEventHandler } from 'react';\nimport { useCallback, useLayoutEffect, useState } from '@wordpress/element';\n\nexport const SCROLL_CONTAINER_ATTR = 'data-wp-ui-overlay-scroll-container';\nconst SCROLLED_FROM_TOP_ATTR = 'data-wp-ui-overlay-scrolled-from-top';\nconst SCROLLED_FROM_BOTTOM_ATTR = 'data-wp-ui-overlay-scrolled-from-bottom';\n/**\n * Marks a `tabindex` that this hook installed, so subsequent runs can tell\n * a hook-managed tabindex apart from one the consumer set on the element\n * themselves.\n *\n * Internal: the constant is not exported, but the literal string is named\n * in the public JSDoc on `useOverlayScrollStateAttributes` so consumers\n * grepping for \"why does this element have a `tabindex='0'` I didn't set?\"\n * can find the breadcrumb. If this string changes, update the JSDoc too.\n */\nconst SCROLL_TABBABLE_FLAG_ATTR = 'data-wp-ui-overlay-scroll-tabbable';\n\n/**\n * Allow fractional-pixel rounding when comparing scroll offsets. Browsers can\n * report `scrollTop + clientHeight` as slightly less than `scrollHeight` even\n * when fully scrolled to the bottom.\n */\nconst SCROLL_END_EPSILON = 1;\n\n/**\n * Detect consumer takeover of a previously hook-managed `tabindex` after the\n * hook had already installed its own: if the flag is set but the current\n * `tabindex` is no longer `\"0\"`, the consumer has overridden our value. Drop\n * the flag so subsequent ticks treat the `tabindex` as consumer-owned and\n * never touch it again.\n *\n * Limitation: the heuristic compares the DOM attribute, so a consumer who\n * passes `tabIndex={ 0 }` explicitly is indistinguishable from our own\n * managed `\"0\"` and would still be cleaned up on the next non-overflow\n * tick. See the contract paragraph on `useOverlayScrollStateAttributes`.\n *\n * @param el The scroll container.\n */\nfunction reconcileTabbableFlag( el: HTMLElement ) {\n\tif (\n\t\tel.hasAttribute( SCROLL_TABBABLE_FLAG_ATTR ) &&\n\t\tel.getAttribute( 'tabindex' ) !== '0'\n\t) {\n\t\tel.removeAttribute( SCROLL_TABBABLE_FLAG_ATTR );\n\t}\n}\n\nfunction updateScrollAttributes( el: HTMLElement ) {\n\tconst { scrollTop, clientHeight, scrollHeight } = el;\n\tconst overflows = scrollHeight - clientHeight > SCROLL_END_EPSILON;\n\n\tel.toggleAttribute( SCROLLED_FROM_TOP_ATTR, scrollTop > 0 );\n\tel.toggleAttribute(\n\t\tSCROLLED_FROM_BOTTOM_ATTR,\n\t\tscrollTop + clientHeight < scrollHeight - SCROLL_END_EPSILON\n\t);\n\n\t// Keyboard-scrollable regions must be reachable via Tab (WCAG 2.1.1),\n\t// but adding a stray tab stop to a non-scrolling `<div>` is an\n\t// anti-pattern. Toggle `tabindex=\"0\"` only while the element actually\n\t// overflows. The flag attribute guards against clobbering a\n\t// consumer-supplied tabindex: we only touch attributes we installed.\n\n\t// Takeover-after-install: detect a consumer who started overriding\n\t// our managed `\"0\"` *after* the hook installed it (e.g. a re-render\n\t// passing `tabIndex={ -1 }`). The flag is dropped so the install /\n\t// cleanup branches below leave the consumer's value untouched.\n\treconcileTabbableFlag( el );\n\n\tif ( overflows ) {\n\t\t// Pre-install opt-out: a consumer-supplied `tabindex` (including\n\t\t// `tabindex=\"-1\"` to hide the region from Tab order) keeps its\n\t\t// value because the flag is never installed in the first place.\n\t\t// If that consumer-supplied value is later *removed*, the hook\n\t\t// will install its own on the next overflow tick \u2014 the DOM\n\t\t// attribute alone can't distinguish a prior explicit opt-out\n\t\t// from an unconfigured state.\n\t\tif (\n\t\t\t! el.hasAttribute( SCROLL_TABBABLE_FLAG_ATTR ) &&\n\t\t\tel.getAttribute( 'tabindex' ) === null\n\t\t) {\n\t\t\tel.setAttribute( 'tabindex', '0' );\n\t\t\tel.setAttribute( SCROLL_TABBABLE_FLAG_ATTR, '' );\n\t\t}\n\t} else if ( el.hasAttribute( SCROLL_TABBABLE_FLAG_ATTR ) ) {\n\t\tel.removeAttribute( 'tabindex' );\n\t\tel.removeAttribute( SCROLL_TABBABLE_FLAG_ATTR );\n\t}\n}\n\nconst HOOK_OWNED_ATTRS = [\n\tSCROLL_CONTAINER_ATTR,\n\tSCROLLED_FROM_TOP_ATTR,\n\tSCROLLED_FROM_BOTTOM_ATTR,\n] as const;\n\nfunction cleanupScrollAttributes( el: HTMLElement ) {\n\tfor ( const attr of HOOK_OWNED_ATTRS ) {\n\t\tel.removeAttribute( attr );\n\t}\n\t// Reconcile first so a flag left over from a consumer-takeover never\n\t// causes us to clobber the consumer's `tabindex` here.\n\treconcileTabbableFlag( el );\n\t// After reconciliation the flag is set only when the current\n\t// `tabindex` is still `\"0\"` (i.e. ours). Any other value belongs to\n\t// the consumer and is left alone.\n\tif ( el.hasAttribute( SCROLL_TABBABLE_FLAG_ATTR ) ) {\n\t\tel.removeAttribute( 'tabindex' );\n\t\tel.removeAttribute( SCROLL_TABBABLE_FLAG_ATTR );\n\t}\n}\n\n/**\n * Keeps `data-wp-ui-overlay-scrolled-from-top` and\n * `data-wp-ui-overlay-scrolled-from-bottom` attributes in sync with a\n * scrollable overlay element's scroll position, and marks the element with\n * `data-wp-ui-overlay-scroll-container` so shared CSS (see\n * `overlay-chrome.module.css`) can target it without coupling to a specific\n * class name. Descendant selectors (e.g. sticky header/footer chrome) read\n * these attributes to toggle their separator border without forcing a React\n * re-render on every scroll frame.\n *\n * When the element overflows, a `tabindex=\"0\"` is also installed so keyboard\n * users can focus the region and arrow-scroll it (WCAG 2.1.1). The tabindex\n * is removed again as soon as the element no longer overflows \u2014 a stray tab\n * stop on a non-scrolling region is an anti-pattern. An internal flag\n * attribute (`data-wp-ui-overlay-scroll-tabbable`) marks tabindex values\n * the hook installed, so a consumer-supplied `tabindex` is never\n * overwritten.\n *\n * Tabindex contract:\n * - **Pre-install opt-out**: a `tabindex` set on the element before the\n * first overflow is detected is left alone forever. The flag is never\n * installed, so the hook never owns the attribute. (This means\n * `tabIndex={ -1 }` on `Dialog.Content` / `Drawer.Content` reliably\n * suppresses the auto tab stop.)\n * - **Takeover after install**: if the consumer overrides the hook's\n * `\"0\"` with a *different* value after the fact, the flag is dropped\n * on the next tick (`reconcileTabbableFlag`) and the consumer's value\n * is preserved through subsequent overflow / non-overflow transitions\n * and through cleanup.\n * - **Indistinguishable case**: a consumer who passes `tabIndex={ 0 }`\n * explicitly while the hook also has `\"0\"` installed cannot be\n * detected \u2014 the DOM attribute is identical to the hook-managed\n * value, so the hook will still strip it on the next non-overflow\n * tick. This is rarely intentional (the consumer's `0` matches the\n * hook's behavior anyway), but consumers needing a guaranteed\n * sticky `0` should avoid relying on it across overflow flips.\n *\n * Overflow detection is block-axis-only. Overlay popups are expected to\n * constrain content width (`overlay-chrome.module.css` clips `.content`\n * with `overflow-inline: hidden`); horizontal scrolling is intentionally\n * not supported, so this hook doesn't toggle tabindex on inline-axis\n * overflow and the scroll-state attributes don't track it.\n *\n * Returns a callback `ref` that the caller must attach to the scroll\n * container, and an `onScroll` handler to wire up to the same element. A\n * callback ref (not a `RefObject`) is used because overlay libraries like\n * Base UI mount the popup DOM lazily when the overlay opens, so the\n * attributes must be initialized the moment the node is attached, not when\n * the host component first renders. `useState` also absorbs repeated\n * attachments of the same node (Strict Mode remount, stable refs) without\n * re-running the effect.\n *\n * Change detection combines a `ResizeObserver` scoped to the container\n * and its direct children (to catch flex-layout growth) with a\n * `MutationObserver` on direct-child additions/removals only (to keep\n * the resize-observer set in sync as direct children come and go).\n *\n * Deeper subtree mutations are intentionally not observed: in practice,\n * any descendant whose growth changes the scroll size also propagates a\n * resize up the layout tree, so the existing `ResizeObserver` on direct\n * children catches it. Watching the full subtree would fan out the\n * mutation callback over every text-node insertion in content-heavy\n * overlays (rich-text editors, virtualized lists), which isn't worth\n * the cost of the rare deep-mutation-without-resize case. Revisit\n * (and consider rAF-coalescing the callback) if a real consumer hits\n * an attribute-staleness regression.\n *\n * Once CSS scroll-state container queries are supported across target\n * browsers, both the data attributes and this hook can be replaced with\n * `@container scroll-state(scrollable: top)` / `(scrollable: bottom)`.\n * See: https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Conditional_rules/Container_scroll-state_queries\n *\n * @param onScroll Optional `onScroll` from the parent; invoked after the\n * overlay scroll-state attributes are updated, so by the\n * time this handler runs, `data-wp-ui-overlay-scrolled-*`\n * on `event.currentTarget` already reflect the post-scroll\n * state.\n */\nexport function useOverlayScrollStateAttributes<\n\tT extends HTMLElement = HTMLElement,\n>( onScroll?: UIEventHandler< T > | undefined ) {\n\tconst [ node, setNode ] = useState< T | null >( null );\n\n\tconst ref = useCallback( ( el: T | null ) => {\n\t\tsetNode( el );\n\t}, [] );\n\n\tuseLayoutEffect( () => {\n\t\tif ( ! node ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnode.setAttribute( SCROLL_CONTAINER_ATTR, '' );\n\t\tupdateScrollAttributes( node );\n\n\t\tif ( typeof ResizeObserver === 'undefined' ) {\n\t\t\treturn () => {\n\t\t\t\tcleanupScrollAttributes( node );\n\t\t\t};\n\t\t}\n\n\t\tconst resizeObserver = new ResizeObserver( () => {\n\t\t\tupdateScrollAttributes( node );\n\t\t} );\n\t\tresizeObserver.observe( node );\n\t\tfor ( const child of Array.from( node.children ) ) {\n\t\t\tresizeObserver.observe( child );\n\t\t}\n\n\t\tlet mutationObserver: MutationObserver | undefined;\n\t\tif ( typeof MutationObserver !== 'undefined' ) {\n\t\t\tmutationObserver = new MutationObserver( ( records ) => {\n\t\t\t\tfor ( const record of records ) {\n\t\t\t\t\t// Only direct-child additions/removals affect what the\n\t\t\t\t\t// ResizeObserver is observing; deeper descendant changes\n\t\t\t\t\t// reach us through this callback for attribute refresh,\n\t\t\t\t\t// but we don't observe them individually to keep the\n\t\t\t\t\t// cost bounded on large subtrees.\n\t\t\t\t\tif ( record.target === node ) {\n\t\t\t\t\t\tfor ( const added of Array.from( record.addedNodes ) ) {\n\t\t\t\t\t\t\tif ( added instanceof Element ) {\n\t\t\t\t\t\t\t\tresizeObserver.observe( added );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor ( const removed of Array.from(\n\t\t\t\t\t\t\trecord.removedNodes\n\t\t\t\t\t\t) ) {\n\t\t\t\t\t\t\tif ( removed instanceof Element ) {\n\t\t\t\t\t\t\t\tresizeObserver.unobserve( removed );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tupdateScrollAttributes( node );\n\t\t\t} );\n\t\t\t// Direct children only \u2014 see the JSDoc above for why we\n\t\t\t// intentionally don't observe the full subtree.\n\t\t\tmutationObserver.observe( node, {\n\t\t\t\tchildList: true,\n\t\t\t} );\n\t\t}\n\n\t\treturn () => {\n\t\t\tresizeObserver.disconnect();\n\t\t\tmutationObserver?.disconnect();\n\t\t\tcleanupScrollAttributes( node );\n\t\t};\n\t}, [ node ] );\n\n\tconst handleScroll = useCallback(\n\t\t( event: UIEvent< T > ) => {\n\t\t\tupdateScrollAttributes( event.currentTarget );\n\t\t\tonScroll?.( event );\n\t\t},\n\t\t[ onScroll ]\n\t);\n\n\treturn { ref, onScroll: handleScroll };\n}\n"],
5
+ "mappings": ";AACA,SAAS,aAAa,iBAAiB,gBAAgB;AAEhD,IAAM,wBAAwB;AACrC,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B;AAWlC,IAAM,4BAA4B;AAOlC,IAAM,qBAAqB;AAgB3B,SAAS,sBAAuB,IAAkB;AACjD,MACC,GAAG,aAAc,yBAA0B,KAC3C,GAAG,aAAc,UAAW,MAAM,KACjC;AACD,OAAG,gBAAiB,yBAA0B;AAAA,EAC/C;AACD;AAEA,SAAS,uBAAwB,IAAkB;AAClD,QAAM,EAAE,WAAW,cAAc,aAAa,IAAI;AAClD,QAAM,YAAY,eAAe,eAAe;AAEhD,KAAG,gBAAiB,wBAAwB,YAAY,CAAE;AAC1D,KAAG;AAAA,IACF;AAAA,IACA,YAAY,eAAe,eAAe;AAAA,EAC3C;AAYA,wBAAuB,EAAG;AAE1B,MAAK,WAAY;AAQhB,QACC,CAAE,GAAG,aAAc,yBAA0B,KAC7C,GAAG,aAAc,UAAW,MAAM,MACjC;AACD,SAAG,aAAc,YAAY,GAAI;AACjC,SAAG,aAAc,2BAA2B,EAAG;AAAA,IAChD;AAAA,EACD,WAAY,GAAG,aAAc,yBAA0B,GAAI;AAC1D,OAAG,gBAAiB,UAAW;AAC/B,OAAG,gBAAiB,yBAA0B;AAAA,EAC/C;AACD;AAEA,IAAM,mBAAmB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACD;AAEA,SAAS,wBAAyB,IAAkB;AACnD,aAAY,QAAQ,kBAAmB;AACtC,OAAG,gBAAiB,IAAK;AAAA,EAC1B;AAGA,wBAAuB,EAAG;AAI1B,MAAK,GAAG,aAAc,yBAA0B,GAAI;AACnD,OAAG,gBAAiB,UAAW;AAC/B,OAAG,gBAAiB,yBAA0B;AAAA,EAC/C;AACD;AAgFO,SAAS,gCAEb,UAA6C;AAC/C,QAAM,CAAE,MAAM,OAAQ,IAAI,SAAsB,IAAK;AAErD,QAAM,MAAM,YAAa,CAAE,OAAkB;AAC5C,YAAS,EAAG;AAAA,EACb,GAAG,CAAC,CAAE;AAEN,kBAAiB,MAAM;AACtB,QAAK,CAAE,MAAO;AACb;AAAA,IACD;AAEA,SAAK,aAAc,uBAAuB,EAAG;AAC7C,2BAAwB,IAAK;AAE7B,QAAK,OAAO,mBAAmB,aAAc;AAC5C,aAAO,MAAM;AACZ,gCAAyB,IAAK;AAAA,MAC/B;AAAA,IACD;AAEA,UAAM,iBAAiB,IAAI,eAAgB,MAAM;AAChD,6BAAwB,IAAK;AAAA,IAC9B,CAAE;AACF,mBAAe,QAAS,IAAK;AAC7B,eAAY,SAAS,MAAM,KAAM,KAAK,QAAS,GAAI;AAClD,qBAAe,QAAS,KAAM;AAAA,IAC/B;AAEA,QAAI;AACJ,QAAK,OAAO,qBAAqB,aAAc;AAC9C,yBAAmB,IAAI,iBAAkB,CAAE,YAAa;AACvD,mBAAY,UAAU,SAAU;AAM/B,cAAK,OAAO,WAAW,MAAO;AAC7B,uBAAY,SAAS,MAAM,KAAM,OAAO,UAAW,GAAI;AACtD,kBAAK,iBAAiB,SAAU;AAC/B,+BAAe,QAAS,KAAM;AAAA,cAC/B;AAAA,YACD;AACA,uBAAY,WAAW,MAAM;AAAA,cAC5B,OAAO;AAAA,YACR,GAAI;AACH,kBAAK,mBAAmB,SAAU;AACjC,+BAAe,UAAW,OAAQ;AAAA,cACnC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AACA,+BAAwB,IAAK;AAAA,MAC9B,CAAE;AAGF,uBAAiB,QAAS,MAAM;AAAA,QAC/B,WAAW;AAAA,MACZ,CAAE;AAAA,IACH;AAEA,WAAO,MAAM;AACZ,qBAAe,WAAW;AAC1B,wBAAkB,WAAW;AAC7B,8BAAyB,IAAK;AAAA,IAC/B;AAAA,EACD,GAAG,CAAE,IAAK,CAAE;AAEZ,QAAM,eAAe;AAAA,IACpB,CAAE,UAAyB;AAC1B,6BAAwB,MAAM,aAAc;AAC5C,iBAAY,KAAM;AAAA,IACnB;AAAA,IACA,CAAE,QAAS;AAAA,EACZ;AAEA,SAAO,EAAE,KAAK,UAAU,aAAa;AACtC;",
6
+ "names": []
7
+ }
@@ -2,12 +2,91 @@
2
2
  import { mergeProps, useRender } from "@base-ui/react";
3
3
  import { forwardRef } from "@wordpress/element";
4
4
 
5
+ // packages/style-runtime/src/index.ts
6
+ var STYLE_HASH_ATTRIBUTE = "data-wp-hash";
7
+ function getRuntime() {
8
+ const globalScope = globalThis;
9
+ if (globalScope.__wpStyleRuntime) {
10
+ return globalScope.__wpStyleRuntime;
11
+ }
12
+ globalScope.__wpStyleRuntime = {
13
+ documents: /* @__PURE__ */ new Map(),
14
+ styles: /* @__PURE__ */ new Map(),
15
+ injectedStyles: /* @__PURE__ */ new WeakMap()
16
+ };
17
+ if (typeof document !== "undefined") {
18
+ registerDocument(document);
19
+ }
20
+ return globalScope.__wpStyleRuntime;
21
+ }
22
+ function documentContainsStyleHash(targetDocument, hash) {
23
+ if (!targetDocument.head) {
24
+ return false;
25
+ }
26
+ for (const style of targetDocument.head.querySelectorAll(
27
+ `style[${STYLE_HASH_ATTRIBUTE}]`
28
+ )) {
29
+ if (style.getAttribute(STYLE_HASH_ATTRIBUTE) === hash) {
30
+ return true;
31
+ }
32
+ }
33
+ return false;
34
+ }
35
+ function injectStyle(targetDocument, hash, css) {
36
+ if (!targetDocument.head) {
37
+ return;
38
+ }
39
+ const runtime = getRuntime();
40
+ let injectedStyles = runtime.injectedStyles.get(targetDocument);
41
+ if (!injectedStyles) {
42
+ injectedStyles = /* @__PURE__ */ new Set();
43
+ runtime.injectedStyles.set(targetDocument, injectedStyles);
44
+ }
45
+ if (injectedStyles.has(hash)) {
46
+ return;
47
+ }
48
+ if (documentContainsStyleHash(targetDocument, hash)) {
49
+ injectedStyles.add(hash);
50
+ return;
51
+ }
52
+ const style = targetDocument.createElement("style");
53
+ style.setAttribute(STYLE_HASH_ATTRIBUTE, hash);
54
+ style.appendChild(targetDocument.createTextNode(css));
55
+ targetDocument.head.appendChild(style);
56
+ injectedStyles.add(hash);
57
+ }
58
+ function registerDocument(targetDocument) {
59
+ const runtime = getRuntime();
60
+ runtime.documents.set(
61
+ targetDocument,
62
+ (runtime.documents.get(targetDocument) ?? 0) + 1
63
+ );
64
+ for (const [hash, css] of runtime.styles) {
65
+ injectStyle(targetDocument, hash, css);
66
+ }
67
+ return () => {
68
+ const count = runtime.documents.get(targetDocument);
69
+ if (count === void 0) {
70
+ return;
71
+ }
72
+ if (count <= 1) {
73
+ runtime.documents.delete(targetDocument);
74
+ return;
75
+ }
76
+ runtime.documents.set(targetDocument, count - 1);
77
+ };
78
+ }
79
+ function registerStyle(hash, css) {
80
+ const runtime = getRuntime();
81
+ runtime.styles.set(hash, css);
82
+ for (const targetDocument of runtime.documents.keys()) {
83
+ injectStyle(targetDocument, hash, css);
84
+ }
85
+ }
86
+
5
87
  // packages/ui/src/visually-hidden/style.module.css
6
- if (typeof document !== "undefined" && process.env.NODE_ENV !== "test" && !document.head.querySelector("style[data-wp-hash='c46e8cb841']")) {
7
- const style = document.createElement("style");
8
- style.setAttribute("data-wp-hash", "c46e8cb841");
9
- style.appendChild(document.createTextNode("@layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;@layer wp-ui-components{.f37b9e2e191ebd66__visually-hidden{word-wrap:normal;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal}}"));
10
- document.head.appendChild(style);
88
+ if (typeof process === "undefined" || process.env.NODE_ENV !== "test") {
89
+ registerStyle("c46e8cb841", "@layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;@layer wp-ui-components{.f37b9e2e191ebd66__visually-hidden{word-wrap:normal;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal}}");
11
90
  }
12
91
  var style_default = { "visually-hidden": "f37b9e2e191ebd66__visually-hidden" };
13
92
 
@@ -19,7 +98,11 @@ var VisuallyHidden = forwardRef(
19
98
  ref,
20
99
  props: mergeProps(
21
100
  { className: style_default["visually-hidden"] },
22
- restProps
101
+ restProps,
102
+ {
103
+ // @ts-expect-error Arbitrary data-* attributes aren't indexable on the typed div props. Kept hardcoded so consumers can't change or remove it.
104
+ "data-visually-hidden": ""
105
+ }
23
106
  )
24
107
  });
25
108
  return element;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/visually-hidden/visually-hidden.tsx", "../../src/visually-hidden/style.module.css"],
4
- "sourcesContent": ["import { mergeProps, useRender } from '@base-ui/react';\nimport { forwardRef } from '@wordpress/element';\nimport type { VisuallyHiddenProps } from './types';\nimport styles from './style.module.css';\n\n/**\n * Visually hides content while keeping it accessible to screen readers.\n * Useful when providing context that's only meaningful to assistive technology.\n *\n * Renders a `<div>` by default. Use the `render` prop to swap the\n * underlying element while preserving the visually-hidden behavior.\n *\n * ## Composing with other components\n *\n * When composing with another component that uses the `render` prop\n * pattern, there are two directions \u2014 and they produce different results.\n *\n * Most of the time you'll want `VisuallyHidden` as the **host** (outer\n * component) and pass the other component via `render`. This keeps the\n * other component's HTML element and semantics intact, while\n * `VisuallyHidden` only adds its hiding styles:\n *\n * ```jsx\n * // OtherComponent keeps its semantic element (e.g. <h2>).\n * <VisuallyHidden render={ <OtherComponent /> }>\n * Accessible text\n * </VisuallyHidden>\n * ```\n *\n * The opposite direction is also possible, but be aware that it replaces\n * the other component's element with VisuallyHidden's default `<div>`:\n *\n * ```jsx\n * // OtherComponent's element becomes a <div>.\n * <OtherComponent render={ <VisuallyHidden /> }>\n * Accessible text\n * </OtherComponent>\n * ```\n *\n * Choose based on what you need: if the other component's semantic\n * element matters (e.g. `<label>`, `<legend>`, `<h2>`), keep\n * `VisuallyHidden` as the host so the element is preserved.\n */\nexport const VisuallyHidden = forwardRef< HTMLDivElement, VisuallyHiddenProps >(\n\tfunction VisuallyHidden( { render, ...restProps }, ref ) {\n\t\tconst element = useRender( {\n\t\t\trender,\n\t\t\tref,\n\t\t\tprops: mergeProps< 'div' >(\n\t\t\t\t{ className: styles[ 'visually-hidden' ] },\n\t\t\t\trestProps\n\t\t\t),\n\t\t} );\n\n\t\treturn element;\n\t}\n);\n", "if (typeof document !== 'undefined' && process.env.NODE_ENV !== 'test' && !document.head.querySelector(\"style[data-wp-hash='c46e8cb841']\")) {\n\tconst style = document.createElement(\"style\");\n\tstyle.setAttribute(\"data-wp-hash\", \"c46e8cb841\");\n\tstyle.appendChild(document.createTextNode(\"@layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;@layer wp-ui-components{.f37b9e2e191ebd66__visually-hidden{word-wrap:normal;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal}}\"));\n\tdocument.head.appendChild(style);\n}\nexport default {\"visually-hidden\":\"f37b9e2e191ebd66__visually-hidden\"};\n"],
5
- "mappings": ";AAAA,SAAS,YAAY,iBAAiB;AACtC,SAAS,kBAAkB;;;ACD3B,IAAI,OAAO,aAAa,eAAe,QAAQ,IAAI,aAAa,UAAU,CAAC,SAAS,KAAK,cAAc,kCAAkC,GAAG;AAC3I,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,aAAa,gBAAgB,YAAY;AAC/C,QAAM,YAAY,SAAS,eAAe,0RAA0R,CAAC;AACrU,WAAS,KAAK,YAAY,KAAK;AAChC;AACA,IAAO,gBAAQ,EAAC,mBAAkB,oCAAmC;;;ADqC9D,IAAM,iBAAiB;AAAA,EAC7B,SAASA,gBAAgB,EAAE,QAAQ,GAAG,UAAU,GAAG,KAAM;AACxD,UAAM,UAAU,UAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACN,EAAE,WAAW,cAAQ,iBAAkB,EAAE;AAAA,QACzC;AAAA,MACD;AAAA,IACD,CAAE;AAEF,WAAO;AAAA,EACR;AACD;",
3
+ "sources": ["../../src/visually-hidden/visually-hidden.tsx", "../../../style-runtime/src/index.ts", "../../src/visually-hidden/style.module.css"],
4
+ "sourcesContent": ["import { mergeProps, useRender } from '@base-ui/react';\nimport { forwardRef } from '@wordpress/element';\nimport type { VisuallyHiddenProps } from './types';\nimport styles from './style.module.css';\n\n/**\n * Visually hides content while keeping it accessible to screen readers.\n * Useful when providing context that's only meaningful to assistive technology.\n *\n * Renders a `<div>` by default. Use the `render` prop to swap the\n * underlying element while preserving the visually-hidden behavior.\n *\n * ## Composing with other components\n *\n * When composing with another component that uses the `render` prop\n * pattern, keep `VisuallyHidden` as the **host** (outer component) and\n * pass the other component via `render`. This keeps the other\n * component's HTML element and semantics intact, while `VisuallyHidden`\n * only adds its hiding styles:\n *\n * ```jsx\n * // OtherComponent keeps its semantic element (e.g. <h2>).\n * <VisuallyHidden render={ <OtherComponent /> }>\n * Accessible text\n * </VisuallyHidden>\n * ```\n */\nexport const VisuallyHidden = forwardRef< HTMLDivElement, VisuallyHiddenProps >(\n\tfunction VisuallyHidden( { render, ...restProps }, ref ) {\n\t\tconst element = useRender( {\n\t\t\trender,\n\t\t\tref,\n\t\t\tprops: mergeProps< 'div' >(\n\t\t\t\t{ className: styles[ 'visually-hidden' ] },\n\t\t\t\trestProps,\n\t\t\t\t{\n\t\t\t\t\t// @ts-expect-error Arbitrary data-* attributes aren't indexable on the typed div props. Kept hardcoded so consumers can't change or remove it.\n\t\t\t\t\t'data-visually-hidden': '',\n\t\t\t\t}\n\t\t\t),\n\t\t} );\n\n\t\treturn element;\n\t}\n);\n", "type GlobalScopeWithStyleRuntime = typeof globalThis & {\n\t// This global is shared by separately bundled copies of this package.\n\t// Keep its shape backward compatible after release.\n\t__wpStyleRuntime?: {\n\t\tdocuments: Map< Document, number >;\n\t\tstyles: Map< string, string >;\n\t\tinjectedStyles: WeakMap< Document, Set< string > >;\n\t};\n};\n\nconst STYLE_HASH_ATTRIBUTE = 'data-wp-hash';\n\n/**\n * Returns the shared style runtime registry.\n *\n * The registry is stored on `globalThis` so separately bundled copies of this\n * package can coordinate through the same document and style maps.\n *\n * @return The shared runtime registry.\n */\nfunction getRuntime() {\n\tconst globalScope = globalThis as GlobalScopeWithStyleRuntime;\n\n\tif ( globalScope.__wpStyleRuntime ) {\n\t\treturn globalScope.__wpStyleRuntime;\n\t}\n\n\tglobalScope.__wpStyleRuntime = {\n\t\tdocuments: new Map(),\n\t\tstyles: new Map(),\n\t\tinjectedStyles: new WeakMap(),\n\t};\n\n\tif ( typeof document !== 'undefined' ) {\n\t\tregisterDocument( document );\n\t}\n\n\treturn globalScope.__wpStyleRuntime;\n}\n\n/**\n * Checks whether a document already contains a style tag for a hash.\n *\n * @param targetDocument Document to inspect.\n * @param hash Stable hash for the transformed CSS.\n *\n * @return Whether the style hash already exists in the document.\n */\nfunction documentContainsStyleHash(\n\ttargetDocument: Document,\n\thash: string\n): boolean {\n\tif ( ! targetDocument.head ) {\n\t\treturn false;\n\t}\n\n\tfor ( const style of targetDocument.head.querySelectorAll(\n\t\t`style[${ STYLE_HASH_ATTRIBUTE }]`\n\t) ) {\n\t\tif ( style.getAttribute( STYLE_HASH_ATTRIBUTE ) === hash ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Injects a registered style into a document, unless that document already\n * contains a style tag for the same hash.\n *\n * @param targetDocument Document to inject the style into.\n * @param hash Stable hash for the transformed CSS.\n * @param css CSS text to inject.\n */\nfunction injectStyle( targetDocument: Document, hash: string, css: string ) {\n\tif ( ! targetDocument.head ) {\n\t\treturn;\n\t}\n\n\tconst runtime = getRuntime();\n\tlet injectedStyles = runtime.injectedStyles.get( targetDocument );\n\n\tif ( ! injectedStyles ) {\n\t\tinjectedStyles = new Set();\n\t\truntime.injectedStyles.set( targetDocument, injectedStyles );\n\t}\n\n\tif ( injectedStyles.has( hash ) ) {\n\t\treturn;\n\t}\n\n\t// Older generated CSS module output can still inject matching style tags\n\t// after this document's cache is created, so keep the DOM as the fallback\n\t// source of truth on cache misses.\n\tif ( documentContainsStyleHash( targetDocument, hash ) ) {\n\t\tinjectedStyles.add( hash );\n\t\treturn;\n\t}\n\n\tconst style = targetDocument.createElement( 'style' );\n\tstyle.setAttribute( STYLE_HASH_ATTRIBUTE, hash );\n\tstyle.appendChild( targetDocument.createTextNode( css ) );\n\ttargetDocument.head.appendChild( style );\n\tinjectedStyles.add( hash );\n}\n\n/**\n * Registers a document as a style injection target.\n *\n * Existing registered styles are replayed into the document immediately.\n * Documents are reference-counted so multiple providers can safely register the\n * same document without one cleanup removing it while another registration is\n * still active.\n *\n * @param targetDocument Document to receive registered styles.\n * @return Cleanup function that unregisters this document registration.\n */\nexport function registerDocument( targetDocument: Document ) {\n\tconst runtime = getRuntime();\n\n\truntime.documents.set(\n\t\ttargetDocument,\n\t\t( runtime.documents.get( targetDocument ) ?? 0 ) + 1\n\t);\n\n\tfor ( const [ hash, css ] of runtime.styles ) {\n\t\tinjectStyle( targetDocument, hash, css );\n\t}\n\n\treturn () => {\n\t\tconst count = runtime.documents.get( targetDocument );\n\n\t\tif ( count === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( count <= 1 ) {\n\t\t\truntime.documents.delete( targetDocument );\n\t\t\treturn;\n\t\t}\n\n\t\truntime.documents.set( targetDocument, count - 1 );\n\t};\n}\n\n/**\n * Registers a style and injects it into all registered documents.\n *\n * The hash is used as the deduplication key, so calling this repeatedly with\n * the same hash will not add duplicate style tags to a document.\n * Registered styles are retained for the lifetime of the page so they can be\n * replayed into documents that are registered later.\n *\n * @param hash Stable hash for the transformed CSS.\n * @param css CSS text to inject.\n */\nexport function registerStyle( hash: string, css: string ) {\n\tconst runtime = getRuntime();\n\n\truntime.styles.set( hash, css );\n\n\tfor ( const targetDocument of runtime.documents.keys() ) {\n\t\tinjectStyle( targetDocument, hash, css );\n\t}\n}\n", "import { registerStyle } from '@wordpress/style-runtime';\nif (typeof process === 'undefined' || process.env.NODE_ENV !== 'test') {\n\tregisterStyle(\"c46e8cb841\", \"@layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;@layer wp-ui-components{.f37b9e2e191ebd66__visually-hidden{word-wrap:normal;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal}}\");\n}\nexport default {\"visually-hidden\":\"f37b9e2e191ebd66__visually-hidden\"};\n"],
5
+ "mappings": ";AAAA,SAAS,YAAY,iBAAiB;AACtC,SAAS,kBAAkB;;;ACS3B,IAAM,uBAAuB;AAU7B,SAAS,aAAa;AACrB,QAAM,cAAc;AAEpB,MAAK,YAAY,kBAAmB;AACnC,WAAO,YAAY;AAAA,EACpB;AAEA,cAAY,mBAAmB;AAAA,IAC9B,WAAW,oBAAI,IAAI;AAAA,IACnB,QAAQ,oBAAI,IAAI;AAAA,IAChB,gBAAgB,oBAAI,QAAQ;AAAA,EAC7B;AAEA,MAAK,OAAO,aAAa,aAAc;AACtC,qBAAkB,QAAS;AAAA,EAC5B;AAEA,SAAO,YAAY;AACpB;AAUA,SAAS,0BACR,gBACA,MACU;AACV,MAAK,CAAE,eAAe,MAAO;AAC5B,WAAO;AAAA,EACR;AAEA,aAAY,SAAS,eAAe,KAAK;AAAA,IACxC,SAAU,oBAAqB;AAAA,EAChC,GAAI;AACH,QAAK,MAAM,aAAc,oBAAqB,MAAM,MAAO;AAC1D,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAUA,SAAS,YAAa,gBAA0B,MAAc,KAAc;AAC3E,MAAK,CAAE,eAAe,MAAO;AAC5B;AAAA,EACD;AAEA,QAAM,UAAU,WAAW;AAC3B,MAAI,iBAAiB,QAAQ,eAAe,IAAK,cAAe;AAEhE,MAAK,CAAE,gBAAiB;AACvB,qBAAiB,oBAAI,IAAI;AACzB,YAAQ,eAAe,IAAK,gBAAgB,cAAe;AAAA,EAC5D;AAEA,MAAK,eAAe,IAAK,IAAK,GAAI;AACjC;AAAA,EACD;AAKA,MAAK,0BAA2B,gBAAgB,IAAK,GAAI;AACxD,mBAAe,IAAK,IAAK;AACzB;AAAA,EACD;AAEA,QAAM,QAAQ,eAAe,cAAe,OAAQ;AACpD,QAAM,aAAc,sBAAsB,IAAK;AAC/C,QAAM,YAAa,eAAe,eAAgB,GAAI,CAAE;AACxD,iBAAe,KAAK,YAAa,KAAM;AACvC,iBAAe,IAAK,IAAK;AAC1B;AAaO,SAAS,iBAAkB,gBAA2B;AAC5D,QAAM,UAAU,WAAW;AAE3B,UAAQ,UAAU;AAAA,IACjB;AAAA,KACE,QAAQ,UAAU,IAAK,cAAe,KAAK,KAAM;AAAA,EACpD;AAEA,aAAY,CAAE,MAAM,GAAI,KAAK,QAAQ,QAAS;AAC7C,gBAAa,gBAAgB,MAAM,GAAI;AAAA,EACxC;AAEA,SAAO,MAAM;AACZ,UAAM,QAAQ,QAAQ,UAAU,IAAK,cAAe;AAEpD,QAAK,UAAU,QAAY;AAC1B;AAAA,IACD;AAEA,QAAK,SAAS,GAAI;AACjB,cAAQ,UAAU,OAAQ,cAAe;AACzC;AAAA,IACD;AAEA,YAAQ,UAAU,IAAK,gBAAgB,QAAQ,CAAE;AAAA,EAClD;AACD;AAaO,SAAS,cAAe,MAAc,KAAc;AAC1D,QAAM,UAAU,WAAW;AAE3B,UAAQ,OAAO,IAAK,MAAM,GAAI;AAE9B,aAAY,kBAAkB,QAAQ,UAAU,KAAK,GAAI;AACxD,gBAAa,gBAAgB,MAAM,GAAI;AAAA,EACxC;AACD;;;ACpKA,IAAI,OAAO,YAAY,eAAe,QAAQ,IAAI,aAAa,QAAQ;AACtE,gBAAc,cAAc,0RAA0R;AACvT;AACA,IAAO,gBAAQ,EAAC,mBAAkB,oCAAmC;;;AFuB9D,IAAM,iBAAiB;AAAA,EAC7B,SAASA,gBAAgB,EAAE,QAAQ,GAAG,UAAU,GAAG,KAAM;AACxD,UAAM,UAAU,UAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACN,EAAE,WAAW,cAAQ,iBAAkB,EAAE;AAAA,QACzC;AAAA,QACA;AAAA;AAAA,UAEC,wBAAwB;AAAA,QACzB;AAAA,MACD;AAAA,IACD,CAAE;AAEF,WAAO;AAAA,EACR;AACD;",
6
6
  "names": ["VisuallyHidden"]
7
7
  }
@@ -1,4 +1,5 @@
1
1
  export { Root } from './root';
2
2
  export { Trigger } from './trigger';
3
3
  export { Popup } from './popup';
4
+ export { Portal } from './portal';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"popup.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/popup.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,QAAA,MAAM,KAAK,uGA4FV,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"popup.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/popup.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,QAAA,MAAM,KAAK,uGAuJV,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Root element that portals `AlertDialog` overlay content. Pass to
3
+ * `AlertDialog.Popup`'s `portal` prop to customize the portal target and
4
+ * wrapper. When `portal` is omitted, `AlertDialog.Popup` uses this component
5
+ * with default props.
6
+ */
7
+ declare const Portal: import("react").ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react").DialogPortalProps, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
8
+ export { Portal };
9
+ //# sourceMappingURL=portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/portal.tsx"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,QAAA,MAAM,MAAM,iNAIX,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -13,6 +13,6 @@ import type { RootProps } from './types';
13
13
  * See the [Destructive Actions guidelines](https://wordpress.github.io/gutenberg/?path=/docs/design-system-patterns-destructive-actions--docs)
14
14
  * for more details on when to use each pattern.
15
15
  */
16
- declare function Root({ children, open: openProp, onOpenChange, defaultOpen, onConfirm, }: RootProps): import("react").JSX.Element;
16
+ declare function Root({ children, open: openProp, onOpenChange, defaultOpen, onConfirm }: RootProps): import("react").JSX.Element;
17
17
  export { Root };
18
18
  //# sourceMappingURL=root.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/root.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAUzC;;;;;;;;;;;;;GAaG;AACH,iBAAS,IAAI,CAAE,EACd,QAAQ,EACR,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,WAAW,EACX,SAAS,GACT,EAAE,SAAS,+BAqLX;AAED,OAAO,EAAE,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/root.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAUzC;;;;;;;;;;;;;GAaG;AACH,iBAAS,IAAI,CAAE,EACd,QAAQ,EACR,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,WAAW,EACX,SAAS,EACT,EAAE,SAAS,+BAqLX;AAED,OAAO,EAAE,IAAI,EAAE,CAAC"}
@@ -24,6 +24,24 @@ export declare const CustomLabels: Story;
24
24
  * accessibility (`aria-describedby`); `children` adds supplementary detail.
25
25
  */
26
26
  export declare const WithCustomContent: Story;
27
+ /**
28
+ * Popovers in Gutenberg are managed with explicit z-index values, which can
29
+ * create situations where an alert dialog renders below another popover when
30
+ * you want it above.
31
+ *
32
+ * `AlertDialog` reuses `Dialog`'s styles, so the same
33
+ * `--wp-ui-dialog-z-index` CSS variable controls the z-index of the alert
34
+ * dialog's backdrop and popup. Override it either:
35
+ *
36
+ * - **Globally**, by setting the variable on `:root` or `body` (raises every
37
+ * dialog and alert dialog in the page), or
38
+ * - **Per instance**, by passing an `AlertDialog.Portal` with a `style` (or
39
+ * `className`) to `AlertDialog.Popup`'s `portal` prop. The variable
40
+ * cascades from the portal wrapper to everything rendered inside it.
41
+ *
42
+ * This story demonstrates the per-instance approach.
43
+ */
44
+ export declare const WithCustomZIndex: Story;
27
45
  /**
28
46
  * Example showing composition with a menu. The `AlertDialog.Trigger` is
29
47
  * composed with Base UI's `Menu.Item` using the `render` prop, allowing the
@@ -47,6 +65,16 @@ export declare const MenuTrigger: Story;
47
65
  * reopens.
48
66
  */
49
67
  export declare const AsyncConfirm: Story;
68
+ /**
69
+ * When the dialog's body overflows the available height, the title/description
70
+ * area stays pinned to the top of the popup and the action buttons stay pinned
71
+ * to the bottom so users keep sight of the context and primary actions while
72
+ * scrolling. Separator borders appear only when there is off-screen content
73
+ * above or below. Pass `stickyHeader={ false }` or `stickyFooter={ false }` on
74
+ * `AlertDialog.Popup` to opt out — the toggles in this story drive both props
75
+ * independently.
76
+ */
77
+ export declare const Scrollable: Story;
50
78
  /**
51
79
  * The `AlertDialog.Trigger` element is not necessary when the open state is
52
80
  * controlled externally. This is useful when the dialog needs to be opened
@@ -1 +1 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/alert-dialog/stories/index.story.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,WAAW,MAAM,KAAK,CAAC;AAGnC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,WAAW,CAAC,IAAI,CAWxC,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,WAAW,CAAC,IAAI,CAAE,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAE,KAYrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAwB/B,CAAC;AAuBF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,EAAE,KA+CzB,CAAC;AAMF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,EAAE,KAkE1B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAuBxB,CAAC"}
1
+ {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/alert-dialog/stories/index.story.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,WAAW,MAAM,KAAK,CAAC;AAInC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,WAAW,CAAC,IAAI,CAmBxC,CAAC;eACa,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,WAAW,CAAC,IAAI,CAAE,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAE,KAYrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAwB/B,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAkB9B,CAAC;AAuBF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,EAAE,KA+CzB,CAAC;AAMF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,EAAE,KAkE1B,CAAC;AAqEF;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAuBxB,CAAC"}
@@ -1,6 +1,7 @@
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
  import type { ComponentProps } from '../utils/types';
4
+ export type PortalProps = ComponentPropsWithoutRef<typeof _AlertDialog.Portal>;
4
5
  /**
5
6
  * The return type of `onConfirm`. Return `void` (or nothing) to auto-close
6
7
  * the dialog after the confirm handler completes. Return `{ close: false }`
@@ -54,9 +55,15 @@ export interface TriggerProps extends ComponentProps<'button'> {
54
55
  }
55
56
  export interface PopupProps extends ComponentProps<'div'>, Pick<_AlertDialog.Popup.Props, 'initialFocus' | 'finalFocus'> {
56
57
  /**
57
- * A parent element to render the portal into.
58
+ * Optional portal element, typically `<AlertDialog.Portal />` with
59
+ * custom `container`, `className`, or `style`. Overlay content is
60
+ * rendered as this portal's children (do not pass `children` on the portal
61
+ * element; they would be ignored).
62
+ *
63
+ * When omitted, `AlertDialog.Popup` uses `AlertDialog.Portal` with default
64
+ * props.
58
65
  */
59
- container?: _AlertDialog.Portal.Props['container'];
66
+ portal?: ReactElement<Omit<PortalProps, 'children'>>;
60
67
  /**
61
68
  * The semantic intent of the dialog, which determines its styling.
62
69
  *
@@ -101,5 +108,20 @@ export interface PopupProps extends ComponentProps<'div'>, Pick<_AlertDialog.Pop
101
108
  * @default 'Cancel'
102
109
  */
103
110
  cancelButtonText?: string;
111
+ /**
112
+ * When `true`, the dialog's title stays pinned to the top of the popup
113
+ * as the body scrolls. When `false`, the title scrolls with the body.
114
+ *
115
+ * @default true
116
+ */
117
+ stickyHeader?: boolean;
118
+ /**
119
+ * When `true`, the dialog's action buttons (and error message, if any)
120
+ * stay pinned to the bottom of the popup as the body scrolls. When
121
+ * `false`, they scroll with the body.
122
+ *
123
+ * @default true
124
+ */
125
+ stickyFooter?: boolean;
104
126
  }
105
127
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,SAChB,SAAQ,IAAI,CACX,YAAY,CAAC,IAAI,CAAC,KAAK,EACvB,MAAM,GAAG,cAAc,GAAG,aAAa,CACvC;IACD;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,SAAS,CAAC,EAAE,MAAM,aAAa,GAAG,OAAO,CAAE,aAAa,CAAE,CAAC;CAC3D;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAE,QAAQ,CAAE;IAC/D;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,UAChB,SAAQ,cAAc,CAAE,KAAK,CAAE,EAC9B,IAAI,CAAE,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAAE;IAChE;;OAEG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,CAAE,WAAW,CAAE,CAAC;IAErD;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IAEpC;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/alert-dialog/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,MAAM,WAAW,GAAG,wBAAwB,CACjD,OAAO,YAAY,CAAC,MAAM,CAC1B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,SAChB,SAAQ,IAAI,CACX,YAAY,CAAC,IAAI,CAAC,KAAK,EACvB,MAAM,GAAG,cAAc,GAAG,aAAa,CACvC;IACD;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,SAAS,CAAC,EAAE,MAAM,aAAa,GAAG,OAAO,CAAE,aAAa,CAAE,CAAC;CAC3D;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAE,QAAQ,CAAE;IAC/D;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,UAChB,SAAQ,cAAc,CAAE,KAAK,CAAE,EAC9B,IAAI,CAAE,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAAE;IAChE;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,YAAY,CAAE,IAAI,CAAE,WAAW,EAAE,UAAU,CAAE,CAAE,CAAC;IAEzD;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IAEpC;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"choosing-intent.story.d.ts","sourceRoot":"","sources":["../../../src/badge/stories/choosing-intent.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,KAAK,CAc7B,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,KAAK,CAAE,CAAC;AAEtC,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAOlB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAOpB,CAAC;AAEF,eAAO,MAAM,GAAG,EAAE,KAOjB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAOnB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAOpB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAOlB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAO1B,CAAC"}
1
+ {"version":3,"file":"choosing-intent.story.d.ts","sourceRoot":"","sources":["../../../src/badge/stories/choosing-intent.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,KAAK,CAc7B,CAAC;eACa,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,KAAK,CAAE,CAAC;AAEtC,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAOlB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAOpB,CAAC;AAEF,eAAO,MAAM,GAAG,EAAE,KAOjB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAOnB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAOpB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAOlB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAO1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/badge/stories/index.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,KAAK,CAI7B,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,KAAK,CAAE,CAAC;AAEtC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAMpB,CAAC;AAEF,eAAO,MAAM,GAAG,EAAE,KAMjB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAMpB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAM3B,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KA6CxB,CAAC"}
1
+ {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/badge/stories/index.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,KAAK,CAU7B,CAAC;eACa,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,KAAK,CAAE,CAAC;AAEtC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAMpB,CAAC;AAEF,eAAO,MAAM,GAAG,EAAE,KAMjB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAMpB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAM3B,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KA6CxB,CAAC"}
@@ -1,3 +1,6 @@
1
1
  import { type ButtonProps } from './types';
2
+ /**
3
+ * A versatile button component with multiple variants, tones, and sizes.
4
+ */
2
5
  export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
3
6
  //# sourceMappingURL=button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/button/button.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAM3C,eAAO,MAAM,MAAM,2GA+ClB,CAAC"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/button/button.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAM3C;;GAEG;AACH,eAAO,MAAM,MAAM,2GA+ClB,CAAC"}
@@ -1,10 +1,3 @@
1
- import { type IconProps } from '../icon/types';
2
- interface ButtonIconProps extends IconProps {
3
- /**
4
- * The icon to display, from the `@wordpress/icons` package.
5
- */
6
- icon: IconProps['icon'];
7
- }
1
+ import { type ButtonIconProps } from './types';
8
2
  export declare const ButtonIcon: import("react").ForwardRefExoticComponent<Omit<ButtonIconProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
9
- export {};
10
3
  //# sourceMappingURL=icon.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/button/icon.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,UAAU,eAAgB,SAAQ,SAAS;IAC1C;;OAEG;IACH,IAAI,EAAE,SAAS,CAAE,MAAM,CAAE,CAAC;CAC1B;AAED,eAAO,MAAM,UAAU,wHAYtB,CAAC"}
1
+ {"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/button/icon.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,eAAO,MAAM,UAAU,wHAYtB,CAAC"}
@@ -1,10 +1,11 @@
1
- import { Button as ButtonButton } from './button';
2
- import { ButtonIcon } from './icon';
3
1
  /**
4
2
  * A versatile button component with multiple variants, tones, and sizes.
5
- * Built on design tokens for consistent theming and accessibility.
6
3
  */
7
- export declare const Button: typeof ButtonButton & {
8
- Icon: typeof ButtonIcon;
4
+ export declare const Button: import("react").ForwardRefExoticComponent<import("./types").ButtonProps & import("react").RefAttributes<HTMLButtonElement>> & {
5
+ /**
6
+ * An icon component specifically designed to work well when rendered inside
7
+ * a `Button` component.
8
+ */
9
+ Icon: import("react").ForwardRefExoticComponent<Omit<import("./types").ButtonIconProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
9
10
  };
10
11
  //# sourceMappingURL=index.d.ts.map