@servicetitan/anvil2 3.8.0 → 3.9.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 (411) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{AiMark-voHPSerQ.js → AiMark-2_O4tKv_.js} +4 -4
  3. package/dist/AiMark-2_O4tKv_.js.map +1 -0
  4. package/dist/AiMark.js +1 -1
  5. package/dist/{Alert-CPe0yh6A.js → Alert-DtM7NDN9.js} +3 -3
  6. package/dist/Alert-DtM7NDN9.js.map +1 -0
  7. package/dist/Alert.js +1 -1
  8. package/dist/{Announcement-DU0J4111.js → Announcement-CGglhMfd.js} +3 -3
  9. package/dist/Announcement-CGglhMfd.js.map +1 -0
  10. package/dist/Announcement.js +1 -1
  11. package/dist/AnvilProvider-b3gvW6Md.js.map +1 -1
  12. package/dist/Avatar-CoQcOHWU.js.map +1 -1
  13. package/dist/Avatar-DX96Mxe7.js.map +1 -1
  14. package/dist/Badge-BNrYBFiU.js.map +1 -1
  15. package/dist/Badge.css +2 -3
  16. package/dist/{Breadcrumbs-VzOM2nBU.js → Breadcrumbs-Bmqmw5F5.js} +4 -4
  17. package/dist/Breadcrumbs-Bmqmw5F5.js.map +1 -0
  18. package/dist/Breadcrumbs.js +1 -1
  19. package/dist/{Button-BNzCI47m.js → Button-Dwh_Nd4l.js} +6 -8
  20. package/dist/Button-Dwh_Nd4l.js.map +1 -0
  21. package/dist/Button.js +1 -1
  22. package/dist/ButtonCompound-D7kA0qXr.js.map +1 -1
  23. package/dist/{ButtonLink-PlW08u41.js → ButtonLink-DOFAxNvC.js} +2 -2
  24. package/dist/ButtonLink-DOFAxNvC.js.map +1 -0
  25. package/dist/ButtonLink.js +1 -1
  26. package/dist/{ButtonToggle-DBGc7dIn.js → ButtonToggle-DKDBD1g3.js} +2 -2
  27. package/dist/ButtonToggle-DKDBD1g3.js.map +1 -0
  28. package/dist/ButtonToggle.js +1 -1
  29. package/dist/{Calendar-MRUB0XU7.js → Calendar-CUgFbnKj.js} +2 -2
  30. package/dist/Calendar-CUgFbnKj.js.map +1 -0
  31. package/dist/{Calendar-CekTYzdT.js → Calendar-D_fqe0-J.js} +11 -4
  32. package/dist/Calendar-D_fqe0-J.js.map +1 -0
  33. package/dist/Calendar.js +2 -2
  34. package/dist/Card-Bt0F6RTq.js.map +1 -1
  35. package/dist/{Checkbox-zz9TyZWn.js → Checkbox-4wRmrann.js} +2 -2
  36. package/dist/Checkbox-4wRmrann.js.map +1 -0
  37. package/dist/{Checkbox-C3rtd-Xe.js → Checkbox-DoxWcbfv.js} +5 -5
  38. package/dist/Checkbox-DoxWcbfv.js.map +1 -0
  39. package/dist/Checkbox.js +1 -1
  40. package/dist/{Chip-CxgryK86.js → Chip-D6Q0J0Xe.js} +3 -3
  41. package/dist/Chip-D6Q0J0Xe.js.map +1 -0
  42. package/dist/Chip.js +1 -1
  43. package/dist/Combobox.js +1 -1
  44. package/dist/{DataTable-Bvsijiqn.js → DataTable-CRzQKN_P.js} +11 -11
  45. package/dist/DataTable-CRzQKN_P.js.map +1 -0
  46. package/dist/DataTable.css +2 -3
  47. package/dist/{DateFieldRange-CP7QgS6P.js → DateFieldRange-CHbrYgsD.js} +12 -5
  48. package/dist/DateFieldRange-CHbrYgsD.js.map +1 -0
  49. package/dist/DateFieldRange.js +1 -1
  50. package/dist/{DateFieldSingle-CgMPTi1v.js → DateFieldSingle-D-KZ3NL0.js} +12 -5
  51. package/dist/DateFieldSingle-D-KZ3NL0.js.map +1 -0
  52. package/dist/DateFieldSingle.js +1 -1
  53. package/dist/{DateFieldYearless-BDSbVQx0.js → DateFieldYearless-DouEX24o.js} +5 -5
  54. package/dist/DateFieldYearless-DouEX24o.js.map +1 -0
  55. package/dist/DateFieldYearless.js +1 -1
  56. package/dist/{DateFieldYearlessRange-Dk7HVYTA.js → DateFieldYearlessRange-B_bImgyn.js} +5 -5
  57. package/dist/DateFieldYearlessRange-B_bImgyn.js.map +1 -0
  58. package/dist/DateFieldYearlessRange.js +1 -1
  59. package/dist/{DaysOfTheWeek-Ci-SKebP.js → DaysOfTheWeek--FBi44iw.js} +5 -5
  60. package/dist/DaysOfTheWeek--FBi44iw.js.map +1 -0
  61. package/dist/DaysOfTheWeek.js +1 -1
  62. package/dist/{Details-DkteVZbk.js → Details-CVA5zbrR.js} +2 -2
  63. package/dist/Details-CVA5zbrR.js.map +1 -0
  64. package/dist/Details.js +1 -1
  65. package/dist/{Dialog-BxulNN8n.js → Dialog-Clh3jaX8.js} +4 -4
  66. package/dist/Dialog-Clh3jaX8.js.map +1 -0
  67. package/dist/Dialog.js +1 -1
  68. package/dist/{DialogCancelButton-DmSUPuCR.js → DialogCancelButton-DBL0aKTK.js} +2 -2
  69. package/dist/DialogCancelButton-DBL0aKTK.js.map +1 -0
  70. package/dist/DialogContext-DBgtApl9.js.map +1 -1
  71. package/dist/Divider-C7fp5Xb6.js.map +1 -1
  72. package/dist/Dnd.js +2 -2
  73. package/dist/{DndHandleButton-Ck5nc8w2.js → DndHandleButton-BRlodkDO.js} +2 -2
  74. package/dist/{DndHandleButton-Ck5nc8w2.js.map → DndHandleButton-BRlodkDO.js.map} +1 -1
  75. package/dist/DndSort.js +4 -4
  76. package/dist/DndSort.js.map +1 -1
  77. package/dist/{Drawer-DzvM9MRB.js → Drawer-h2Mut1lB.js} +5 -5
  78. package/dist/Drawer-h2Mut1lB.js.map +1 -0
  79. package/dist/Drawer.js +1 -1
  80. package/dist/DrawerContext-BSpnzXVZ.js.map +1 -1
  81. package/dist/DrillDown.js +1 -1
  82. package/dist/DrillDown.module-D1Bf9_yP.js.map +1 -1
  83. package/dist/{EditCard-ZpF032WP.js → EditCard-QohYSylF.js} +4 -4
  84. package/dist/EditCard-QohYSylF.js.map +1 -0
  85. package/dist/EditCard.js +1 -1
  86. package/dist/{FieldLabel-Cm5A1Jcx.js → FieldLabel-SzH61hCb.js} +3 -3
  87. package/dist/FieldLabel-SzH61hCb.js.map +1 -0
  88. package/dist/FieldLabel.js +1 -1
  89. package/dist/{FilterBar-DBVW3LL3.js → FilterBar-CBTAkEri.js} +8 -8
  90. package/dist/FilterBar-CBTAkEri.js.map +1 -0
  91. package/dist/FilterBar.js +1 -1
  92. package/dist/{Flex-Bb3iHExM.js → Flex-CRF7gj0_.js} +3 -3
  93. package/dist/Flex-CRF7gj0_.js.map +1 -0
  94. package/dist/Flex.css +2 -4
  95. package/dist/Flex.js +1 -1
  96. package/dist/{Grid-ho1pGJ5L.js → Grid-CvGQrIhE.js} +4 -4
  97. package/dist/Grid-CvGQrIhE.js.map +1 -0
  98. package/dist/Grid.css +3 -5
  99. package/dist/Grid.js +1 -1
  100. package/dist/{Helper-B_VAFgGd.js → Helper-Bq6Npkgh.js} +2 -2
  101. package/dist/Helper-Bq6Npkgh.js.map +1 -0
  102. package/dist/{Icon-B4uCvMU9.js → Icon-B5zwN7GD.js} +4 -4
  103. package/dist/Icon-B5zwN7GD.js.map +1 -0
  104. package/dist/Icon.js +1 -1
  105. package/dist/{InputMask-CX6XiOOm.js → InputMask-CQONHcTq.js} +3 -3
  106. package/dist/InputMask-CQONHcTq.js.map +1 -0
  107. package/dist/InputMask.js +1 -1
  108. package/dist/InteractiveCard-C0g5PxB6.js.map +1 -1
  109. package/dist/Layout-C2Q2hyLG.js.map +1 -1
  110. package/dist/{Link-C7dtI5K6.js → Link-D7ycmfQ_.js} +2 -2
  111. package/dist/Link-D7ycmfQ_.js.map +1 -0
  112. package/dist/Link.css +2 -4
  113. package/dist/Link.js +1 -1
  114. package/dist/LinkButton-C0wps8r1.js.map +1 -1
  115. package/dist/List-BvzfZ9TW.js.map +1 -1
  116. package/dist/{ListView-DpveXOsN.js → ListView-BgGEwal3.js} +3 -3
  117. package/dist/ListView-BgGEwal3.js.map +1 -0
  118. package/dist/ListView.js +1 -1
  119. package/dist/{Listbox-Cdwaofd2.js → Listbox-Cw_2W62S.js} +4 -4
  120. package/dist/Listbox-Cw_2W62S.js.map +1 -0
  121. package/dist/Listbox.js +1 -1
  122. package/dist/LocalizationContext-UsmB5mnR.js.map +1 -1
  123. package/dist/LocalizationProvider-BPcOU7YX.js.map +1 -1
  124. package/dist/{Menu-DmEXQLXt.js → Menu-DNOOmDQC.js} +3 -3
  125. package/dist/Menu-DNOOmDQC.js.map +1 -0
  126. package/dist/Menu.js +1 -1
  127. package/dist/{MenuFooter-Ck9L599M.js → MenuFooter-BXcNxNnX.js} +2 -2
  128. package/dist/MenuFooter-BXcNxNnX.js.map +1 -0
  129. package/dist/MultiSelectField.js +1 -1
  130. package/dist/{MultiSelectFieldSync-B1tkEtft.js → MultiSelectFieldSync-CpfsWecG.js} +18 -8
  131. package/dist/MultiSelectFieldSync-CpfsWecG.js.map +1 -0
  132. package/dist/MultiSelectMenu.js +1 -1
  133. package/dist/{MultiSelectMenuSync-Deki_z-0.js → MultiSelectMenuSync-CtyLYyDE.js} +10 -8
  134. package/dist/MultiSelectMenuSync-CtyLYyDE.js.map +1 -0
  135. package/dist/{NumberField-CjC6KHKl.js → NumberField-B1761jkf.js} +7 -7
  136. package/dist/NumberField-B1761jkf.js.map +1 -0
  137. package/dist/NumberField.css +2 -3
  138. package/dist/NumberField.js +1 -1
  139. package/dist/Overflow.js +1 -1
  140. package/dist/Overflow.js.map +1 -1
  141. package/dist/{Page-BreBQ3pG.js → Page-B6E3Gbji.js} +12 -12
  142. package/dist/Page-B6E3Gbji.js.map +1 -0
  143. package/dist/Page.js +1 -1
  144. package/dist/{Pagination-CmqAut6y.js → Pagination-DF7iMeJe.js} +6 -6
  145. package/dist/Pagination-DF7iMeJe.js.map +1 -0
  146. package/dist/Pagination.js +1 -1
  147. package/dist/{Popover-CdRuNv3C.js → Popover-CjsE5FG0.js} +2 -2
  148. package/dist/Popover-CjsE5FG0.js.map +1 -0
  149. package/dist/Popover.js +1 -1
  150. package/dist/PortalProvider-Cj_y3gbC.js.map +1 -1
  151. package/dist/{ProgressBar-065vjsQ0.js → ProgressBar-Coh2nTJ1.js} +6 -6
  152. package/dist/ProgressBar-Coh2nTJ1.js.map +1 -0
  153. package/dist/ProgressBar.js +1 -1
  154. package/dist/{Radio-D9w_-JYw.js → Radio-BxSL1PoP.js} +2 -2
  155. package/dist/Radio-BxSL1PoP.js.map +1 -0
  156. package/dist/{Radio-dyLcVmUw.js → Radio-J4Iv3wbJ.js} +5 -5
  157. package/dist/Radio-J4Iv3wbJ.js.map +1 -0
  158. package/dist/Radio.js +1 -1
  159. package/dist/{RichTextEditor-byoMZaJy.js → RichTextEditor-CLo8yoUP.js} +13 -13
  160. package/dist/RichTextEditor-CLo8yoUP.js.map +1 -0
  161. package/dist/RichTextEditor.css +1 -2
  162. package/dist/RichTextEditor.js +1 -1
  163. package/dist/{SavedFiltersButton-BHgS4akL.js → SavedFiltersButton-FcYVncxU.js} +12 -12
  164. package/dist/SavedFiltersButton-FcYVncxU.js.map +1 -0
  165. package/dist/SavedFiltersButton.js +1 -1
  166. package/dist/{SearchField-B7fIOJf-.js → SearchField-ChoNtw8w.js} +2 -2
  167. package/dist/SearchField-ChoNtw8w.js.map +1 -0
  168. package/dist/{SearchField-X4B7f23E.js → SearchField-DX8hZyo2.js} +2 -2
  169. package/dist/SearchField-DX8hZyo2.js.map +1 -0
  170. package/dist/SearchField.js +1 -1
  171. package/dist/{SegmentedControl-Be6jCglV.js → SegmentedControl-CQ6DrbDc.js} +2 -2
  172. package/dist/SegmentedControl-CQ6DrbDc.js.map +1 -0
  173. package/dist/SegmentedControl.css +2 -3
  174. package/dist/SegmentedControl.js +1 -1
  175. package/dist/{SelectCard-CMSG_ba1.js → SelectCard-BTfhPyHH.js} +4 -4
  176. package/dist/SelectCard-BTfhPyHH.js.map +1 -0
  177. package/dist/SelectCard.js +1 -1
  178. package/dist/SelectField.js +1 -1
  179. package/dist/{SelectFieldLabel-dKVBaki2.js → SelectFieldLabel-CjY6zFJA.js} +2 -2
  180. package/dist/SelectFieldLabel-CjY6zFJA.js.map +1 -0
  181. package/dist/{SelectFieldSync-VShqP5J0.js → SelectFieldSync-Bi8HsMYP.js} +17 -7
  182. package/dist/SelectFieldSync-Bi8HsMYP.js.map +1 -0
  183. package/dist/SelectMenu.js +1 -1
  184. package/dist/{SelectMenuSync-BDx1yhZT.js → SelectMenuSync-DKg4g5nN.js} +7 -7
  185. package/dist/SelectMenuSync-DKg4g5nN.js.map +1 -0
  186. package/dist/{SelectOptions-BIVTviOh.js → SelectOptions-DszNAjxB.js} +2 -2
  187. package/dist/SelectOptions-DszNAjxB.js.map +1 -0
  188. package/dist/{SelectTrigger-APxYfL3V.js → SelectTrigger-DNIc5ttg.js} +4 -4
  189. package/dist/SelectTrigger-DNIc5ttg.js.map +1 -0
  190. package/dist/SelectTrigger.js +1 -1
  191. package/dist/{SelectTriggerBase-lYieONTb.js → SelectTriggerBase-1Cc6EUBw.js} +10 -14
  192. package/dist/SelectTriggerBase-1Cc6EUBw.js.map +1 -0
  193. package/dist/SelectTriggerBase.css +2 -3
  194. package/dist/{SideNav-DoxX8Vi-.js → SideNav-DZRXOYHs.js} +2 -2
  195. package/dist/SideNav-DZRXOYHs.js.map +1 -0
  196. package/dist/SideNav.js +1 -1
  197. package/dist/Skeleton.js.map +1 -1
  198. package/dist/Spinner-B7tTWcP6.js.map +1 -1
  199. package/dist/SrOnly-pnf8ajnh.js.map +1 -1
  200. package/dist/{Stepper-CvaR7OoT.js → Stepper-BX_gDWLE.js} +4 -4
  201. package/dist/Stepper-BX_gDWLE.js.map +1 -0
  202. package/dist/Stepper.css +1 -2
  203. package/dist/Stepper.js +1 -1
  204. package/dist/{Switch-Bm3qqjd6.js → Switch-BpjBYm-U.js} +5 -5
  205. package/dist/Switch-BpjBYm-U.js.map +1 -0
  206. package/dist/Switch.js +1 -1
  207. package/dist/{Tab-Cy4G562A.js → Tab-Bqfvg8Ce.js} +53 -23
  208. package/dist/Tab-Bqfvg8Ce.js.map +1 -0
  209. package/dist/Tab.css +35 -31
  210. package/dist/Tab.js +1 -1
  211. package/dist/Table.js +1 -1
  212. package/dist/{Text-mDcQHC2U.js → Text-CIoD_RK4.js} +2 -2
  213. package/dist/Text-CIoD_RK4.js.map +1 -0
  214. package/dist/Text.js +1 -1
  215. package/dist/{TextField-CUVsDfWo.js → TextField-CzzvLI5_.js} +4 -4
  216. package/dist/TextField-CzzvLI5_.js.map +1 -0
  217. package/dist/{TextField-WQTlqKso.js → TextField-D3sRS5q1.js} +2 -2
  218. package/dist/TextField-D3sRS5q1.js.map +1 -0
  219. package/dist/TextField.js +1 -1
  220. package/dist/{Textarea-CW3KGuB9.js → Textarea-B3C7AkPj.js} +4 -4
  221. package/dist/Textarea-B3C7AkPj.js.map +1 -0
  222. package/dist/Textarea.js +1 -1
  223. package/dist/ThemeProvider-Sd8LK0A9.js.map +1 -1
  224. package/dist/ThemeProviderContext-l52GohYT.js.map +1 -1
  225. package/dist/{TimeField-JA3gXyS7.js → TimeField-L9B_X6-H.js} +31 -9
  226. package/dist/TimeField-L9B_X6-H.js.map +1 -0
  227. package/dist/TimeField.js +1 -1
  228. package/dist/TimezoneMessage-BrKB_psP.js.map +1 -1
  229. package/dist/Toast.js +2 -2
  230. package/dist/{Toaster-DMZng3Im.js → Toaster-CAI7tX8q.js} +4 -4
  231. package/dist/Toaster-CAI7tX8q.js.map +1 -0
  232. package/dist/{Toaster-fPcgIF7Q.js → Toaster-DZxf0N9g.js} +2 -2
  233. package/dist/Toaster-DZxf0N9g.js.map +1 -0
  234. package/dist/{Toolbar-BfGcDXgC.js → Toolbar-2VQIjU5b.js} +9 -9
  235. package/dist/Toolbar-2VQIjU5b.js.map +1 -0
  236. package/dist/{Toolbar-Dlu39v69.js → Toolbar-BbImThIu.js} +7 -7
  237. package/dist/Toolbar-BbImThIu.js.map +1 -0
  238. package/dist/Toolbar.js +2 -2
  239. package/dist/{ToolbarButtonToggle-3xbnm1Qr.js → ToolbarButtonToggle-Bc0XvCM9.js} +2 -2
  240. package/dist/ToolbarButtonToggle-Bc0XvCM9.js.map +1 -0
  241. package/dist/Tooltip-BC8lnFhe.js.map +1 -1
  242. package/dist/TrackingProvider-Co4lyoI9.js.map +1 -1
  243. package/dist/TrackingProviderContext-CrVA7KHv.js.map +1 -1
  244. package/dist/TreeSelectField.js +1 -1
  245. package/dist/{TreeSelectFieldSync-CdtC8d3Q.js → TreeSelectFieldSync-DUHVmOQa.js} +19 -8
  246. package/dist/TreeSelectFieldSync-DUHVmOQa.js.map +1 -0
  247. package/dist/TreeSelectMenu.js +1 -1
  248. package/dist/{TreeSelectMenuSync-CPuQWUNU.js → TreeSelectMenuSync-DVoYUG7F.js} +8 -8
  249. package/dist/TreeSelectMenuSync-DVoYUG7F.js.map +1 -0
  250. package/dist/{TypeaheadTextField-BkLECKZY.js → TypeaheadTextField-9Nkkd4c4.js} +3 -3
  251. package/dist/TypeaheadTextField-9Nkkd4c4.js.map +1 -0
  252. package/dist/TypeaheadTextField.js +1 -1
  253. package/dist/{YearlessDateInputWithPicker-DLtMQhDw.js → YearlessDateInputWithPicker-CM9mmz8s.js} +11 -4
  254. package/dist/YearlessDateInputWithPicker-CM9mmz8s.js.map +1 -0
  255. package/dist/beta.js +16 -16
  256. package/dist/{bulkActionTypes-CTKwMpO7.js → bulkActionTypes-BnZNAru6.js} +2 -2
  257. package/dist/bulkActionTypes-BnZNAru6.js.map +1 -0
  258. package/dist/childrenToString-Bz9MqbHb.js.map +1 -1
  259. package/dist/{filter-state-DKXF5MeW.js → filter-state-XmqhkURU.js} +37 -33
  260. package/dist/filter-state-XmqhkURU.js.map +1 -0
  261. package/dist/{index-B7BIlotN.js → index-BwNeldDw.js} +2 -2
  262. package/dist/{index-B7BIlotN.js.map → index-BwNeldDw.js.map} +1 -1
  263. package/dist/{index-SZMmvI3D.js → index-BwV_Pz7v.js} +2 -2
  264. package/dist/index-BwV_Pz7v.js.map +1 -0
  265. package/dist/index.js +56 -56
  266. package/dist/makeZeroShortcutPreprocessor-CxsiGTRW.js.map +1 -1
  267. package/dist/src/beta/components/FilterBar/index.d.ts +1 -1
  268. package/dist/src/beta/components/Toolbar/index.d.ts +1 -1
  269. package/dist/src/components/Alert/Alert.d.ts +2 -4
  270. package/dist/src/components/Announcement/Announcement.d.ts +2 -4
  271. package/dist/src/components/Breadcrumbs/index.d.ts +1 -1
  272. package/dist/src/components/ButtonCompound/ButtonCompound.d.ts +2 -4
  273. package/dist/src/components/ButtonLink/ButtonLink.d.ts +2 -4
  274. package/dist/src/components/ButtonToggle/ButtonToggle.d.ts +2 -4
  275. package/dist/src/components/Calendar/Calendar.d.ts +3 -1
  276. package/dist/src/components/Calendar/index.d.ts +1 -1
  277. package/dist/src/components/Checkbox/index.d.ts +2 -2
  278. package/dist/src/components/Combobox/Combobox.d.ts +2 -2
  279. package/dist/src/components/Combobox/ComboboxEmpty.d.ts +1 -1
  280. package/dist/src/components/Combobox/index.d.ts +2 -2
  281. package/dist/src/components/DateFieldSingle/index.d.ts +1 -1
  282. package/dist/src/components/DateFieldYearless/index.d.ts +1 -1
  283. package/dist/src/components/Details/index.d.ts +2 -2
  284. package/dist/src/components/Dialog/index.d.ts +4 -4
  285. package/dist/src/components/DndSort/index.d.ts +3 -3
  286. package/dist/src/components/Drawer/index.d.ts +4 -4
  287. package/dist/src/components/Grid/index.d.ts +1 -1
  288. package/dist/src/components/List/index.d.ts +1 -1
  289. package/dist/src/components/Listbox/index.d.ts +2 -2
  290. package/dist/src/components/Menu/index.d.ts +1 -1
  291. package/dist/src/components/Overflow/index.d.ts +1 -1
  292. package/dist/src/components/Popover/index.d.ts +4 -4
  293. package/dist/src/components/Radio/index.d.ts +2 -2
  294. package/dist/src/components/SelectCard/index.d.ts +1 -1
  295. package/dist/src/components/SelectMenu/internal/useMenuInteraction.d.ts +7 -1
  296. package/dist/src/components/SideNav/index.d.ts +3 -3
  297. package/dist/src/components/Stepper/index.d.ts +6 -6
  298. package/dist/src/components/Tab/index.d.ts +3 -3
  299. package/dist/src/components/TimeField/index.d.ts +1 -1
  300. package/dist/src/components/Toolbar/index.d.ts +5 -5
  301. package/dist/src/components/Tooltip/index.d.ts +2 -2
  302. package/dist/src/internal/components/Popover/index.d.ts +4 -4
  303. package/dist/src/providers/ThemeProvider/index.d.ts +2 -2
  304. package/dist/src/providers/TrackingProvider/index.d.ts +1 -1
  305. package/dist/src/types/index.d.ts +3 -3
  306. package/dist/{stripInlineMarkdown-BZzgG-Zm.js → stripInlineMarkdown-BfNNOWPk.js} +2 -2
  307. package/dist/{stripInlineMarkdown-BZzgG-Zm.js.map → stripInlineMarkdown-BfNNOWPk.js.map} +1 -1
  308. package/dist/{syncFilterUtils-BVclVovw.js → syncFilterUtils-UVNoFsDr.js} +5 -5
  309. package/dist/syncFilterUtils-UVNoFsDr.js.map +1 -0
  310. package/dist/{treeSync-oC-VZpP0.js → treeSync-CiU5d6rF.js} +4 -4
  311. package/dist/{treeSync-oC-VZpP0.js.map → treeSync-CiU5d6rF.js.map} +1 -1
  312. package/dist/{useAdaptiveView-AvsDkChF.js → useAdaptiveView-C_WvM4-P.js} +6 -6
  313. package/dist/useAdaptiveView-C_WvM4-P.js.map +1 -0
  314. package/dist/useChipLayout-BWZfKDgd.js.map +1 -1
  315. package/dist/{useDrilldown-PmrZ4BXn.js → useDrilldown-D7DKSs7E.js} +4 -4
  316. package/dist/{useDrilldown-PmrZ4BXn.js.map → useDrilldown-D7DKSs7E.js.map} +1 -1
  317. package/dist/useFocusWithin-hi77jsrB.js.map +1 -1
  318. package/dist/{useInfiniteCombobox-C78WQZx4.js → useInfiniteCombobox-COJTJxCZ.js} +70 -68
  319. package/dist/useInfiniteCombobox-COJTJxCZ.js.map +1 -0
  320. package/dist/useInitialFocus-BUxEDMEG.js.map +1 -1
  321. package/dist/useLayoutPropsUtil-DjqeAJZ9.js.map +1 -1
  322. package/dist/{useMenuInteraction-NEJXUD4I.js → useMenuInteraction-AgrXU8kv.js} +8 -2
  323. package/dist/useMenuInteraction-AgrXU8kv.js.map +1 -0
  324. package/dist/{useNumberField-D_ic9i2q.js → useNumberField-CXFYUZ_n.js} +4 -2
  325. package/dist/useNumberField-CXFYUZ_n.js.map +1 -0
  326. package/dist/useOptionallyControlledState-DbDuos5L.js.map +1 -1
  327. package/dist/useSize.js.map +1 -1
  328. package/dist/useSwipe-Cp-CJxLU.js.map +1 -1
  329. package/package.json +2 -2
  330. package/dist/AiMark-voHPSerQ.js.map +0 -1
  331. package/dist/Alert-CPe0yh6A.js.map +0 -1
  332. package/dist/Announcement-DU0J4111.js.map +0 -1
  333. package/dist/Breadcrumbs-VzOM2nBU.js.map +0 -1
  334. package/dist/Button-BNzCI47m.js.map +0 -1
  335. package/dist/ButtonLink-PlW08u41.js.map +0 -1
  336. package/dist/ButtonToggle-DBGc7dIn.js.map +0 -1
  337. package/dist/Calendar-CekTYzdT.js.map +0 -1
  338. package/dist/Calendar-MRUB0XU7.js.map +0 -1
  339. package/dist/Checkbox-C3rtd-Xe.js.map +0 -1
  340. package/dist/Checkbox-zz9TyZWn.js.map +0 -1
  341. package/dist/Chip-CxgryK86.js.map +0 -1
  342. package/dist/DataTable-Bvsijiqn.js.map +0 -1
  343. package/dist/DateFieldRange-CP7QgS6P.js.map +0 -1
  344. package/dist/DateFieldSingle-CgMPTi1v.js.map +0 -1
  345. package/dist/DateFieldYearless-BDSbVQx0.js.map +0 -1
  346. package/dist/DateFieldYearlessRange-Dk7HVYTA.js.map +0 -1
  347. package/dist/DaysOfTheWeek-Ci-SKebP.js.map +0 -1
  348. package/dist/Details-DkteVZbk.js.map +0 -1
  349. package/dist/Dialog-BxulNN8n.js.map +0 -1
  350. package/dist/DialogCancelButton-DmSUPuCR.js.map +0 -1
  351. package/dist/Drawer-DzvM9MRB.js.map +0 -1
  352. package/dist/EditCard-ZpF032WP.js.map +0 -1
  353. package/dist/FieldLabel-Cm5A1Jcx.js.map +0 -1
  354. package/dist/FilterBar-DBVW3LL3.js.map +0 -1
  355. package/dist/Flex-Bb3iHExM.js.map +0 -1
  356. package/dist/Grid-ho1pGJ5L.js.map +0 -1
  357. package/dist/Helper-B_VAFgGd.js.map +0 -1
  358. package/dist/Icon-B4uCvMU9.js.map +0 -1
  359. package/dist/InputMask-CX6XiOOm.js.map +0 -1
  360. package/dist/Link-C7dtI5K6.js.map +0 -1
  361. package/dist/ListView-DpveXOsN.js.map +0 -1
  362. package/dist/Listbox-Cdwaofd2.js.map +0 -1
  363. package/dist/Menu-DmEXQLXt.js.map +0 -1
  364. package/dist/MenuFooter-Ck9L599M.js.map +0 -1
  365. package/dist/MultiSelectFieldSync-B1tkEtft.js.map +0 -1
  366. package/dist/MultiSelectMenuSync-Deki_z-0.js.map +0 -1
  367. package/dist/NumberField-CjC6KHKl.js.map +0 -1
  368. package/dist/Page-BreBQ3pG.js.map +0 -1
  369. package/dist/Pagination-CmqAut6y.js.map +0 -1
  370. package/dist/Popover-CdRuNv3C.js.map +0 -1
  371. package/dist/ProgressBar-065vjsQ0.js.map +0 -1
  372. package/dist/Radio-D9w_-JYw.js.map +0 -1
  373. package/dist/Radio-dyLcVmUw.js.map +0 -1
  374. package/dist/RichTextEditor-byoMZaJy.js.map +0 -1
  375. package/dist/SavedFiltersButton-BHgS4akL.js.map +0 -1
  376. package/dist/SearchField-B7fIOJf-.js.map +0 -1
  377. package/dist/SearchField-X4B7f23E.js.map +0 -1
  378. package/dist/SegmentedControl-Be6jCglV.js.map +0 -1
  379. package/dist/SelectCard-CMSG_ba1.js.map +0 -1
  380. package/dist/SelectFieldLabel-dKVBaki2.js.map +0 -1
  381. package/dist/SelectFieldSync-VShqP5J0.js.map +0 -1
  382. package/dist/SelectMenuSync-BDx1yhZT.js.map +0 -1
  383. package/dist/SelectOptions-BIVTviOh.js.map +0 -1
  384. package/dist/SelectTrigger-APxYfL3V.js.map +0 -1
  385. package/dist/SelectTriggerBase-lYieONTb.js.map +0 -1
  386. package/dist/SideNav-DoxX8Vi-.js.map +0 -1
  387. package/dist/Stepper-CvaR7OoT.js.map +0 -1
  388. package/dist/Switch-Bm3qqjd6.js.map +0 -1
  389. package/dist/Tab-Cy4G562A.js.map +0 -1
  390. package/dist/Text-mDcQHC2U.js.map +0 -1
  391. package/dist/TextField-CUVsDfWo.js.map +0 -1
  392. package/dist/TextField-WQTlqKso.js.map +0 -1
  393. package/dist/Textarea-CW3KGuB9.js.map +0 -1
  394. package/dist/TimeField-JA3gXyS7.js.map +0 -1
  395. package/dist/Toaster-DMZng3Im.js.map +0 -1
  396. package/dist/Toaster-fPcgIF7Q.js.map +0 -1
  397. package/dist/Toolbar-BfGcDXgC.js.map +0 -1
  398. package/dist/Toolbar-Dlu39v69.js.map +0 -1
  399. package/dist/ToolbarButtonToggle-3xbnm1Qr.js.map +0 -1
  400. package/dist/TreeSelectFieldSync-CdtC8d3Q.js.map +0 -1
  401. package/dist/TreeSelectMenuSync-CPuQWUNU.js.map +0 -1
  402. package/dist/TypeaheadTextField-BkLECKZY.js.map +0 -1
  403. package/dist/YearlessDateInputWithPicker-DLtMQhDw.js.map +0 -1
  404. package/dist/bulkActionTypes-CTKwMpO7.js.map +0 -1
  405. package/dist/filter-state-DKXF5MeW.js.map +0 -1
  406. package/dist/index-SZMmvI3D.js.map +0 -1
  407. package/dist/syncFilterUtils-BVclVovw.js.map +0 -1
  408. package/dist/useAdaptiveView-AvsDkChF.js.map +0 -1
  409. package/dist/useInfiniteCombobox-C78WQZx4.js.map +0 -1
  410. package/dist/useMenuInteraction-NEJXUD4I.js.map +0 -1
  411. package/dist/useNumberField-D_ic9i2q.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"Textarea-CW3KGuB9.js","sources":["../../../node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types+react@18.3.18_react@18.2.0/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js","../../../node_modules/.pnpm/use-latest@1.3.0_@types+react@18.3.18_react@18.2.0/node_modules/use-latest/dist/use-latest.esm.js","../../../node_modules/.pnpm/use-composed-ref@1.4.0_@types+react@18.3.18_react@18.2.0/node_modules/use-composed-ref/dist/use-composed-ref.esm.js","../../../node_modules/.pnpm/react-textarea-autosize@8.5.5_@types+react@18.3.18_react@18.2.0/node_modules/react-textarea-autosize/dist/react-textarea-autosize.browser.esm.js","../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import { useLayoutEffect } from 'react';\n\nvar index = useLayoutEffect ;\n\nexport { index as default };\n","import React from 'react';\nimport useIsomorphicLayoutEffect from 'use-isomorphic-layout-effect';\n\nvar useLatest = function useLatest(value) {\n var ref = React.useRef(value);\n useIsomorphicLayoutEffect(function () {\n ref.current = value;\n });\n return ref;\n};\n\nexport { useLatest as default };\n","import React from 'react';\n\n// basically Exclude<React.ClassAttributes<T>[\"ref\"], string>\n\nvar updateRef = function updateRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n return;\n }\n ref.current = value;\n};\nvar useComposedRef = function useComposedRef(libRef, userRef) {\n var prevUserRef = React.useRef();\n return React.useCallback(function (instance) {\n libRef.current = instance;\n if (prevUserRef.current) {\n updateRef(prevUserRef.current, null);\n }\n prevUserRef.current = userRef;\n if (!userRef) {\n return;\n }\n updateRef(userRef, instance);\n }, [userRef]);\n};\n\nexport { useComposedRef as default };\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport * as React from 'react';\nimport useLatest from 'use-latest';\nimport useComposedRef from 'use-composed-ref';\n\nvar HIDDEN_TEXTAREA_STYLE = {\n 'min-height': '0',\n 'max-height': 'none',\n height: '0',\n visibility: 'hidden',\n overflow: 'hidden',\n position: 'absolute',\n 'z-index': '-1000',\n top: '0',\n right: '0',\n display: 'block'\n};\nvar forceHiddenStyles = function forceHiddenStyles(node) {\n Object.keys(HIDDEN_TEXTAREA_STYLE).forEach(function (key) {\n node.style.setProperty(key, HIDDEN_TEXTAREA_STYLE[key], 'important');\n });\n};\nvar forceHiddenStyles$1 = forceHiddenStyles;\n\nvar hiddenTextarea = null;\nvar getHeight = function getHeight(node, sizingData) {\n var height = node.scrollHeight;\n if (sizingData.sizingStyle.boxSizing === 'border-box') {\n // border-box: add border, since height = content + padding + border\n return height + sizingData.borderSize;\n }\n\n // remove padding, since height = content\n return height - sizingData.paddingSize;\n};\nfunction calculateNodeHeight(sizingData, value, minRows, maxRows) {\n if (minRows === void 0) {\n minRows = 1;\n }\n if (maxRows === void 0) {\n maxRows = Infinity;\n }\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement('textarea');\n hiddenTextarea.setAttribute('tabindex', '-1');\n hiddenTextarea.setAttribute('aria-hidden', 'true');\n forceHiddenStyles$1(hiddenTextarea);\n }\n if (hiddenTextarea.parentNode === null) {\n document.body.appendChild(hiddenTextarea);\n }\n var paddingSize = sizingData.paddingSize,\n borderSize = sizingData.borderSize,\n sizingStyle = sizingData.sizingStyle;\n var boxSizing = sizingStyle.boxSizing;\n Object.keys(sizingStyle).forEach(function (_key) {\n var key = _key;\n hiddenTextarea.style[key] = sizingStyle[key];\n });\n forceHiddenStyles$1(hiddenTextarea);\n hiddenTextarea.value = value;\n var height = getHeight(hiddenTextarea, sizingData);\n // Double set and calc due to Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1795904\n hiddenTextarea.value = value;\n height = getHeight(hiddenTextarea, sizingData);\n\n // measure height of a textarea with a single row\n hiddenTextarea.value = 'x';\n var rowHeight = hiddenTextarea.scrollHeight - paddingSize;\n var minHeight = rowHeight * minRows;\n if (boxSizing === 'border-box') {\n minHeight = minHeight + paddingSize + borderSize;\n }\n height = Math.max(minHeight, height);\n var maxHeight = rowHeight * maxRows;\n if (boxSizing === 'border-box') {\n maxHeight = maxHeight + paddingSize + borderSize;\n }\n height = Math.min(maxHeight, height);\n return [height, rowHeight];\n}\n\nvar noop = function noop() {};\nvar pick = function pick(props, obj) {\n return props.reduce(function (acc, prop) {\n acc[prop] = obj[prop];\n return acc;\n }, {});\n};\n\nvar SIZING_STYLE = ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 'boxSizing', 'fontFamily', 'fontSize', 'fontStyle', 'fontWeight', 'letterSpacing', 'lineHeight', 'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop',\n// non-standard\n'tabSize', 'textIndent',\n// non-standard\n'textRendering', 'textTransform', 'width', 'wordBreak', 'wordSpacing', 'scrollbarGutter'];\nvar isIE = !!document.documentElement.currentStyle ;\nvar getSizingData = function getSizingData(node) {\n var style = window.getComputedStyle(node);\n if (style === null) {\n return null;\n }\n var sizingStyle = pick(SIZING_STYLE, style);\n var boxSizing = sizingStyle.boxSizing;\n\n // probably node is detached from DOM, can't read computed dimensions\n if (boxSizing === '') {\n return null;\n }\n\n // IE (Edge has already correct behaviour) returns content width as computed width\n // so we need to add manually padding and border widths\n if (isIE && boxSizing === 'border-box') {\n sizingStyle.width = parseFloat(sizingStyle.width) + parseFloat(sizingStyle.borderRightWidth) + parseFloat(sizingStyle.borderLeftWidth) + parseFloat(sizingStyle.paddingRight) + parseFloat(sizingStyle.paddingLeft) + 'px';\n }\n var paddingSize = parseFloat(sizingStyle.paddingBottom) + parseFloat(sizingStyle.paddingTop);\n var borderSize = parseFloat(sizingStyle.borderBottomWidth) + parseFloat(sizingStyle.borderTopWidth);\n return {\n sizingStyle: sizingStyle,\n paddingSize: paddingSize,\n borderSize: borderSize\n };\n};\nvar getSizingData$1 = getSizingData;\n\nfunction useListener(target, type, listener) {\n var latestListener = useLatest(listener);\n React.useLayoutEffect(function () {\n var handler = function handler(ev) {\n return latestListener.current(ev);\n };\n\n // might happen if document.fonts is not defined, for instance\n if (!target) {\n return;\n }\n target.addEventListener(type, handler);\n return function () {\n return target.removeEventListener(type, handler);\n };\n }, []);\n}\nvar useWindowResizeListener = function useWindowResizeListener(listener) {\n useListener(window, 'resize', listener);\n};\nvar useFontsLoadedListener = function useFontsLoadedListener(listener) {\n useListener(document.fonts, 'loadingdone', listener);\n};\n\nvar _excluded = [\"cacheMeasurements\", \"maxRows\", \"minRows\", \"onChange\", \"onHeightChange\"];\nvar TextareaAutosize = function TextareaAutosize(_ref, userRef) {\n var cacheMeasurements = _ref.cacheMeasurements,\n maxRows = _ref.maxRows,\n minRows = _ref.minRows,\n _ref$onChange = _ref.onChange,\n onChange = _ref$onChange === void 0 ? noop : _ref$onChange,\n _ref$onHeightChange = _ref.onHeightChange,\n onHeightChange = _ref$onHeightChange === void 0 ? noop : _ref$onHeightChange,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n var isControlled = props.value !== undefined;\n var libRef = React.useRef(null);\n var ref = useComposedRef(libRef, userRef);\n var heightRef = React.useRef(0);\n var measurementsCacheRef = React.useRef();\n var resizeTextarea = function resizeTextarea() {\n var node = libRef.current;\n var nodeSizingData = cacheMeasurements && measurementsCacheRef.current ? measurementsCacheRef.current : getSizingData$1(node);\n if (!nodeSizingData) {\n return;\n }\n measurementsCacheRef.current = nodeSizingData;\n var _calculateNodeHeight = calculateNodeHeight(nodeSizingData, node.value || node.placeholder || 'x', minRows, maxRows),\n height = _calculateNodeHeight[0],\n rowHeight = _calculateNodeHeight[1];\n if (heightRef.current !== height) {\n heightRef.current = height;\n node.style.setProperty('height', height + \"px\", 'important');\n onHeightChange(height, {\n rowHeight: rowHeight\n });\n }\n };\n var handleChange = function handleChange(event) {\n if (!isControlled) {\n resizeTextarea();\n }\n onChange(event);\n };\n {\n React.useLayoutEffect(resizeTextarea);\n useWindowResizeListener(resizeTextarea);\n useFontsLoadedListener(resizeTextarea);\n return /*#__PURE__*/React.createElement(\"textarea\", _extends({}, props, {\n onChange: handleChange,\n ref: ref\n }));\n }\n};\nvar index = /* #__PURE__ */React.forwardRef(TextareaAutosize);\n\nexport { index as default };\n","import {\n ChangeEvent,\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n FocusEventHandler,\n ReactElement,\n forwardRef,\n isValidElement,\n useId,\n useState,\n useRef,\n useEffect,\n useMemo,\n Ref,\n} from \"react\";\nimport { useTrackingId, useMergeRefs } from \"../../hooks\";\nimport {\n DataTrackingId,\n LayoutUtilProps,\n MaxLengthCounterProps,\n} from \"../../types\";\nimport FieldLabel, { FieldLabelProps } from \"../FieldLabel\";\nimport { Helper, HelperProps } from \"../../internal/components\";\nimport { warnDeprecatedErrorUsage } from \"../FieldMessage\";\nimport cx from \"classnames\";\nimport styles from \"./Textarea.module.scss\";\nimport {\n useLayoutPropsUtil,\n useOptionallyControlledState,\n} from \"../../internal/hooks\";\nimport { TextareaAutosizeConditionalProps, TextareaState } from \"./types\";\nimport TextareaAutosize from \"react-textarea-autosize\";\nimport {\n childrenToString,\n stripInlineMarkdown,\n warnOnce,\n} from \"../../internal/functions\";\n\n/**\n * Props for the Textarea component\n */\nexport type TextareaProps = Omit<\n ComponentPropsWithoutRef<\"textarea\">,\n \"onChange\"\n> &\n LayoutUtilProps &\n DataTrackingId &\n MaxLengthCounterProps &\n TextareaAutosizeConditionalProps &\n Pick<FieldLabelProps, \"moreInfo\"> & {\n /**\n * Error state for the field. Pass `true` to indicate error styling without a message.\n * Pass a string, string[], or ReactElement (deprecated) for error messages.\n */\n error?: boolean | string | ReactElement | string[];\n /**\n * Hint text displayed below the textarea\n */\n hint?: ReactElement | string;\n /**\n * Description text displayed below the textarea\n */\n description?: ReactElement | string;\n\n // TODO(v4.0.0): make label required and type string\n /**\n * Label for the textarea.\n * Omitting `label` is deprecated — it will be required in v4.0.0. Use `hideLabel` to visually hide it.\n * Passing `ReactNode` is deprecated — use a plain string with inline markdown instead.\n */\n label?: string | ReactElement;\n /**\n * When `true`, hides the visible label and moves it to `aria-label` on the textarea.\n * Requires `label` to be set — the label is always needed for accessibility.\n * @default false\n */\n hideLabel?: boolean;\n\n /**\n * Sets textarea's element no user-controllable method for resizing\n * @default false\n */\n disableResize?: boolean;\n\n /**\n * Fires on each change of textarea's value\n * @param e The change event\n * @param state Object containing the current value\n */\n onChange?: (\n e: ChangeEvent<HTMLTextAreaElement>,\n state?: TextareaState,\n ) => void;\n\n /**\n * Props passed to the internal label component.\n */\n labelProps?: FieldLabelProps;\n } & {\n /**\n * @deprecated No longer used. Error messages always use `aria-live=\"assertive\"`.\n */\n errorAriaLive?: HelperProps[\"errorAriaLive\"];\n /**\n * Warning message(s) to display. Supports a single string or an array of strings.\n */\n warning?: string | string[];\n };\n\n/**\n * Textarea component for multi-line free-form text input — a text area box for writing longer text such as paragraphs, comments, notes, messages, or descriptions.\n *\n * Features:\n * - Character counter with maxLength validation\n * - Auto-height adjustment based on content\n * - Error state handling with custom error messages\n * - Hint and description text support\n * - Disable resize functionality\n * - Accessible with proper ARIA attributes\n * - Label association and required field support\n * - Focus and blur event handling\n * - Supports layout utilities for positioning and spacing\n * - SSR-safe auto-height implementation\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Textarea\n * label=\"Description\"\n * placeholder=\"Enter your description here\"\n * onChange={(e, state) => console.log('Value:', state?.value)}\n * />\n *\n * @example\n * <Textarea\n * label=\"Bio\"\n * showCounter\n * maxLength={500}\n * hint=\"Tell us about yourself\"\n * />\n */\nexport const Textarea = forwardRef(\n (props: TextareaProps, ref: Ref<HTMLTextAreaElement>) => {\n const { aiMark, ...labelPropsWithoutAiMark } = props.labelProps || {};\n\n const data = {\n label: childrenToString(props.label),\n labelProps: labelPropsWithoutAiMark,\n prefix: childrenToString(props.prefix),\n hint: childrenToString(props.hint),\n description: childrenToString(props.description),\n };\n\n const trackingId = useTrackingId({\n name: \"Textarea\",\n data,\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const {\n value: valueProp,\n defaultValue: defaultValueProp,\n className,\n disableResize,\n error,\n errorAriaLive: _errorAriaLive,\n hint,\n description,\n label,\n moreInfo,\n onChange,\n required,\n showCounter,\n onFocus,\n onBlur,\n id: idProp,\n maxLength,\n autoHeight,\n minRows,\n maxRows,\n labelProps,\n placeholder,\n warning,\n style,\n hideLabel = false,\n ...rest\n } = componentProps;\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [isTyping, setIsTyping] = useState(false);\n const [ssr, setSSR] = useState(true);\n\n // Use the optionally controlled state for value\n const [value, setValue] = useOptionallyControlledState<typeof valueProp>({\n controlledValue: valueProp,\n defaultValue: defaultValueProp,\n });\n\n const length = useMemo(() => {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n Array.isArray(value)\n ) {\n return String(value).length;\n }\n return 0;\n }, [value]);\n\n useEffect(() => {\n setSSR(false);\n }, []);\n\n const onChangeHandler: ChangeEventHandler<HTMLTextAreaElement> = (e) => {\n setValue(e.target.value);\n onChange?.(e, { value: e.target.value });\n if (!isTyping) {\n setIsTyping(true);\n }\n };\n\n const blurHandler: FocusEventHandler<HTMLTextAreaElement> = (e) => {\n onBlur?.(e);\n if (isTyping) {\n setIsTyping(false);\n }\n };\n\n const labelUid = useId();\n const id = idProp ?? labelUid;\n\n const helperUid = useId();\n const moreInfoUid = useId();\n\n warnDeprecatedErrorUsage(\"Textarea\", error);\n\n // TODO(v4.0.0): remove once label is required string\n if (label === undefined) {\n warnOnce(\n \"Textarea: label will be required in v4.0.0. Use hideLabel to visually hide the label.\",\n );\n } else if (typeof label !== \"string\") {\n warnOnce(\n \"Textarea: Passing ReactNode to label is deprecated. Use a plain string with inline markdown instead.\",\n );\n }\n\n const errorMessages =\n typeof error === \"boolean\" || error === undefined ? undefined : error;\n\n const hasHelperText =\n hint || showCounter || errorMessages || warning || description;\n\n const ariaDescribedBy =\n [hasHelperText && helperUid, moreInfo && moreInfoUid]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const textareaClassNames = cx([styles[\"textarea\"]], className, {\n [styles[\"error\"]]: error,\n [styles[\"disable-resize\"]]: disableResize,\n [styles[\"disabled\"]]: rest.disabled,\n [styles[\"readonly\"]]: rest.readOnly,\n [styles[\"has-cols\"]]: rest.cols != null,\n });\n\n const styleCombined = { ...style, ...layoutStyles };\n\n const shouldUseAutosize = autoHeight && !ssr;\n\n const TextareaComponent = shouldUseAutosize ? TextareaAutosize : \"textarea\";\n\n return (\n <div\n className={textareaClassNames}\n data-anv=\"textarea\"\n style={styleCombined}\n >\n {/* TODO(v4.0.0): simplify to !hideLabel once label is required */}\n {label && !hideLabel && (\n <FieldLabel\n htmlFor={id}\n moreInfo={moreInfo}\n moreInfoId={moreInfo ? moreInfoUid : undefined}\n required={required}\n {...labelProps}\n >\n {label}\n </FieldLabel>\n )}\n\n <TextareaComponent\n rows={3}\n onChange={onChangeHandler}\n onFocus={onFocus}\n onBlur={blurHandler}\n ref={useMergeRefs([ref, textareaRef])}\n required={required}\n maxLength={maxLength}\n id={id}\n placeholder={placeholder}\n value={value ?? \"\"}\n data-tracking-id={trackingId}\n {...rest}\n {...(shouldUseAutosize ? { minRows, maxRows } : {})}\n aria-label={\n // TODO(v4.0.0): remove typeof check — label will always be string\n hideLabel && typeof label === \"string\"\n ? stripInlineMarkdown(label)\n : label\n ? undefined\n : placeholder\n }\n aria-describedby={ariaDescribedBy}\n aria-invalid={error ? !!error : undefined}\n className={styles[\"input\"]}\n />\n {hasHelperText ? (\n <Helper\n id={helperUid}\n hint={hint}\n maxLength={maxLength}\n inputLength={length}\n isTyping={isTyping}\n showCounter={showCounter}\n error={\n typeof errorMessages === \"string\" || Array.isArray(errorMessages)\n ? errorMessages\n : undefined\n }\n warning={warning}\n errorMessage={\n isValidElement(errorMessages) ? errorMessages : undefined\n }\n description={description}\n />\n ) : null}\n </div>\n );\n },\n);\nTextarea.displayName = \"Textarea\";\n"],"names":["index","React","useIsomorphicLayoutEffect","TextareaAutosize"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TimeField-JA3gXyS7.js","sources":["../src/internal/hooks/usePopoverCloseDelayWorkaround/usePopoverCloseDelayWorkaround.ts","../../hammer-icon/mdi/round/access_time.svg","../src/components/TimeField/internal/constants.ts","../src/components/TimeField/internal/utils/timeFormatting.ts","../src/components/TimeField/internal/utils/timeParsing.ts","../src/components/TimeField/internal/utils/timeOptions.ts","../src/components/TimeField/internal/utils/timeValidation.ts","../src/components/TimeField/internal/utils/timeRounding.ts","../src/components/TimeField/internal/maskito/timePlaceholderMask.ts","../src/components/TimeField/internal/MaskedTimeInput.tsx","../src/components/TimeField/TimeField.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n// The Popover continues to render Popover.Content for X milliseconds after the popover is closed.\n// To prevent the popover content from appearing empty, we need to continue to show it inside Popover.Content for X milliseconds.\n// This is just a hack until we have a `onCloseAnimationEnd` prop on Popover.\nexport const usePopoverCloseDelayWorkaround = (\n popoverOpen: boolean,\n delay: number = 300,\n) => {\n const [shouldShowContent, setShouldShowContent] = useState(popoverOpen);\n\n useEffect(() => {\n if (!popoverOpen) {\n const timeout = setTimeout(() => {\n setShouldShowContent(false);\n }, delay);\n return () => clearTimeout(timeout);\n }\n setShouldShowContent(true);\n }, [popoverOpen, delay]);\n\n return shouldShowContent;\n};\n","import * as React from \"react\";\nconst SvgAccessTime = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: \"1em\", height: \"1em\", viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm-.22-13h-.06c-.4 0-.72.32-.72.72v4.72c0 .35.18.68.49.86l4.15 2.49c.34.2.78.1.98-.24a.71.71 0 0 0-.25-.99l-3.87-2.3V7.72c0-.4-.32-.72-.72-.72z\" }));\nexport default SvgAccessTime;\n","import { TimeFormat } from \"./types\";\nimport IconAccessTime from \"@servicetitan/hammer-icon/mdi/round/access_time.svg\";\n\n// Time Constants\nexport const TIME_CONSTANTS = {\n /** Minutes in a full day (24 hours * 60 minutes) */\n MINUTES_IN_DAY: 1440,\n /** Maximum hour in 24-hour format */\n MAX_HOUR_24: 23,\n /** Maximum minute value */\n MAX_MINUTE: 59,\n /** Timeout in milliseconds for input debouncing */\n INPUT_DEBOUNCE_TIMEOUT: 100,\n} as const;\n\n// Format Constants\nexport const FORMAT_CONSTANTS = {\n /** 12-hour time format */\n TWELVE_HOUR: 12 as const,\n /** 24-hour time format */\n TWENTY_FOUR_HOUR: 24 as const,\n} as const;\n\n/**\n * Placeholder strings for different time formats.\n */\nexport const TIME_FORMAT_PLACEHOLDERS: Record<TimeFormat, string> = {\n 12: \"––:–– ––\",\n 24: \"––:––\",\n};\n\n/**\n * Clock icon used as prefix in the time input field.\n */\nexport const CLOCK_ICON = IconAccessTime;\n","import { TimeFormat } from \"../types\";\n\n/**\n * Converts hours and minutes to a formatted time string.\n *\n * @param hours - Hours (0-23)\n * @param minutes - Minutes (0-59)\n * @param format - Target format (12 or 24 hour)\n * @returns Formatted time string\n */\nexport function formatTimeString(\n hours: number,\n minutes: number,\n format: TimeFormat,\n): string {\n // Handle 24:00 edge case\n if (hours === 24) {\n hours = 0; // Convert 24:00 to 00:00\n }\n\n if (format === 12) {\n // Convert to 12-hour format\n let displayHours = hours;\n let period = \"AM\";\n\n if (hours === 0) {\n displayHours = 12;\n } else if (hours > 12) {\n displayHours = hours - 12;\n period = \"PM\";\n } else if (hours === 12) {\n period = \"PM\";\n }\n\n return `${displayHours.toString().padStart(2, \"0\")}:${minutes.toString().padStart(2, \"0\")} ${period}`;\n } else {\n // 24-hour format\n return `${hours.toString().padStart(2, \"0\")}:${minutes.toString().padStart(2, \"0\")}`;\n }\n}\n","import { TimeFormat } from \"../types\";\nimport { formatTimeString } from \"./timeFormatting\";\nimport { TIME_CONSTANTS } from \"../constants\";\n\n/**\n * Maximum hour value for 24-hour format.\n */\nexport const MAX_HOUR = TIME_CONSTANTS.MAX_HOUR_24;\n\n/**\n * Maximum minute value.\n */\nexport const MAX_MINUTE = TIME_CONSTANTS.MAX_MINUTE;\n\n/**\n * Converts constraint times to normalized minutes for comparison.\n * Helper to eliminate duplicate constraint conversion logic.\n *\n * @param min - Minimum time constraint\n * @param max - Maximum time constraint\n * @returns Object with minMinutes and maxMinutes for constraint checking\n */\nfunction getConstraintMinutes(min?: string, max?: string) {\n const minMinutes = min ? timeToMinutes(convertTimeFormat(min, 24)) : 0;\n const maxMinutes = max\n ? timeToMinutes(convertTimeFormat(max, 24))\n : TIME_CONSTANTS.MINUTES_IN_DAY;\n return { minMinutes, maxMinutes };\n}\n\n/**\n * Checks if time in minutes falls within the given constraints.\n *\n * @param timeMinutes - Time to check in minutes since midnight\n * @param minMinutes - Minimum allowed time in minutes\n * @param maxMinutes - Maximum allowed time in minutes\n * @returns True if time is within constraints\n */\nfunction isWithinConstraints(\n timeMinutes: number,\n minMinutes: number,\n maxMinutes: number,\n): boolean {\n return timeMinutes >= minMinutes && timeMinutes <= maxMinutes;\n}\n\n/**\n * Converts a time string to total minutes since midnight.\n *\n * @param timeStr - Time string in HH:mm format (24-hour)\n * @returns Total minutes since midnight\n */\nexport const timeToMinutes = (timeStr: string): number => {\n const match = timeStr.match(/^(\\d{1,2}):(\\d{2})(?:\\s*(AM|PM))?$/i);\n if (!match) return 0;\n\n let hours = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const period = match[3]?.toUpperCase();\n\n // Validate minutes range\n if (minutes > MAX_MINUTE) return 0;\n\n if (period === \"PM\" && hours !== 12) {\n hours += 12;\n } else if (period === \"AM\" && hours === 12) {\n hours = 0;\n }\n\n // Validate final hours range (0-23)\n if (hours > MAX_HOUR) return 0;\n\n return hours * 60 + minutes;\n};\n\n/**\n * Converts a time string between 12-hour and 24-hour formats.\n *\n * @param time - Time string to convert\n * @param targetFormat - Target format (12 or 24)\n * @returns Converted time string\n */\nexport function convertTimeFormat(\n time: string,\n targetFormat: TimeFormat,\n): string {\n if (!time) return time;\n\n const minutes = timeToMinutes(time);\n\n // If timeToMinutes returns 0, it means the input couldn't be parsed as a valid time\n // Return the original string as the JSDoc comment promises\n if (minutes === 0 && time !== \"00:00\" && time !== \"12:00 AM\") {\n return time;\n }\n\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n\n return formatTimeString(hours, mins, targetFormat);\n}\n\n/**\n * Normalizes partial time input by adding missing components.\n *\n * @param value - Raw input value\n * @returns Normalized time string\n */\nfunction normalizePartialInput(value: string): string {\n // Remove placeholder characters first (including en dashes)\n const cleanValue = value.replace(/[–_:]/g, \"\").replace(/\\s+/g, \"\");\n\n if (/^\\d{1,2}$/.test(cleanValue)) {\n // Single or double digit hours, add \":00\"\n const result = `${cleanValue}:00`;\n return result;\n } else if (/^\\d{1,2}:\\d{1}$/.test(cleanValue)) {\n // Hours and single digit minutes, add \"0\"\n const result = `${cleanValue}0`;\n return result;\n } else if (/^\\d{4}$/.test(cleanValue)) {\n // Four digits, insert colon after first two\n const result = `${cleanValue.slice(0, 2)}:${cleanValue.slice(2)}`;\n return result;\n } else if (/^\\d{4}(AM|PM)$/i.test(cleanValue)) {\n // Four digits followed by AM/PM, insert colon after first two\n const digits = cleanValue.slice(0, 4);\n const ampm = cleanValue.slice(4);\n const result = `${digits.slice(0, 2)}:${digits.slice(2)} ${ampm}`;\n return result;\n }\n\n return value;\n}\n\n/**\n * Parses 12-hour format time input.\n *\n * @param normalizedValue - Normalized input value\n * @param min - Minimum allowed time constraint\n * @param max - Maximum allowed time constraint\n * @returns Parsed time components or null if invalid\n */\nfunction parse12HourFormat(\n normalizedValue: string,\n min?: string,\n max?: string,\n): { hours: number; minutes: number } | null {\n const match = normalizedValue.match(/^(\\d{1,2}):(\\d{1,2})(?:\\s*(AM|PM))?$/i);\n if (!match) return null;\n\n let hours = parseInt(match[1], 10);\n let minutes = parseInt(match[2], 10);\n const ampm = match[3]?.toUpperCase();\n\n // Handle partial minute input (e.g., \"10:5\" should be \"10:50\")\n if (minutes < 10 && normalizedValue.match(/^(\\d{1,2}):(\\d{1})$/)) {\n minutes *= 10;\n }\n\n // Handle AM/PM conversion to 24-hour format\n if (ampm === \"PM\") {\n if (hours !== 12) {\n hours += 12; // Convert to 24-hour (1 PM = 13:00, 2 PM = 14:00, etc.)\n }\n // 12 PM stays as 12:00\n } else if (ampm === \"AM\") {\n if (hours === 12) {\n hours = 0; // 12 AM = 00:00\n }\n // All other AM times stay as-is\n } else {\n // No AM/PM specified - need to choose between AM and PM\n if (hours === 12) {\n hours = 12; // 12:00 = 12 PM\n } else {\n // For hours 1-11, check constraints to decide AM vs PM\n if (min || max) {\n // Check which interpretation (AM or PM) is valid within constraints\n const amHours = hours;\n const pmHours = hours + 12;\n\n const { minMinutes, maxMinutes } = getConstraintMinutes(min, max);\n\n const amMinutes = amHours * 60 + minutes;\n const pmMinutes = pmHours * 60 + minutes;\n\n const amValid = isWithinConstraints(amMinutes, minMinutes, maxMinutes);\n const pmValid = isWithinConstraints(pmMinutes, minMinutes, maxMinutes);\n\n if (amValid && pmValid) {\n // Both are valid, prefer AM (original behavior)\n // hours stays as-is (AM)\n } else if (pmValid) {\n // Only PM is valid, use PM\n hours = pmHours;\n } else if (amValid) {\n // Only AM is valid, use AM\n // hours stays as-is (AM)\n } else {\n // Neither is valid - this should be caught by constraint validation later\n // hours stays as-is (AM) for now\n }\n }\n // If no constraints, assume AM (original behavior)\n }\n }\n\n return { hours, minutes };\n}\n\n/**\n * Parses 24-hour format time input.\n *\n * @param normalizedValue - Normalized input value\n * @returns Parsed time components or null if invalid\n */\nfunction parse24HourFormat(\n normalizedValue: string,\n): { hours: number; minutes: number } | null {\n const match = normalizedValue.match(/^(\\d{1,2}):(\\d{1,2})$/);\n\n if (!match) {\n return null;\n }\n\n const hours = parseInt(match[1], 10);\n let minutes = parseInt(match[2], 10);\n\n // Handle partial minute input (e.g., \"10:5\" should be \"10:50\")\n if (minutes < 10 && normalizedValue.match(/^(\\d{1,2}):(\\d{1})$/)) {\n minutes *= 10;\n }\n\n const result = { hours, minutes };\n return result;\n}\n\n/**\n * Validates time constraints for 12-hour format with partial inputs.\n *\n * @param timeString - Formatted time string\n * @param value - Original input value\n * @param min - Minimum allowed time\n * @param max - Maximum allowed time\n * @returns True if time is within constraints\n */\nfunction validate12HourConstraints(\n timeString: string,\n value: string,\n min?: string,\n max?: string,\n): boolean {\n if (!min && !max) return true;\n\n // Check if the original input had AM/PM specified\n const originalHasAMPM =\n value.toUpperCase().includes(\"AM\") || value.toUpperCase().includes(\"PM\");\n\n if (!originalHasAMPM) {\n // This is a partial input without AM/PM - check if either AM or PM interpretation would be valid\n // Extract just the time part (HH:MM) without AM/PM\n const timePart = timeString.replace(/\\s*(AM|PM)$/i, \"\");\n const amTime = `${timePart} AM`;\n const pmTime = `${timePart} PM`;\n\n const amMinutes = timeToMinutes(convertTimeFormat(amTime, 24));\n const pmMinutes = timeToMinutes(convertTimeFormat(pmTime, 24));\n\n const { minMinutes, maxMinutes } = getConstraintMinutes(min, max);\n\n // If either AM or PM interpretation is valid, allow the input\n return (\n isWithinConstraints(amMinutes, minMinutes, maxMinutes) ||\n isWithinConstraints(pmMinutes, minMinutes, maxMinutes)\n );\n } else {\n // AM/PM is specified, check the specific time\n const timeMinutes = timeToMinutes(convertTimeFormat(timeString, 24));\n const { minMinutes, maxMinutes } = getConstraintMinutes(min, max);\n\n return isWithinConstraints(timeMinutes, minMinutes, maxMinutes);\n }\n}\n\n/**\n * Validates time constraints for 24-hour format.\n *\n * @param timeString - Formatted time string\n * @param min - Minimum allowed time\n * @param max - Maximum allowed time\n * @returns True if time is within constraints\n */\nfunction validate24HourConstraints(\n timeString: string,\n min?: string,\n max?: string,\n): boolean {\n if (!min && !max) return true;\n\n const timeMinutes = timeToMinutes(timeString);\n const { minMinutes, maxMinutes } = getConstraintMinutes(min, max);\n\n // Check if the exact time is valid\n if (isWithinConstraints(timeMinutes, minMinutes, maxMinutes)) {\n return true;\n }\n\n // Handle partial inputs - check if this time could potentially be valid\n // For example, if someone types \"1:00\" but constraints are 09:00-17:00,\n // we should allow it because they might be typing \"14:00\"\n const hours = Math.floor(timeMinutes / 60);\n const minutes = timeMinutes % 60;\n\n // If this is a partial hour (like \"1:00\"), check if any hour in the valid range\n // could potentially match this pattern\n if (minutes === 0) {\n // Check if any hour in the valid range could start with this digit\n for (let h = minMinutes; h <= maxMinutes; h += 60) {\n const potentialHour = Math.floor(h / 60);\n if (potentialHour.toString().startsWith(hours.toString())) {\n return true;\n }\n }\n }\n\n // If this is a partial minute (like \"14:3\"), check if any minute in the valid range\n // could potentially match this pattern\n if (\n hours >= Math.floor(minMinutes / 60) &&\n hours <= Math.floor(maxMinutes / 60)\n ) {\n const hourMinutes = hours * 60;\n const hourMinMinutes = Math.max(minMinutes, hourMinutes);\n const hourMaxMinutes = Math.min(maxMinutes, hourMinutes + 59);\n\n for (let m = hourMinMinutes; m <= hourMaxMinutes; m++) {\n const potentialMinutes = m % 60;\n if (potentialMinutes.toString().startsWith(minutes.toString())) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Parses input value and converts it to a time string with validation.\n *\n * @param value - The raw input value (may contain placeholders)\n * @param format - The time format (12 or 24 hour)\n * @param removePlaceholder - Function to remove placeholder characters\n * @param min - Minimum allowed time constraint\n * @param max - Maximum allowed time constraint\n * @returns Object containing parsed time string, validation state, and empty state\n */\nexport function parseInputValue(\n value: string,\n format: TimeFormat,\n removePlaceholder: (value: string) => string,\n min?: string,\n max?: string,\n) {\n const valueMinusPlaceholder = removePlaceholder(value);\n\n if (valueMinusPlaceholder === \"\") {\n return {\n time: null,\n isInputValid: false,\n isInputEmpty: true,\n };\n }\n\n // Normalize partial inputs\n const normalizedValue = normalizePartialInput(valueMinusPlaceholder);\n\n // Parse based on format\n const parsed =\n format === 12\n ? parse12HourFormat(normalizedValue, min, max)\n : parse24HourFormat(normalizedValue);\n\n if (!parsed) {\n return {\n time: null,\n isInputValid: false,\n isInputEmpty: false,\n };\n }\n\n const { hours, minutes } = parsed;\n\n // Validate hours and minutes\n if (hours < 0 || hours > MAX_HOUR || minutes < 0 || minutes > MAX_MINUTE) {\n return {\n time: null,\n isInputValid: false,\n isInputEmpty: false,\n };\n }\n\n // Convert to formatted string\n const timeString = formatTimeString(hours, minutes, format);\n\n // Validate constraints\n const isValid =\n format === 12\n ? validate12HourConstraints(timeString, value, min, max)\n : validate24HourConstraints(timeString, min, max);\n\n if (!isValid) {\n return {\n time: null,\n isInputValid: false,\n isInputEmpty: false,\n };\n }\n\n return {\n time: timeString,\n isInputValid: true,\n isInputEmpty: false,\n };\n}\n","import { TimeFormat } from \"../types\";\nimport { timeToMinutes } from \"./timeParsing\";\nimport { formatTimeString } from \"./timeFormatting\";\nimport { TIME_CONSTANTS, TIME_FORMAT_PLACEHOLDERS } from \"../constants\";\n\n/**\n * Generates time options for the dropdown based on step, min/max constraints, and format.\n *\n * @param step - Time increment in minutes (default 30)\n * @param min - Minimum allowed time as string\n * @param max - Maximum allowed time as string\n * @param format - Time format (12 or 24 hour)\n * @returns Array of time options formatted as strings\n */\nexport function generateTimeOptions({\n step = 30,\n min,\n max,\n format,\n}: {\n step?: number;\n min?: string;\n max?: string;\n format: TimeFormat;\n}): string[] {\n const options: string[] = [];\n\n const minMinutes = min ? timeToMinutes(min) : 0;\n const maxMinutes = max\n ? timeToMinutes(max)\n : TIME_CONSTANTS.MINUTES_IN_DAY - 1;\n\n // Generate options at step intervals\n for (\n let minutes = 0;\n minutes < TIME_CONSTANTS.MINUTES_IN_DAY;\n minutes += step\n ) {\n // Skip if outside min/max range\n if (minutes < minMinutes || minutes > maxMinutes) {\n continue;\n }\n\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n\n options.push(formatTimeString(hours, mins, format));\n }\n\n return options;\n}\n\n/**\n * Normalizes a time string by removing special characters and converting to lowercase.\n * Used for fuzzy matching in dropdown filtering.\n *\n * @param str - The time string to normalize\n * @returns Normalized string for comparison\n */\nfunction normalizeTimeString(str: string): string {\n return str\n .replace(/[–_:]/g, \"\") // Remove en dashes, underscores, and colons\n .replace(/\\s+/g, \"\") // Remove spaces\n .toLowerCase();\n}\n\n/**\n * Filters time options based on user input.\n *\n * @param options - Array of available time options\n * @param userInput - The current user input (after Maskito processing)\n * @returns Filtered array of matching options\n */\nexport function filterTimeOptions(\n options: string[],\n userInput: string,\n): string[] {\n if (\n !userInput ||\n userInput === TIME_FORMAT_PLACEHOLDERS[12] ||\n userInput === TIME_FORMAT_PLACEHOLDERS[24]\n ) {\n return options;\n }\n\n const normalizedInput = normalizeTimeString(userInput);\n\n const filtered = options.filter((option) => {\n const normalizedOption = normalizeTimeString(option);\n return normalizedOption.startsWith(normalizedInput);\n });\n\n return filtered;\n}\n","import { timeToMinutes } from \"./timeParsing\";\nimport { TimeFormat } from \"../types\";\n\n/**\n * Checks if a time aligns with a given step interval.\n *\n * @param time - The time to check\n * @param step - The step increment in minutes\n * @returns True if the time aligns with the step\n */\nexport function isTimeOnStep(time: string, step: number): boolean {\n if (!step || step <= 0) return true;\n\n const totalMinutes = timeToMinutes(time);\n return totalMinutes % step === 0;\n}\n\n/**\n * Checks if a time is valid (exists and can be parsed).\n *\n * @param time - The time to check\n * @returns True if the time is valid\n */\nexport function isValidTime(time: string | null): boolean {\n if (!time) return false;\n return timeToMinutes(time) > 0 || time === \"00:00\";\n}\n\n/**\n * Checks if a partial input might become valid as the user continues typing.\n * For example, \"1\" in a 10-11 AM range could become \"10:00 AM\" or \"11:00 AM\".\n * Or \"2\" in a 20:00-23:00 range could become \"20:00\", \"21:00\", etc.\n *\n * @param inputValue - The current input value (may include mask characters)\n * @param format - The time format (12 or 24 hour)\n * @param min - Minimum allowed time constraint\n * @param max - Maximum allowed time constraint\n * @returns True if the partial input could potentially become valid\n */\nexport function isPartialInputPotentiallyValid(\n inputValue: string,\n format: TimeFormat,\n min?: string,\n max?: string,\n): boolean {\n // Must have both constraints or neither\n if (!min || !max) return false;\n\n // Extract just the digits from the input\n const digits = inputValue.replace(/[^\\d]/g, \"\");\n\n // Only handle single digit case - check if it could start a valid hour\n if (digits.length === 1) {\n const digit = parseInt(digits, 10);\n\n // Convert constraints to minutes for easier comparison\n const minMinutes = timeToMinutes(min);\n const maxMinutes = timeToMinutes(max);\n\n // Check all possible hours this digit could represent\n for (let h = 0; h <= 23; h++) {\n // Check if this hour starts with our digit (check both padded and unpadded)\n const hourStr = h.toString().padStart(2, \"0\");\n const hourStrNoPad = h.toString();\n\n const startsWithDigit =\n hourStr.startsWith(digit.toString()) ||\n hourStrNoPad.startsWith(digit.toString());\n\n if (!startsWithDigit) continue;\n\n if (format === 24) {\n // 24-hour format - simple check\n const hourMinutes = h * 60;\n if (hourMinutes >= minMinutes && hourMinutes <= maxMinutes) {\n return true;\n }\n } else {\n // 12-hour format - check both AM and PM versions\n if (h === 0) {\n // Hour 0 = 12 AM (midnight)\n if (digit === 1) {\n // \"1\" could be \"12 AM\"\n const midnightMinutes = 0;\n if (\n midnightMinutes >= minMinutes &&\n midnightMinutes <= maxMinutes\n ) {\n return true;\n }\n }\n } else if (h >= 1 && h <= 12) {\n // Hours 1-12: check both AM and PM\n\n // AM version\n const amHour24 = h === 12 ? 0 : h; // 12 AM = hour 0, others stay same\n const amMinutes = amHour24 * 60;\n if (amMinutes >= minMinutes && amMinutes <= maxMinutes) {\n return true;\n }\n\n // PM version\n const pmHour24 = h === 12 ? 12 : h + 12; // 12 PM = hour 12, others add 12\n const pmMinutes = pmHour24 * 60;\n if (pmMinutes >= minMinutes && pmMinutes <= maxMinutes) {\n return true;\n }\n }\n }\n }\n }\n\n return false;\n}\n","import { TimeFormat } from \"../types\";\nimport { timeToMinutes } from \"./timeParsing\";\nimport { isTimeOnStep, isValidTime } from \"./timeValidation\";\nimport { formatTimeString } from \"./timeFormatting\";\n\n/**\n * Options for auto-rounding functionality.\n */\nexport interface AutoRoundingOptions {\n /** Whether auto-rounding is enabled. */\n autoround: boolean;\n /** Time increment in minutes. */\n step?: number;\n /** Time format (12 or 24 hour). */\n format: TimeFormat;\n}\n\n/**\n * Gets the next future step for a given time based on the step increment.\n *\n * @param time - The current time string\n * @param step - The step increment in minutes\n * @param format - The time format (12 or 24 hour)\n * @returns The next step time string\n */\nexport function getNextFutureStep(\n time: string,\n step: number,\n format: TimeFormat,\n): string {\n if (!step || step <= 0) return time;\n\n // Convert time string to minutes\n const totalMinutes = timeToMinutes(time);\n\n // Find the next step that's AFTER the current time\n const nextStep = Math.ceil(totalMinutes / step) * step;\n\n // Convert back to string format\n const hours = Math.floor(nextStep / 60);\n const minutes = nextStep % 60;\n\n return formatTimeString(hours, minutes, format);\n}\n\n/**\n * Handles auto-rounding of time values based on step intervals.\n *\n * @param time - The time to potentially auto-round\n * @param options - Auto-rounding configuration options\n * @returns The rounded time or the original time if no rounding is needed\n */\nexport function handleAutoRounding(\n time: string | null,\n options: AutoRoundingOptions,\n): string | null {\n const { autoround, step, format } = options;\n\n if (!autoround || !time) return time;\n\n // Check if the time is already on a valid step\n const stepValue = step ?? 30;\n\n // If the time is already on a valid step, no rounding needed\n if (isTimeOnStep(time, stepValue)) {\n return time;\n }\n\n // Auto-round to the next step\n return getNextFutureStep(time, stepValue, format);\n}\n\n/**\n * Generates AM/PM variants for 12-hour format auto-rounding when user hasn't specified AM/PM.\n *\n * @param currentTime - The current time string\n * @param step - Step increment in minutes\n * @param inputValue - Original user input to check for AM/PM specification\n * @returns Array of time options (AM only, PM only, or both)\n */\nexport function generateAmPmVariants(\n currentTime: string,\n step: number,\n inputValue: string,\n): string[] {\n const hasAM = inputValue.toUpperCase().includes(\"AM\");\n const hasPM = inputValue.toUpperCase().includes(\"PM\");\n\n // Helper function to get next step for a given time\n const getNextStepForTime = (time: string) => {\n const currentMinutes = timeToMinutes(time);\n const nextStepMinutes = Math.ceil(currentMinutes / step) * step;\n const finalMinutes =\n nextStepMinutes === currentMinutes\n ? nextStepMinutes + step\n : nextStepMinutes;\n\n const hours = Math.floor(finalMinutes / 60);\n const minutes = finalMinutes % 60;\n return formatTimeString(hours, minutes, 12);\n };\n\n const nextStep = getNextFutureStep(currentTime, step, 12);\n\n // If user specified AM or PM, only show options in that period\n if (hasAM || hasPM) {\n return [nextStep];\n } else {\n // User didn't specify AM/PM, show both options\n // For PM version, add 12 hours to the current time\n const currentMinutes = timeToMinutes(currentTime);\n const pmMinutes = currentMinutes + 12 * 60;\n const pmHours = Math.floor(pmMinutes / 60);\n const pmMins = pmMinutes % 60;\n const pmVersion = getNextStepForTime(formatTimeString(pmHours, pmMins, 24));\n return [nextStep, pmVersion]; // Both AM and PM\n }\n}\n\n/**\n * Tries to generate PM interpretation options for ambiguous input.\n *\n * @param currentTime - The current time string\n * @param step - Step increment in minutes\n * @param inputValue - Original user input\n * @returns Array of PM time options or empty array\n */\nexport function generatePmInterpretation(\n currentTime: string,\n step: number,\n inputValue: string,\n): string[] {\n // Only try PM interpretation if no AM/PM was specified\n if (\n inputValue.toUpperCase().includes(\"AM\") ||\n inputValue.toUpperCase().includes(\"PM\")\n ) {\n return [];\n }\n\n // Try PM version of the current time\n const currentMinutes = timeToMinutes(currentTime);\n const pmMinutes = currentMinutes + 12 * 60;\n const pmHours = Math.floor(pmMinutes / 60);\n const pmMins = pmMinutes % 60;\n const pmTime = formatTimeString(pmHours, pmMins, 12);\n\n // Check if the PM time is valid\n if (isValidTime(pmTime)) {\n const pmNextStep = getNextFutureStep(pmTime, step, 12);\n return [pmNextStep];\n }\n\n return [];\n}\n\n/**\n * Gets auto-rounding options for dropdown suggestions when no matches are found.\n *\n * @param currentTime - The current parsed time\n * @param step - Step increment in minutes\n * @param format - Time format (12 or 24 hour)\n * @param inputValue - Original user input\n * @param min - Minimum time constraint\n * @returns Array of auto-rounded time options\n */\nexport function getAutoRoundingOptions(\n currentTime: string | null,\n step: number,\n format: TimeFormat,\n inputValue: string,\n min?: string,\n): string[] {\n if (!currentTime) {\n return [];\n }\n\n // Only add next future step if the current time is valid\n if (!isValidTime(currentTime)) {\n // For 12-hour format, try PM interpretation\n if (format === 12) {\n return generatePmInterpretation(currentTime, step, inputValue);\n }\n return [];\n }\n\n const nextStep = getNextFutureStep(currentTime, step, format);\n\n // For 12-hour format without time range, show AM/PM variants\n if (format === 12 && !min) {\n return generateAmPmVariants(currentTime, step, inputValue);\n }\n\n return [nextStep];\n}\n","import type { MaskitoOptions } from \"@maskito/core\";\nimport {\n maskitoTimeOptionsGenerator,\n maskitoWithPlaceholder,\n} from \"@maskito/kit\";\nimport { TimeFormat } from \"../types\";\n\n/**\n * Creates Maskito options for time input with placeholder support.\n *\n * Features:\n * - Time-specific masking for 12/24 hour formats\n * - Placeholder character support\n * - Filtered preprocessors to avoid conflicts\n * - Combined plugins and postprocessors\n *\n * @param format - The time format (12 or 24 hour)\n * @param placeholder - The placeholder string to use\n * @returns Object containing Maskito options and removePlaceholder function\n */\nconst timePlaceholderMask = ({\n format,\n placeholder,\n}: {\n format: TimeFormat;\n placeholder: string;\n}) => {\n // Use Maskito Time Kit for time-specific options\n const timeOptions = maskitoTimeOptionsGenerator({\n mode: format === 12 ? \"HH:MM AA\" : \"HH:MM\",\n step: 0, // We handle step logic in your business layer\n });\n\n const { plugins, removePlaceholder, ...placeholderOptions } =\n maskitoWithPlaceholder(placeholder);\n\n const timePlaceholderMask = {\n ...timeOptions,\n plugins: plugins.concat(timeOptions.plugins || []),\n preprocessors: [\n ...placeholderOptions.preprocessors,\n ...timeOptions.preprocessors,\n ],\n postprocessors: [\n ...timeOptions.postprocessors,\n ...placeholderOptions.postprocessors,\n ],\n } satisfies Required<MaskitoOptions>;\n\n return { options: timePlaceholderMask, removePlaceholder };\n};\n\nexport default timePlaceholderMask;\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { TimeFormat } from \"./types\";\nimport timePlaceholderMask from \"./maskito/timePlaceholderMask\";\nimport { useMaskito } from \"@maskito/react\";\nimport { useMergeRefs } from \"../../../hooks\";\nimport {\n CLOCK_ICON,\n TIME_CONSTANTS,\n TIME_FORMAT_PLACEHOLDERS,\n} from \"./constants\";\nimport { Icon } from \"../../Icon\";\nimport { convertTimeFormat, parseInputValue } from \"./utils/timeParsing\";\nimport { isPartialInputPotentiallyValid } from \"./utils/timeValidation\";\nimport { TextField, TextFieldProps } from \"../../TextField/internal/TextField\";\n\nimport cx from \"classnames\";\nimport styles from \"../TimeField.module.scss\";\n\n/**\n * Change event data for MaskedTimeInput onInputChange callback.\n */\nexport type MaskedTimeInputChange = {\n /**\n * The original input change event.\n */\n event: React.ChangeEvent<HTMLInputElement>;\n /**\n * The parsed time as a string if valid, otherwise null.\n */\n time: string | null;\n /**\n * True if the input matches the mask and is not empty.\n */\n isInputValid: boolean;\n /**\n * True if the input is empty.\n */\n isInputEmpty: boolean;\n};\n\n/**\n * Props for the MaskedTimeInput component.\n * @extends Omit<TextFieldProps, \"onChange\" | \"value\" | \"ref\" | \"showCounter\" | \"prefix\" | \"type\" | \"maxLength\" | \"hint\">\n */\nexport interface MaskedTimeInputProps\n extends Omit<\n TextFieldProps,\n | \"onChange\"\n | \"value\"\n | \"ref\"\n | \"showCounter\"\n | \"prefix\"\n | \"type\"\n | \"maxLength\"\n | \"hint\"\n > {\n /**\n * External time selection from dropdown\n */\n selectedTime?: string | null;\n /**\n * The time format (12 or 24 hour).\n */\n format: TimeFormat;\n /**\n * The placeholder string for the input.\n */\n placeholder: string;\n /**\n * Minimum allowed time constraint.\n */\n min?: string;\n /**\n * Maximum allowed time constraint.\n */\n max?: string;\n /**\n * Callback fired when the input value changes.\n */\n onInputChange?: (change: MaskedTimeInputChange) => void;\n /**\n * Callback fired when a key is pressed.\n */\n onKeyDown?: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n /**\n * Callback fired when the input receives focus.\n */\n onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;\n /**\n * Data attribute indicating if the current input is valid.\n */\n \"data-input-valid\"?: boolean;\n}\n\n/**\n * A masked time input component for entering time in 12/24 hour format.\n *\n * Features:\n * - Input masking and placeholder using Maskito\n * - Smart validation and parsing\n * - Hard-coded clock icon prefix\n * - Controlled or uncontrolled usage\n * - Automatic time format conversion\n * - Placeholder handling and cleanup\n *\n * @example\n * <MaskedTimeInput\n * selectedTime=\"14:30\"\n * format={24}\n * placeholder=\"––:––\"\n * onInputChange={(change) => {\n * console.log('Input changed:', change.time);\n * }}\n * />\n */\nexport const MaskedTimeInput = forwardRef<\n HTMLInputElement,\n MaskedTimeInputProps\n>(\n (\n {\n selectedTime,\n format,\n placeholder,\n min,\n max,\n onInputChange,\n onKeyDown,\n onFocus,\n onBlur,\n className,\n ...props\n },\n ref,\n ) => {\n const [inputValue, setInputValue] = useState(placeholder);\n\n const { options, removePlaceholder } = timePlaceholderMask({\n format,\n placeholder,\n });\n const maskedInputRef = useMaskito({ options });\n const inputRef = useRef<HTMLInputElement>(null);\n const combinedRef = useMergeRefs([maskedInputRef, inputRef, ref]);\n const isUserTypingRef = useRef(false);\n const inputValueRef = useRef<string>(placeholder);\n const previousPlaceholderRef = useRef<string>(placeholder);\n\n // Parse current input value - following DateFields pattern\n const currentParsedData = useMemo(() => {\n return parseInputValue(inputValue, format, removePlaceholder, min, max);\n }, [inputValue, format, removePlaceholder, min, max]);\n\n // Update refs when values change\n useEffect(() => {\n inputValueRef.current = inputValue;\n }, [inputValue]);\n\n useEffect(() => {\n previousPlaceholderRef.current = placeholder;\n }, [placeholder]);\n\n // Handle external selectedTime updates (e.g., from dropdown selections)\n useEffect(() => {\n if (selectedTime !== undefined && !isUserTypingRef.current) {\n const newInputValue = selectedTime\n ? convertTimeFormat(selectedTime, format)\n : placeholder;\n\n setInputValue(newInputValue);\n inputValueRef.current = newInputValue;\n }\n }, [selectedTime, format, placeholder]);\n\n // Handle placeholder changes\n useEffect(() => {\n // Only run when placeholder actually changes\n if (placeholder === previousPlaceholderRef.current) return;\n\n // Only update if input is actually a placeholder\n const isOldPlaceholder =\n inputValue === TIME_FORMAT_PLACEHOLDERS[12] ||\n inputValue === TIME_FORMAT_PLACEHOLDERS[24];\n\n if (isOldPlaceholder) {\n setInputValue(placeholder);\n }\n\n previousPlaceholderRef.current = placeholder;\n }, [placeholder, inputValue]);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n isUserTypingRef.current = true;\n\n const { time, isInputValid, isInputEmpty } = parseInputValue(\n event.target.value,\n format,\n removePlaceholder,\n min,\n max,\n );\n\n // Check if this might be a potentially valid partial input\n const isPotentiallyValidPartial =\n !isInputValid &&\n !isInputEmpty &&\n event.target.value.length >= placeholder.length && // User is typing, not deleting\n isPartialInputPotentiallyValid(event.target.value, format, min, max);\n\n // Only update the input value if it's valid, empty, or potentially valid partial\n if (isInputValid || isInputEmpty || isPotentiallyValidPartial) {\n setInputValue(event.target.value);\n } else {\n // Reset to placeholder when input is invalid to clear the mask's internal state\n setInputValue(placeholder);\n }\n\n onInputChange?.({\n event,\n time,\n isInputValid,\n isInputEmpty,\n });\n\n // Reset typing flag after a delay\n setTimeout(() => {\n isUserTypingRef.current = false;\n }, TIME_CONSTANTS.INPUT_DEBOUNCE_TIMEOUT);\n },\n [format, removePlaceholder, onInputChange, min, max, placeholder],\n );\n\n const resetTypingFlag = useCallback(() => {\n isUserTypingRef.current = false;\n }, []);\n\n // Handle auto-completion on blur\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n // Auto-complete if we have a valid parsed time\n if (currentParsedData.time && currentParsedData.isInputValid) {\n const completedValue = convertTimeFormat(\n currentParsedData.time,\n format,\n );\n setInputValue(completedValue);\n }\n\n // Call parent's blur handler if provided\n onBlur?.(event);\n },\n [currentParsedData, format, onBlur],\n );\n\n useImperativeHandle(ref, () => {\n const input = inputRef.current;\n if (!input)\n return null as unknown as HTMLInputElement & {\n resetTypingFlag: () => void;\n };\n return Object.assign(input, {\n resetTypingFlag,\n });\n });\n\n const classNames = useMemo(() => {\n return cx(styles[\"time-field\"], className);\n }, [className]);\n\n return (\n <TextField\n ref={combinedRef}\n data-input-valid={currentParsedData.isInputValid}\n data-input-empty={currentParsedData.isInputEmpty}\n data-time={currentParsedData.time ?? \"\"}\n value={inputValue}\n onChange={handleChange}\n prefix={<Icon svg={CLOCK_ICON} />}\n autoComplete=\"off\"\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n onBlur={handleBlur}\n className={classNames}\n {...props}\n />\n );\n },\n);\n\nMaskedTimeInput.displayName = \"MaskedTimeInput\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTrackingId, useMergeRefs } from \"../../hooks\";\nimport { DataTrackingId } from \"../../types\";\nimport { TextFieldProps } from \"../TextField\";\nimport { TimeFieldChangeHandler, TimeFormat } from \"./internal/types\";\nimport { childrenToString } from \"../../internal/functions\";\nimport {\n useLayoutPropsUtil,\n useOptionallyControlledState,\n usePopoverCloseDelayWorkaround,\n} from \"../../internal/hooks\";\nimport { TIME_FORMAT_PLACEHOLDERS } from \"./internal/constants\";\nimport {\n filterTimeOptions,\n generateTimeOptions,\n} from \"./internal/utils/timeOptions\";\nimport {\n getAutoRoundingOptions,\n handleAutoRounding,\n} from \"./internal/utils/timeRounding\";\nimport {\n MaskedTimeInput,\n MaskedTimeInputChange,\n} from \"./internal/MaskedTimeInput\";\nimport { Popover } from \"../../internal/components/Popover\";\nimport Listbox from \"../Listbox\";\n\n/**\n * Props for the TimeField component.\n * @extends Omit<TextFieldProps, \"onChange\" | \"value\" | \"defaultValue\" | \"type\" | \"min\" | \"max\" | \"step\" | \"maxLength\" | \"showCounter\">\n */\nexport type TimeFieldProps = Omit<\n TextFieldProps,\n | \"onChange\"\n | \"value\"\n | \"defaultValue\"\n | \"type\"\n | \"min\"\n | \"max\"\n | \"step\"\n | \"maxLength\"\n | \"showCounter\"\n | \"prefix\"\n> & {\n /**\n * The current value of the time field.\n * @example \"14:30\" or \"02:30 PM\"\n */\n value?: string | null;\n /**\n * The default value for uncontrolled mode.\n * @example \"14:30\" or \"02:30 PM\"\n */\n defaultValue?: string | null;\n /**\n * Callback when the time value changes.\n */\n onChange?: TimeFieldChangeHandler;\n /**\n * Time format to use.\n * @default 12\n */\n format?: TimeFormat;\n /**\n * Time increment in minutes.\n * @default 30\n */\n step?: number;\n /**\n * Whether to automatically round to the nearest step.\n * @default false\n */\n autoround?: boolean;\n /**\n * Whether to disable the dropdown suggestions.\n * @default false\n */\n disableSuggestions?: boolean;\n} & (\n | {\n /**\n * Minimum allowed time constraint.\n * @example \"09:00 AM\" or \"09:00\"\n */\n min: string;\n /**\n * Maximum allowed time constraint.\n * @example \"05:00 PM\" or \"17:00\"\n */\n max: string;\n }\n | {\n min?: never;\n max?: never;\n }\n ) &\n DataTrackingId;\n\n/**\n * TimeField component for entering time values with auto-rounding and suggestions.\n *\n * Features:\n * - Supports 12-hour and 24-hour time formats\n * - Min/max time constraints handled during input parsing\n * - Auto-rounding to step intervals when autoround is true\n * - Dropdown suggestions for quick time selection\n * - Controlled and uncontrolled modes\n * - Smart input masking with placeholders\n * - Integration with MaskedTimeInput for auto-complete\n * - Validation handled by implementors using onChange callback\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <TimeField\n * label=\"Meeting Time\"\n * value=\"14:30\"\n * format={24}\n * step={30}\n * min=\"09:00\"\n * max=\"17:00\"\n * autoround\n * disableSuggestions\n * onChange={(change) => {\n * // Handle time change and validation\n * if (change.isInputEmpty && required) {\n * // Show required error\n * }\n * }}\n * />\n */\nexport const TimeField = (props: TimeFieldProps) => {\n const { componentProps } = useLayoutPropsUtil(props);\n const {\n label,\n labelProps,\n size,\n value: valueProp,\n defaultValue,\n min,\n max,\n onChange,\n format = 12,\n step = 30,\n required,\n description,\n error: errorProp,\n disableSuggestions = false,\n autoround = false,\n className,\n ...rest\n } = componentProps;\n\n // Dropdown state management\n const [isDropdownOpen, setIsDropdownOpenRaw] = useState(false);\n\n const setIsDropdownOpen = (open: boolean) => {\n setIsDropdownOpenRaw(open);\n };\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(0);\n const [inputValueForFiltering, setInputValueForFiltering] = useState(\"\");\n const [currentParsedTime, setCurrentParsedTime] = useState<string | null>(\n null,\n );\n\n // Controlled state for the visual input value when an option is selected from dropdown\n const [selectedTime, setSelectedTime] = useOptionallyControlledState<\n string | null\n >({\n controlledValue: valueProp,\n defaultValue: defaultValue ?? null,\n });\n\n // Get parsed data from MaskedTimeInput via data attributes\n const [inputParsedData, setInputParsedData] = useState<{\n time: string | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n }>({ time: null, isInputValid: false, isInputEmpty: true });\n\n // Track the last onChange call to prevent duplicate calls\n const lastOnChangeCallRef = useRef<{\n time: string | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n } | null>(null);\n\n // Track if dropdown is being clicked (vs tabbed to)\n const isDropdownClickingRef = useRef(false);\n\n // Track if we just made a selection (to prevent auto-reopening on focus)\n const [justSelected, setJustSelected] = useState(false);\n\n // Track if Tab was just pressed (to prevent useEffect from reopening dropdown)\n const tabJustPressedRef = useRef(false);\n // Set when the popover is explicitly closed (e.g. via Escape through useDismiss),\n // to prevent the auto-reopen effect from immediately reopening it while focus\n // stays on the input.\n const closeJustTriggeredRef = useRef(false);\n\n // Popover support and refs\n const inputRef = useRef<\n HTMLInputElement & {\n resetTypingFlag?: () => void;\n }\n >(null);\n const popoverContentRef = useRef<HTMLDivElement>(null);\n // Beta Popover.Trigger passes a callback ref (not RefObject) — store it in a ref\n // and delegate via a stable callback so useMergeRefs stays stable across renders.\n const popoverRefSetter = useRef<((node: Element | null) => void) | null>(\n null,\n );\n const popoverCallbackRef = useCallback((node: HTMLInputElement | null) => {\n popoverRefSetter.current?.(node);\n }, []);\n const combinedRef = useMergeRefs([popoverCallbackRef, inputRef]);\n\n // Get placeholder based on format\n const placeholder = TIME_FORMAT_PLACEHOLDERS[format];\n\n // Optimize dropdown rendering - only show options when dropdown is open\n const shouldShowOptionsFromHook =\n usePopoverCloseDelayWorkaround(isDropdownOpen);\n\n // Override the delay when Tab was just pressed to prevent empty popover\n const shouldShowOptions = tabJustPressedRef.current\n ? false\n : shouldShowOptionsFromHook;\n\n // Cleanup timeouts on unmount\n const dropdownTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup timeouts when component unmounts\n useEffect(() => {\n const dropdownRef = dropdownTimeoutRef.current;\n return () => {\n if (dropdownRef) {\n clearTimeout(dropdownRef);\n }\n };\n }, []);\n\n // Generate time options for dropdown\n const allTimeOptions = useMemo(\n () => generateTimeOptions({ step, min, max, format }),\n [step, min, max, format],\n );\n\n // Split the complex filtering logic into focused memos\n const baseFilteredOptions = useMemo(() => {\n // If no input or placeholder, show all options\n if (!inputValueForFiltering || inputValueForFiltering.match(/^[–_:]+$/)) {\n return allTimeOptions;\n }\n\n return filterTimeOptions(allTimeOptions, inputValueForFiltering);\n }, [allTimeOptions, inputValueForFiltering]);\n\n const autoRoundingOptions = useMemo(() => {\n // Only generate auto-rounding options if enabled and no base matches\n if (\n !autoround ||\n baseFilteredOptions.length > 0 ||\n !inputValueForFiltering ||\n inputValueForFiltering.match(/^[–_:]+$/)\n ) {\n return [];\n }\n\n // Get current time for auto-rounding logic\n const currentTime = currentParsedTime || inputParsedData.time;\n\n const autoRoundedOptions = getAutoRoundingOptions(\n currentTime,\n step ?? 30,\n format,\n inputValueForFiltering,\n min,\n );\n\n // Filter out any options that are already in baseFiltered\n return autoRoundedOptions.filter(\n (option) => !baseFilteredOptions.includes(option),\n );\n }, [\n autoround,\n baseFilteredOptions,\n inputValueForFiltering,\n currentParsedTime,\n inputParsedData.time,\n format,\n min,\n step,\n ]);\n\n const filteredOptions = useMemo(() => {\n // If input is completely invalid AND we have no matches, show all options\n if (baseFilteredOptions.length === 0 && autoRoundingOptions.length === 0) {\n if (\n !inputParsedData.isInputValid &&\n inputValueForFiltering &&\n !inputValueForFiltering.match(/^[–_:]+$/)\n ) {\n return allTimeOptions;\n }\n }\n\n return [...baseFilteredOptions, ...autoRoundingOptions];\n }, [\n baseFilteredOptions,\n autoRoundingOptions,\n allTimeOptions,\n inputValueForFiltering,\n inputParsedData.isInputValid,\n ]);\n\n // Handle blur - close dropdown and validate current input state\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n // Skip blur processing if clicking in the dropdown (prevents duplicate onChange)\n // but allow blur for other cases like tabbing away\n if (\n event.relatedTarget &&\n popoverContentRef.current?.contains(event.relatedTarget as Node) &&\n isDropdownClickingRef.current\n ) {\n isDropdownClickingRef.current = false; // Reset flag\n return;\n }\n\n // Close dropdown on blur\n setIsDropdownOpen(false);\n setSelectedOptionIndex(0);\n\n // Get parsed data from MaskedTimeInput data attributes - following DateFields pattern\n const input = event.target as HTMLInputElement;\n const parsedInputTime = input.dataset.time || null;\n const isInputValid = input.dataset.inputValid === \"true\";\n const isInputEmpty = input.dataset.inputEmpty === \"true\";\n\n // Use the parsed input time directly, don't fall back to old values\n let finalTime = parsedInputTime;\n\n // Auto-rounding logic - apply when autoround is enabled regardless of suggestions\n if (autoround && finalTime && isInputValid) {\n const beforeRounding = finalTime;\n finalTime = handleAutoRounding(finalTime, {\n autoround,\n step,\n format,\n });\n\n // If auto-rounding changed the time, update the visual input\n if (finalTime !== beforeRounding) {\n inputRef.current?.resetTypingFlag?.();\n setSelectedTime(finalTime);\n }\n }\n\n // Check if this onChange call would be a duplicate\n const currentChange = {\n time: finalTime,\n isInputValid,\n isInputEmpty,\n };\n\n const lastChange = lastOnChangeCallRef.current;\n const isDuplicate =\n lastChange &&\n lastChange.time === currentChange.time &&\n lastChange.isInputValid === currentChange.isInputValid &&\n lastChange.isInputEmpty === currentChange.isInputEmpty;\n\n // Only call onChange if this is not a duplicate\n if (!isDuplicate) {\n onChange?.(currentChange);\n lastOnChangeCallRef.current = currentChange;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [format, step, autoround, onChange],\n );\n\n // Add focus handler\n const handleFocus = useCallback(() => {\n if (!disableSuggestions && !justSelected) {\n setIsDropdownOpen(true);\n // Don't automatically select the first option on focus\n // This allows the input to remain empty when user just focuses\n setSelectedOptionIndex(0);\n }\n }, [disableSuggestions, justSelected]);\n\n // Handle dropdown state based on filtered options\n useEffect(() => {\n // Close dropdown if no options available or only 1 option (no choice to make)\n if (filteredOptions.length <= 1 && isDropdownOpen) {\n setIsDropdownOpen(false);\n }\n\n // Reopen dropdown when multiple options become available while input is focused\n if (\n !disableSuggestions &&\n filteredOptions.length > 1 &&\n document.activeElement &&\n document.activeElement.tagName === \"INPUT\" &&\n !isDropdownOpen &&\n !justSelected &&\n !tabJustPressedRef.current &&\n !closeJustTriggeredRef.current\n ) {\n setIsDropdownOpen(true);\n setSelectedOptionIndex(0);\n }\n }, [filteredOptions, disableSuggestions, isDropdownOpen, justSelected]);\n\n // Handle input changes from MaskedTimeInput\n const handleInputChange = (change: MaskedTimeInputChange) => {\n // Update input value for filtering\n setInputValueForFiltering(change.event.target.value);\n\n // Update current parsed time for auto-rounding logic\n setCurrentParsedTime(change.time);\n\n // Update parsed data state from the change event\n setInputParsedData({\n time: change.time,\n isInputValid: change.isInputValid,\n isInputEmpty: change.isInputEmpty,\n });\n\n // Reset selected option index when user types\n setSelectedOptionIndex(0);\n\n // Clear the just-selected flag when user starts typing\n setJustSelected(false);\n\n // Reset selectedTime when user types to allow consecutive auto-rounding\n setSelectedTime(null);\n };\n\n // Scroll the selected option into view within the popover\n const scrollToSelectedOption = useCallback(() => {\n if (!popoverContentRef.current || selectedOptionIndex < 0) return;\n\n // Get all option elements and select by index\n const optionElements =\n popoverContentRef.current.querySelectorAll('[role=\"option\"]');\n const targetElement = optionElements[selectedOptionIndex];\n\n if (targetElement) {\n targetElement.scrollIntoView({\n block: \"nearest\",\n behavior: \"auto\",\n });\n }\n }, [selectedOptionIndex]);\n\n // Scroll to selected option when selectedOptionIndex changes\n useEffect(() => {\n if (isDropdownOpen && selectedOptionIndex >= 0) {\n scrollToSelectedOption();\n }\n }, [selectedOptionIndex, isDropdownOpen, scrollToSelectedOption]);\n\n // Handle dropdown option selection (Enter key and mouse clicks)\n const handleOptionSelect = useCallback(\n (selectedTime: string) => {\n // Reset typing flag FIRST to ensure MaskedTimeInput will accept the new value\n if (inputRef.current?.resetTypingFlag) {\n inputRef.current.resetTypingFlag();\n }\n\n // Close dropdown after selection\n setIsDropdownOpen(false);\n setSelectedOptionIndex(0);\n\n // Set flag to prevent auto-reopening on focus\n setJustSelected(true);\n\n // Update all state to reflect the selection\n setCurrentParsedTime(selectedTime);\n setSelectedTime(selectedTime);\n\n const changeData = {\n time: selectedTime,\n isInputValid: true,\n isInputEmpty: false,\n };\n\n // Notify parent of the change\n onChange?.(changeData);\n\n // Update the last onChange call ref to prevent duplicate in blur\n lastOnChangeCallRef.current = changeData;\n\n // Focus the input after selection\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onChange],\n );\n\n // Handle keyboard navigation\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isDropdownOpen) {\n return; // Let normal input behavior handle it\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setSelectedOptionIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : 0,\n );\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setSelectedOptionIndex((prev) =>\n prev > 0 ? prev - 1 : filteredOptions.length - 1,\n );\n break;\n case \"Enter\":\n event.preventDefault();\n if (filteredOptions[selectedOptionIndex]) {\n // Enter: select option, keep dropdown open\n handleOptionSelect(filteredOptions[selectedOptionIndex]);\n }\n break;\n case \"Tab\":\n // Set flag to prevent useEffect from reopening dropdown\n tabJustPressedRef.current = true;\n\n // Close dropdown and let natural tab behavior happen\n setIsDropdownOpen(false);\n setSelectedOptionIndex(0);\n\n // Clear the flag after blur completes\n setTimeout(() => {\n tabJustPressedRef.current = false;\n }, 50);\n break;\n }\n },\n [isDropdownOpen, selectedOptionIndex, filteredOptions, handleOptionSelect],\n );\n\n const popoverDisabled = disableSuggestions;\n\n const { aiMark, ...labelPropsWithoutAiMark } = labelProps || {};\n\n const data = {\n label: childrenToString(label),\n labelProps: labelPropsWithoutAiMark,\n description: childrenToString(description),\n size,\n format,\n step,\n min,\n max,\n autoround,\n disableSuggestions,\n };\n const trackingId = useTrackingId({\n name: \"TimeField\",\n data,\n hasOverride: !!rest[\"data-tracking-id\"],\n });\n\n const justTheInput = (\n <MaskedTimeInput\n data-tracking-id={trackingId}\n ref={combinedRef}\n selectedTime={selectedTime}\n format={format}\n placeholder={placeholder}\n min={min}\n max={max}\n onInputChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n label={label}\n labelProps={labelProps}\n size={size}\n description={description}\n error={errorProp}\n className={popoverDisabled ? className : undefined}\n {...rest}\n aria-label={label ? undefined : \"Select a time\"}\n data-anv=\"time-field\"\n />\n );\n\n if (popoverDisabled) {\n return justTheInput;\n }\n\n return (\n <Popover\n open={isDropdownOpen}\n role=\"listbox\"\n noPadding\n placement=\"bottom-start\"\n matchReferenceWidth\n onClickOutside={() => {\n setIsDropdownOpen(false);\n }}\n onClose={() => {\n closeJustTriggeredRef.current = true;\n setIsDropdownOpen(false);\n setTimeout(() => {\n closeJustTriggeredRef.current = false;\n }, 50);\n }}\n fitScreen\n maxHeight={205}\n >\n <Popover.Trigger>\n {({ ref: setReference }) => {\n popoverRefSetter.current = setReference;\n return justTheInput;\n }}\n </Popover.Trigger>\n\n <Popover.Content\n ref={popoverContentRef}\n data-open={isDropdownOpen}\n data-disabled={disableSuggestions}\n onMouseDown={() => {\n // Set flag to indicate dropdown is being clicked (desktop)\n isDropdownClickingRef.current = true;\n }}\n onTouchStart={() => {\n // Set flag to indicate dropdown is being touched (mobile)\n isDropdownClickingRef.current = true;\n }}\n >\n {shouldShowOptions && (\n <Listbox\n selected={filteredOptions[selectedOptionIndex]}\n onSelectionChange={(selected: string | undefined) => {\n if (selected) {\n handleOptionSelect(selected);\n } else {\n // Re-select the same option instead of deselecting (for TimeField, we never want deselection)\n const currentOption = filteredOptions[selectedOptionIndex];\n if (currentOption) {\n handleOptionSelect(currentOption);\n }\n }\n }}\n aria-label=\"Time suggestions\"\n >\n {filteredOptions.map((option) => (\n <Listbox.Option key={option} value={option} label={option}>\n {option}\n </Listbox.Option>\n ))}\n </Listbox>\n )}\n </Popover.Content>\n </Popover>\n );\n};\n\nTimeField.displayName = \"TimeField\";\n"],"names":["IconAccessTime","timePlaceholderMask","selectedTime"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Toaster-DMZng3Im.js","sources":["../src/components/Toast/internal/ToastProvider.tsx","../src/components/Toast/internal/useToasts.ts","../src/components/Toast/internal/ToasterPopover.tsx","../src/components/Toast/internal/constants.ts","../src/components/Toast/internal/addOrUpdateToastHeight.ts","../../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/stringify.js","../../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/rng.js","../../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/v4.js","../src/components/Toast/toast.ts","../src/components/Toast/internal/useCloseToast.tsx","../src/components/Toast/internal/useToastPositionStyles.ts","../src/components/Toast/internal/Toast.tsx","../src/components/Toast/internal/useHotkeyFocus.tsx","../src/components/Toast/internal/useShowMoreButtonPositionStyles.ts","../src/components/Toast/internal/ToastStack.tsx","../src/components/Toast/internal/Toaster.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport {\n createContext,\n Dispatch,\n FC,\n PropsWithChildren,\n SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { ToastProps } from \"./Toast\";\n\n/**\n * Props for the ToastProvider component\n * @extends PropsWithChildren\n */\nexport type ToastProviderProps = PropsWithChildren<{\n /**\n * Whether this toaster is used within a dialog context\n * @default false\n */\n isDialogToaster?: boolean;\n}>;\n\n/**\n * Context properties for the ToastProvider\n */\nexport type ToastProviderContextProps = {\n /**\n * Array of active toast notifications\n */\n toasts: ToastProps[];\n /**\n * Function to update the toast array\n */\n setToasts: Dispatch<SetStateAction<ToastProps[]>>;\n /**\n * Array of toast height measurements\n */\n toastHeights: { id: string; height: number }[];\n /**\n * Function to update toast heights\n */\n setToastHeights: Dispatch<\n SetStateAction<ToastProviderContextProps[\"toastHeights\"]>\n >;\n /**\n * Function to calculate the total height of the toast stack\n */\n getToastStackHeight: (index?: number) => number;\n /**\n * Number of toasts to display before stacking\n */\n toastsBeforeStack: number;\n /**\n * Function to update the number of toasts before stacking\n */\n setToastsBeforeStack: Dispatch<SetStateAction<number>>;\n /**\n * Whether extra toasts are currently visible\n */\n extraToastsVisible: boolean;\n /**\n * Function to update the visibility of extra toasts\n */\n setExtraToastsVisible: Dispatch<SetStateAction<boolean>>;\n /**\n * Whether this toaster is used within a dialog context\n */\n isDialogToaster: boolean;\n};\n\n/**\n * Context for managing toast state and operations\n */\nexport const ToastProviderContext = createContext<ToastProviderContextProps>({\n toasts: [],\n setToasts: () => [],\n toastHeights: [],\n setToastHeights: () => [],\n getToastStackHeight: () => 0,\n toastsBeforeStack: 3,\n setToastsBeforeStack: () => [],\n extraToastsVisible: false,\n setExtraToastsVisible: () => [],\n isDialogToaster: false,\n});\n\n/**\n * Global reference to toast state setters for external access\n */\nexport const getSetToasts: {\n setToasts: ToastProviderContextProps[\"setToasts\"];\n setToastHeights: ToastProviderContextProps[\"setToastHeights\"];\n} = {\n setToasts: () => [],\n setToastHeights: () => [],\n};\n\n/**\n * ToastProvider component for managing toast state and context.\n *\n * Features:\n * - Manages toast state and lifecycle\n * - Handles toast height tracking for positioning\n * - Provides stacking behavior configuration\n * - Supports dialog toaster mode\n * - Automatic duplicate toast detection and removal\n * - Context-based state management\n * - Height calculation utilities for positioning\n *\n * @example\n * <ToastProvider isDialogToaster={false}>\n * <Toaster id=\"main-toaster\" />\n * </ToastProvider>\n */\nexport const ToastProvider: FC<ToastProviderProps> = ({\n children,\n isDialogToaster: isDialogToasterProp = false,\n}) => {\n const [toasts, setToasts] = useState<ToastProps[]>([]);\n const [toastHeights, setToastHeights] = useState<\n ToastProviderContextProps[\"toastHeights\"]\n >([]);\n const [toastsBeforeStack, setToastsBeforeStack] = useState<number>(3);\n const [extraToastsVisible, setExtraToastsVisible] = useState<boolean>(false);\n getSetToasts.setToasts = setToasts;\n getSetToasts.setToastHeights = setToastHeights;\n const [isDialogToaster, setIsDialogToaster] =\n useState<boolean>(isDialogToasterProp);\n\n const removeDuplicateToasts = (toasts: ToastProps[]) => {\n const toastIds = new Set<ToastProps[\"id\"]>();\n const uniqueToasts = toasts.filter((toast) => {\n if (toastIds.has(toast.id)) {\n console.error(\n `Encountered toast with duplicate id ${toast.id}. Each toast id needs to be unique.`,\n );\n return false;\n } else {\n toastIds.add(toast.id);\n return true;\n }\n });\n return uniqueToasts;\n };\n\n useEffect(() => {\n const uniqueToasts = removeDuplicateToasts(toasts);\n if (toasts.length !== uniqueToasts.length) {\n setToasts(uniqueToasts);\n }\n }, [toasts]);\n\n useEffect(() => {\n setIsDialogToaster(isDialogToasterProp);\n }, [isDialogToasterProp]);\n\n // Memoize the ID→height map once per toastHeights change, so\n // getToastStackHeight (called once per toast) doesn't rebuild it each time.\n const heightMap = useMemo(\n () => new Map(toastHeights.map((t) => [t.id, t.height])),\n [toastHeights],\n );\n\n const getToastStackHeight = useCallback(\n (index?: number) => {\n // Use the toasts array for ordering, filter to toasts after the given index\n const relevantToasts =\n index !== undefined ? toasts.slice(index + 1) : toasts;\n\n // Get heights for relevant toasts (only those that have reported heights)\n const heights = relevantToasts\n .map((t) => heightMap.get(t.id))\n .filter((h): h is number => h !== undefined);\n\n if (heights.length > 0) {\n if (extraToastsVisible) {\n return heights.reduce((total, current) => total + current);\n }\n return heights\n .slice(-toastsBeforeStack)\n .reduce((total, current) => total + current);\n }\n return 0;\n },\n [toasts, heightMap, extraToastsVisible, toastsBeforeStack],\n );\n\n const value = useMemo(\n () => ({\n toasts,\n setToasts,\n toastHeights,\n setToastHeights,\n getToastStackHeight,\n toastsBeforeStack,\n setToastsBeforeStack,\n extraToastsVisible,\n setExtraToastsVisible,\n isDialogToaster,\n }),\n [\n extraToastsVisible,\n getToastStackHeight,\n toastHeights,\n toasts,\n toastsBeforeStack,\n isDialogToaster,\n ],\n );\n\n return (\n <ToastProviderContext.Provider value={value}>\n {children}\n </ToastProviderContext.Provider>\n );\n};\n","import { useContext } from \"react\";\nimport { ToastProviderContext } from \"./ToastProvider\";\n\n/**\n * Hook for accessing toast context and state management functions\n * @returns ToastProviderContextProps - The toast context with state and functions\n * @throws Error when used outside of ToastProvider\n */\nexport const useToasts = () => {\n const context = useContext(ToastProviderContext);\n\n if (context == null) {\n throw new Error(\"useToasts must be wrapped in <ToastProvider />\");\n }\n\n return context;\n};\n","import {\n forwardRef,\n PropsWithChildren,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\nimport { useMergeRefs } from \"../../../hooks\";\nimport { safeHidePopover, safeShowPopover } from \"../../../internal/functions\";\n\nimport cx from \"classnames\";\n\nimport { useToasts } from \"./useToasts\";\n\nimport styles from \"./Toaster.module.scss\";\nimport { portalScopeClassNames } from \"../../../internal/functions/portalScopeClassNames\";\n\n/**\n * Props for the ToasterPopover component\n * @extends PropsWithChildren\n */\ntype ToasterPopoverProps = PropsWithChildren;\n\n/**\n * ToasterPopover component for displaying toast notifications in a popover.\n *\n * Features:\n * - Displays toast notifications in a native popover element\n * - Automatically shows/hides based on toast count\n * - Handles dialog toaster state management\n * - Browser compatibility checking for popover support\n * - Smooth transitions between show/hide states\n * - Integration with toast provider context\n *\n * @example\n * <ToasterPopover>\n * <ToastStack toasts={toastList} />\n * </ToasterPopover>\n */\nexport const ToasterPopover = forwardRef<HTMLDivElement, ToasterPopoverProps>(\n (props, ref) => {\n const { isDialogToaster } = useToasts();\n const popoverRef = useRef<HTMLDivElement>(null);\n const combinedRef = useMergeRefs([popoverRef, ref]);\n\n const { toasts } = useToasts();\n const toastCount = useMemo(() => toasts.length, [toasts]);\n\n useEffect(() => {\n if (!popoverRef.current) return;\n const currentPopover = popoverRef.current;\n let timeout: NodeJS.Timeout | undefined;\n\n if (toastCount > 0) {\n if (isDialogToaster) {\n // For dialog toasters, we need to reset the popover state\n timeout = setTimeout(() => {\n safeHidePopover(currentPopover);\n safeShowPopover(currentPopover);\n });\n } else {\n // For non-dialog toasters, just show the popover\n safeShowPopover(currentPopover);\n }\n } else {\n safeHidePopover(currentPopover);\n }\n\n return () => {\n if (timeout) clearTimeout(timeout);\n if (toastCount === 0) {\n safeHidePopover(currentPopover);\n }\n };\n }, [toastCount, isDialogToaster]);\n\n return (\n <div\n ref={combinedRef}\n // The toaster renders in a native `popover` (top layer), escaping any\n // ancestor `AnvilProvider`'s `.anvil2` scope; self-apply it so portaled\n // toasts still receive the `--a2-*` tokens and scoped component rules.\n className={cx(styles.popover, portalScopeClassNames)}\n popover=\"manual\"\n >\n {props.children}\n </div>\n );\n },\n);\n\nToasterPopover.displayName = \"ToasterPopover\";\n","/**\n * Animation duration for toast transitions in milliseconds\n */\nexport const ANIMATION_DURATION = 300; // ms\n\n/**\n * Total padding around the toast stack (top + bottom approximation)\n */\nexport const TOAST_STACK_PADDING = 48;\n\n/**\n * Height of the expand/collapse button plus its padding\n */\nexport const EXPAND_BUTTON_HEIGHT_WITH_PADDING = 64;\n\n/**\n * Scroll threshold in pixels from bottom to hide bottom gradient\n */\nexport const SCROLL_THRESHOLD = 64;\n\n/**\n * Throttle interval for scroll and resize event handlers in milliseconds\n */\nexport const EVENT_THROTTLE_MS = 16; // ~60fps\n","import { ToastProviderContextProps } from \"./ToastProvider\";\n\n/**\n * Adds or updates the height of a toast in the height tracking system\n * @param toastId - The unique identifier of the toast\n * @param toastHeight - The height of the toast in pixels\n * @param setToastHeights - Function to update toast heights\n */\nexport const addOrUpdateToastHeight = (\n toastId: string,\n toastHeight: number,\n setToastHeights: ToastProviderContextProps[\"setToastHeights\"],\n) => {\n setToastHeights((prev) => {\n // update height if toast height is defined\n if (prev.find((t) => t.id === toastId)) {\n return prev.map((t) => {\n if (t.id === toastId) {\n return { ...t, height: toastHeight };\n }\n return t;\n });\n }\n // otherwise set height for the first time\n return [\n ...prev,\n {\n id: toastId,\n height: toastHeight,\n },\n ];\n });\n};\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","const rnds8 = new Uint8Array(16);\nexport default function rng() {\n return crypto.getRandomValues(rnds8);\n}\n","import rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (!buf && !options && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { MouseEvent } from \"react\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { Status } from \"../../types\";\nimport { ToastCustomEventDetail, ToastUpdateProps } from \"./internal/types\";\nimport { ToastProps } from \"./internal/Toast\";\n\nexport type toastProps = Pick<\n ToastProps,\n | \"actions\"\n | \"aiMark\"\n | \"containerClassName\"\n | \"duration\"\n | \"message\"\n | \"onClose\"\n | \"onDismiss\"\n | \"progress\"\n | \"title\"\n | \"toastClassName\"\n>;\n\n/**\n * Use to run toast methods for adding, updating, and dismissing toasts.\n *\n * @method info\n * @method success\n * @method warning\n * @method danger\n * @method promise\n * @method update\n * @method dismiss\n */\nexport const toast = () => {\n const toastMethods = [\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n \"promise\",\n \"update\",\n \"dismiss\",\n ];\n console.error(\n \"Please use one of the following toast methods:\\n\",\n ...toastMethods.map((m) => `\\ttoast.${m}()\\n`),\n );\n};\ntype ToastCustomEvent = CustomEvent<ToastCustomEventDetail>;\n\nconst TOAST_EVENT_NAME = \"hammer-toast\";\n\nconst TOAST_TYPES: readonly Status[] = [\"info\", \"success\", \"warning\", \"danger\"];\n\nconst methods: Record<string, (props: toastProps) => string> = {};\n\nTOAST_TYPES.forEach((type) => {\n methods[type] = (props: toastProps) => {\n const uniqueId = uuid();\n\n const ToastAddEvent: ToastCustomEvent =\n new CustomEvent<ToastCustomEventDetail>(TOAST_EVENT_NAME, {\n composed: true,\n detail: {\n id: uniqueId,\n eventType: \"add\",\n status: type,\n createdAt: Date.now(),\n ...props,\n },\n });\n dispatchEvent(ToastAddEvent);\n return uniqueId;\n };\n});\n\nconst update = (id: string, props: Omit<ToastUpdateProps, \"id\">) => {\n const ToastEvent: ToastCustomEvent = new CustomEvent<ToastCustomEventDetail>(\n TOAST_EVENT_NAME,\n {\n composed: true,\n detail: {\n eventType: \"update\",\n id,\n ...props,\n },\n },\n );\n dispatchEvent(ToastEvent);\n};\n\nconst dismiss = (id?: string) => {\n const ToastEvent: ToastCustomEvent = new CustomEvent<ToastCustomEventDetail>(\n TOAST_EVENT_NAME,\n {\n composed: true,\n detail: {\n eventType: \"dismiss\",\n id,\n },\n },\n );\n dispatchEvent(ToastEvent);\n};\n\nconst promise = async (\n promise: Promise<string>,\n toastConfig: {\n loading: toastProps;\n success: (data: string) => Omit<toastProps, \"id\">;\n error: (error: string) => Omit<toastProps, \"id\">;\n },\n): Promise<string> => {\n const { onClose, ...loadingToastConfig } = toastConfig.loading;\n let closedWhileLoading = false;\n\n const onCloseWhileLoading: toastProps[\"onClose\"] = (\n e: MouseEvent<HTMLButtonElement>,\n ) => {\n toastConfig.loading.onClose?.(e);\n closedWhileLoading = true;\n };\n\n const id = toast.info({\n ...loadingToastConfig,\n onClose: onCloseWhileLoading,\n duration: false,\n });\n await Promise.resolve(promise)\n .then((res) => {\n if (closedWhileLoading) {\n toast.success({\n ...toastConfig.success(res),\n });\n } else {\n toast.update(id, {\n ...toastConfig.success(res),\n status: \"success\",\n });\n }\n })\n .catch((err) => {\n if (closedWhileLoading) {\n toast.danger({\n ...toastConfig.error(err),\n });\n } else {\n toast.update(id, {\n ...toastConfig.error(err),\n status: \"danger\",\n });\n }\n });\n return id;\n};\n\n/**\n * Use to add info toast to the stack.\n *\n * @example\n * import { toast } from \"@servicetitan/anvil2\";\n * const id = toast.info({\n * message: \"This is an info toast\",\n * title: \"Info\",\n * });\n */\ntoast.info = methods.info;\n/**\n * Use to add success toast to the stack.\n *\n * @example\n * import { toast } from \"@servicetitan/anvil2\";\n * const id = toast.success({\n * message: \"This is an info toast\",\n * title: \"Info\",\n * });\n */\ntoast.success = methods.success;\n/**\n * Use to add warning toast to the stack.\n *\n * @example\n * import { toast } from \"@servicetitan/anvil2\";\n * const id = toast.warning({\n * message: \"This is an info toast\",\n * title: \"Info\",\n * });\n */\ntoast.warning = methods.warning;\n/**\n * Use to add danger toast to the stack.\n *\n * @example\n * import { toast } from \"@servicetitan/anvil2\";\n * const id = toast.danger({\n * message: \"This is an info toast\",\n * title: \"Info\",\n * });\n */\ntoast.danger = methods.danger;\n/**\n * Use to update a specific toast in the stack.\n *\n * @example\n * import { toast } from \"@servicetitan/anvil2\";\n * const id = toast.info({\n * message: \"This is an info toast\",\n * title: \"Info\",\n * });\n * toast.update(id, {\n * message: \"This is an updated toast\",\n * title: \"Updated\",\n * });\n */\ntoast.update = update;\n/**\n * Use to dismiss a specific toast in the stack.\n *\n * @example\n * import { toast } from \"@servicetitan/anvil2\";\n * const id = toast.info({\n * message: \"This is an info toast\",\n * title: \"Info\",\n * });\n * toast.dismiss(id);\n */\ntoast.dismiss = dismiss;\n/**\n * Use to create a toast that updates itself based on a Promise state.\n *\n * @example\n * ```ts\n * import { toast } from \"@servicetitan/anvil2\";\n * toast.promise(\n * new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve(\"This is a success toast\");\n * }, 2000);\n * }),\n * {\n * loading: {\n * message: \"This is a loading toast\",\n * title: \"Loading\",\n * },\n * success: (data) => ({\n * message: data,\n * title: \"Success\",\n * }),\n * error: (error) => ({\n * message: error,\n * title: \"Error\",\n * }),\n * },\n * );\n * ```\n */\ntoast.promise = promise;\n","import { ToastProps } from \"./Toast\";\nimport { useToasts } from \"./useToasts\";\nimport { ANIMATION_DURATION } from \"./constants\";\nimport { ToastProviderContextProps } from \"./ToastProvider\";\n\n/**\n * Updates toasts after close\n * @param setToasts - Function to update toasts\n * @param setToastHeights - Function to update toast heights\n * @param id - Optional toast ID to close specific toast, or undefined to close all\n */\nconst setToastsAfterClose = (\n setToasts: ToastProviderContextProps[\"setToasts\"],\n setToastHeights: ToastProviderContextProps[\"setToastHeights\"],\n id?: string,\n) => {\n setToasts((prev) => (id ? prev.filter((t) => t.id !== id) : []));\n setToastHeights((prev) => (id ? prev.filter((t) => t.id !== id) : []));\n};\n\n/**\n * Closes a toast with animation support\n * @param setToasts - Function to update toasts\n * @param setToastHeights - Function to update toast heights\n * @param closingToastClassName - CSS class for closing animation\n * @param id - Optional toast ID to close specific toast, or undefined to close all\n */\nconst closeToast = (\n setToasts: ToastProviderContextProps[\"setToasts\"],\n setToastHeights: ToastProviderContextProps[\"setToastHeights\"],\n closingToastClassName: ToastProps[\"toastClassName\"],\n id?: string,\n) => {\n const prefersReducedMotion = globalThis.matchMedia(\n `(prefers-reduced-motion: reduce)`,\n ).matches;\n\n if (prefersReducedMotion) {\n setToastsAfterClose(setToasts, setToastHeights, id);\n } else {\n // show the close animation\n setToasts((prev) =>\n prev.map((t) => {\n if (!id || t.id === id) {\n return {\n ...t,\n toastClassName: closingToastClassName,\n };\n }\n return t;\n }),\n );\n // actually remove the toast\n setTimeout(() => {\n setToastsAfterClose(setToasts, setToastHeights, id);\n }, ANIMATION_DURATION - 10);\n }\n};\n\n/**\n * Hook that returns a function to close toasts\n * @param closingToastClassName - CSS class for closing animation\n * @returns Function to close toasts by ID or all toasts\n */\nexport const useCloseToast = (\n closingToastClassName: ToastProps[\"toastClassName\"],\n) => {\n const { setToasts, setToastHeights } = useToasts();\n return (id?: string) => {\n closeToast(setToasts, setToastHeights, closingToastClassName, id);\n };\n};\n","import { CSSProperties, useMemo } from \"react\";\nimport { useToasts } from \"./useToasts\";\n\nconst STACKED_TOAST_HEIGHT = \"5.3125rem\"; // border + padding + title + gap + message\nconst STACKED_TOAST_PEEK_HEIGHT = \"1rem\";\n\n/**\n * Hook for calculating position styles for individual toasts\n * @param index - The index of the toast in the stack\n * @returns CSS properties for positioning the toast\n */\nexport const useToastPositionStyles = (\n index: number,\n): CSSProperties | undefined => {\n const {\n toasts,\n toastHeights,\n getToastStackHeight,\n toastsBeforeStack,\n extraToastsVisible,\n } = useToasts();\n const toastCount = toasts.length;\n const toasterHeight = getToastStackHeight(index);\n\n return useMemo(() => {\n if (index === toastCount - 1) {\n return {\n top: 0,\n zIndex: 3,\n };\n } else if (\n // all toasts when show more is clicked\n extraToastsVisible ||\n // or visible toasts when stacked\n (!extraToastsVisible &&\n (toastCount <= toastsBeforeStack ||\n (toastCount > toastsBeforeStack &&\n index >= toastCount - toastsBeforeStack)))\n ) {\n return {\n top: toasterHeight,\n };\n\n // stacked toasts\n } else {\n if (toastCount > toastsBeforeStack) {\n // first stack\n if (index === toastCount - toastsBeforeStack - 1) {\n return {\n top: `calc(${toasterHeight || 0}px - ${STACKED_TOAST_HEIGHT} +\n ${STACKED_TOAST_PEEK_HEIGHT})`,\n zIndex: 1,\n };\n // second stack and hidden toasts\n } else if (index <= toastCount - toastsBeforeStack - 2) {\n return {\n top: `calc(${toasterHeight || 0}px -\n ${STACKED_TOAST_HEIGHT} \n + ${STACKED_TOAST_PEEK_HEIGHT} * 2)`,\n zIndex: 0,\n };\n }\n }\n }\n return undefined;\n // only run when toastHeights changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toastHeights]);\n};\n","import cx from \"classnames\";\nimport { forwardRef, useEffect, useRef, useState } from \"react\";\n\nimport { Alert, AlertProps } from \"../../Alert\";\nimport { Button, ButtonProps } from \"../../Button\";\nimport { ProgressBar, ProgressBarProps } from \"../../ProgressBar\";\nimport { useSwipe, UseSwipeFn } from \"../../../hooks\";\n\nimport { ANIMATION_DURATION } from \"./constants\";\nimport { addOrUpdateToastHeight } from \"./addOrUpdateToastHeight\";\nimport { toast } from \"../toast\";\nimport { useCloseToast } from \"./useCloseToast\";\nimport { useToastPositionStyles } from \"./useToastPositionStyles\";\nimport { useToasts } from \"./useToasts\";\n\nimport styles from \"./Toaster.module.scss\";\n\ntype ToastAction = Pick<ButtonProps, \"appearance\" | \"onClick\"> & {\n label: string;\n};\n\n/**\n * Props for the Toast component\n * @extends ComponentPropsWithoutRef<\"div\">\n */\nexport type ToastProps = {\n // used in toast methods\n /**\n * Action buttons to display in the toast\n */\n actions?: { primary: ToastAction; secondary?: ToastAction };\n /**\n * CSS class name for the toast container\n */\n containerClassName?: string;\n /**\n * Duration in milliseconds before auto-dismiss. Set to false to disable auto-dismiss\n */\n duration?: number | false;\n /**\n * Additional message content to display below the title\n */\n message?: string;\n /**\n * Callback function called when toast is dismissed, expired, or closed\n */\n onDismiss?: () => void;\n /**\n * Progress bar value or indeterminate state\n */\n progress?: ProgressBarProps[\"value\"] | \"indeterminate\";\n /**\n * CSS class name for the toast element\n */\n toastClassName?: string;\n\n // used in toast methods and passed to alert\n /**\n * When set, displays the AI mark inline after the toast title.\n * Use `true` for the sparkle only, or pass tooltip/popover configuration.\n */\n aiMark?: AlertProps[\"aiMark\"];\n /**\n * Unique identifier for the toast\n */\n id: string;\n /**\n * This is only run when the \"x\" button is triggered on the toast.\n * To run a callback when the toast is closed, expired, or dismissed,\n * use the `onDismiss` parameter instead.\n */\n onClose?: AlertProps[\"onClose\"];\n /**\n * Visual status of the toast (info, success, warning, danger)\n */\n status: AlertProps[\"status\"];\n /**\n * Title text displayed in the toast\n */\n title: string;\n\n // used by toaster (internal)\n /**\n * Timestamp when the toast was created (internal use)\n */\n createdAt?: number;\n /**\n * Position index of the toast in the stack (internal use)\n */\n index?: number;\n /**\n * Whether the toast is below the stack index (internal use)\n */\n isBelowStackIndex?: boolean;\n /**\n * Whether the toast is currently stacked (internal use)\n */\n isStacked?: boolean;\n /**\n * Pause status for hover interactions (internal use)\n */\n pausedStatus?: number | \"resumed\";\n};\n\n/**\n * Toast component for displaying temporary notifications to users.\n *\n * Features:\n * - Supports different visual styles (info, success, warning, danger)\n * - Auto-dismiss with configurable duration\n * - Optional action buttons for user interaction\n * - Progress bar support for loading states\n * - Swipe gestures for dismissal\n * - Stacking behavior for multiple toasts\n * - Pause on hover functionality\n * - Accessible with proper ARIA roles\n * - Smooth animations and transitions\n *\n * @example\n * <Toast\n * id=\"toast-1\"\n * status=\"success\"\n * title=\"Success!\"\n * message=\"Your changes have been saved.\"\n * duration={5000}\n * />\n */\nexport const Toast = forwardRef<HTMLDivElement, ToastProps>(\n (\n {\n actions,\n containerClassName,\n createdAt,\n duration: durationProp,\n index = 0,\n isBelowStackIndex,\n isStacked,\n message,\n onClose,\n onDismiss,\n pausedStatus,\n progress,\n toastClassName,\n ...alertProps\n },\n ref,\n ) => {\n const { setToastHeights, extraToastsVisible, isDialogToaster } =\n useToasts();\n const closeToast = useCloseToast(styles.close);\n const toastPositionStyles = useToastPositionStyles(index);\n\n const toastWrapperRef = useRef<HTMLDivElement>(null);\n const timerRef = useRef<NodeJS.Timeout | undefined>();\n const pausedAtRef = useRef<number>(0);\n const createdAtRef = useRef<number>(createdAt ?? 0);\n const hasBeenStackedRef = useRef<boolean>(false);\n\n const [transitionClass, setTransitionClass] = useState<string | undefined>(\n styles.hidden,\n );\n const [toastOpened, setToastOpened] = useState<boolean>(false);\n\n // don't allow toasts to auto-dismiss when actions are present\n const duration = actions ? false : durationProp;\n\n const alertClasses = cx(\n styles[\"toast-alert\"],\n toastClassName,\n transitionClass,\n );\n\n useEffect(() => {\n // add styles for opening animation then remove\n if (!toastOpened) {\n setTransitionClass(styles.open);\n\n setTimeout(() => {\n setTransitionClass(undefined);\n }, ANIMATION_DURATION);\n\n // manually set toast opened since animation is not run\n setToastOpened(true);\n }\n return () => {\n // run when toast is closed\n onDismiss?.();\n };\n // only run this once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // send height to toast provider for positioning calculations on open\n useEffect(() => {\n if (toastWrapperRef.current && toastOpened && !isStacked) {\n if ((isBelowStackIndex && extraToastsVisible) || isDialogToaster) {\n // animation is disabled when dialog toaster first opens\n const delay = isDialogToaster ? 0 : ANIMATION_DURATION;\n\n setTimeout(() => {\n const height = toastWrapperRef.current?.clientHeight;\n addOrUpdateToastHeight(alertProps.id, height ?? 0, setToastHeights);\n }, delay); // get correct height after width transition\n } else {\n const height = toastWrapperRef.current.clientHeight;\n addOrUpdateToastHeight(alertProps.id, height, setToastHeights);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n toastOpened,\n isStacked,\n extraToastsVisible,\n isDialogToaster,\n // toast updates\n actions,\n message,\n alertProps.title,\n ]);\n\n // handle duration timeout and pausing when hovering over toaster\n useEffect(() => {\n if (duration && !isStacked) {\n // initial render\n if (!pausedStatus) {\n timerRef.current = setTimeout(\n () => closeToast(alertProps.id),\n duration,\n );\n return () => clearTimeout(timerRef.current);\n\n // initial hovering over toaster\n } else if (typeof pausedStatus === \"number\") {\n clearTimeout(timerRef.current);\n pausedAtRef.current = pausedStatus;\n\n // after initial hovering over toaster\n } else if (pausedStatus === \"resumed\") {\n const remainingDuration =\n // rendering new toast after initial hover\n pausedAtRef.current === 0\n ? duration\n : // resume timer after valid hover\n duration + (createdAtRef.current || 0) - pausedAtRef.current;\n\n timerRef.current = setTimeout(() => {\n closeToast(alertProps.id);\n pausedAtRef.current = 0;\n }, remainingDuration);\n\n return () => clearTimeout(timerRef.current);\n }\n }\n // don't want to re-render here for alertProps.id, closeToast, or isStacked\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [createdAtRef.current, duration, pausedStatus]);\n\n // disable timeout when toasts are stacked\n useEffect(() => {\n if (duration) {\n // stop timer if toast is stacked (hidden)\n if (isStacked) {\n clearTimeout(timerRef.current);\n hasBeenStackedRef.current = true;\n\n // reset timer after moving out of the stack\n } else if (\n !isStacked &&\n hasBeenStackedRef.current &&\n !(typeof pausedStatus === \"number\")\n ) {\n createdAtRef.current = Date.now();\n\n timerRef.current = setTimeout(() => {\n closeToast(alertProps.id);\n hasBeenStackedRef.current = false;\n }, duration);\n\n return () => clearTimeout(timerRef.current);\n }\n }\n // only run if isStacked or duration change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isStacked, duration]);\n\n const onSwipe = (dir: UseSwipeFn[\"direction\"]) => {\n if (dir === \"right\") {\n toast.dismiss(alertProps.id);\n return;\n }\n };\n\n const { direction, ...touchProps } = useSwipe(onSwipe);\n\n const alertCloseProps:\n | {\n onClose: AlertProps[\"onClose\"];\n }\n | Record<string, never> =\n isStacked && !extraToastsVisible\n ? {}\n : {\n onClose,\n };\n\n const hasMessage = message && message !== \"\";\n const hasProgress = progress != null;\n\n return (\n <div\n data-anv=\"toast\"\n className={containerClassName}\n style={toastPositionStyles ?? { top: \"1.5rem\" }}\n ref={toastWrapperRef}\n onAnimationStart={() => setToastOpened(true)}\n role={isStacked ? \"presentation\" : undefined}\n {...touchProps}\n >\n <Alert\n className={alertClasses}\n {...alertProps}\n {...alertCloseProps}\n ref={ref}\n tabIndex={isStacked && !extraToastsVisible ? -1 : 0}\n >\n {hasMessage || hasProgress || actions ? (\n <>\n {hasMessage ? (\n <div\n className={styles[\"message-container\"]}\n id={`toast-message-${alertProps.id}`}\n >\n {message}\n </div>\n ) : null}\n\n {hasProgress ? (\n <>\n {progress === \"indeterminate\" ? (\n <ProgressBar\n aria-labelledby={`toast-message-${alertProps.id}`}\n indeterminate\n />\n ) : (\n <ProgressBar\n aria-labelledby={`toast-message-${alertProps.id}`}\n value={progress}\n />\n )}\n </>\n ) : null}\n\n {actions ? (\n <div className={styles[\"alert-action\"]}>\n <Button\n appearance={actions.primary.appearance}\n onClick={actions.primary.onClick}\n size=\"small\"\n >\n {actions.primary.label}\n </Button>\n\n {actions.secondary && (\n <Button\n appearance={actions.secondary.appearance}\n onClick={actions.secondary.onClick}\n size=\"small\"\n >\n {actions.secondary.label}\n </Button>\n )}\n </div>\n ) : null}\n </>\n ) : null}\n </Alert>\n </div>\n );\n },\n);\n\nToast.displayName = \"Toast\";\n","import { MutableRefObject, useEffect, useRef, useState } from \"react\";\nimport { getActiveElement } from \"../../../internal/functions\";\n\ntype HotkeyFocusParams = {\n disabled: boolean;\n hotkey: string;\n onHotkeyIn?: () => void | Promise<void>;\n onHotkeyOut?: () => void | Promise<void>;\n refToFocus: MutableRefObject<HTMLElement>;\n rootRef: MutableRefObject<HTMLElement>;\n};\n\n/**\n * A hook that listens for a hotkey press and focuses an element when the hotkey is pressed.\n * The hook also listens for the Escape key to blur the element and refocus the previous element.\n *\n * @param params\n * @param params.disabled - If true, the hotkey will not be active\n * @param params.hotkey - The key to press to focus the element\n * @param params.onHotkeyIn - A function to run when the hotkey is pressed; this runs before the element is focused\n * @param params.onHotkeyOut - A function to run when the user presses Escape after focusing the element\n * @param params.refToFocus - The ref to the element that will be focused when the hotkey is pressed\n * @param params.rootRef - The ref to the element that will listen for changes to focus, disabling the Escape key\n */\nexport const useHotkeyFocus = ({\n disabled,\n hotkey,\n onHotkeyIn,\n onHotkeyOut,\n refToFocus,\n rootRef,\n}: HotkeyFocusParams) => {\n const [shouldEscapeRefocus, setShouldEscapeRefocus] = useState(false);\n const previousFocusElement = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (disabled || typeof document === \"undefined\") return;\n const rootElement = rootRef.current;\n\n const blurHandler = (e: FocusEvent) => {\n if (e.relatedTarget && rootElement.contains(e.relatedTarget as Node)) {\n return;\n }\n // If the user's focus leaves the area, pressing Escape will no longer refocus the previous element\n setShouldEscapeRefocus(false);\n };\n\n const keyDownHandler = async (e: KeyboardEvent) => {\n const activeElement = getActiveElement(document);\n\n if (\n activeElement?.tagName.toLowerCase() !== \"input\" &&\n activeElement?.tagName.toLowerCase() !== \"textarea\" &&\n activeElement?.tagName.toLowerCase() !== \"pre\" &&\n e.key === hotkey\n ) {\n e.preventDefault();\n previousFocusElement.current = activeElement as HTMLElement | null;\n await onHotkeyIn?.();\n\n if (refToFocus.current) {\n refToFocus.current.focus();\n setShouldEscapeRefocus(true);\n if (refToFocus.current.scrollTo) {\n refToFocus.current.scrollTo();\n }\n }\n } else if (e.code === \"Escape\" && shouldEscapeRefocus) {\n onHotkeyOut?.();\n if (\n previousFocusElement.current &&\n previousFocusElement.current.tagName.toLowerCase() !== \"body\"\n ) {\n (previousFocusElement.current as HTMLElement).focus();\n } else {\n (activeElement as HTMLElement).blur();\n }\n }\n };\n\n document.addEventListener(\"keydown\", keyDownHandler);\n rootElement.addEventListener(\"focusout\", blurHandler);\n\n return () => {\n document.removeEventListener(\"keydown\", keyDownHandler);\n rootElement.removeEventListener(\"focusout\", blurHandler);\n };\n }, [\n hotkey,\n disabled,\n rootRef,\n shouldEscapeRefocus,\n onHotkeyIn,\n refToFocus,\n onHotkeyOut,\n ]);\n\n return { returnFocusRef: previousFocusElement };\n};\n","import { CSSProperties, useMemo } from \"react\";\nimport { useToasts } from \"./useToasts\";\n\n/**\n * Hook for calculating position styles for the show more button\n * @returns CSS properties for positioning the show more button\n */\nexport const useShowMoreButtonPositionStyles = (): CSSProperties => {\n const { toasts, toastHeights, toastsBeforeStack } = useToasts();\n const totalToasts = toasts.length;\n const extraSpace = totalToasts > toastsBeforeStack + 1 ? \"2rem\" : \"1rem\";\n const top = useMemo(() => {\n if (totalToasts > toastsBeforeStack) {\n // Build a height lookup map by toast ID for correct matching\n const heightMap = new Map(toastHeights.map((t) => [t.id, t.height]));\n\n // Use the toasts array to get the visible (non-stacked) toasts' heights\n return toasts\n .slice(-toastsBeforeStack)\n .map((t) => heightMap.get(t.id))\n .filter((h): h is number => h !== undefined)\n .reduce((t, c) => t + c, 0);\n }\n return \"unset\";\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toasts, toastHeights, toastsBeforeStack]);\n\n return {\n // -0.75px fixes hover issue when 1rem != 16px due to pixel rounding\n top: `calc(${top}px + ${extraSpace} - 0.75px)`,\n position: \"absolute\",\n display: totalToasts > toastsBeforeStack ? undefined : \"none\",\n transition: \"top var(--a2-toaster-animation-duration) ease-in\",\n };\n};\n","import {\n ComponentPropsWithoutRef,\n forwardRef,\n useEffect,\n useRef,\n useCallback,\n useState,\n useMemo,\n CSSProperties,\n} from \"react\";\nimport cx from \"classnames\";\n\nimport { Button } from \"../../Button\";\nimport { useMergeRefs } from \"../../../hooks\";\nimport { SrOnly } from \"../../SrOnly\";\n\nimport {\n ANIMATION_DURATION,\n TOAST_STACK_PADDING,\n EXPAND_BUTTON_HEIGHT_WITH_PADDING,\n SCROLL_THRESHOLD,\n EVENT_THROTTLE_MS,\n} from \"./constants\";\nimport { Toast, ToastProps } from \"./Toast\";\nimport { toast } from \"../toast\";\nimport { useHotkeyFocus } from \"./useHotkeyFocus\";\nimport { useShowMoreButtonPositionStyles } from \"./useShowMoreButtonPositionStyles\";\nimport { useToasts } from \"./useToasts\";\n\nimport styles from \"./Toaster.module.scss\";\n\n/**\n * Props for the ToastStack component\n * @extends ComponentPropsWithoutRef<\"div\">\n */\nexport type ToastStackProps = Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"children\"\n> & {\n /**\n * Duration of the toast in milliseconds. If set to `false`, the toast will not auto-dismiss.\n * If `actions` are provided in the toast method, this prop will be ignored and treated as `false`.\n * @default false\n */\n duration?: number | false;\n /**\n * How a screen-reader will announce the hotkey used to set focus on the first toast.\n * @default \"t\"\n */\n focusKey?: string;\n /**\n * How many toasts to display before they start stacking.\n * @default 3\n */\n toastsBeforeStack?: number;\n /**\n * The toasts to display in the stack.\n * @default []\n */\n toasts: ToastProps[];\n};\n\n/**\n * ToastStack component for displaying a stack of toast notifications.\n *\n * Features:\n * - Displays multiple toasts in a vertical stack\n * - Automatic stacking behavior when toast count exceeds limit\n * - Show more button to expand stacked toasts\n * - Keyboard navigation with hotkey support\n * - Hover pause functionality for toast timers\n * - Smooth animations and transitions\n * - Accessibility features with screen reader support\n * - Responsive design with mobile touch support\n * - Focus management for keyboard users\n *\n * @example\n * <ToastStack\n * toasts={toastList}\n * duration={5000}\n * toastsBeforeStack={3}\n * focusKey=\"t\"\n * />\n *\n * @example\n * <ToastStack\n * toasts={[toast1, toast2]}\n * duration={false}\n * toastsBeforeStack={5}\n * />\n */\nexport const ToastStack = forwardRef<HTMLDivElement, ToastStackProps>(\n (\n {\n className,\n duration = false,\n focusKey = \"t\",\n toasts,\n toastsBeforeStack = 3,\n ...props\n },\n ref,\n ) => {\n const toastStackRef = useRef<HTMLDivElement>(null);\n const firstToastRef = useRef<HTMLDivElement | null>(null);\n const mergedToastStackRef = useMergeRefs([toastStackRef, ref]);\n const {\n setToastsBeforeStack,\n extraToastsVisible,\n setExtraToastsVisible,\n getToastStackHeight,\n isDialogToaster,\n } = useToasts();\n const toastCount = toasts.length;\n const isToastStackEmpty = toastCount === 0;\n\n const lastToastCount = useRef<number>(0);\n const resizeThrottleRef = useRef(false);\n const resizeTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const scrollThrottleRef = useRef(false);\n const scrollTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const [toastStackHeight, setToastStackHeight] = useState<number>(0);\n const [disableAnimations, setDisableAnimations] = useState(false);\n const [toastPausedStatus, setToastPausedStatus] =\n useState<ToastProps[\"pausedStatus\"]>(undefined);\n const [showTopGradient, setShowTopGradient] = useState(false);\n const [showBottomGradient, setShowBottomGradient] = useState(true);\n // Initialize to 0 for SSR compatibility; set actual value in useEffect\n const [viewportHeight, setViewportHeight] = useState<number>(0);\n\n const isOverflowing =\n toastStackHeight + EXPAND_BUTTON_HEIGHT_WITH_PADDING > viewportHeight;\n\n // Update viewport height on window resize (throttled)\n useEffect(() => {\n // Set initial value on mount\n setViewportHeight(window.innerHeight - TOAST_STACK_PADDING);\n\n const handleResize = () => {\n if (resizeThrottleRef.current) return;\n\n resizeThrottleRef.current = true;\n resizeTimerRef.current = setTimeout(() => {\n setViewportHeight(window.innerHeight - TOAST_STACK_PADDING);\n resizeThrottleRef.current = false;\n }, EVENT_THROTTLE_MS);\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => {\n clearTimeout(resizeTimerRef.current);\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n useEffect(() => {\n if (toastCount === 0) {\n setToastPausedStatus(undefined);\n }\n }, [toastCount]);\n\n // Track scroll position to show/hide gradients (only when expanded)\n useEffect(() => {\n const toastStackElement = toastStackRef.current;\n\n // When collapsed with overflow, just show bottom gradient (no scroll tracking)\n if (!extraToastsVisible) {\n setShowTopGradient(false);\n setShowBottomGradient(isOverflowing);\n return;\n }\n\n if (!toastStackElement) {\n setShowTopGradient(false);\n setShowBottomGradient(true);\n return;\n }\n\n const updateGradients = () => {\n const { scrollTop, scrollHeight, clientHeight } = toastStackElement;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n // Show top gradient when scrolled down from top\n setShowTopGradient(scrollTop > 0);\n // Show bottom gradient when not at bottom (within threshold)\n setShowBottomGradient(distanceFromBottom > SCROLL_THRESHOLD);\n };\n\n const handleScroll = () => {\n if (scrollThrottleRef.current) return;\n\n scrollThrottleRef.current = true;\n scrollTimerRef.current = setTimeout(() => {\n updateGradients();\n scrollThrottleRef.current = false;\n }, EVENT_THROTTLE_MS);\n };\n\n // Initial check (unthrottled)\n updateGradients();\n\n toastStackElement.addEventListener(\"scroll\", handleScroll, {\n passive: true,\n });\n return () => {\n clearTimeout(scrollTimerRef.current);\n toastStackElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [extraToastsVisible, isOverflowing]);\n\n useEffect(() => {\n const scrollListener = (e: WheelEvent) => {\n e.preventDefault();\n e.stopPropagation();\n toastStackRef.current?.scrollTo({\n top: toastStackRef.current.scrollTop + e.deltaY,\n });\n };\n\n if (isDialogToaster) {\n // prevent existing toasts from sliding in again\n setDisableAnimations(isDialogToaster);\n const animationTimer = setTimeout(() => {\n setDisableAnimations(false);\n }, 500);\n\n // fix scrolling for toast stacks in dialogs\n const toastStackRefCurrent = toastStackRef.current;\n toastStackRefCurrent?.addEventListener(\"wheel\", scrollListener, {\n passive: false,\n });\n\n return () => {\n clearTimeout(animationTimer);\n toastStackRefCurrent?.removeEventListener(\"wheel\", scrollListener);\n };\n }\n }, [isDialogToaster]);\n\n // reset toast stack height when toasts change\n useEffect(() => {\n let timer: NodeJS.Timeout;\n if (\n toastCount > lastToastCount.current ||\n isDialogToaster ||\n extraToastsVisible\n ) {\n // Update immediately when adding toasts or expanding\n setToastStackHeight(getToastStackHeight());\n } else {\n // Delay update when removing toasts or collapsing to allow animation\n timer = setTimeout(\n () => setToastStackHeight(getToastStackHeight()),\n ANIMATION_DURATION - 10,\n );\n }\n lastToastCount.current = toastCount;\n return () => {\n clearTimeout(timer);\n };\n // only run after toastStackHeight updates or dialog state changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getToastStackHeight, isDialogToaster, extraToastsVisible]);\n\n useEffect(() => {\n setToastsBeforeStack(toastsBeforeStack);\n }, [setToastsBeforeStack, toastsBeforeStack]);\n\n // Collapse the toast stack (only called by collapse button)\n const handleCollapseStack = useCallback(() => {\n setExtraToastsVisible(false);\n setToastPausedStatus(\"resumed\");\n\n if (toastStackRef.current?.scrollTo) {\n toastStackRef.current?.scrollTo(0, 0);\n }\n }, [setExtraToastsVisible]);\n\n const handleResumeToastTimers = useCallback(() => {\n setToastPausedStatus(\"resumed\");\n }, []);\n\n const { returnFocusRef } = useHotkeyFocus({\n disabled: isToastStackEmpty,\n hotkey: focusKey,\n onHotkeyIn: async () => {\n setExtraToastsVisible(true);\n return new Promise((resolve) => {\n // add a delay for the ToastStack to render the hidden toasts\n setTimeout(() => {\n resolve();\n }, 100);\n });\n },\n onHotkeyOut: () => {\n handleResumeToastTimers();\n },\n refToFocus: firstToastRef as React.MutableRefObject<HTMLElement>,\n rootRef: toastStackRef as React.MutableRefObject<HTMLElement>,\n });\n\n const showMoreButtonPositionStyles = useShowMoreButtonPositionStyles();\n\n const showExpandCollapseButton = toastCount > toastsBeforeStack;\n const expandCollapseButtonText = extraToastsVisible\n ? \"Collapse all\"\n : \"Expand all\";\n\n // Use getToastStackHeight() directly to avoid stale state during expand animation\n const currentStackHeight = useMemo(\n () => getToastStackHeight(),\n [getToastStackHeight],\n );\n\n // Check if current stack would overflow (for button animation)\n // Include button space to trigger overflow if button would be off-screen at all\n const hasOverflow =\n currentStackHeight + EXPAND_BUTTON_HEIGHT_WITH_PADDING > viewportHeight;\n\n // Calculate button top position\n const expandCollapseButtonTop: CSSProperties[\"top\"] = hasOverflow\n ? `calc(100dvh - 4.5rem)`\n : extraToastsVisible\n ? `calc(${currentStackHeight}px - 1rem)`\n : showMoreButtonPositionStyles.top;\n\n const toastStackClasses = cx(styles[\"toast-stack\"], className, {\n [styles[\"show-more-button\"]]:\n showExpandCollapseButton && !extraToastsVisible,\n [styles[\"show-extra-toast\"]]: extraToastsVisible,\n [styles[\"disable-animations\"]]: disableAnimations,\n [styles[\"has-overflow\"]]: hasOverflow,\n });\n\n const handleToastStackFocusHover = () => {\n if (toastPausedStatus === \"resumed\" || toastPausedStatus === undefined) {\n setToastPausedStatus(Date.now());\n }\n };\n\n const handleToastStackOnBlur = () => {\n if (!toastStackRef.current?.matches(\":focus-within\")) {\n handleResumeToastTimers();\n }\n };\n\n const handleExpandCollapseClick = () => {\n if (extraToastsVisible) {\n handleCollapseStack();\n } else {\n setExtraToastsVisible(true);\n }\n };\n\n let toastStackHeightStyle: CSSProperties[\"height\"] = 0;\n\n if (extraToastsVisible) {\n // need to reduce padding here due to box-sizing: content-box\n toastStackHeightStyle =\n \"calc(100vh - var(--a2-mod-toaster-stack-padding) * 2)\";\n } else if (toastCount > toastsBeforeStack) {\n // 3rem to leave room for show more button\n toastStackHeightStyle = `calc(${toastStackHeight}px + 3rem + var(--a2-mod-toaster-stack-padding))`;\n } else {\n toastStackHeightStyle = toastStackHeight;\n }\n\n return (\n <>\n <div\n data-anv=\"ToastStack\"\n className={toastStackClasses}\n ref={mergedToastStackRef}\n onMouseOver={handleToastStackFocusHover}\n onMouseLeave={handleResumeToastTimers}\n onFocus={handleToastStackFocusHover}\n onBlur={handleToastStackOnBlur}\n style={{\n height: toastStackHeightStyle,\n }}\n {...props}\n >\n {toasts.map(({ toastClassName, onClose, ...toastProps }, index) => {\n const isStacked =\n !extraToastsVisible && index < toastCount - toastsBeforeStack;\n\n const isLastToastDisplayed =\n index === toastCount - toastsBeforeStack;\n\n const isHidden = index < toastCount - toastsBeforeStack - 2;\n\n const toastClasses = cx(styles.toast, toastClassName);\n const toastContainerClasses = cx(styles[\"toast-wrapper\"], {\n [styles.stacked]: isStacked || isLastToastDisplayed,\n [styles[\"stack-one\"]]:\n isStacked && index === toastCount - toastsBeforeStack - 1,\n [styles[\"stack-two\"]]:\n isStacked && index === toastCount - toastsBeforeStack - 2,\n [styles[\"stacked-extra\"]]: isHidden,\n [styles[\"stacked-show-extra\"]]: extraToastsVisible,\n });\n\n const handleOnClose = (\n e: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n ) => {\n onClose?.(e);\n returnFocusRef.current?.focus();\n toast.dismiss(toastProps.id);\n };\n\n return (\n <Toast\n containerClassName={toastContainerClasses}\n duration={duration}\n index={index}\n isStacked={isStacked}\n isBelowStackIndex={index < toastCount - toastsBeforeStack}\n key={toastProps.id}\n onClose={handleOnClose}\n pausedStatus={toastPausedStatus}\n toastClassName={toastClasses}\n ref={index === 0 ? firstToastRef : undefined}\n {...toastProps}\n />\n );\n })}\n {showExpandCollapseButton && (\n <div\n className={cx(styles[\"show-more-button-container\"], {\n [styles[\"fixed-position\"]]: hasOverflow,\n })}\n style={{ top: expandCollapseButtonTop }}\n >\n <Button\n className={styles[\"show-collapse-button\"]}\n onClick={handleExpandCollapseClick}\n appearance=\"secondary\"\n >\n {expandCollapseButtonText}\n </Button>\n </div>\n )}\n {/* Spacer element to extend scroll area so last toast can scroll above the fixed button (only when expanded) */}\n {extraToastsVisible && hasOverflow && (\n <div\n className={styles[\"toast-stack-spacer\"]}\n style={{ top: `calc(${currentStackHeight}px + 2rem)` }}\n aria-hidden=\"true\"\n />\n )}\n <SrOnly aria-live=\"polite\">\n New toast message appeared. Press the {focusKey} key to focus on the\n toast messages. Press escape to return focus to previous position.\n </SrOnly>\n </div>\n {hasOverflow && (\n <>\n <div\n className={cx(styles[\"toast-stack-gradient-top\"], {\n [styles[\"toast-stack-gradient-visible\"]]: showTopGradient,\n })}\n aria-hidden=\"true\"\n />\n <div\n className={cx(styles[\"toast-stack-gradient-bottom\"], {\n [styles[\"toast-stack-gradient-visible\"]]: showBottomGradient,\n })}\n aria-hidden=\"true\"\n />\n </>\n )}\n </>\n );\n },\n);\n\nToastStack.displayName = \"ToastStack\";\n","import cx from \"classnames\";\nimport {\n ComponentPropsWithoutRef,\n forwardRef,\n useEffect,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nimport { ANIMATION_DURATION } from \"./constants\";\nimport { ToastProvider } from \"./ToastProvider\";\nimport {\n ToastCustomEventDetail,\n ToastCustomEventDetailAdd,\n ToastCustomEventDetailUpdate,\n ToastUpdateProps,\n} from \"./types\";\nimport { ToastProps } from \"./Toast\";\nimport { ToastStack, ToastStackProps } from \"./ToastStack\";\nimport { ToasterPopover } from \"./ToasterPopover\";\nimport { useCloseToast } from \"./useCloseToast\";\nimport { useMergeRefs } from \"../../../hooks\";\nimport { useToasts } from \"./useToasts\";\n\nimport styles from \"./Toaster.module.scss\";\n\nexport type ToastEventType = {\n eventType: \"add\" | \"update\" | \"dismiss\" | \"dismiss-all\";\n toastCount: number;\n id?: string;\n toasterId?: string;\n toastProps?: ToastProps | ToastUpdateProps;\n};\n\n/**\n * Props for the Toaster component\n * @extends ComponentPropsWithoutRef<\"div\">\n * @extends Omit<ToastStackProps, \"toasts\">\n */\nexport type ToasterProps = ComponentPropsWithoutRef<\"div\"> &\n Omit<ToastStackProps, \"toasts\"> & {\n /**\n * When `true`, the toaster will not listen for custom events to add, update, or dismiss toasts.\n * Use this to prevent multiple toasters from displaying the same toasts.\n * @default false\n */\n disableEvents?: boolean;\n /**\n * Unique toaster id.\n */\n id: string;\n /**\n * Callback function that is called when toasts are added, updated, or dismissed.\n */\n onToastEvent?: (toastEvent: ToastEventType) => void;\n };\n\ntype DialogToasterCustomEventDetail = {\n eventType: \"dialog-toaster\";\n};\ntype DialogToasterCustomEvent = CustomEvent<DialogToasterCustomEventDetail>;\n\n/**\n * Toaster component for managing and displaying toast notifications.\n *\n * Features:\n * - Manages multiple toast notifications in a stack\n * - Handles toast positioning and stacking behavior\n * - Supports custom events for toast management\n * - Automatic toast dismissal with configurable duration\n * - Keyboard navigation and accessibility support\n * - Dialog-aware positioning for modal contexts\n * - Session storage for dialog toaster state\n * - Custom event system for toast lifecycle management\n * - Responsive design with mobile support\n *\n * @example\n * <Toaster\n * id=\"main-toaster\"\n * duration={5000}\n * toastsBeforeStack={3}\n * onToastEvent={(event) => console.log('Toast event:', event)}\n * />\n *\n * @example\n * <Toaster\n * id=\"dialog-toaster\"\n * disableEvents={false}\n * focusKey=\"t\"\n * />\n */\nexport const ToasterContent = forwardRef<HTMLDivElement, ToasterProps>(\n (\n {\n className,\n disableEvents = false,\n id,\n onToastEvent,\n\n // ToastStackProps\n duration,\n focusKey,\n toastsBeforeStack,\n ...props\n },\n ref,\n ) => {\n const toasterRef = useRef<HTMLDivElement>(null);\n const mergedToasterRef = useMergeRefs([toasterRef, ref]);\n\n const { toasts, setToasts, isDialogToaster } = useToasts();\n\n // refs using state to be used inside event listeners\n const disableEventsRef = useRef<boolean>(disableEvents);\n const toastCountRef = useRef<number>(0);\n const isDialogToasterRef = useRef<boolean>(isDialogToaster);\n\n const [shouldHideToaster, setShouldHideToaster] = useState(false);\n\n const updateDialogToasterStorage = useCallback(\n (isDialogToaster: boolean) => {\n const dialogToasters = JSON.parse(\n window?.sessionStorage.getItem(\"dialog-toasters\") ?? \"[]\",\n );\n\n if (isDialogToaster) {\n if (!dialogToasters.includes(id)) {\n window?.sessionStorage.setItem(\n \"dialog-toasters\",\n JSON.stringify([...dialogToasters, id]),\n );\n }\n } else if (dialogToasters.includes(id)) {\n window?.sessionStorage.setItem(\n \"dialog-toasters\",\n JSON.stringify(\n dialogToasters.filter(\n (dialogToaster: string) => dialogToaster !== id,\n ),\n ),\n );\n }\n },\n [id],\n );\n\n useEffect(() => {\n disableEventsRef.current = disableEvents;\n }, [disableEvents]);\n\n useEffect(() => {\n toastCountRef.current = toasts.length;\n }, [toasts.length]);\n\n useEffect(() => {\n // update session storage\n updateDialogToasterStorage(isDialogToaster);\n // update ref for event listeners\n isDialogToasterRef.current = isDialogToaster;\n\n // Dispatch a custom event to notify other Toasters\n const DialogToasterEvent: DialogToasterCustomEvent =\n new CustomEvent<DialogToasterCustomEventDetail>(\"dialog-toaster\", {\n composed: true,\n detail: {\n eventType: \"dialog-toaster\",\n },\n });\n dispatchEvent(DialogToasterEvent);\n // don't need to check for function change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDialogToaster]);\n\n const closeToast = useCloseToast(styles.close);\n\n useEffect(() => {\n let timeout: NodeJS.Timeout | undefined;\n updateDialogToasterStorage(isDialogToaster);\n\n /**\n * Listen for custom events to add, update, or dismiss toasts.\n */\n const toastEventListener = (e: Event) => {\n if (disableEventsRef.current) {\n return;\n }\n\n const { eventType, ...toastProps } = (\n e as CustomEvent<ToastCustomEventDetail>\n ).detail;\n\n if (eventType === \"add\") {\n const toastAddProps = toastProps as ToastCustomEventDetailAdd;\n\n if (!toastAddProps.toasterId || toastAddProps.toasterId === id) {\n setToasts((prev) => [...prev, toastProps as ToastProps]);\n }\n\n // allow for state change to finish before calling onToastEvent()\n timeout = setTimeout(() => {\n onToastEvent?.({\n eventType: \"add\",\n toastCount: toastCountRef.current,\n id: toastAddProps.id,\n toasterId: id,\n toastProps: toastAddProps,\n });\n });\n } else if (eventType === \"update\") {\n const toastUpdateProps = toastProps as ToastCustomEventDetailUpdate;\n\n setToasts((prev) => {\n return prev.map((t) => {\n if (t.id === toastUpdateProps.id) {\n return {\n ...t,\n ...toastUpdateProps,\n };\n } else {\n return t;\n }\n });\n });\n\n onToastEvent?.({\n eventType: \"update\",\n toastCount: toastCountRef.current,\n id: toastUpdateProps.id,\n toasterId: id,\n toastProps: toastUpdateProps,\n });\n } else if (eventType === \"dismiss\") {\n if (toastProps.id) {\n closeToast(toastProps.id);\n\n // allow for animation to finish before calling onToastEvent()\n timeout = setTimeout(() => {\n onToastEvent?.({\n eventType: \"dismiss\",\n toastCount: toastCountRef.current,\n id: toastProps.id,\n toasterId: id,\n });\n }, ANIMATION_DURATION);\n } else {\n closeToast();\n\n onToastEvent?.({\n eventType: \"dismiss-all\",\n toastCount: 0,\n toasterId: id,\n });\n }\n }\n };\n\n /**\n * Listen for custom events that indicate a dialog toaster is open or closed.\n */\n const dialogToasterEventListener = (e: Event) => {\n const { eventType } = (e as CustomEvent<DialogToasterCustomEventDetail>)\n .detail;\n if (eventType === \"dialog-toaster\") {\n const dialogToasters = JSON.parse(\n window?.sessionStorage.getItem(\"dialog-toasters\") ?? \"[]\",\n );\n if (dialogToasters.length > 0) {\n if (\n isDialogToasterRef.current &&\n dialogToasters[dialogToasters.length - 1] === id\n ) {\n setShouldHideToaster(false);\n } else {\n setShouldHideToaster(true);\n }\n } else {\n setShouldHideToaster(false);\n }\n }\n };\n\n const onPageRefreshListener = () => {\n window?.sessionStorage.removeItem(\"dialog-toasters\");\n };\n\n window?.addEventListener(\"hammer-toast\", toastEventListener);\n window?.addEventListener(\"dialog-toaster\", dialogToasterEventListener);\n window?.addEventListener(\"beforeunload\", onPageRefreshListener);\n\n return () => {\n window?.removeEventListener(\"hammer-toast\", toastEventListener);\n window?.removeEventListener(\n \"dialog-toaster\",\n dialogToasterEventListener,\n );\n window?.removeEventListener(\"beforeunload\", onPageRefreshListener);\n\n clearTimeout(timeout);\n updateDialogToasterStorage(false);\n };\n // only run on first render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const toasterClasses = cx(styles.toaster, {\n [styles[\"hidden\"]]: shouldHideToaster,\n [`${className}`]: className != null,\n });\n\n return (\n <div\n data-anv=\"toaster\"\n data-toaster-id={id}\n aria-hidden={shouldHideToaster}\n className={toasterClasses}\n ref={mergedToasterRef}\n {...props}\n >\n <ToastStack\n toasts={toasts}\n duration={duration}\n focusKey={focusKey}\n toastsBeforeStack={toastsBeforeStack}\n />\n </div>\n );\n },\n);\n\nexport const Toaster = forwardRef<HTMLDivElement, ToasterProps>(\n (props, ref) => {\n return (\n <ToastProvider>\n <ToasterPopover>\n <ToasterContent {...props} ref={ref} />\n </ToasterPopover>\n </ToastProvider>\n );\n },\n);\n\nToaster.displayName = \"Toaster\";\nToasterContent.displayName = \"ToasterContent\";\n"],"names":["toasts","uuid","promise","isDialogToaster"],"mappings":"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","x_google_ignoreList":[5,6,7]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Toaster-fPcgIF7Q.js","sources":["../src/components/Toast/Toaster.tsx"],"sourcesContent":["import { Ref, forwardRef, useEffect, useRef, useState } from \"react\";\n\nimport { useMergeRefs } from \"../../hooks\";\n\nimport {\n ToasterProps as BaseToasterProps,\n Toaster as BaseToaster,\n ToastEventType,\n} from \"./internal/Toaster\";\n\nconst SHADOW_HOST_DATA_ATTRS = \"[data-mfe-portal-name], [data-mfe-name]\";\n\n/**\n * Props for the Toaster component\n * @property {number | false} [duration] - Timeout, in ms, before toasts auto-closes. If set to false, toasts will not auto-close\n * @property {string} id - Unique toaster id\n * @property {(toastEvent: ToastEventType) => void} [onToastEvent] - Callback function that is called when toasts are added, updated, or dismissed\n * @property {string} [focusKey] - How a screen-reader will announce the hotkey used to set focus on the first toast\n * @property {number} [toastsBeforeStack] - How many toasts to display before they start stacking\n * @extends Omit<BaseToasterProps, \"disableEvents\">\n */\nexport type ToasterProps = Omit<BaseToasterProps, \"disableEvents\">;\n\n/**\n * Toaster component for managing and displaying toast notifications with anvil2-specific features.\n *\n * Features:\n * - Manages multiple toast notifications in a stack\n * - Handles toast positioning and stacking behavior\n * - Supports custom events for toast management\n * - Automatic toast dismissal with configurable duration\n * - Keyboard navigation and accessibility support\n * - Dialog-aware positioning for modal contexts\n * - Session storage for dialog toaster state\n * - Custom event system for toast lifecycle management\n * - Responsive design with mobile support\n * - Automatic tracking ID generation for analytics\n * - Monolith toaster integration and coordination\n * - Shadow DOM support for micro-frontend environments\n * - A1 toast group compatibility and positioning\n *\n * @example\n * <Toaster\n * id=\"main-toaster\"\n * duration={5000}\n * toastsBeforeStack={3}\n * onToastEvent={(event) => console.log('Toast event:', event)}\n * />\n *\n * @example\n * <Toaster\n * id=\"dialog-toaster\"\n * disableEvents={false}\n * focusKey=\"t\"\n * />\n */\nexport const Toaster = forwardRef(\n ({ onToastEvent, ...props }: BaseToasterProps, ref: Ref<HTMLDivElement>) => {\n const { id } = props;\n\n const toasterRef = useRef<HTMLDivElement>(null);\n const mergedToasterRef = useMergeRefs([toasterRef, ref]);\n\n const [shouldDisableEvents, setShouldDisableEvents] =\n useState<boolean>(false);\n\n useEffect(() => {\n const toasters = document.querySelectorAll(\"[data-anv='toaster']\");\n const shadowToasters =\n (\n toasterRef.current?.getRootNode() as Document | ShadowRoot\n )?.querySelectorAll(\"[data-anv='toaster']\") || [];\n\n // Toaster(s) exist in the document, bail out if this toaster is not the first one\n if (\n toasters.length &&\n id !== toasters[0].getAttribute(\"data-toaster-id\")\n ) {\n setShouldDisableEvents(true);\n } else if (\n // Toaster(s) exist in the shadow dom, bail out if this toaster is not the first one\n shadowToasters.length &&\n id !== shadowToasters[0].getAttribute(\"data-toaster-id\")\n ) {\n setShouldDisableEvents(true);\n }\n }, [id]);\n\n const a1ToastGroupObserver = useRef<MutationObserver | null>(null);\n const a1ToastGroupObserverConnected = useRef<boolean>(false);\n const [a1ToastGroups, setA1ToastGroups] = useState<Element[]>([]);\n const [toastCount, setToastCount] = useState<number>(0);\n\n const handleToastEvent = (event: ToastEventType) => {\n const { toastCount: newToastCount } = event;\n setToastCount(newToastCount);\n onToastEvent?.(event);\n };\n\n const updateA1ToastGroups = () => {\n const mfeRoots = document.querySelectorAll(SHADOW_HOST_DATA_ATTRS);\n const a1ToastGroupsLocal = [\n ...document.getElementsByClassName(\"ToastGroup\"),\n ];\n\n if (mfeRoots.length > 0) {\n mfeRoots.forEach((el) => {\n setTimeout(() => {\n if (el.shadowRoot) {\n a1ToastGroupsLocal.push(\n ...el.shadowRoot.querySelectorAll(\".ToastGroup\"),\n );\n }\n setA1ToastGroups(a1ToastGroupsLocal);\n });\n });\n } else {\n setA1ToastGroups(a1ToastGroupsLocal);\n }\n };\n\n useEffect(() => {\n // set mutation observer for a1 toasts after initial render\n a1ToastGroupObserver.current = new MutationObserver(updateA1ToastGroups);\n }, []);\n\n /*\n Listen for any new A1 Toast Groups to adjust styles and\n prevent overlapping.\n */\n useEffect(() => {\n if (a1ToastGroupObserver.current !== null) {\n if (toastCount > 0 && a1ToastGroupObserverConnected.current === false) {\n // listen for any new a1 toasts\n a1ToastGroupObserver.current.observe(document.body, {\n childList: true,\n subtree: true,\n });\n a1ToastGroupObserverConnected.current = true;\n\n // account for already existing a1 toasts\n updateA1ToastGroups();\n } else if (\n toastCount === 0 &&\n a1ToastGroupObserverConnected.current === true\n ) {\n a1ToastGroupObserver.current.disconnect();\n a1ToastGroupObserverConnected.current = false;\n }\n }\n }, [toastCount]);\n\n useEffect(() => {\n if (a1ToastGroups && a1ToastGroups.length > 0) {\n const toasterHeight =\n toasterRef.current?.firstElementChild?.getBoundingClientRect()\n .height as number;\n a1ToastGroups.forEach((group) => {\n (group as HTMLDivElement).style.top =\n toastCount === 0 ? \"16px\" : `calc(${toasterHeight}px + 2.5rem)`;\n });\n }\n // eslint-disable-next-line\n }, [a1ToastGroups.length, toastCount]);\n\n return (\n <BaseToaster\n {...props}\n onToastEvent={handleToastEvent}\n disableEvents={shouldDisableEvents}\n ref={mergedToasterRef}\n />\n );\n },\n);\n\nToaster.displayName = \"Toaster\";\n"],"names":["BaseToaster"],"mappings":"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"}