@oxyhq/bloom 0.50.2 → 0.51.1

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 (567) hide show
  1. package/NOTICE +89 -0
  2. package/README.md +12 -7
  3. package/lib/commonjs/avatar-group/AvatarGroup.web.js +2 -1
  4. package/lib/commonjs/avatar-group/AvatarGroup.web.js.map +1 -1
  5. package/lib/commonjs/bottom-sheet/index.web.js +2 -1
  6. package/lib/commonjs/bottom-sheet/index.web.js.map +1 -1
  7. package/lib/commonjs/context-menu/index.web.js +3 -2
  8. package/lib/commonjs/context-menu/index.web.js.map +1 -1
  9. package/lib/commonjs/dialog/Dialog.web.js +4 -3
  10. package/lib/commonjs/dialog/Dialog.web.js.map +1 -1
  11. package/lib/commonjs/frosted-icon-button/shared.js +1 -1
  12. package/lib/commonjs/index.js +90 -83
  13. package/lib/commonjs/index.js.map +1 -1
  14. package/lib/commonjs/index.web.js +116 -109
  15. package/lib/commonjs/index.web.js.map +1 -1
  16. package/lib/commonjs/menu/index.web.js +2 -1
  17. package/lib/commonjs/menu/index.web.js.map +1 -1
  18. package/lib/commonjs/popover/index.web.js +3 -2
  19. package/lib/commonjs/popover/index.web.js.map +1 -1
  20. package/lib/commonjs/portal/index.js +4 -1
  21. package/lib/commonjs/portal/index.js.map +1 -1
  22. package/lib/commonjs/progressive-blur/index.js +79 -0
  23. package/lib/commonjs/progressive-blur/index.js.map +1 -0
  24. package/lib/commonjs/progressive-blur/index.web.js +67 -0
  25. package/lib/commonjs/progressive-blur/index.web.js.map +1 -0
  26. package/lib/commonjs/progressive-blur/shared.js +66 -0
  27. package/lib/commonjs/progressive-blur/shared.js.map +1 -0
  28. package/lib/commonjs/progressive-blur/types.js +6 -0
  29. package/lib/commonjs/progressive-blur/types.js.map +1 -0
  30. package/lib/commonjs/select/index.web.js +2 -1
  31. package/lib/commonjs/select/index.web.js.map +1 -1
  32. package/lib/commonjs/styles/web-view-style.js +26 -0
  33. package/lib/commonjs/styles/web-view-style.js.map +1 -0
  34. package/lib/commonjs/tab-bar/TabBarBase.js +415 -0
  35. package/lib/commonjs/tab-bar/TabBarBase.js.map +1 -0
  36. package/lib/commonjs/tab-bar/expo-router/RouterTabBar.js +83 -0
  37. package/lib/commonjs/tab-bar/expo-router/RouterTabBar.js.map +1 -0
  38. package/lib/commonjs/tab-bar/expo-router/fading-tab-screen.js +119 -0
  39. package/lib/commonjs/tab-bar/expo-router/fading-tab-screen.js.map +1 -0
  40. package/lib/commonjs/tab-bar/expo-router/index.js +26 -0
  41. package/lib/commonjs/tab-bar/expo-router/index.js.map +1 -0
  42. package/lib/commonjs/tab-bar/glyph.js +43 -0
  43. package/lib/commonjs/tab-bar/glyph.js.map +1 -0
  44. package/lib/commonjs/tab-bar/glyph.native.js +55 -0
  45. package/lib/commonjs/tab-bar/glyph.native.js.map +1 -0
  46. package/lib/commonjs/tab-bar/index.js +65 -0
  47. package/lib/commonjs/tab-bar/index.js.map +1 -0
  48. package/lib/commonjs/tab-bar/index.web.js +67 -0
  49. package/lib/commonjs/tab-bar/index.web.js.map +1 -0
  50. package/lib/commonjs/tab-bar/minimize-context.js +127 -0
  51. package/lib/commonjs/tab-bar/minimize-context.js.map +1 -0
  52. package/lib/commonjs/tab-bar/shared.js +139 -0
  53. package/lib/commonjs/tab-bar/shared.js.map +1 -0
  54. package/lib/commonjs/tab-bar/surface-solid.js +43 -0
  55. package/lib/commonjs/tab-bar/surface-solid.js.map +1 -0
  56. package/lib/commonjs/tab-bar/surface.js +13 -0
  57. package/lib/commonjs/tab-bar/surface.js.map +1 -0
  58. package/lib/commonjs/tab-bar/surface.native.js +113 -0
  59. package/lib/commonjs/tab-bar/surface.native.js.map +1 -0
  60. package/lib/commonjs/tab-bar/surface.web.js +59 -0
  61. package/lib/commonjs/tab-bar/surface.web.js.map +1 -0
  62. package/lib/commonjs/tab-bar/types.js +6 -0
  63. package/lib/commonjs/tab-bar/types.js.map +1 -0
  64. package/lib/commonjs/toast/Positioner.js +117 -0
  65. package/lib/commonjs/toast/Positioner.js.map +1 -0
  66. package/lib/commonjs/toast/ToastContent.js +301 -0
  67. package/lib/commonjs/toast/ToastContent.js.map +1 -0
  68. package/lib/commonjs/toast/ToastHost.js +69 -0
  69. package/lib/commonjs/toast/ToastHost.js.map +1 -0
  70. package/lib/commonjs/toast/ToastHost.native.js +44 -0
  71. package/lib/commonjs/toast/ToastHost.native.js.map +1 -0
  72. package/lib/commonjs/toast/ToastIcon.js +57 -0
  73. package/lib/commonjs/toast/ToastIcon.js.map +1 -0
  74. package/lib/commonjs/toast/ToastRow.js +411 -0
  75. package/lib/commonjs/toast/ToastRow.js.map +1 -0
  76. package/lib/commonjs/toast/ToastSwipeHandler.js +189 -0
  77. package/lib/commonjs/toast/ToastSwipeHandler.js.map +1 -0
  78. package/lib/commonjs/toast/Toaster.js +205 -0
  79. package/lib/commonjs/toast/Toaster.js.map +1 -0
  80. package/lib/commonjs/toast/animations.js +274 -0
  81. package/lib/commonjs/toast/animations.js.map +1 -0
  82. package/lib/commonjs/toast/constants.js +56 -0
  83. package/lib/commonjs/toast/constants.js.map +1 -0
  84. package/lib/commonjs/toast/context.js +42 -0
  85. package/lib/commonjs/toast/context.js.map +1 -0
  86. package/lib/commonjs/toast/index.js +32 -126
  87. package/lib/commonjs/toast/index.js.map +1 -1
  88. package/lib/commonjs/toast/position-utils.js +115 -0
  89. package/lib/commonjs/toast/position-utils.js.map +1 -0
  90. package/lib/commonjs/toast/positioner-utils.js +141 -0
  91. package/lib/commonjs/toast/positioner-utils.js.map +1 -0
  92. package/lib/commonjs/toast/toast-comparator.js +28 -0
  93. package/lib/commonjs/toast/toast-comparator.js.map +1 -0
  94. package/lib/commonjs/toast/toast-fns.js +90 -0
  95. package/lib/commonjs/toast/toast-fns.js.map +1 -0
  96. package/lib/commonjs/toast/toast-store.js +352 -0
  97. package/lib/commonjs/toast/toast-store.js.map +1 -0
  98. package/lib/commonjs/toast/toast-timers.js +110 -0
  99. package/lib/commonjs/toast/toast-timers.js.map +1 -0
  100. package/lib/commonjs/toast/types.js +42 -0
  101. package/lib/commonjs/toast/types.js.map +1 -1
  102. package/lib/commonjs/toast/use-animated-target.js +57 -0
  103. package/lib/commonjs/toast/use-animated-target.js.map +1 -0
  104. package/lib/commonjs/toast/use-app-state.js +76 -0
  105. package/lib/commonjs/toast/use-app-state.js.map +1 -0
  106. package/lib/commonjs/toast/use-toast-colors.js +114 -0
  107. package/lib/commonjs/toast/use-toast-colors.js.map +1 -0
  108. package/lib/commonjs/toast/use-toast-position.js +40 -0
  109. package/lib/commonjs/toast/use-toast-position.js.map +1 -0
  110. package/lib/commonjs/tooltip/index.web.js +2 -1
  111. package/lib/commonjs/tooltip/index.web.js.map +1 -1
  112. package/lib/commonjs/zoomable-image-gallery/ZoomableImageGallery.js +20 -8
  113. package/lib/commonjs/zoomable-image-gallery/ZoomableImageGallery.js.map +1 -1
  114. package/lib/module/avatar-group/AvatarGroup.web.js +2 -1
  115. package/lib/module/avatar-group/AvatarGroup.web.js.map +1 -1
  116. package/lib/module/bottom-sheet/index.web.js +2 -1
  117. package/lib/module/bottom-sheet/index.web.js.map +1 -1
  118. package/lib/module/context-menu/index.web.js +3 -2
  119. package/lib/module/context-menu/index.web.js.map +1 -1
  120. package/lib/module/dialog/Dialog.web.js +4 -3
  121. package/lib/module/dialog/Dialog.web.js.map +1 -1
  122. package/lib/module/frosted-icon-button/shared.js +1 -1
  123. package/lib/module/index.js +3 -2
  124. package/lib/module/index.js.map +1 -1
  125. package/lib/module/index.web.js +3 -2
  126. package/lib/module/index.web.js.map +1 -1
  127. package/lib/module/menu/index.web.js +2 -1
  128. package/lib/module/menu/index.web.js.map +1 -1
  129. package/lib/module/popover/index.web.js +3 -2
  130. package/lib/module/popover/index.web.js.map +1 -1
  131. package/lib/module/portal/index.js +4 -1
  132. package/lib/module/portal/index.js.map +1 -1
  133. package/lib/module/progressive-blur/index.js +74 -0
  134. package/lib/module/progressive-blur/index.js.map +1 -0
  135. package/lib/module/progressive-blur/index.web.js +62 -0
  136. package/lib/module/progressive-blur/index.web.js.map +1 -0
  137. package/lib/module/progressive-blur/shared.js +60 -0
  138. package/lib/module/progressive-blur/shared.js.map +1 -0
  139. package/lib/module/progressive-blur/types.js +4 -0
  140. package/lib/module/progressive-blur/types.js.map +1 -0
  141. package/lib/module/select/index.web.js +2 -1
  142. package/lib/module/select/index.web.js.map +1 -1
  143. package/lib/module/styles/web-view-style.js +22 -0
  144. package/lib/module/styles/web-view-style.js.map +1 -0
  145. package/lib/module/tab-bar/TabBarBase.js +408 -0
  146. package/lib/module/tab-bar/TabBarBase.js.map +1 -0
  147. package/lib/module/tab-bar/expo-router/RouterTabBar.js +78 -0
  148. package/lib/module/tab-bar/expo-router/RouterTabBar.js.map +1 -0
  149. package/lib/module/tab-bar/expo-router/fading-tab-screen.js +113 -0
  150. package/lib/module/tab-bar/expo-router/fading-tab-screen.js.map +1 -0
  151. package/lib/module/tab-bar/expo-router/index.js +15 -0
  152. package/lib/module/tab-bar/expo-router/index.js.map +1 -0
  153. package/lib/module/tab-bar/glyph.js +38 -0
  154. package/lib/module/tab-bar/glyph.js.map +1 -0
  155. package/lib/module/tab-bar/glyph.native.js +50 -0
  156. package/lib/module/tab-bar/glyph.native.js.map +1 -0
  157. package/lib/module/tab-bar/index.js +24 -0
  158. package/lib/module/tab-bar/index.js.map +1 -0
  159. package/lib/module/tab-bar/index.web.js +26 -0
  160. package/lib/module/tab-bar/index.web.js.map +1 -0
  161. package/lib/module/tab-bar/minimize-context.js +118 -0
  162. package/lib/module/tab-bar/minimize-context.js.map +1 -0
  163. package/lib/module/tab-bar/shared.js +132 -0
  164. package/lib/module/tab-bar/shared.js.map +1 -0
  165. package/lib/module/tab-bar/surface-solid.js +37 -0
  166. package/lib/module/tab-bar/surface-solid.js.map +1 -0
  167. package/lib/module/tab-bar/surface.js +31 -0
  168. package/lib/module/tab-bar/surface.js.map +1 -0
  169. package/lib/module/tab-bar/surface.native.js +109 -0
  170. package/lib/module/tab-bar/surface.native.js.map +1 -0
  171. package/lib/module/tab-bar/surface.web.js +53 -0
  172. package/lib/module/tab-bar/surface.web.js.map +1 -0
  173. package/lib/module/tab-bar/types.js +4 -0
  174. package/lib/module/tab-bar/types.js.map +1 -0
  175. package/lib/module/toast/Positioner.js +110 -0
  176. package/lib/module/toast/Positioner.js.map +1 -0
  177. package/lib/module/toast/ToastContent.js +295 -0
  178. package/lib/module/toast/ToastContent.js.map +1 -0
  179. package/lib/module/toast/ToastHost.js +63 -0
  180. package/lib/module/toast/ToastHost.js.map +1 -0
  181. package/lib/module/toast/ToastHost.native.js +38 -0
  182. package/lib/module/toast/ToastHost.native.js.map +1 -0
  183. package/lib/module/toast/ToastIcon.js +52 -0
  184. package/lib/module/toast/ToastIcon.js.map +1 -0
  185. package/lib/module/toast/ToastRow.js +407 -0
  186. package/lib/module/toast/ToastRow.js.map +1 -0
  187. package/lib/module/toast/ToastSwipeHandler.js +182 -0
  188. package/lib/module/toast/ToastSwipeHandler.js.map +1 -0
  189. package/lib/module/toast/Toaster.js +198 -0
  190. package/lib/module/toast/Toaster.js.map +1 -0
  191. package/lib/module/toast/animations.js +261 -0
  192. package/lib/module/toast/animations.js.map +1 -0
  193. package/lib/module/toast/constants.js +52 -0
  194. package/lib/module/toast/constants.js.map +1 -0
  195. package/lib/module/toast/context.js +34 -0
  196. package/lib/module/toast/context.js.map +1 -0
  197. package/lib/module/toast/index.js +27 -103
  198. package/lib/module/toast/index.js.map +1 -1
  199. package/lib/module/toast/position-utils.js +107 -0
  200. package/lib/module/toast/position-utils.js.map +1 -0
  201. package/lib/module/toast/positioner-utils.js +134 -0
  202. package/lib/module/toast/positioner-utils.js.map +1 -0
  203. package/lib/module/toast/toast-comparator.js +22 -0
  204. package/lib/module/toast/toast-comparator.js.map +1 -0
  205. package/lib/module/toast/toast-fns.js +85 -0
  206. package/lib/module/toast/toast-fns.js.map +1 -0
  207. package/lib/module/toast/toast-store.js +346 -0
  208. package/lib/module/toast/toast-store.js.map +1 -0
  209. package/lib/module/toast/toast-timers.js +104 -0
  210. package/lib/module/toast/toast-timers.js.map +1 -0
  211. package/lib/module/toast/types.js +38 -0
  212. package/lib/module/toast/types.js.map +1 -1
  213. package/lib/module/toast/use-animated-target.js +52 -0
  214. package/lib/module/toast/use-animated-target.js.map +1 -0
  215. package/lib/module/toast/use-app-state.js +70 -0
  216. package/lib/module/toast/use-app-state.js.map +1 -0
  217. package/lib/module/toast/use-toast-colors.js +109 -0
  218. package/lib/module/toast/use-toast-colors.js.map +1 -0
  219. package/lib/module/toast/use-toast-position.js +35 -0
  220. package/lib/module/toast/use-toast-position.js.map +1 -0
  221. package/lib/module/tooltip/index.web.js +2 -1
  222. package/lib/module/tooltip/index.web.js.map +1 -1
  223. package/lib/module/zoomable-image-gallery/ZoomableImageGallery.js +20 -8
  224. package/lib/module/zoomable-image-gallery/ZoomableImageGallery.js.map +1 -1
  225. package/lib/typescript/commonjs/avatar-group/AvatarGroup.web.d.ts.map +1 -1
  226. package/lib/typescript/commonjs/benefit-list/types.d.ts +2 -1
  227. package/lib/typescript/commonjs/benefit-list/types.d.ts.map +1 -1
  228. package/lib/typescript/commonjs/bottom-sheet/index.web.d.ts.map +1 -1
  229. package/lib/typescript/commonjs/context-menu/index.web.d.ts.map +1 -1
  230. package/lib/typescript/commonjs/dialog/Dialog.web.d.ts.map +1 -1
  231. package/lib/typescript/commonjs/fab/types.d.ts +4 -2
  232. package/lib/typescript/commonjs/fab/types.d.ts.map +1 -1
  233. package/lib/typescript/commonjs/frosted-icon-button/shared.d.ts +1 -1
  234. package/lib/typescript/commonjs/frosted-icon-button/types.d.ts +2 -1
  235. package/lib/typescript/commonjs/frosted-icon-button/types.d.ts.map +1 -1
  236. package/lib/typescript/commonjs/index.d.ts +2 -1
  237. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  238. package/lib/typescript/commonjs/index.web.d.ts +2 -1
  239. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  240. package/lib/typescript/commonjs/menu/index.web.d.ts.map +1 -1
  241. package/lib/typescript/commonjs/popover/index.web.d.ts.map +1 -1
  242. package/lib/typescript/commonjs/portal/index.d.ts.map +1 -1
  243. package/lib/typescript/commonjs/progressive-blur/index.d.ts +23 -0
  244. package/lib/typescript/commonjs/progressive-blur/index.d.ts.map +1 -0
  245. package/lib/typescript/commonjs/progressive-blur/index.web.d.ts +30 -0
  246. package/lib/typescript/commonjs/progressive-blur/index.web.d.ts.map +1 -0
  247. package/lib/typescript/commonjs/progressive-blur/shared.d.ts +35 -0
  248. package/lib/typescript/commonjs/progressive-blur/shared.d.ts.map +1 -0
  249. package/lib/typescript/commonjs/progressive-blur/types.d.ts +21 -0
  250. package/lib/typescript/commonjs/progressive-blur/types.d.ts.map +1 -0
  251. package/lib/typescript/commonjs/select/index.web.d.ts.map +1 -1
  252. package/lib/typescript/commonjs/styles/web-view-style.d.ts +21 -0
  253. package/lib/typescript/commonjs/styles/web-view-style.d.ts.map +1 -0
  254. package/lib/typescript/commonjs/tab-bar/TabBarBase.d.ts +36 -0
  255. package/lib/typescript/commonjs/tab-bar/TabBarBase.d.ts.map +1 -0
  256. package/lib/typescript/commonjs/tab-bar/expo-router/RouterTabBar.d.ts +59 -0
  257. package/lib/typescript/commonjs/tab-bar/expo-router/RouterTabBar.d.ts.map +1 -0
  258. package/lib/typescript/commonjs/tab-bar/expo-router/fading-tab-screen.d.ts +11 -0
  259. package/lib/typescript/commonjs/tab-bar/expo-router/fading-tab-screen.d.ts.map +1 -0
  260. package/lib/typescript/commonjs/tab-bar/expo-router/index.d.ts +14 -0
  261. package/lib/typescript/commonjs/tab-bar/expo-router/index.d.ts.map +1 -0
  262. package/lib/typescript/commonjs/tab-bar/glyph.d.ts +6 -0
  263. package/lib/typescript/commonjs/tab-bar/glyph.d.ts.map +1 -0
  264. package/lib/typescript/commonjs/tab-bar/glyph.native.d.ts +6 -0
  265. package/lib/typescript/commonjs/tab-bar/glyph.native.d.ts.map +1 -0
  266. package/lib/typescript/commonjs/tab-bar/index.d.ts +12 -0
  267. package/lib/typescript/commonjs/tab-bar/index.d.ts.map +1 -0
  268. package/lib/typescript/commonjs/tab-bar/index.web.d.ts +12 -0
  269. package/lib/typescript/commonjs/tab-bar/index.web.d.ts.map +1 -0
  270. package/lib/typescript/commonjs/tab-bar/minimize-context.d.ts +51 -0
  271. package/lib/typescript/commonjs/tab-bar/minimize-context.d.ts.map +1 -0
  272. package/lib/typescript/commonjs/tab-bar/shared.d.ts +93 -0
  273. package/lib/typescript/commonjs/tab-bar/shared.d.ts.map +1 -0
  274. package/lib/typescript/commonjs/tab-bar/surface-solid.d.ts +6 -0
  275. package/lib/typescript/commonjs/tab-bar/surface-solid.d.ts.map +1 -0
  276. package/lib/typescript/commonjs/tab-bar/surface.d.ts +29 -0
  277. package/lib/typescript/commonjs/tab-bar/surface.d.ts.map +1 -0
  278. package/lib/typescript/commonjs/tab-bar/surface.native.d.ts +6 -0
  279. package/lib/typescript/commonjs/tab-bar/surface.native.d.ts.map +1 -0
  280. package/lib/typescript/commonjs/tab-bar/surface.web.d.ts +6 -0
  281. package/lib/typescript/commonjs/tab-bar/surface.web.d.ts.map +1 -0
  282. package/lib/typescript/commonjs/tab-bar/types.d.ts +88 -0
  283. package/lib/typescript/commonjs/tab-bar/types.d.ts.map +1 -0
  284. package/lib/typescript/commonjs/toast/Positioner.d.ts +21 -0
  285. package/lib/typescript/commonjs/toast/Positioner.d.ts.map +1 -0
  286. package/lib/typescript/commonjs/toast/ToastContent.d.ts +14 -0
  287. package/lib/typescript/commonjs/toast/ToastContent.d.ts.map +1 -0
  288. package/lib/typescript/commonjs/toast/ToastHost.d.ts +6 -0
  289. package/lib/typescript/commonjs/toast/ToastHost.d.ts.map +1 -0
  290. package/lib/typescript/commonjs/toast/ToastHost.native.d.ts +6 -0
  291. package/lib/typescript/commonjs/toast/ToastHost.native.d.ts.map +1 -0
  292. package/lib/typescript/commonjs/toast/ToastIcon.d.ts +9 -0
  293. package/lib/typescript/commonjs/toast/ToastIcon.d.ts.map +1 -0
  294. package/lib/typescript/commonjs/toast/ToastRow.d.ts +80 -0
  295. package/lib/typescript/commonjs/toast/ToastRow.d.ts.map +1 -0
  296. package/lib/typescript/commonjs/toast/ToastSwipeHandler.d.ts +30 -0
  297. package/lib/typescript/commonjs/toast/ToastSwipeHandler.d.ts.map +1 -0
  298. package/lib/typescript/commonjs/toast/Toaster.d.ts +19 -0
  299. package/lib/typescript/commonjs/toast/Toaster.d.ts.map +1 -0
  300. package/lib/typescript/commonjs/toast/animations.d.ts +62 -0
  301. package/lib/typescript/commonjs/toast/animations.d.ts.map +1 -0
  302. package/lib/typescript/commonjs/toast/constants.d.ts +39 -0
  303. package/lib/typescript/commonjs/toast/constants.d.ts.map +1 -0
  304. package/lib/typescript/commonjs/toast/context.d.ts +19 -0
  305. package/lib/typescript/commonjs/toast/context.d.ts.map +1 -0
  306. package/lib/typescript/commonjs/toast/index.d.ts +23 -76
  307. package/lib/typescript/commonjs/toast/index.d.ts.map +1 -1
  308. package/lib/typescript/commonjs/toast/position-utils.d.ts +30 -0
  309. package/lib/typescript/commonjs/toast/position-utils.d.ts.map +1 -0
  310. package/lib/typescript/commonjs/toast/positioner-utils.d.ts +72 -0
  311. package/lib/typescript/commonjs/toast/positioner-utils.d.ts.map +1 -0
  312. package/lib/typescript/commonjs/toast/toast-comparator.d.ts +12 -0
  313. package/lib/typescript/commonjs/toast/toast-comparator.d.ts.map +1 -0
  314. package/lib/typescript/commonjs/toast/toast-fns.d.ts +3 -0
  315. package/lib/typescript/commonjs/toast/toast-fns.d.ts.map +1 -0
  316. package/lib/typescript/commonjs/toast/toast-store.d.ts +52 -0
  317. package/lib/typescript/commonjs/toast/toast-store.d.ts.map +1 -0
  318. package/lib/typescript/commonjs/toast/toast-timers.d.ts +24 -0
  319. package/lib/typescript/commonjs/toast/toast-timers.d.ts.map +1 -0
  320. package/lib/typescript/commonjs/toast/types.d.ts +222 -5
  321. package/lib/typescript/commonjs/toast/types.d.ts.map +1 -1
  322. package/lib/typescript/commonjs/toast/use-animated-target.d.ts +7 -0
  323. package/lib/typescript/commonjs/toast/use-animated-target.d.ts.map +1 -0
  324. package/lib/typescript/commonjs/toast/use-app-state.d.ts +18 -0
  325. package/lib/typescript/commonjs/toast/use-app-state.d.ts.map +1 -0
  326. package/lib/typescript/commonjs/toast/use-toast-colors.d.ts +22 -0
  327. package/lib/typescript/commonjs/toast/use-toast-colors.d.ts.map +1 -0
  328. package/lib/typescript/commonjs/toast/use-toast-position.d.ts +37 -0
  329. package/lib/typescript/commonjs/toast/use-toast-position.d.ts.map +1 -0
  330. package/lib/typescript/commonjs/tooltip/index.web.d.ts.map +1 -1
  331. package/lib/typescript/commonjs/zoomable-image-gallery/ZoomableImageGallery.d.ts.map +1 -1
  332. package/lib/typescript/module/avatar-group/AvatarGroup.web.d.ts.map +1 -1
  333. package/lib/typescript/module/benefit-list/types.d.ts +2 -1
  334. package/lib/typescript/module/benefit-list/types.d.ts.map +1 -1
  335. package/lib/typescript/module/bottom-sheet/index.web.d.ts.map +1 -1
  336. package/lib/typescript/module/context-menu/index.web.d.ts.map +1 -1
  337. package/lib/typescript/module/dialog/Dialog.web.d.ts.map +1 -1
  338. package/lib/typescript/module/fab/types.d.ts +4 -2
  339. package/lib/typescript/module/fab/types.d.ts.map +1 -1
  340. package/lib/typescript/module/frosted-icon-button/shared.d.ts +1 -1
  341. package/lib/typescript/module/frosted-icon-button/types.d.ts +2 -1
  342. package/lib/typescript/module/frosted-icon-button/types.d.ts.map +1 -1
  343. package/lib/typescript/module/index.d.ts +2 -1
  344. package/lib/typescript/module/index.d.ts.map +1 -1
  345. package/lib/typescript/module/index.web.d.ts +2 -1
  346. package/lib/typescript/module/index.web.d.ts.map +1 -1
  347. package/lib/typescript/module/menu/index.web.d.ts.map +1 -1
  348. package/lib/typescript/module/popover/index.web.d.ts.map +1 -1
  349. package/lib/typescript/module/portal/index.d.ts.map +1 -1
  350. package/lib/typescript/module/progressive-blur/index.d.ts +23 -0
  351. package/lib/typescript/module/progressive-blur/index.d.ts.map +1 -0
  352. package/lib/typescript/module/progressive-blur/index.web.d.ts +30 -0
  353. package/lib/typescript/module/progressive-blur/index.web.d.ts.map +1 -0
  354. package/lib/typescript/module/progressive-blur/shared.d.ts +35 -0
  355. package/lib/typescript/module/progressive-blur/shared.d.ts.map +1 -0
  356. package/lib/typescript/module/progressive-blur/types.d.ts +21 -0
  357. package/lib/typescript/module/progressive-blur/types.d.ts.map +1 -0
  358. package/lib/typescript/module/select/index.web.d.ts.map +1 -1
  359. package/lib/typescript/module/styles/web-view-style.d.ts +21 -0
  360. package/lib/typescript/module/styles/web-view-style.d.ts.map +1 -0
  361. package/lib/typescript/module/tab-bar/TabBarBase.d.ts +36 -0
  362. package/lib/typescript/module/tab-bar/TabBarBase.d.ts.map +1 -0
  363. package/lib/typescript/module/tab-bar/expo-router/RouterTabBar.d.ts +59 -0
  364. package/lib/typescript/module/tab-bar/expo-router/RouterTabBar.d.ts.map +1 -0
  365. package/lib/typescript/module/tab-bar/expo-router/fading-tab-screen.d.ts +11 -0
  366. package/lib/typescript/module/tab-bar/expo-router/fading-tab-screen.d.ts.map +1 -0
  367. package/lib/typescript/module/tab-bar/expo-router/index.d.ts +14 -0
  368. package/lib/typescript/module/tab-bar/expo-router/index.d.ts.map +1 -0
  369. package/lib/typescript/module/tab-bar/glyph.d.ts +6 -0
  370. package/lib/typescript/module/tab-bar/glyph.d.ts.map +1 -0
  371. package/lib/typescript/module/tab-bar/glyph.native.d.ts +6 -0
  372. package/lib/typescript/module/tab-bar/glyph.native.d.ts.map +1 -0
  373. package/lib/typescript/module/tab-bar/index.d.ts +12 -0
  374. package/lib/typescript/module/tab-bar/index.d.ts.map +1 -0
  375. package/lib/typescript/module/tab-bar/index.web.d.ts +12 -0
  376. package/lib/typescript/module/tab-bar/index.web.d.ts.map +1 -0
  377. package/lib/typescript/module/tab-bar/minimize-context.d.ts +51 -0
  378. package/lib/typescript/module/tab-bar/minimize-context.d.ts.map +1 -0
  379. package/lib/typescript/module/tab-bar/shared.d.ts +93 -0
  380. package/lib/typescript/module/tab-bar/shared.d.ts.map +1 -0
  381. package/lib/typescript/module/tab-bar/surface-solid.d.ts +6 -0
  382. package/lib/typescript/module/tab-bar/surface-solid.d.ts.map +1 -0
  383. package/lib/typescript/module/tab-bar/surface.d.ts +29 -0
  384. package/lib/typescript/module/tab-bar/surface.d.ts.map +1 -0
  385. package/lib/typescript/module/tab-bar/surface.native.d.ts +6 -0
  386. package/lib/typescript/module/tab-bar/surface.native.d.ts.map +1 -0
  387. package/lib/typescript/module/tab-bar/surface.web.d.ts +6 -0
  388. package/lib/typescript/module/tab-bar/surface.web.d.ts.map +1 -0
  389. package/lib/typescript/module/tab-bar/types.d.ts +88 -0
  390. package/lib/typescript/module/tab-bar/types.d.ts.map +1 -0
  391. package/lib/typescript/module/toast/Positioner.d.ts +21 -0
  392. package/lib/typescript/module/toast/Positioner.d.ts.map +1 -0
  393. package/lib/typescript/module/toast/ToastContent.d.ts +14 -0
  394. package/lib/typescript/module/toast/ToastContent.d.ts.map +1 -0
  395. package/lib/typescript/module/toast/ToastHost.d.ts +6 -0
  396. package/lib/typescript/module/toast/ToastHost.d.ts.map +1 -0
  397. package/lib/typescript/module/toast/ToastHost.native.d.ts +6 -0
  398. package/lib/typescript/module/toast/ToastHost.native.d.ts.map +1 -0
  399. package/lib/typescript/module/toast/ToastIcon.d.ts +9 -0
  400. package/lib/typescript/module/toast/ToastIcon.d.ts.map +1 -0
  401. package/lib/typescript/module/toast/ToastRow.d.ts +80 -0
  402. package/lib/typescript/module/toast/ToastRow.d.ts.map +1 -0
  403. package/lib/typescript/module/toast/ToastSwipeHandler.d.ts +30 -0
  404. package/lib/typescript/module/toast/ToastSwipeHandler.d.ts.map +1 -0
  405. package/lib/typescript/module/toast/Toaster.d.ts +19 -0
  406. package/lib/typescript/module/toast/Toaster.d.ts.map +1 -0
  407. package/lib/typescript/module/toast/animations.d.ts +62 -0
  408. package/lib/typescript/module/toast/animations.d.ts.map +1 -0
  409. package/lib/typescript/module/toast/constants.d.ts +39 -0
  410. package/lib/typescript/module/toast/constants.d.ts.map +1 -0
  411. package/lib/typescript/module/toast/context.d.ts +19 -0
  412. package/lib/typescript/module/toast/context.d.ts.map +1 -0
  413. package/lib/typescript/module/toast/index.d.ts +23 -76
  414. package/lib/typescript/module/toast/index.d.ts.map +1 -1
  415. package/lib/typescript/module/toast/position-utils.d.ts +30 -0
  416. package/lib/typescript/module/toast/position-utils.d.ts.map +1 -0
  417. package/lib/typescript/module/toast/positioner-utils.d.ts +72 -0
  418. package/lib/typescript/module/toast/positioner-utils.d.ts.map +1 -0
  419. package/lib/typescript/module/toast/toast-comparator.d.ts +12 -0
  420. package/lib/typescript/module/toast/toast-comparator.d.ts.map +1 -0
  421. package/lib/typescript/module/toast/toast-fns.d.ts +3 -0
  422. package/lib/typescript/module/toast/toast-fns.d.ts.map +1 -0
  423. package/lib/typescript/module/toast/toast-store.d.ts +52 -0
  424. package/lib/typescript/module/toast/toast-store.d.ts.map +1 -0
  425. package/lib/typescript/module/toast/toast-timers.d.ts +24 -0
  426. package/lib/typescript/module/toast/toast-timers.d.ts.map +1 -0
  427. package/lib/typescript/module/toast/types.d.ts +222 -5
  428. package/lib/typescript/module/toast/types.d.ts.map +1 -1
  429. package/lib/typescript/module/toast/use-animated-target.d.ts +7 -0
  430. package/lib/typescript/module/toast/use-animated-target.d.ts.map +1 -0
  431. package/lib/typescript/module/toast/use-app-state.d.ts +18 -0
  432. package/lib/typescript/module/toast/use-app-state.d.ts.map +1 -0
  433. package/lib/typescript/module/toast/use-toast-colors.d.ts +22 -0
  434. package/lib/typescript/module/toast/use-toast-colors.d.ts.map +1 -0
  435. package/lib/typescript/module/toast/use-toast-position.d.ts +37 -0
  436. package/lib/typescript/module/toast/use-toast-position.d.ts.map +1 -0
  437. package/lib/typescript/module/tooltip/index.web.d.ts.map +1 -1
  438. package/lib/typescript/module/zoomable-image-gallery/ZoomableImageGallery.d.ts.map +1 -1
  439. package/package.json +58 -26
  440. package/src/__tests__/TabBar.test.tsx +342 -0
  441. package/src/__tests__/TabBarGlassFallback.test.tsx +234 -0
  442. package/src/__tests__/TabBarReanimatedDeps.test.ts +130 -0
  443. package/src/__tests__/TabBarWebFork.test.ts +243 -0
  444. package/src/__tests__/ToastContent.test.tsx +192 -0
  445. package/src/__tests__/ToastHostWebFork.test.ts +155 -0
  446. package/src/__tests__/Toaster.test.tsx +527 -0
  447. package/src/__tests__/animated-style-deps.test.ts +156 -0
  448. package/src/__tests__/icon-references.test.ts +243 -0
  449. package/src/__tests__/toast-animations.test.ts +98 -0
  450. package/src/__tests__/toast-comparator.test.ts +131 -0
  451. package/src/__tests__/toast-enter-driver.test.ts +147 -0
  452. package/src/__tests__/toast-fns.test.ts +240 -0
  453. package/src/__tests__/toast-position-utils.test.ts +259 -0
  454. package/src/__tests__/toast-positioner-utils.test.ts +214 -0
  455. package/src/__tests__/toast-store.test.ts +622 -0
  456. package/src/__tests__/toast-timers.test.ts +163 -0
  457. package/src/__tests__/use-animated-target.test.tsx +60 -0
  458. package/src/__tests__/use-app-state.test.tsx +127 -0
  459. package/src/__tests__/use-toast-colors.test.tsx +189 -0
  460. package/src/__tests__/web-position-fixed.test.ts +70 -0
  461. package/src/avatar-group/AvatarGroup.web.tsx +2 -1
  462. package/src/benefit-list/types.ts +2 -1
  463. package/src/bottom-sheet/index.web.tsx +3 -2
  464. package/src/context-menu/index.web.tsx +3 -2
  465. package/src/dialog/Dialog.web.tsx +4 -3
  466. package/src/fab/types.ts +4 -2
  467. package/src/frosted-icon-button/shared.ts +1 -1
  468. package/src/frosted-icon-button/types.ts +2 -1
  469. package/src/index.ts +4 -1
  470. package/src/index.web.ts +4 -1
  471. package/src/menu/index.web.tsx +2 -1
  472. package/src/popover/index.web.tsx +3 -2
  473. package/src/portal/index.tsx +4 -1
  474. package/src/progressive-blur/index.tsx +78 -0
  475. package/src/progressive-blur/index.web.tsx +65 -0
  476. package/src/progressive-blur/shared.ts +81 -0
  477. package/src/progressive-blur/types.ts +21 -0
  478. package/src/select/index.web.tsx +2 -1
  479. package/src/styles/web-view-style.ts +21 -0
  480. package/src/tab-bar/TabBar.stories.tsx +217 -0
  481. package/src/tab-bar/TabBarBase.tsx +517 -0
  482. package/src/tab-bar/expo-router/RouterTabBar.tsx +80 -0
  483. package/src/tab-bar/expo-router/fading-tab-screen.tsx +109 -0
  484. package/src/tab-bar/expo-router/index.ts +13 -0
  485. package/src/tab-bar/glyph.native.tsx +46 -0
  486. package/src/tab-bar/glyph.tsx +31 -0
  487. package/src/tab-bar/index.ts +32 -0
  488. package/src/tab-bar/index.web.tsx +34 -0
  489. package/src/tab-bar/minimize-context.tsx +117 -0
  490. package/src/tab-bar/shared.ts +159 -0
  491. package/src/tab-bar/surface-solid.tsx +40 -0
  492. package/src/tab-bar/surface.native.tsx +122 -0
  493. package/src/tab-bar/surface.tsx +28 -0
  494. package/src/tab-bar/surface.web.tsx +56 -0
  495. package/src/tab-bar/types.ts +91 -0
  496. package/src/toast/Positioner.tsx +121 -0
  497. package/src/toast/Toast.stories.tsx +292 -65
  498. package/src/toast/ToastContent.tsx +405 -0
  499. package/src/toast/ToastHost.native.tsx +31 -0
  500. package/src/toast/ToastHost.tsx +67 -0
  501. package/src/toast/ToastIcon.tsx +55 -0
  502. package/src/toast/ToastRow.tsx +485 -0
  503. package/src/toast/ToastSwipeHandler.tsx +222 -0
  504. package/src/toast/Toaster.tsx +259 -0
  505. package/src/toast/animations.ts +313 -0
  506. package/src/toast/constants.ts +76 -0
  507. package/src/toast/context.tsx +44 -0
  508. package/src/toast/index.tsx +47 -123
  509. package/src/toast/position-utils.ts +149 -0
  510. package/src/toast/positioner-utils.ts +142 -0
  511. package/src/toast/toast-comparator.ts +41 -0
  512. package/src/toast/toast-fns.ts +104 -0
  513. package/src/toast/toast-store.ts +432 -0
  514. package/src/toast/toast-timers.ts +124 -0
  515. package/src/toast/types.ts +301 -5
  516. package/src/toast/use-animated-target.ts +61 -0
  517. package/src/toast/use-app-state.ts +77 -0
  518. package/src/toast/use-toast-colors.ts +133 -0
  519. package/src/toast/use-toast-position.ts +46 -0
  520. package/src/tooltip/index.web.tsx +2 -1
  521. package/src/zoomable-image-gallery/ZoomableImageGallery.stories.tsx +134 -0
  522. package/src/zoomable-image-gallery/ZoomableImageGallery.tsx +50 -27
  523. package/lib/commonjs/toast/Toast.js +0 -267
  524. package/lib/commonjs/toast/Toast.js.map +0 -1
  525. package/lib/commonjs/toast/const.js +0 -8
  526. package/lib/commonjs/toast/const.js.map +0 -1
  527. package/lib/commonjs/toast/index.web.js +0 -114
  528. package/lib/commonjs/toast/index.web.js.map +0 -1
  529. package/lib/commonjs/toast/sonner/index.js +0 -9
  530. package/lib/commonjs/toast/sonner/index.js.map +0 -1
  531. package/lib/commonjs/toast/sonner/index.web.js +0 -9
  532. package/lib/commonjs/toast/sonner/index.web.js.map +0 -1
  533. package/lib/module/toast/Toast.js +0 -258
  534. package/lib/module/toast/Toast.js.map +0 -1
  535. package/lib/module/toast/const.js +0 -4
  536. package/lib/module/toast/const.js.map +0 -1
  537. package/lib/module/toast/index.web.js +0 -74
  538. package/lib/module/toast/index.web.js.map +0 -1
  539. package/lib/module/toast/sonner/index.js +0 -5
  540. package/lib/module/toast/sonner/index.js.map +0 -1
  541. package/lib/module/toast/sonner/index.web.js +0 -5
  542. package/lib/module/toast/sonner/index.web.js.map +0 -1
  543. package/lib/typescript/commonjs/toast/Toast.d.ts +0 -23
  544. package/lib/typescript/commonjs/toast/Toast.d.ts.map +0 -1
  545. package/lib/typescript/commonjs/toast/const.d.ts +0 -2
  546. package/lib/typescript/commonjs/toast/const.d.ts.map +0 -1
  547. package/lib/typescript/commonjs/toast/index.web.d.ts +0 -29
  548. package/lib/typescript/commonjs/toast/index.web.d.ts.map +0 -1
  549. package/lib/typescript/commonjs/toast/sonner/index.d.ts +0 -2
  550. package/lib/typescript/commonjs/toast/sonner/index.d.ts.map +0 -1
  551. package/lib/typescript/commonjs/toast/sonner/index.web.d.ts +0 -2
  552. package/lib/typescript/commonjs/toast/sonner/index.web.d.ts.map +0 -1
  553. package/lib/typescript/module/toast/Toast.d.ts +0 -23
  554. package/lib/typescript/module/toast/Toast.d.ts.map +0 -1
  555. package/lib/typescript/module/toast/const.d.ts +0 -2
  556. package/lib/typescript/module/toast/const.d.ts.map +0 -1
  557. package/lib/typescript/module/toast/index.web.d.ts +0 -29
  558. package/lib/typescript/module/toast/index.web.d.ts.map +0 -1
  559. package/lib/typescript/module/toast/sonner/index.d.ts +0 -2
  560. package/lib/typescript/module/toast/sonner/index.d.ts.map +0 -1
  561. package/lib/typescript/module/toast/sonner/index.web.d.ts +0 -2
  562. package/lib/typescript/module/toast/sonner/index.web.d.ts.map +0 -1
  563. package/src/toast/Toast.tsx +0 -269
  564. package/src/toast/const.ts +0 -1
  565. package/src/toast/index.web.tsx +0 -101
  566. package/src/toast/sonner/index.ts +0 -3
  567. package/src/toast/sonner/index.web.ts +0 -3
@@ -0,0 +1,432 @@
1
+ /**
2
+ * Derived from sonner-native v0.26.4 — src/toast-store.ts
3
+ * (MIT © Gunnar Torfi Steinarsson). See the top-level NOTICE.
4
+ *
5
+ * The auto-close timers were lifted out into `toast-timers.ts`. Everything this
6
+ * module touches is pure JavaScript — `react` (for `createRef`), `./constants`,
7
+ * `./toast-comparator`, `./toast-timers` and type-only `./types`. Keep it that
8
+ * way: nothing here may reach React Native or Reanimated, or the store stops
9
+ * being testable without a platform.
10
+ */
11
+ import * as React from 'react';
12
+ import { ENTERING_ANIMATION_DURATION, toastDefaults } from './constants';
13
+ import { areToastsEqual } from './toast-comparator';
14
+ import { ToastTimerRegistry } from './toast-timers';
15
+ import type {
16
+ ToastProps,
17
+ ToastRef,
18
+ ToastStoreConfig,
19
+ ToastStoreState,
20
+ } from './types';
21
+
22
+ type Subscriber = () => void;
23
+
24
+ /** How long the collapse gesture stays latched, so the same tap cannot re-expand. */
25
+ const COLLAPSE_COOLDOWN = 100;
26
+
27
+ class ToastStore {
28
+ private state: ToastStoreState = {
29
+ toasts: [],
30
+ toastsById: new Map(),
31
+ toastsCounter: 1,
32
+ toastRefs: {},
33
+ shouldShowOverlay: false,
34
+ toastHeights: {},
35
+ isExpanded: false,
36
+ };
37
+
38
+ private subscribers = new Set<Subscriber>();
39
+ private config: ToastStoreConfig = {};
40
+ private timers = new ToastTimerRegistry();
41
+ private hideOverlayTimeout: ReturnType<typeof setTimeout> | null = null;
42
+ private pendingPromises = new Set<string | number>();
43
+ private collapseCooldown = false;
44
+ private collapseCooldownTimeout: ReturnType<typeof setTimeout> | null = null;
45
+
46
+ subscribe = (callback: Subscriber) => {
47
+ this.subscribers.add(callback);
48
+ return () => {
49
+ this.subscribers.delete(callback);
50
+ };
51
+ };
52
+
53
+ /** Stable while nothing has changed — safe as a `useSyncExternalStore` snapshot. */
54
+ getSnapshot = (): ToastStoreState => {
55
+ return this.state;
56
+ };
57
+
58
+ setConfig = (config: ToastStoreConfig) => {
59
+ this.config = config;
60
+ };
61
+
62
+ private notify = () => {
63
+ this.subscribers.forEach((callback) => callback());
64
+ };
65
+
66
+ private cloneIndex = (): Map<string | number, ToastProps> => {
67
+ return new Map(this.state.toastsById);
68
+ };
69
+
70
+ private resolveDuration = (duration: number | undefined): number => {
71
+ return duration ?? this.config.duration ?? toastDefaults.duration;
72
+ };
73
+
74
+ private scheduleAutoClose = (id: string | number, duration: number) => {
75
+ this.timers.start({
76
+ id,
77
+ duration,
78
+ onComplete: () => {
79
+ this.dismissToast(id, 'onAutoClose');
80
+ },
81
+ });
82
+ };
83
+
84
+ pauseTimer = (id: string | number) => {
85
+ this.timers.pause(id);
86
+ };
87
+
88
+ resumeTimer = (id: string | number) => {
89
+ this.timers.resume(id);
90
+ };
91
+
92
+ pauseAllTimers = () => {
93
+ this.timers.pauseAll();
94
+ };
95
+
96
+ resumeAllTimers = () => {
97
+ this.timers.resumeAll();
98
+ };
99
+
100
+ private handlePromise = async (toast: ToastProps) => {
101
+ const { id, promiseOptions } = toast;
102
+
103
+ if (!promiseOptions || this.pendingPromises.has(id)) {
104
+ return;
105
+ }
106
+
107
+ this.pendingPromises.add(id);
108
+
109
+ try {
110
+ // Already the success title — see `PromiseOptions`.
111
+ const title = await promiseOptions.promise;
112
+
113
+ if (!this.state.toastsById.has(id)) return;
114
+
115
+ this.addToast({
116
+ title,
117
+ id,
118
+ variant: 'success',
119
+ promiseOptions: undefined,
120
+ duration: toast.duration,
121
+ styles: promiseOptions.styles?.success,
122
+ });
123
+ } catch (error) {
124
+ if (!this.state.toastsById.has(id)) return;
125
+
126
+ this.addToast({
127
+ title:
128
+ typeof promiseOptions.error === 'function'
129
+ ? promiseOptions.error(error)
130
+ : promiseOptions.error,
131
+ id,
132
+ variant: 'error',
133
+ promiseOptions: undefined,
134
+ duration: toast.duration,
135
+ styles: promiseOptions.styles?.error,
136
+ });
137
+ } finally {
138
+ this.pendingPromises.delete(id);
139
+ }
140
+ };
141
+
142
+ addToast = (
143
+ options: Omit<
144
+ ToastProps,
145
+ 'id' | 'numberOfToasts' | 'index' | 'orderedToastIds'
146
+ > & {
147
+ id?: string | number;
148
+ },
149
+ ): string | number => {
150
+ const providedId =
151
+ typeof options.id === 'number' ||
152
+ (typeof options.id === 'string' && options.id.length > 0)
153
+ ? options.id
154
+ : undefined;
155
+
156
+ const id: string | number = providedId ?? this.state.toastsCounter;
157
+ const nextCounter =
158
+ providedId === undefined
159
+ ? this.state.toastsCounter + 1
160
+ : this.state.toastsCounter;
161
+
162
+ const duration = this.resolveDuration(options.duration);
163
+
164
+ const newToast: ToastProps = {
165
+ ...options,
166
+ id,
167
+ variant: options.variant ?? toastDefaults.variant,
168
+ duration,
169
+ // Assigned by the Toaster at render time from the live position group.
170
+ numberOfToasts: 0,
171
+ index: 0,
172
+ orderedToastIds: [],
173
+ };
174
+
175
+ const existingToast = this.state.toastsById.get(id);
176
+
177
+ if (existingToast && providedId !== undefined) {
178
+ const shouldWiggle =
179
+ this.config.autoWiggleOnUpdate === 'always' ||
180
+ (this.config.autoWiggleOnUpdate === 'toast-change' &&
181
+ !areToastsEqual(newToast, existingToast));
182
+
183
+ if (shouldWiggle) {
184
+ this.wiggleToast(providedId);
185
+ }
186
+
187
+ const updatedToasts = this.state.toasts.map((currentToast) =>
188
+ currentToast.id === providedId
189
+ ? { ...currentToast, ...newToast }
190
+ : currentToast,
191
+ );
192
+
193
+ // The update may have changed the duration, so the timer restarts.
194
+ if (!newToast.promiseOptions) {
195
+ this.scheduleAutoClose(id, duration);
196
+ }
197
+
198
+ const updatedIndex = this.cloneIndex();
199
+ const updatedEntry = updatedToasts.find((t) => t.id === providedId);
200
+ if (updatedEntry) {
201
+ updatedIndex.set(providedId, updatedEntry);
202
+ }
203
+
204
+ this.state = {
205
+ ...this.state,
206
+ toasts: updatedToasts,
207
+ toastsById: updatedIndex,
208
+ shouldShowOverlay: true,
209
+ };
210
+ } else {
211
+ const newToasts: ToastProps[] = [...this.state.toasts, newToast];
212
+
213
+ const newToastRefs = { ...this.state.toastRefs };
214
+ if (!(id in newToastRefs)) {
215
+ newToastRefs[id] = React.createRef<ToastRef>();
216
+ }
217
+
218
+ const visibleToasts =
219
+ this.config.visibleToasts ?? toastDefaults.visibleToasts;
220
+ const newIndex = this.cloneIndex();
221
+ newIndex.set(id, newToast);
222
+ const updatedHeights = { ...this.state.toastHeights };
223
+ let heightsChanged = false;
224
+
225
+ if (newToasts.length > visibleToasts) {
226
+ const removedToast = newToasts.shift();
227
+ if (removedToast) {
228
+ this.timers.clear(removedToast.id);
229
+ newIndex.delete(removedToast.id);
230
+ delete newToastRefs[removedToast.id];
231
+ if (removedToast.id in updatedHeights) {
232
+ delete updatedHeights[removedToast.id];
233
+ heightsChanged = true;
234
+ }
235
+ }
236
+ }
237
+
238
+ this.state = {
239
+ ...this.state,
240
+ toasts: newToasts,
241
+ toastsById: newIndex,
242
+ toastRefs: newToastRefs,
243
+ toastHeights: heightsChanged ? updatedHeights : this.state.toastHeights,
244
+ toastsCounter: nextCounter,
245
+ shouldShowOverlay: true,
246
+ };
247
+
248
+ if (newToast.promiseOptions) {
249
+ // A promise toast has no auto-close timer until it settles.
250
+ void this.handlePromise(newToast);
251
+ } else {
252
+ this.scheduleAutoClose(id, duration);
253
+ }
254
+ }
255
+
256
+ if (this.hideOverlayTimeout) {
257
+ clearTimeout(this.hideOverlayTimeout);
258
+ this.hideOverlayTimeout = null;
259
+ }
260
+
261
+ this.notify();
262
+ return id;
263
+ };
264
+
265
+ /** Omit `id` to dismiss every toast. */
266
+ dismissToast = (
267
+ id: string | number | undefined,
268
+ origin?: 'onDismiss' | 'onAutoClose',
269
+ ): string | number | undefined => {
270
+ if (id == null) {
271
+ this.timers.clearAll();
272
+ this.state.toasts.forEach((currentToast) => {
273
+ if (origin === 'onDismiss') {
274
+ currentToast.onDismiss?.(currentToast.id);
275
+ } else {
276
+ currentToast.onAutoClose?.(currentToast.id);
277
+ }
278
+ });
279
+
280
+ this.state = {
281
+ ...this.state,
282
+ toasts: [],
283
+ toastsById: new Map(),
284
+ toastsCounter: 1,
285
+ toastRefs: {},
286
+ toastHeights: {},
287
+ isExpanded: false,
288
+ };
289
+ this.scheduleHideOverlay();
290
+ this.notify();
291
+ return undefined;
292
+ }
293
+
294
+ this.timers.clear(id);
295
+
296
+ const toastForCallback = this.state.toastsById.get(id);
297
+
298
+ const filteredToasts = this.state.toasts.filter(
299
+ (currentToast) => currentToast.id !== id,
300
+ );
301
+
302
+ const updatedHeights = { ...this.state.toastHeights };
303
+ delete updatedHeights[id];
304
+
305
+ const updatedRefs = { ...this.state.toastRefs };
306
+ delete updatedRefs[id];
307
+
308
+ const shouldAutoCollapse =
309
+ filteredToasts.length <= 1 && this.state.isExpanded;
310
+
311
+ const updatedIndex = this.cloneIndex();
312
+ updatedIndex.delete(id);
313
+
314
+ this.state = {
315
+ ...this.state,
316
+ toasts: filteredToasts,
317
+ toastsById: updatedIndex,
318
+ toastRefs: updatedRefs,
319
+ toastHeights: updatedHeights,
320
+ isExpanded: shouldAutoCollapse ? false : this.state.isExpanded,
321
+ };
322
+
323
+ if (shouldAutoCollapse) {
324
+ this.timers.resumeAll();
325
+ }
326
+
327
+ if (origin === 'onDismiss') {
328
+ toastForCallback?.onDismiss?.(id);
329
+ } else {
330
+ toastForCallback?.onAutoClose?.(id);
331
+ }
332
+
333
+ if (filteredToasts.length === 0) {
334
+ this.scheduleHideOverlay();
335
+ }
336
+
337
+ this.notify();
338
+ return id;
339
+ };
340
+
341
+ /** Keeps the overlay mounted until the last exit animation has finished. */
342
+ private scheduleHideOverlay = () => {
343
+ if (this.hideOverlayTimeout) {
344
+ clearTimeout(this.hideOverlayTimeout);
345
+ }
346
+
347
+ this.hideOverlayTimeout = setTimeout(() => {
348
+ this.state = {
349
+ ...this.state,
350
+ shouldShowOverlay: false,
351
+ };
352
+ this.hideOverlayTimeout = null;
353
+ this.notify();
354
+ }, ENTERING_ANIMATION_DURATION);
355
+ };
356
+
357
+ wiggleToast = (id: string | number) => {
358
+ const toast = this.state.toastsById.get(id);
359
+ if (!toast) {
360
+ return;
361
+ }
362
+
363
+ this.state.toastRefs[id]?.current?.wiggle();
364
+
365
+ // A wiggle re-draws attention, so the reading time starts over — except for
366
+ // toasts that never auto-close.
367
+ if (!toast.promiseOptions) {
368
+ this.scheduleAutoClose(id, this.resolveDuration(toast.duration));
369
+ }
370
+ };
371
+
372
+ getToastRef = (
373
+ id: string | number,
374
+ ): React.RefObject<ToastRef | null> | undefined => {
375
+ return this.state.toastRefs[id];
376
+ };
377
+
378
+ setToastHeight = (id: string | number, height: number) => {
379
+ if (this.state.toastHeights[id] === height) return;
380
+ // A NEW object, never an in-place write — see `ToastStoreState.toastHeights`.
381
+ this.state = {
382
+ ...this.state,
383
+ toastHeights: {
384
+ ...this.state.toastHeights,
385
+ [id]: height,
386
+ },
387
+ };
388
+ this.notify();
389
+ };
390
+
391
+ expand = () => {
392
+ this.state = {
393
+ ...this.state,
394
+ isExpanded: true,
395
+ };
396
+ this.timers.pauseAll();
397
+ this.notify();
398
+ };
399
+
400
+ collapse = () => {
401
+ this.state = {
402
+ ...this.state,
403
+ isExpanded: false,
404
+ };
405
+
406
+ this.collapseCooldown = true;
407
+ if (this.collapseCooldownTimeout) {
408
+ clearTimeout(this.collapseCooldownTimeout);
409
+ }
410
+ this.collapseCooldownTimeout = setTimeout(() => {
411
+ this.collapseCooldown = false;
412
+ this.collapseCooldownTimeout = null;
413
+ }, COLLAPSE_COOLDOWN);
414
+
415
+ this.timers.resumeAll();
416
+ this.notify();
417
+ };
418
+
419
+ toggleExpand = () => {
420
+ if (!this.state.isExpanded && this.collapseCooldown) {
421
+ return;
422
+ }
423
+
424
+ if (this.state.isExpanded) {
425
+ this.collapse();
426
+ } else {
427
+ this.expand();
428
+ }
429
+ };
430
+ }
431
+
432
+ export const toastStore = new ToastStore();
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Derived from sonner-native v0.26.4 — src/toast-store.ts:78-154
3
+ * (MIT © Gunnar Torfi Steinarsson). See the top-level NOTICE.
4
+ *
5
+ * Upstream keeps auto-close timers inside the store's React state even though no
6
+ * renderer ever reads them. Extracting them keeps the store's snapshot free of
7
+ * mutable side-channel data and makes the timing rules testable on their own.
8
+ */
9
+ import { ENTERING_ANIMATION_DURATION } from './constants';
10
+
11
+ type ToastTimer = {
12
+ timeout: ReturnType<typeof setTimeout>;
13
+ startTime: number;
14
+ remainingTime: number;
15
+ isPaused: boolean;
16
+ onComplete: () => void;
17
+ };
18
+
19
+ /**
20
+ * A toast resumed after the app came back to the foreground always gets at least
21
+ * this long on screen — whatever was left of its duration when it was paused is
22
+ * usually too short to read on re-entry.
23
+ */
24
+ const MIN_RESUMED_DURATION = 1000;
25
+
26
+ export class ToastTimerRegistry {
27
+ private timers = new Map<string | number, ToastTimer>();
28
+
29
+ /**
30
+ * Non-finite durations (`Infinity`, `NaN`) mean "never auto-close" — starting a
31
+ * timer for them would either be pointless or fire immediately.
32
+ */
33
+ start = ({
34
+ id,
35
+ duration,
36
+ onComplete,
37
+ }: {
38
+ id: string | number;
39
+ duration: number;
40
+ onComplete: () => void;
41
+ }) => {
42
+ if (!Number.isFinite(duration)) {
43
+ return;
44
+ }
45
+
46
+ this.clear(id);
47
+
48
+ // The toast is not fully on screen until the enter animation lands, so the
49
+ // readable duration starts there.
50
+ const timeout = setTimeout(() => {
51
+ this.timers.delete(id);
52
+ onComplete();
53
+ }, ENTERING_ANIMATION_DURATION + duration);
54
+
55
+ this.timers.set(id, {
56
+ timeout,
57
+ startTime: Date.now(),
58
+ remainingTime: duration,
59
+ isPaused: false,
60
+ onComplete,
61
+ });
62
+ };
63
+
64
+ clear = (id: string | number) => {
65
+ const timer = this.timers.get(id);
66
+ if (!timer) {
67
+ return;
68
+ }
69
+ clearTimeout(timer.timeout);
70
+ this.timers.delete(id);
71
+ };
72
+
73
+ clearAll = () => {
74
+ for (const timer of this.timers.values()) {
75
+ clearTimeout(timer.timeout);
76
+ }
77
+ this.timers.clear();
78
+ };
79
+
80
+ /**
81
+ * Banks the time left. The enter animation's head start is intentionally not
82
+ * subtracted, so a paused toast keeps up to `ENTERING_ANIMATION_DURATION` of
83
+ * slack — the same as upstream.
84
+ */
85
+ pause = (id: string | number) => {
86
+ const timer = this.timers.get(id);
87
+ if (!timer || timer.isPaused) {
88
+ return;
89
+ }
90
+ clearTimeout(timer.timeout);
91
+ timer.remainingTime = timer.remainingTime - (Date.now() - timer.startTime);
92
+ timer.isPaused = true;
93
+ };
94
+
95
+ resume = (id: string | number) => {
96
+ const timer = this.timers.get(id);
97
+ if (!timer || !timer.isPaused) {
98
+ return;
99
+ }
100
+
101
+ const { onComplete } = timer;
102
+ timer.isPaused = false;
103
+ timer.startTime = Date.now();
104
+ timer.timeout = setTimeout(
105
+ () => {
106
+ this.timers.delete(id);
107
+ onComplete();
108
+ },
109
+ Math.max(timer.remainingTime, MIN_RESUMED_DURATION),
110
+ );
111
+ };
112
+
113
+ pauseAll = () => {
114
+ for (const id of [...this.timers.keys()]) {
115
+ this.pause(id);
116
+ }
117
+ };
118
+
119
+ resumeAll = () => {
120
+ for (const id of [...this.timers.keys()]) {
121
+ this.resume(id);
122
+ }
123
+ };
124
+ }