@wordpress/ui 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +4 -4
  3. package/build/alert-dialog/index.cjs +3 -0
  4. package/build/alert-dialog/index.cjs.map +2 -2
  5. package/build/alert-dialog/popup.cjs +120 -55
  6. package/build/alert-dialog/popup.cjs.map +3 -3
  7. package/build/alert-dialog/portal.cjs +38 -0
  8. package/build/alert-dialog/portal.cjs.map +7 -0
  9. package/build/alert-dialog/types.cjs.map +1 -1
  10. package/build/collapsible-card/content.cjs +9 -5
  11. package/build/collapsible-card/content.cjs.map +2 -2
  12. package/build/collapsible-card/header.cjs +14 -4
  13. package/build/collapsible-card/header.cjs.map +3 -3
  14. package/build/dialog/content.cjs +85 -0
  15. package/build/dialog/content.cjs.map +7 -0
  16. package/build/dialog/context.cjs +12 -44
  17. package/build/dialog/context.cjs.map +2 -2
  18. package/build/dialog/description.cjs +59 -0
  19. package/build/dialog/description.cjs.map +7 -0
  20. package/build/dialog/footer.cjs +5 -4
  21. package/build/dialog/footer.cjs.map +2 -2
  22. package/build/dialog/header.cjs +5 -4
  23. package/build/dialog/header.cjs.map +2 -2
  24. package/build/dialog/index.cjs +9 -0
  25. package/build/dialog/index.cjs.map +2 -2
  26. package/build/dialog/popup.cjs +21 -9
  27. package/build/dialog/popup.cjs.map +2 -2
  28. package/build/dialog/portal.cjs +38 -0
  29. package/build/dialog/portal.cjs.map +7 -0
  30. package/build/dialog/root.cjs +3 -2
  31. package/build/dialog/root.cjs.map +2 -2
  32. package/build/dialog/title.cjs +9 -6
  33. package/build/dialog/title.cjs.map +2 -2
  34. package/build/dialog/types.cjs.map +1 -1
  35. package/build/drawer/action.cjs +48 -0
  36. package/build/drawer/action.cjs.map +7 -0
  37. package/build/drawer/close-icon.cjs +58 -0
  38. package/build/drawer/close-icon.cjs.map +7 -0
  39. package/build/drawer/content.cjs +86 -0
  40. package/build/drawer/content.cjs.map +7 -0
  41. package/build/drawer/context.cjs +44 -0
  42. package/build/drawer/context.cjs.map +7 -0
  43. package/build/drawer/description.cjs +47 -0
  44. package/build/drawer/description.cjs.map +7 -0
  45. package/build/drawer/footer.cjs +65 -0
  46. package/build/drawer/footer.cjs.map +7 -0
  47. package/build/drawer/header.cjs +65 -0
  48. package/build/drawer/header.cjs.map +7 -0
  49. package/build/drawer/index.cjs +61 -0
  50. package/build/drawer/index.cjs.map +7 -0
  51. package/build/drawer/popup.cjs +103 -0
  52. package/build/drawer/popup.cjs.map +7 -0
  53. package/build/drawer/portal.cjs +38 -0
  54. package/build/drawer/portal.cjs.map +7 -0
  55. package/build/drawer/root.cjs +49 -0
  56. package/build/drawer/root.cjs.map +7 -0
  57. package/build/drawer/title.cjs +70 -0
  58. package/build/drawer/title.cjs.map +7 -0
  59. package/build/drawer/trigger.cjs +38 -0
  60. package/build/drawer/trigger.cjs.map +7 -0
  61. package/build/drawer/types.cjs +19 -0
  62. package/build/drawer/types.cjs.map +7 -0
  63. package/build/form/primitives/autocomplete/clear.cjs +62 -0
  64. package/build/form/primitives/autocomplete/clear.cjs.map +7 -0
  65. package/build/form/primitives/autocomplete/collection.cjs +38 -0
  66. package/build/form/primitives/autocomplete/collection.cjs.map +7 -0
  67. package/build/form/primitives/autocomplete/empty.cjs +67 -0
  68. package/build/form/primitives/autocomplete/empty.cjs.map +7 -0
  69. package/build/form/primitives/autocomplete/index.cjs +64 -0
  70. package/build/form/primitives/autocomplete/index.cjs.map +7 -0
  71. package/build/form/primitives/autocomplete/input-group.cjs +36 -0
  72. package/build/form/primitives/autocomplete/input-group.cjs.map +7 -0
  73. package/build/form/primitives/autocomplete/input.cjs +47 -0
  74. package/build/form/primitives/autocomplete/input.cjs.map +7 -0
  75. package/build/form/primitives/autocomplete/item.cjs +81 -0
  76. package/build/form/primitives/autocomplete/item.cjs.map +7 -0
  77. package/build/form/primitives/autocomplete/list-body.cjs +57 -0
  78. package/build/form/primitives/autocomplete/list-body.cjs.map +7 -0
  79. package/build/form/primitives/autocomplete/list.cjs +67 -0
  80. package/build/form/primitives/autocomplete/list.cjs.map +7 -0
  81. package/build/form/primitives/autocomplete/popup.cjs +102 -0
  82. package/build/form/primitives/autocomplete/popup.cjs.map +7 -0
  83. package/build/form/primitives/autocomplete/portal.cjs +38 -0
  84. package/build/form/primitives/autocomplete/portal.cjs.map +7 -0
  85. package/build/form/primitives/autocomplete/root.cjs +35 -0
  86. package/build/form/primitives/autocomplete/root.cjs.map +7 -0
  87. package/build/form/primitives/autocomplete/types.cjs +19 -0
  88. package/build/form/primitives/autocomplete/types.cjs.map +7 -0
  89. package/build/form/primitives/autocomplete/value.cjs +35 -0
  90. package/build/form/primitives/autocomplete/value.cjs.map +7 -0
  91. package/build/form/primitives/index.cjs +3 -0
  92. package/build/form/primitives/index.cjs.map +2 -2
  93. package/build/form/primitives/select/index.cjs +3 -0
  94. package/build/form/primitives/select/index.cjs.map +2 -2
  95. package/build/form/primitives/select/item.cjs +4 -5
  96. package/build/form/primitives/select/item.cjs.map +2 -2
  97. package/build/form/primitives/select/popup.cjs +12 -11
  98. package/build/form/primitives/select/popup.cjs.map +2 -2
  99. package/build/form/primitives/select/portal.cjs +38 -0
  100. package/build/form/primitives/select/portal.cjs.map +7 -0
  101. package/build/form/primitives/select/types.cjs.map +1 -1
  102. package/build/index.cjs +3 -0
  103. package/build/index.cjs.map +2 -2
  104. package/build/link/link.cjs +8 -18
  105. package/build/link/link.cjs.map +2 -2
  106. package/build/link/types.cjs.map +1 -1
  107. package/build/notice/action-button.cjs +3 -3
  108. package/build/notice/action-button.cjs.map +2 -2
  109. package/build/notice/action-link.cjs +8 -7
  110. package/build/notice/action-link.cjs.map +2 -2
  111. package/build/notice/actions.cjs +3 -3
  112. package/build/notice/actions.cjs.map +2 -2
  113. package/build/notice/close-icon.cjs +3 -3
  114. package/build/notice/close-icon.cjs.map +2 -2
  115. package/build/notice/description.cjs +3 -3
  116. package/build/notice/description.cjs.map +2 -2
  117. package/build/notice/root.cjs +3 -3
  118. package/build/notice/root.cjs.map +2 -2
  119. package/build/notice/title.cjs +3 -3
  120. package/build/notice/title.cjs.map +2 -2
  121. package/build/popover/arrow.cjs +4 -4
  122. package/build/popover/arrow.cjs.map +2 -2
  123. package/build/popover/context.cjs +4 -44
  124. package/build/popover/context.cjs.map +2 -2
  125. package/build/popover/description.cjs +1 -24
  126. package/build/popover/description.cjs.map +4 -4
  127. package/build/popover/index.cjs +3 -0
  128. package/build/popover/index.cjs.map +2 -2
  129. package/build/popover/popup.cjs +15 -15
  130. package/build/popover/popup.cjs.map +2 -2
  131. package/build/popover/portal.cjs +38 -0
  132. package/build/popover/portal.cjs.map +7 -0
  133. package/build/popover/root.cjs.map +1 -1
  134. package/build/popover/title.cjs +18 -4
  135. package/build/popover/title.cjs.map +3 -3
  136. package/build/popover/types.cjs.map +1 -1
  137. package/build/tabs/context.cjs +9 -22
  138. package/build/tabs/context.cjs.map +2 -2
  139. package/build/tabs/list.cjs +4 -4
  140. package/build/tabs/list.cjs.map +2 -2
  141. package/build/tabs/panel.cjs +19 -6
  142. package/build/tabs/panel.cjs.map +3 -3
  143. package/build/tabs/tab.cjs +4 -4
  144. package/build/tabs/tab.cjs.map +2 -2
  145. package/build/text/text.cjs +2 -2
  146. package/build/text/text.cjs.map +2 -2
  147. package/build/tooltip/index.cjs +3 -0
  148. package/build/tooltip/index.cjs.map +2 -2
  149. package/build/tooltip/popup.cjs +11 -14
  150. package/build/tooltip/popup.cjs.map +3 -3
  151. package/build/tooltip/portal.cjs +38 -0
  152. package/build/tooltip/portal.cjs.map +7 -0
  153. package/build/tooltip/provider.cjs +2 -2
  154. package/build/tooltip/provider.cjs.map +3 -3
  155. package/build/tooltip/root.cjs.map +3 -3
  156. package/build/tooltip/trigger.cjs +2 -2
  157. package/build/tooltip/trigger.cjs.map +3 -3
  158. package/build/tooltip/types.cjs.map +1 -1
  159. package/build/utils/create-overlay-modal-context.cjs +48 -0
  160. package/build/utils/create-overlay-modal-context.cjs.map +7 -0
  161. package/build/utils/create-overlay-title-validation.cjs +93 -0
  162. package/build/utils/create-overlay-title-validation.cjs.map +7 -0
  163. package/build/utils/render-portal-with-children.cjs +37 -0
  164. package/build/utils/render-portal-with-children.cjs.map +7 -0
  165. package/build/utils/use-deprioritized-initial-focus.cjs +8 -8
  166. package/build/utils/use-deprioritized-initial-focus.cjs.map +2 -2
  167. package/build/utils/use-overlay-scroll-state-attributes.cjs +140 -0
  168. package/build/utils/use-overlay-scroll-state-attributes.cjs.map +7 -0
  169. package/build/utils/use-schedule-validation.cjs +59 -0
  170. package/build/utils/use-schedule-validation.cjs.map +7 -0
  171. package/build/visually-hidden/visually-hidden.cjs +5 -1
  172. package/build/visually-hidden/visually-hidden.cjs.map +2 -2
  173. package/build-module/alert-dialog/index.mjs +2 -0
  174. package/build-module/alert-dialog/index.mjs.map +2 -2
  175. package/build-module/alert-dialog/popup.mjs +124 -56
  176. package/build-module/alert-dialog/popup.mjs.map +3 -3
  177. package/build-module/alert-dialog/portal.mjs +13 -0
  178. package/build-module/alert-dialog/portal.mjs.map +7 -0
  179. package/build-module/collapsible-card/content.mjs +9 -5
  180. package/build-module/collapsible-card/content.mjs.map +2 -2
  181. package/build-module/collapsible-card/header.mjs +14 -4
  182. package/build-module/collapsible-card/header.mjs.map +3 -3
  183. package/build-module/dialog/content.mjs +50 -0
  184. package/build-module/dialog/content.mjs.map +7 -0
  185. package/build-module/dialog/context.mjs +10 -51
  186. package/build-module/dialog/context.mjs.map +2 -2
  187. package/build-module/dialog/description.mjs +34 -0
  188. package/build-module/dialog/description.mjs.map +7 -0
  189. package/build-module/dialog/footer.mjs +5 -4
  190. package/build-module/dialog/footer.mjs.map +2 -2
  191. package/build-module/dialog/header.mjs +5 -4
  192. package/build-module/dialog/header.mjs.map +2 -2
  193. package/build-module/dialog/index.mjs +6 -0
  194. package/build-module/dialog/index.mjs.map +2 -2
  195. package/build-module/dialog/popup.mjs +23 -11
  196. package/build-module/dialog/popup.mjs.map +2 -2
  197. package/build-module/dialog/portal.mjs +13 -0
  198. package/build-module/dialog/portal.mjs.map +7 -0
  199. package/build-module/dialog/root.mjs +3 -2
  200. package/build-module/dialog/root.mjs.map +2 -2
  201. package/build-module/dialog/title.mjs +10 -7
  202. package/build-module/dialog/title.mjs.map +2 -2
  203. package/build-module/drawer/action.mjs +23 -0
  204. package/build-module/drawer/action.mjs.map +7 -0
  205. package/build-module/drawer/close-icon.mjs +33 -0
  206. package/build-module/drawer/close-icon.mjs.map +7 -0
  207. package/build-module/drawer/content.mjs +51 -0
  208. package/build-module/drawer/content.mjs.map +7 -0
  209. package/build-module/drawer/context.mjs +16 -0
  210. package/build-module/drawer/context.mjs.map +7 -0
  211. package/build-module/drawer/description.mjs +22 -0
  212. package/build-module/drawer/description.mjs.map +7 -0
  213. package/build-module/drawer/footer.mjs +30 -0
  214. package/build-module/drawer/footer.mjs.map +7 -0
  215. package/build-module/drawer/header.mjs +30 -0
  216. package/build-module/drawer/header.mjs.map +7 -0
  217. package/build-module/drawer/index.mjs +26 -0
  218. package/build-module/drawer/index.mjs.map +7 -0
  219. package/build-module/drawer/popup.mjs +70 -0
  220. package/build-module/drawer/popup.mjs.map +7 -0
  221. package/build-module/drawer/portal.mjs +13 -0
  222. package/build-module/drawer/portal.mjs.map +7 -0
  223. package/build-module/drawer/root.mjs +24 -0
  224. package/build-module/drawer/root.mjs.map +7 -0
  225. package/build-module/drawer/title.mjs +45 -0
  226. package/build-module/drawer/title.mjs.map +7 -0
  227. package/build-module/drawer/trigger.mjs +13 -0
  228. package/build-module/drawer/trigger.mjs.map +7 -0
  229. package/build-module/drawer/types.mjs +1 -0
  230. package/build-module/form/primitives/autocomplete/clear.mjs +37 -0
  231. package/build-module/form/primitives/autocomplete/clear.mjs.map +7 -0
  232. package/build-module/form/primitives/autocomplete/collection.mjs +13 -0
  233. package/build-module/form/primitives/autocomplete/collection.mjs.map +7 -0
  234. package/build-module/form/primitives/autocomplete/empty.mjs +32 -0
  235. package/build-module/form/primitives/autocomplete/empty.mjs.map +7 -0
  236. package/build-module/form/primitives/autocomplete/index.mjs +28 -0
  237. package/build-module/form/primitives/autocomplete/index.mjs.map +7 -0
  238. package/build-module/form/primitives/autocomplete/input-group.mjs +11 -0
  239. package/build-module/form/primitives/autocomplete/input-group.mjs.map +7 -0
  240. package/build-module/form/primitives/autocomplete/input.mjs +22 -0
  241. package/build-module/form/primitives/autocomplete/input.mjs.map +7 -0
  242. package/build-module/form/primitives/autocomplete/item.mjs +46 -0
  243. package/build-module/form/primitives/autocomplete/item.mjs.map +7 -0
  244. package/build-module/form/primitives/autocomplete/list-body.mjs +32 -0
  245. package/build-module/form/primitives/autocomplete/list-body.mjs.map +7 -0
  246. package/build-module/form/primitives/autocomplete/list.mjs +32 -0
  247. package/build-module/form/primitives/autocomplete/list.mjs.map +7 -0
  248. package/build-module/form/primitives/autocomplete/popup.mjs +69 -0
  249. package/build-module/form/primitives/autocomplete/popup.mjs.map +7 -0
  250. package/build-module/form/primitives/autocomplete/portal.mjs +13 -0
  251. package/build-module/form/primitives/autocomplete/portal.mjs.map +7 -0
  252. package/build-module/form/primitives/autocomplete/root.mjs +10 -0
  253. package/build-module/form/primitives/autocomplete/root.mjs.map +7 -0
  254. package/build-module/form/primitives/autocomplete/types.mjs +1 -0
  255. package/build-module/form/primitives/autocomplete/value.mjs +10 -0
  256. package/build-module/form/primitives/autocomplete/value.mjs.map +7 -0
  257. package/build-module/form/primitives/index.mjs +2 -0
  258. package/build-module/form/primitives/index.mjs.map +2 -2
  259. package/build-module/form/primitives/select/index.mjs +2 -0
  260. package/build-module/form/primitives/select/index.mjs.map +2 -2
  261. package/build-module/form/primitives/select/item.mjs +4 -5
  262. package/build-module/form/primitives/select/item.mjs.map +2 -2
  263. package/build-module/form/primitives/select/popup.mjs +12 -11
  264. package/build-module/form/primitives/select/popup.mjs.map +2 -2
  265. package/build-module/form/primitives/select/portal.mjs +13 -0
  266. package/build-module/form/primitives/select/portal.mjs.map +7 -0
  267. package/build-module/index.mjs +2 -0
  268. package/build-module/index.mjs.map +2 -2
  269. package/build-module/link/link.mjs +8 -18
  270. package/build-module/link/link.mjs.map +2 -2
  271. package/build-module/notice/action-button.mjs +3 -3
  272. package/build-module/notice/action-button.mjs.map +2 -2
  273. package/build-module/notice/action-link.mjs +8 -7
  274. package/build-module/notice/action-link.mjs.map +2 -2
  275. package/build-module/notice/actions.mjs +3 -3
  276. package/build-module/notice/actions.mjs.map +2 -2
  277. package/build-module/notice/close-icon.mjs +3 -3
  278. package/build-module/notice/close-icon.mjs.map +2 -2
  279. package/build-module/notice/description.mjs +3 -3
  280. package/build-module/notice/description.mjs.map +2 -2
  281. package/build-module/notice/root.mjs +3 -3
  282. package/build-module/notice/root.mjs.map +2 -2
  283. package/build-module/notice/title.mjs +3 -3
  284. package/build-module/notice/title.mjs.map +2 -2
  285. package/build-module/popover/arrow.mjs +4 -4
  286. package/build-module/popover/arrow.mjs.map +2 -2
  287. package/build-module/popover/context.mjs +4 -51
  288. package/build-module/popover/context.mjs.map +2 -2
  289. package/build-module/popover/description.mjs +1 -14
  290. package/build-module/popover/description.mjs.map +3 -3
  291. package/build-module/popover/index.mjs +2 -0
  292. package/build-module/popover/index.mjs.map +2 -2
  293. package/build-module/popover/popup.mjs +16 -16
  294. package/build-module/popover/popup.mjs.map +2 -2
  295. package/build-module/popover/portal.mjs +13 -0
  296. package/build-module/popover/portal.mjs.map +7 -0
  297. package/build-module/popover/root.mjs.map +1 -1
  298. package/build-module/popover/title.mjs +19 -5
  299. package/build-module/popover/title.mjs.map +3 -3
  300. package/build-module/tabs/context.mjs +11 -24
  301. package/build-module/tabs/context.mjs.map +2 -2
  302. package/build-module/tabs/list.mjs +4 -4
  303. package/build-module/tabs/list.mjs.map +2 -2
  304. package/build-module/tabs/panel.mjs +19 -6
  305. package/build-module/tabs/panel.mjs.map +3 -3
  306. package/build-module/tabs/tab.mjs +4 -4
  307. package/build-module/tabs/tab.mjs.map +2 -2
  308. package/build-module/text/text.mjs +2 -2
  309. package/build-module/text/text.mjs.map +2 -2
  310. package/build-module/tooltip/index.mjs +2 -0
  311. package/build-module/tooltip/index.mjs.map +2 -2
  312. package/build-module/tooltip/popup.mjs +14 -17
  313. package/build-module/tooltip/popup.mjs.map +2 -2
  314. package/build-module/tooltip/portal.mjs +13 -0
  315. package/build-module/tooltip/portal.mjs.map +7 -0
  316. package/build-module/tooltip/provider.mjs +3 -3
  317. package/build-module/tooltip/provider.mjs.map +2 -2
  318. package/build-module/tooltip/root.mjs +2 -2
  319. package/build-module/tooltip/root.mjs.map +2 -2
  320. package/build-module/tooltip/trigger.mjs +3 -3
  321. package/build-module/tooltip/trigger.mjs.map +2 -2
  322. package/build-module/utils/create-overlay-modal-context.mjs +23 -0
  323. package/build-module/utils/create-overlay-modal-context.mjs.map +7 -0
  324. package/build-module/utils/create-overlay-title-validation.mjs +75 -0
  325. package/build-module/utils/create-overlay-title-validation.mjs.map +7 -0
  326. package/build-module/utils/render-portal-with-children.mjs +12 -0
  327. package/build-module/utils/render-portal-with-children.mjs.map +7 -0
  328. package/build-module/utils/use-deprioritized-initial-focus.mjs +9 -9
  329. package/build-module/utils/use-deprioritized-initial-focus.mjs.map +2 -2
  330. package/build-module/utils/use-overlay-scroll-state-attributes.mjs +114 -0
  331. package/build-module/utils/use-overlay-scroll-state-attributes.mjs.map +7 -0
  332. package/build-module/utils/use-schedule-validation.mjs +34 -0
  333. package/build-module/utils/use-schedule-validation.mjs.map +7 -0
  334. package/build-module/visually-hidden/visually-hidden.mjs +5 -1
  335. package/build-module/visually-hidden/visually-hidden.mjs.map +2 -2
  336. package/build-types/alert-dialog/index.d.ts +1 -0
  337. package/build-types/alert-dialog/index.d.ts.map +1 -1
  338. package/build-types/alert-dialog/popup.d.ts.map +1 -1
  339. package/build-types/alert-dialog/portal.d.ts +9 -0
  340. package/build-types/alert-dialog/portal.d.ts.map +1 -0
  341. package/build-types/alert-dialog/stories/index.story.d.ts +29 -1
  342. package/build-types/alert-dialog/stories/index.story.d.ts.map +1 -1
  343. package/build-types/alert-dialog/types.d.ts +25 -3
  344. package/build-types/alert-dialog/types.d.ts.map +1 -1
  345. package/build-types/badge/stories/index.story.d.ts.map +1 -1
  346. package/build-types/card/stories/index.story.d.ts.map +1 -1
  347. package/build-types/collapsible/stories/index.story.d.ts.map +1 -1
  348. package/build-types/collapsible-card/content.d.ts.map +1 -1
  349. package/build-types/collapsible-card/header.d.ts.map +1 -1
  350. package/build-types/collapsible-card/stories/index.story.d.ts.map +1 -1
  351. package/build-types/dialog/content.d.ts +17 -0
  352. package/build-types/dialog/content.d.ts.map +1 -0
  353. package/build-types/dialog/context.d.ts +11 -16
  354. package/build-types/dialog/context.d.ts.map +1 -1
  355. package/build-types/dialog/description.d.ts +9 -0
  356. package/build-types/dialog/description.d.ts.map +1 -0
  357. package/build-types/dialog/footer.d.ts +8 -1
  358. package/build-types/dialog/footer.d.ts.map +1 -1
  359. package/build-types/dialog/header.d.ts +8 -1
  360. package/build-types/dialog/header.d.ts.map +1 -1
  361. package/build-types/dialog/index.d.ts +4 -1
  362. package/build-types/dialog/index.d.ts.map +1 -1
  363. package/build-types/dialog/popup.d.ts +3 -0
  364. package/build-types/dialog/popup.d.ts.map +1 -1
  365. package/build-types/dialog/portal.d.ts +10 -0
  366. package/build-types/dialog/portal.d.ts.map +1 -0
  367. package/build-types/dialog/root.d.ts +14 -4
  368. package/build-types/dialog/root.d.ts.map +1 -1
  369. package/build-types/dialog/stories/index.story.d.ts +29 -6
  370. package/build-types/dialog/stories/index.story.d.ts.map +1 -1
  371. package/build-types/dialog/title.d.ts.map +1 -1
  372. package/build-types/dialog/types.d.ts +60 -7
  373. package/build-types/dialog/types.d.ts.map +1 -1
  374. package/build-types/drawer/action.d.ts +8 -0
  375. package/build-types/drawer/action.d.ts.map +1 -0
  376. package/build-types/drawer/close-icon.d.ts +8 -0
  377. package/build-types/drawer/close-icon.d.ts.map +1 -0
  378. package/build-types/drawer/content.d.ts +21 -0
  379. package/build-types/drawer/content.d.ts.map +1 -0
  380. package/build-types/drawer/context.d.ts +20 -0
  381. package/build-types/drawer/context.d.ts.map +1 -0
  382. package/build-types/drawer/description.d.ts +9 -0
  383. package/build-types/drawer/description.d.ts.map +1 -0
  384. package/build-types/drawer/footer.d.ts +15 -0
  385. package/build-types/drawer/footer.d.ts.map +1 -0
  386. package/build-types/drawer/header.d.ts +15 -0
  387. package/build-types/drawer/header.d.ts.map +1 -0
  388. package/build-types/drawer/index.d.ts +13 -0
  389. package/build-types/drawer/index.d.ts.map +1 -0
  390. package/build-types/drawer/popup.d.ts +16 -0
  391. package/build-types/drawer/popup.d.ts.map +1 -0
  392. package/build-types/drawer/portal.d.ts +10 -0
  393. package/build-types/drawer/portal.d.ts.map +1 -0
  394. package/build-types/drawer/root.d.ts +21 -0
  395. package/build-types/drawer/root.d.ts.map +1 -0
  396. package/build-types/drawer/stories/index.story.d.ts +63 -0
  397. package/build-types/drawer/stories/index.story.d.ts.map +1 -0
  398. package/build-types/drawer/test/index.test.d.ts +2 -0
  399. package/build-types/drawer/test/index.test.d.ts.map +1 -0
  400. package/build-types/drawer/title.d.ts +22 -0
  401. package/build-types/drawer/title.d.ts.map +1 -0
  402. package/build-types/drawer/trigger.d.ts +7 -0
  403. package/build-types/drawer/trigger.d.ts.map +1 -0
  404. package/build-types/drawer/types.d.ts +146 -0
  405. package/build-types/drawer/types.d.ts.map +1 -0
  406. package/build-types/empty-state/stories/index.story.d.ts +1 -1
  407. package/build-types/empty-state/stories/index.story.d.ts.map +1 -1
  408. package/build-types/form/input-control/stories/index.story.d.ts +1 -1
  409. package/build-types/form/input-control/stories/index.story.d.ts.map +1 -1
  410. package/build-types/form/primitives/autocomplete/clear.d.ts +13 -0
  411. package/build-types/form/primitives/autocomplete/clear.d.ts.map +1 -0
  412. package/build-types/form/primitives/autocomplete/collection.d.ts +3 -0
  413. package/build-types/form/primitives/autocomplete/collection.d.ts.map +1 -0
  414. package/build-types/form/primitives/autocomplete/empty.d.ts +10 -0
  415. package/build-types/form/primitives/autocomplete/empty.d.ts.map +1 -0
  416. package/build-types/form/primitives/autocomplete/index.d.ts +13 -0
  417. package/build-types/form/primitives/autocomplete/index.d.ts.map +1 -0
  418. package/build-types/form/primitives/autocomplete/input-group.d.ts +16 -0
  419. package/build-types/form/primitives/autocomplete/input-group.d.ts.map +1 -0
  420. package/build-types/form/primitives/autocomplete/input.d.ts +3 -0
  421. package/build-types/form/primitives/autocomplete/input.d.ts.map +1 -0
  422. package/build-types/form/primitives/autocomplete/item.d.ts +10 -0
  423. package/build-types/form/primitives/autocomplete/item.d.ts.map +1 -0
  424. package/build-types/form/primitives/autocomplete/list-body.d.ts +13 -0
  425. package/build-types/form/primitives/autocomplete/list-body.d.ts.map +1 -0
  426. package/build-types/form/primitives/autocomplete/list.d.ts +11 -0
  427. package/build-types/form/primitives/autocomplete/list.d.ts.map +1 -0
  428. package/build-types/form/primitives/autocomplete/popup.d.ts +11 -0
  429. package/build-types/form/primitives/autocomplete/popup.d.ts.map +1 -0
  430. package/build-types/form/primitives/autocomplete/portal.d.ts +8 -0
  431. package/build-types/form/primitives/autocomplete/portal.d.ts.map +1 -0
  432. package/build-types/form/primitives/autocomplete/root.d.ts +8 -0
  433. package/build-types/form/primitives/autocomplete/root.d.ts.map +1 -0
  434. package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts +8 -0
  435. package/build-types/form/primitives/autocomplete/stories/fixtures.d.ts.map +1 -0
  436. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts +41 -0
  437. package/build-types/form/primitives/autocomplete/stories/index.story.d.ts.map +1 -0
  438. package/build-types/form/primitives/autocomplete/test/index.test.d.ts +2 -0
  439. package/build-types/form/primitives/autocomplete/test/index.test.d.ts.map +1 -0
  440. package/build-types/form/primitives/autocomplete/types.d.ts +44 -0
  441. package/build-types/form/primitives/autocomplete/types.d.ts.map +1 -0
  442. package/build-types/form/primitives/autocomplete/value.d.ts +3 -0
  443. package/build-types/form/primitives/autocomplete/value.d.ts.map +1 -0
  444. package/build-types/form/primitives/field/stories/index.story.d.ts +1 -1
  445. package/build-types/form/primitives/field/stories/index.story.d.ts.map +1 -1
  446. package/build-types/form/primitives/fieldset/stories/index.story.d.ts +1 -1
  447. package/build-types/form/primitives/fieldset/stories/index.story.d.ts.map +1 -1
  448. package/build-types/form/primitives/index.d.ts +1 -0
  449. package/build-types/form/primitives/index.d.ts.map +1 -1
  450. package/build-types/form/primitives/input/stories/index.story.d.ts +1 -1
  451. package/build-types/form/primitives/input/stories/index.story.d.ts.map +1 -1
  452. package/build-types/form/primitives/input-layout/stories/index.story.d.ts +1 -1
  453. package/build-types/form/primitives/input-layout/stories/index.story.d.ts.map +1 -1
  454. package/build-types/form/primitives/select/index.d.ts +1 -0
  455. package/build-types/form/primitives/select/index.d.ts.map +1 -1
  456. package/build-types/form/primitives/select/item.d.ts.map +1 -1
  457. package/build-types/form/primitives/select/popup.d.ts +1 -2
  458. package/build-types/form/primitives/select/popup.d.ts.map +1 -1
  459. package/build-types/form/primitives/select/portal.d.ts +8 -0
  460. package/build-types/form/primitives/select/portal.d.ts.map +1 -0
  461. package/build-types/form/primitives/select/stories/index.story.d.ts +14 -6
  462. package/build-types/form/primitives/select/stories/index.story.d.ts.map +1 -1
  463. package/build-types/form/primitives/select/types.d.ts +7 -2
  464. package/build-types/form/primitives/select/types.d.ts.map +1 -1
  465. package/build-types/index.d.ts +1 -0
  466. package/build-types/index.d.ts.map +1 -1
  467. package/build-types/link/link.d.ts.map +1 -1
  468. package/build-types/link/stories/index.story.d.ts +2 -3
  469. package/build-types/link/stories/index.story.d.ts.map +1 -1
  470. package/build-types/link/types.d.ts +1 -2
  471. package/build-types/link/types.d.ts.map +1 -1
  472. package/build-types/notice/action-link.d.ts.map +1 -1
  473. package/build-types/popover/context.d.ts +6 -13
  474. package/build-types/popover/context.d.ts.map +1 -1
  475. package/build-types/popover/description.d.ts +0 -1
  476. package/build-types/popover/description.d.ts.map +1 -1
  477. package/build-types/popover/index.d.ts +2 -1
  478. package/build-types/popover/index.d.ts.map +1 -1
  479. package/build-types/popover/popup.d.ts +3 -2
  480. package/build-types/popover/popup.d.ts.map +1 -1
  481. package/build-types/popover/portal.d.ts +9 -0
  482. package/build-types/popover/portal.d.ts.map +1 -0
  483. package/build-types/popover/root.d.ts +2 -2
  484. package/build-types/popover/stories/index.story.d.ts +23 -15
  485. package/build-types/popover/stories/index.story.d.ts.map +1 -1
  486. package/build-types/popover/title.d.ts.map +1 -1
  487. package/build-types/popover/types.d.ts +8 -15
  488. package/build-types/popover/types.d.ts.map +1 -1
  489. package/build-types/stack/stories/index.story.d.ts.map +1 -1
  490. package/build-types/tabs/context.d.ts.map +1 -1
  491. package/build-types/tabs/panel.d.ts.map +1 -1
  492. package/build-types/tabs/stories/index.story.d.ts +1 -1
  493. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  494. package/build-types/text/stories/index.story.d.ts.map +1 -1
  495. package/build-types/tooltip/index.d.ts +2 -1
  496. package/build-types/tooltip/index.d.ts.map +1 -1
  497. package/build-types/tooltip/popup.d.ts.map +1 -1
  498. package/build-types/tooltip/portal.d.ts +8 -0
  499. package/build-types/tooltip/portal.d.ts.map +1 -0
  500. package/build-types/tooltip/provider.d.ts +1 -1
  501. package/build-types/tooltip/provider.d.ts.map +1 -1
  502. package/build-types/tooltip/stories/index.story.d.ts +18 -1
  503. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  504. package/build-types/tooltip/stories/usage-guidelines.story.d.ts.map +1 -1
  505. package/build-types/tooltip/trigger.d.ts.map +1 -1
  506. package/build-types/tooltip/types.d.ts +11 -7
  507. package/build-types/tooltip/types.d.ts.map +1 -1
  508. package/build-types/utils/create-overlay-modal-context.d.ts +14 -0
  509. package/build-types/utils/create-overlay-modal-context.d.ts.map +1 -0
  510. package/build-types/utils/create-overlay-title-validation.d.ts +15 -0
  511. package/build-types/utils/create-overlay-title-validation.d.ts.map +1 -0
  512. package/build-types/utils/render-portal-with-children.d.ts +16 -0
  513. package/build-types/utils/render-portal-with-children.d.ts.map +1 -0
  514. package/build-types/utils/use-deprioritized-initial-focus.d.ts +9 -8
  515. package/build-types/utils/use-deprioritized-initial-focus.d.ts.map +1 -1
  516. package/build-types/utils/use-overlay-scroll-state-attributes.d.ts +85 -0
  517. package/build-types/utils/use-overlay-scroll-state-attributes.d.ts.map +1 -0
  518. package/build-types/utils/use-schedule-validation.d.ts +13 -0
  519. package/build-types/utils/use-schedule-validation.d.ts.map +1 -0
  520. package/build-types/visually-hidden/stories/index.story.d.ts.map +1 -1
  521. package/build-types/visually-hidden/visually-hidden.d.ts +4 -20
  522. package/build-types/visually-hidden/visually-hidden.d.ts.map +1 -1
  523. package/package.json +12 -12
  524. package/src/alert-dialog/index.ts +1 -0
  525. package/src/alert-dialog/popup.tsx +114 -45
  526. package/src/alert-dialog/portal.tsx +17 -0
  527. package/src/alert-dialog/stories/index.story.tsx +123 -3
  528. package/src/alert-dialog/style.module.css +13 -4
  529. package/src/alert-dialog/test/index.test.tsx +329 -3
  530. package/src/alert-dialog/types.ts +30 -3
  531. package/src/badge/stories/choosing-intent.story.tsx +1 -1
  532. package/src/badge/stories/index.story.tsx +1 -0
  533. package/src/card/stories/index.story.tsx +1 -0
  534. package/src/collapsible/stories/index.story.tsx +1 -0
  535. package/src/collapsible-card/content.tsx +12 -1
  536. package/src/collapsible-card/header.tsx +2 -0
  537. package/src/collapsible-card/stories/index.story.tsx +1 -0
  538. package/src/collapsible-card/style.module.css +16 -4
  539. package/src/dialog/content.tsx +47 -0
  540. package/src/dialog/context.tsx +14 -98
  541. package/src/dialog/description.tsx +27 -0
  542. package/src/dialog/footer.tsx +10 -2
  543. package/src/dialog/header.tsx +10 -2
  544. package/src/dialog/index.ts +16 -1
  545. package/src/dialog/popup.tsx +28 -8
  546. package/src/dialog/portal.tsx +18 -0
  547. package/src/dialog/root.tsx +22 -5
  548. package/src/dialog/stories/index.story.tsx +195 -51
  549. package/src/dialog/style.module.css +73 -23
  550. package/src/dialog/test/index.test.tsx +849 -149
  551. package/src/dialog/title.tsx +6 -4
  552. package/src/dialog/types.ts +64 -6
  553. package/src/drawer/action.tsx +28 -0
  554. package/src/drawer/close-icon.tsx +33 -0
  555. package/src/drawer/content.tsx +50 -0
  556. package/src/drawer/context.tsx +29 -0
  557. package/src/drawer/description.tsx +25 -0
  558. package/src/drawer/footer.tsx +34 -0
  559. package/src/drawer/header.tsx +34 -0
  560. package/src/drawer/index.ts +25 -0
  561. package/src/drawer/popup.tsx +100 -0
  562. package/src/drawer/portal.tsx +18 -0
  563. package/src/drawer/root.tsx +41 -0
  564. package/src/drawer/stories/index.story.tsx +543 -0
  565. package/src/drawer/style.module.css +324 -0
  566. package/src/drawer/test/index.test.tsx +1097 -0
  567. package/src/drawer/title.tsx +53 -0
  568. package/src/drawer/trigger.tsx +14 -0
  569. package/src/drawer/types.ts +174 -0
  570. package/src/empty-state/stories/index.story.tsx +2 -1
  571. package/src/form/input-control/stories/index.story.tsx +4 -1
  572. package/src/form/primitives/autocomplete/clear.tsx +35 -0
  573. package/src/form/primitives/autocomplete/collection.tsx +13 -0
  574. package/src/form/primitives/autocomplete/empty.tsx +17 -0
  575. package/src/form/primitives/autocomplete/index.ts +12 -0
  576. package/src/form/primitives/autocomplete/input-group.tsx +16 -0
  577. package/src/form/primitives/autocomplete/input.tsx +20 -0
  578. package/src/form/primitives/autocomplete/item.tsx +24 -0
  579. package/src/form/primitives/autocomplete/list-body.tsx +23 -0
  580. package/src/form/primitives/autocomplete/list.tsx +17 -0
  581. package/src/form/primitives/autocomplete/popup.tsx +42 -0
  582. package/src/form/primitives/autocomplete/portal.tsx +16 -0
  583. package/src/form/primitives/autocomplete/root.tsx +11 -0
  584. package/src/form/primitives/autocomplete/stories/fixtures.ts +35 -0
  585. package/src/form/primitives/autocomplete/stories/index.story.tsx +437 -0
  586. package/src/form/primitives/autocomplete/style.module.css +7 -0
  587. package/src/form/primitives/autocomplete/test/index.test.tsx +162 -0
  588. package/src/form/primitives/autocomplete/types.ts +74 -0
  589. package/src/form/primitives/autocomplete/value.tsx +6 -0
  590. package/src/form/primitives/field/stories/index.story.tsx +1 -1
  591. package/src/form/primitives/fieldset/stories/index.story.tsx +1 -1
  592. package/src/form/primitives/index.ts +1 -0
  593. package/src/form/primitives/input/stories/index.story.tsx +2 -1
  594. package/src/form/primitives/input-layout/stories/index.story.tsx +2 -1
  595. package/src/form/primitives/select/index.ts +1 -0
  596. package/src/form/primitives/select/item.tsx +0 -1
  597. package/src/form/primitives/select/popup.tsx +34 -37
  598. package/src/form/primitives/select/portal.tsx +16 -0
  599. package/src/form/primitives/select/stories/index.story.tsx +21 -7
  600. package/src/form/primitives/select/test/index.test.tsx +7 -3
  601. package/src/form/primitives/select/types.ts +9 -2
  602. package/src/index.ts +1 -0
  603. package/src/link/link.tsx +12 -26
  604. package/src/link/stories/index.story.tsx +6 -11
  605. package/src/link/style.module.css +5 -17
  606. package/src/link/test/index.test.tsx +31 -27
  607. package/src/link/types.ts +1 -2
  608. package/src/notice/action-link.tsx +7 -4
  609. package/src/notice/style.module.css +5 -5
  610. package/src/popover/context.tsx +6 -89
  611. package/src/popover/description.tsx +1 -5
  612. package/src/popover/index.ts +2 -1
  613. package/src/popover/popup.tsx +17 -15
  614. package/src/popover/portal.tsx +17 -0
  615. package/src/popover/root.tsx +2 -2
  616. package/src/popover/stories/index.story.tsx +56 -25
  617. package/src/popover/style.module.css +33 -4
  618. package/src/popover/test/index.test.tsx +189 -74
  619. package/src/popover/title.tsx +9 -5
  620. package/src/popover/types.ts +10 -15
  621. package/src/stack/stories/index.story.tsx +1 -0
  622. package/src/tabs/context.tsx +14 -34
  623. package/src/tabs/panel.tsx +7 -2
  624. package/src/tabs/stories/index.story.tsx +2 -1
  625. package/src/tabs/style.module.css +0 -17
  626. package/src/tabs/test/index.test.tsx +7 -3
  627. package/src/text/stories/index.story.tsx +1 -0
  628. package/src/text/text.tsx +2 -2
  629. package/src/tooltip/index.ts +2 -1
  630. package/src/tooltip/popup.tsx +24 -28
  631. package/src/tooltip/portal.tsx +16 -0
  632. package/src/tooltip/provider.tsx +3 -3
  633. package/src/tooltip/root.tsx +2 -2
  634. package/src/tooltip/stories/index.story.tsx +39 -1
  635. package/src/tooltip/stories/usage-guidelines.story.tsx +5 -1
  636. package/src/tooltip/style.module.css +12 -0
  637. package/src/tooltip/test/index.test.tsx +9 -3
  638. package/src/tooltip/trigger.tsx +3 -7
  639. package/src/tooltip/types.ts +13 -7
  640. package/src/utils/create-overlay-modal-context.tsx +34 -0
  641. package/src/utils/create-overlay-title-validation.tsx +116 -0
  642. package/src/utils/css/item-popup.module.css +9 -11
  643. package/src/utils/css/overlay-chrome.module.css +222 -0
  644. package/src/utils/render-portal-with-children.ts +27 -0
  645. package/src/utils/test/use-deprioritized-initial-focus.test.tsx +3 -3
  646. package/src/utils/use-deprioritized-initial-focus.ts +23 -17
  647. package/src/utils/use-overlay-scroll-state-attributes.ts +272 -0
  648. package/src/utils/use-schedule-validation.ts +45 -0
  649. package/src/visually-hidden/stories/index.story.tsx +1 -0
  650. package/src/visually-hidden/visually-hidden.tsx +9 -21
  651. package/build/types/css-modules.d.cjs +0 -2
  652. package/build/types/react.d.cjs +0 -5
  653. package/build/types/react.d.cjs.map +0 -7
  654. package/build-module/types/css-modules.d.mjs +0 -1
  655. package/build-module/types/react.d.mjs +0 -3
  656. package/build-module/types/react.d.mjs.map +0 -7
  657. package/src/types/css-modules.d.ts +0 -4
  658. package/src/types/react.d.ts +0 -7
  659. /package/build-module/{types/css-modules.d.mjs.map → drawer/types.mjs.map} +0 -0
  660. /package/{build/types/css-modules.d.cjs.map → build-module/form/primitives/autocomplete/types.mjs.map} +0 -0
@@ -0,0 +1,12 @@
1
+ // packages/ui/src/utils/render-portal-with-children.ts
2
+ import { cloneElement } from "@wordpress/element";
3
+ function renderPortalWithChildren(portal, defaultPortal, children) {
4
+ const rootPortal = portal ?? defaultPortal;
5
+ return cloneElement(rootPortal, {
6
+ children
7
+ });
8
+ }
9
+ export {
10
+ renderPortalWithChildren
11
+ };
12
+ //# sourceMappingURL=render-portal-with-children.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/render-portal-with-children.ts"],
4
+ "sourcesContent": ["import { cloneElement } from '@wordpress/element';\nimport type { ReactElement, ReactNode } from 'react';\n\n/**\n * Renders overlay markup (`children`) through an optional `portal` element from\n * `portal={ <Component.Portal \u2026 /> }`, or through the package default portal.\n *\n * Shared by overlay `Popup` components so portal merge behavior stays consistent.\n *\n * @param portal Optional element from the `portal` prop (should have no\n * `children`; callers type this via `Omit<PortalProps,'children'>`).\n * When omitted, `defaultPortal` is used. Injected `children`\n * replace any subtree on the portal element.\n * @param defaultPortal Unpopulated default portal element (e.g. `<Dialog.Portal />`).\n * @param children Popup subtree (backdrop, positioner, etc.) to inject as the portal\u2019s children.\n */\nexport function renderPortalWithChildren(\n\tportal: ReactElement | undefined,\n\tdefaultPortal: ReactElement,\n\tchildren: ReactNode\n): ReactElement {\n\tconst rootPortal = portal ?? defaultPortal;\n\n\treturn cloneElement( rootPortal, {\n\t\tchildren,\n\t} );\n}\n"],
5
+ "mappings": ";AAAA,SAAS,oBAAoB;AAgBtB,SAAS,yBACf,QACA,eACA,UACe;AACf,QAAM,aAAa,UAAU;AAE7B,SAAO,aAAc,YAAY;AAAA,IAChC;AAAA,EACD,CAAE;AACH;",
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
+ }
@@ -0,0 +1,34 @@
1
+ // packages/ui/src/utils/use-schedule-validation.ts
2
+ import { useCallback, useEffect, useRef } from "@wordpress/element";
3
+ function useScheduleValidation(validate) {
4
+ const validateRef = useRef(validate);
5
+ validateRef.current = validate;
6
+ const timerRef = useRef(null);
7
+ const unmountedRef = useRef(false);
8
+ const scheduleValidation = useCallback(() => {
9
+ if (unmountedRef.current) {
10
+ return;
11
+ }
12
+ if (timerRef.current) {
13
+ clearTimeout(timerRef.current);
14
+ }
15
+ timerRef.current = setTimeout(() => {
16
+ validateRef.current();
17
+ timerRef.current = null;
18
+ }, 0);
19
+ }, []);
20
+ useEffect(() => {
21
+ unmountedRef.current = false;
22
+ return () => {
23
+ unmountedRef.current = true;
24
+ if (timerRef.current) {
25
+ clearTimeout(timerRef.current);
26
+ }
27
+ };
28
+ }, []);
29
+ return scheduleValidation;
30
+ }
31
+ export {
32
+ useScheduleValidation
33
+ };
34
+ //# sourceMappingURL=use-schedule-validation.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/use-schedule-validation.ts"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useRef } from '@wordpress/element';\n\n/**\n * Dev-only hook that returns a stable `scheduleValidation` function.\n *\n * Each call debounces to `setTimeout(\u2026, 0)` so that rapid\n * register / unregister cycles (e.g. React strict-mode double-mount)\n * settle before the check runs. The timer is cleaned up on unmount,\n * and calls after unmount are silently ignored.\n *\n * @param validate Callback that performs the actual validation.\n * Stored in a ref \u2014 safe to pass an unstable closure.\n */\nexport function useScheduleValidation( validate: () => void ) {\n\tconst validateRef = useRef( validate );\n\tvalidateRef.current = validate;\n\n\tconst timerRef = useRef< ReturnType< typeof setTimeout > | null >( null );\n\tconst unmountedRef = useRef( false );\n\n\tconst scheduleValidation = useCallback( () => {\n\t\tif ( unmountedRef.current ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( timerRef.current ) {\n\t\t\tclearTimeout( timerRef.current );\n\t\t}\n\t\ttimerRef.current = setTimeout( () => {\n\t\t\tvalidateRef.current();\n\t\t\ttimerRef.current = null;\n\t\t}, 0 );\n\t}, [] );\n\n\tuseEffect( () => {\n\t\tunmountedRef.current = false;\n\t\treturn () => {\n\t\t\tunmountedRef.current = true;\n\t\t\tif ( timerRef.current ) {\n\t\t\t\tclearTimeout( timerRef.current );\n\t\t\t}\n\t\t};\n\t}, [] );\n\n\treturn scheduleValidation;\n}\n"],
5
+ "mappings": ";AAAA,SAAS,aAAa,WAAW,cAAc;AAaxC,SAAS,sBAAuB,UAAuB;AAC7D,QAAM,cAAc,OAAQ,QAAS;AACrC,cAAY,UAAU;AAEtB,QAAM,WAAW,OAAkD,IAAK;AACxE,QAAM,eAAe,OAAQ,KAAM;AAEnC,QAAM,qBAAqB,YAAa,MAAM;AAC7C,QAAK,aAAa,SAAU;AAC3B;AAAA,IACD;AACA,QAAK,SAAS,SAAU;AACvB,mBAAc,SAAS,OAAQ;AAAA,IAChC;AACA,aAAS,UAAU,WAAY,MAAM;AACpC,kBAAY,QAAQ;AACpB,eAAS,UAAU;AAAA,IACpB,GAAG,CAAE;AAAA,EACN,GAAG,CAAC,CAAE;AAEN,YAAW,MAAM;AAChB,iBAAa,UAAU;AACvB,WAAO,MAAM;AACZ,mBAAa,UAAU;AACvB,UAAK,SAAS,SAAU;AACvB,qBAAc,SAAS,OAAQ;AAAA,MAChC;AAAA,IACD;AAAA,EACD,GAAG,CAAC,CAAE;AAEN,SAAO;AACR;",
6
+ "names": []
7
+ }
@@ -19,7 +19,11 @@ var VisuallyHidden = forwardRef(
19
19
  ref,
20
20
  props: mergeProps(
21
21
  { className: style_default["visually-hidden"] },
22
- restProps
22
+ restProps,
23
+ {
24
+ // @ts-expect-error Arbitrary data-* attributes aren't indexable on the typed div props. Kept hardcoded so consumers can't change or remove it.
25
+ "data-visually-hidden": ""
26
+ }
23
27
  )
24
28
  });
25
29
  return element;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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", "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;;;ADqB9D,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").AlertDialogPortalProps, "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,sNAIX,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { AlertDialog } from '../..';
2
+ import * as AlertDialog from '../';
3
3
  declare const meta: Meta<typeof AlertDialog.Root>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof AlertDialog.Root>;
@@ -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;AAI5D,OAAO,EAAE,WAAW,EAAQ,MAAM,OAAO,CAAC;AAE1C,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,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;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":"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,CAG7B,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,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 +1 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/card/stories/index.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,UAAU,CAAC;AAwBjC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,IAAI,CAAC,IAAI,CASjC,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,IAAI,CAAC,IAAI,CAAE,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,KAyBrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,KAsB3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,KAc7B,CAAC"}
1
+ {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/card/stories/index.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,UAAU,CAAC;AAwBjC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,IAAI,CAAC,IAAI,CAUjC,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,IAAI,CAAC,IAAI,CAAE,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,KAyBrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,KAsB3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,KAc7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/collapsible/stories/index.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,WAAW,MAAM,UAAU,CAAC;AAExC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,WAAW,CAAC,IAAI,CAOxC,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,WAAW,CAAC,IAAI,CAAE,CAAC;AAEjD,eAAO,MAAM,OAAO,EAAE,KAWrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAazB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAYtB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAsB9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAkBxB,CAAC"}
1
+ {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/collapsible/stories/index.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,WAAW,MAAM,UAAU,CAAC;AAExC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,WAAW,CAAC,IAAI,CAQxC,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,WAAW,CAAC,IAAI,CAAE,CAAC;AAEjD,eAAO,MAAM,OAAO,EAAE,KAWrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAazB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAYtB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAsB9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAkBxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/collapsible-card/content.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,OAAO,yGAqBnB,CAAC"}
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/collapsible-card/content.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,OAAO,yGAgCnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../src/collapsible-card/header.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,wGAuDlB,CAAC"}
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../src/collapsible-card/header.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,wGAwDlB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/collapsible-card/stories/index.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,eAAe,MAAM,UAAU,CAAC;AAyB5C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,eAAe,CAAC,IAAI,CAQ5C,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,eAAe,CAAC,IAAI,CAAE,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAqBrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,KAkB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAetB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KA6CrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAuCnC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,KA4C5B,CAAC"}
1
+ {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/collapsible-card/stories/index.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,eAAe,MAAM,UAAU,CAAC;AAyB5C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAE,OAAO,eAAe,CAAC,IAAI,CAS5C,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAE,OAAO,eAAe,CAAC,IAAI,CAAE,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAqBrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,KAkB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAetB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KA6CrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAuCnC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,KA4C5B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ContentProps } from './types';
2
+ /**
3
+ * Renders the scrollable body of the dialog, sitting between `Dialog.Header`
4
+ * and `Dialog.Footer` as a flex sibling.
5
+ *
6
+ * **Required for scrolling** — `Dialog.Content` is the element that owns
7
+ * the popup's overflow. Without it, body content that exceeds the popup's
8
+ * max height clips instead of scrolling. Render it once per popup and wrap
9
+ * any freeform body content in it.
10
+ *
11
+ * Placing `Dialog.Header` or `Dialog.Footer` *inside* `Dialog.Content`
12
+ * makes them scroll with the body (the "non-sticky" opt-out) rather than
13
+ * staying pinned to the popup's edges.
14
+ */
15
+ declare const Content: import("react").ForwardRefExoticComponent<ContentProps & import("react").RefAttributes<HTMLDivElement>>;
16
+ export { Content };
17
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/dialog/content.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,OAAO,yGAsBZ,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -1,25 +1,20 @@
1
- type DialogValidationContextType = {
2
- registerTitle: (element: HTMLElement | null) => void;
3
- };
4
- /**
5
- * Development-only hook to access the dialog validation context.
6
- */
7
- declare function useDialogValidationContextDev(): DialogValidationContextType | null;
1
+ export declare const DialogModalProvider: ({ modal, children, }: {
2
+ modal: boolean | "trap-focus" | undefined;
3
+ children: React.ReactNode;
4
+ }) => import("react").JSX.Element;
5
+ export declare const useDialogModal: () => boolean | "trap-focus" | undefined;
8
6
  /**
9
7
  * Hook to access the dialog validation context.
10
8
  * Returns null in production or if not within a Dialog.Popup.
11
9
  */
12
- export declare const useDialogValidationContext: typeof useDialogValidationContextDev;
13
- /**
14
- * Development-only provider that tracks whether Dialog.Title is rendered.
15
- */
16
- declare function DialogValidationProviderDev({ children, }: {
17
- children: React.ReactNode;
18
- }): import("react").JSX.Element;
10
+ export declare const useDialogValidationContext: () => {
11
+ registerTitle: (element: HTMLElement | null) => () => void;
12
+ } | null;
19
13
  /**
20
14
  * Provider component that validates Dialog.Title presence in development mode.
21
15
  * In production, this component is a no-op and just renders children.
22
16
  */
23
- export declare const DialogValidationProvider: typeof DialogValidationProviderDev;
24
- export {};
17
+ export declare const DialogValidationProvider: ({ children, }: {
18
+ children: React.ReactNode;
19
+ }) => import("react").JSX.Element;
25
20
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/dialog/context.tsx"],"names":[],"mappings":"AAeA,KAAK,2BAA2B,GAAG;IAClC,aAAa,EAAE,CAAE,OAAO,EAAE,WAAW,GAAG,IAAI,KAAM,IAAI,CAAC;CACvD,CAAC;AAOF;;GAEG;AACH,iBAAS,6BAA6B,uCAErC;AASD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,sCAEN,CAAC;AAElC;;GAEG;AACH,iBAAS,2BAA2B,CAAE,EACrC,QAAQ,GACR,EAAE;IACF,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B,+BAwCA;AAaD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,oCAEN,CAAC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/dialog/context.tsx"],"names":[],"mappings":"AASA,eAAO,MAAM,mBAAmB;;;iCAAuB,CAAC;AACxD,eAAO,MAAM,cAAc,0CAAuB,CAAC;AAMnD;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;QACI,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;iCACI,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { DescriptionProps } from './types';
2
+ /**
3
+ * Renders an optional paragraph that describes the dialog content.
4
+ *
5
+ * The rendered element is linked to the popup via `aria-describedby`.
6
+ */
7
+ declare const Description: import("react").ForwardRefExoticComponent<DescriptionProps & import("react").RefAttributes<HTMLParagraphElement>>;
8
+ export { Description };
9
+ //# sourceMappingURL=description.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../src/dialog/description.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;;GAIG;AACH,QAAA,MAAM,WAAW,mHAahB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -2,7 +2,14 @@ import type { FooterProps } from './types';
2
2
  /**
3
3
  * Renders the footer section of the dialog, typically containing
4
4
  * action buttons.
5
+ *
6
+ * Defaults to a native `<footer>` element for richer semantics (contentinfo
7
+ * landmark navigation where screen readers expose landmarks nested in
8
+ * dialogs). Pass `render` to opt out of the default tag.
9
+ *
10
+ * The footer is pinned to the bottom of the popup by default. To let it
11
+ * scroll with the body instead, render it *inside* `Dialog.Content`.
5
12
  */
6
- declare const Footer: import("react").ForwardRefExoticComponent<FooterProps & import("react").RefAttributes<HTMLDivElement>>;
13
+ declare const Footer: import("react").ForwardRefExoticComponent<FooterProps & import("react").RefAttributes<HTMLElement>>;
7
14
  export { Footer };
8
15
  //# sourceMappingURL=footer.d.ts.map