@unif/react-native-design 0.20.0 → 0.21.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 (562) hide show
  1. package/README.md +121 -12
  2. package/lib/module/components/business/AvatarWithRing/AvatarWithRing.js +4 -5
  3. package/lib/module/components/business/AvatarWithRing/AvatarWithRing.js.map +1 -1
  4. package/lib/module/components/business/AvatarWithRing/styles.js +10 -9
  5. package/lib/module/components/business/AvatarWithRing/styles.js.map +1 -1
  6. package/lib/module/components/business/VersionPill/VersionPill.js +32 -15
  7. package/lib/module/components/business/VersionPill/VersionPill.js.map +1 -1
  8. package/lib/module/components/business/VersionPill/content.js +30 -0
  9. package/lib/module/components/business/VersionPill/content.js.map +1 -0
  10. package/lib/module/components/business/VersionPill/styles.js +4 -0
  11. package/lib/module/components/business/VersionPill/styles.js.map +1 -1
  12. package/lib/module/components/business/useSvgId.js +17 -8
  13. package/lib/module/components/business/useSvgId.js.map +1 -1
  14. package/lib/module/components/ui/Avatar/Avatar.js +22 -29
  15. package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
  16. package/lib/module/components/ui/Button/Button.js +40 -23
  17. package/lib/module/components/ui/Button/Button.js.map +1 -1
  18. package/lib/module/components/ui/Button/ButtonBase.js +13 -13
  19. package/lib/module/components/ui/Button/ButtonBase.js.map +1 -1
  20. package/lib/module/components/ui/Carousel/Carousel.js +68 -40
  21. package/lib/module/components/ui/Carousel/Carousel.js.map +1 -1
  22. package/lib/module/components/ui/Carousel/behavior.js +60 -0
  23. package/lib/module/components/ui/Carousel/behavior.js.map +1 -0
  24. package/lib/module/components/ui/Carousel/styles.js +6 -8
  25. package/lib/module/components/ui/Carousel/styles.js.map +1 -1
  26. package/lib/module/components/ui/Cell/Cell.js +76 -65
  27. package/lib/module/components/ui/Cell/Cell.js.map +1 -1
  28. package/lib/module/components/ui/Cell/Leading.js +11 -5
  29. package/lib/module/components/ui/Cell/Leading.js.map +1 -1
  30. package/lib/module/components/ui/Cell/content.js +34 -0
  31. package/lib/module/components/ui/Cell/content.js.map +1 -0
  32. package/lib/module/components/ui/Checkbox/Checkbox.js +25 -8
  33. package/lib/module/components/ui/Checkbox/Checkbox.js.map +1 -1
  34. package/lib/module/components/ui/Confirm/ConfirmHost.js +49 -25
  35. package/lib/module/components/ui/Confirm/ConfirmHost.js.map +1 -1
  36. package/lib/module/components/ui/Confirm/confirm.js +15 -29
  37. package/lib/module/components/ui/Confirm/confirm.js.map +1 -1
  38. package/lib/module/components/ui/Confirm/labels.js +10 -0
  39. package/lib/module/components/ui/Confirm/labels.js.map +1 -0
  40. package/lib/module/components/ui/Confirm/store.js +113 -0
  41. package/lib/module/components/ui/Confirm/store.js.map +1 -0
  42. package/lib/module/components/ui/Confirm/styles.js +4 -0
  43. package/lib/module/components/ui/Confirm/styles.js.map +1 -1
  44. package/lib/module/components/ui/DrawerHeader/DrawerHeader.js +17 -25
  45. package/lib/module/components/ui/DrawerHeader/DrawerHeader.js.map +1 -1
  46. package/lib/module/components/ui/Grid/Grid.js +26 -9
  47. package/lib/module/components/ui/Grid/Grid.js.map +1 -1
  48. package/lib/module/components/ui/Grid/accessibility.js +13 -0
  49. package/lib/module/components/ui/Grid/accessibility.js.map +1 -0
  50. package/lib/module/components/ui/IconButton/IconButton.js +16 -3
  51. package/lib/module/components/ui/IconButton/IconButton.js.map +1 -1
  52. package/lib/module/components/ui/Input/Input.js +8 -5
  53. package/lib/module/components/ui/Input/Input.js.map +1 -1
  54. package/lib/module/components/ui/Logo/Logo.js +22 -4
  55. package/lib/module/components/ui/Logo/Logo.js.map +1 -1
  56. package/lib/module/components/ui/NavBar/NavBar.js +23 -14
  57. package/lib/module/components/ui/NavBar/NavBar.js.map +1 -1
  58. package/lib/module/components/ui/NavBar/isSlot.js +297 -4
  59. package/lib/module/components/ui/NavBar/isSlot.js.map +1 -1
  60. package/lib/module/components/ui/PasswordInput/PasswordInput.js +61 -66
  61. package/lib/module/components/ui/PasswordInput/PasswordInput.js.map +1 -1
  62. package/lib/module/components/ui/Pulse/Pulse.js +1 -1
  63. package/lib/module/components/ui/Pulse/Pulse.js.map +1 -1
  64. package/lib/module/components/ui/Pulse/PulseDot.js +5 -7
  65. package/lib/module/components/ui/Pulse/PulseDot.js.map +1 -1
  66. package/lib/module/components/ui/Pulse/index.js +1 -1
  67. package/lib/module/components/ui/Pulse/index.js.map +1 -1
  68. package/lib/module/components/ui/Pulse/normalizePulseOptions.js +45 -0
  69. package/lib/module/components/ui/Pulse/normalizePulseOptions.js.map +1 -0
  70. package/lib/module/components/ui/Pulse/usePulse.js +61 -24
  71. package/lib/module/components/ui/Pulse/usePulse.js.map +1 -1
  72. package/lib/module/components/ui/Pulse/usePulseDriver.js +44 -0
  73. package/lib/module/components/ui/Pulse/usePulseDriver.js.map +1 -0
  74. package/lib/module/components/ui/Pulse/usePulseDriver.web.js +67 -0
  75. package/lib/module/components/ui/Pulse/usePulseDriver.web.js.map +1 -0
  76. package/lib/module/components/ui/Radio/Radio.js +31 -14
  77. package/lib/module/components/ui/Radio/Radio.js.map +1 -1
  78. package/lib/module/components/ui/Radio/RadioGroup.js +15 -2
  79. package/lib/module/components/ui/Radio/RadioGroup.js.map +1 -1
  80. package/lib/module/components/ui/Reveal/Reveal.js +4 -3
  81. package/lib/module/components/ui/Reveal/Reveal.js.map +1 -1
  82. package/lib/module/components/ui/Reveal/Reveal.web.js +55 -32
  83. package/lib/module/components/ui/Reveal/Reveal.web.js.map +1 -1
  84. package/lib/module/components/ui/Reveal/webTransition.js +157 -0
  85. package/lib/module/components/ui/Reveal/webTransition.js.map +1 -0
  86. package/lib/module/components/ui/Search/Search.js +85 -58
  87. package/lib/module/components/ui/Search/Search.js.map +1 -1
  88. package/lib/module/components/ui/Segmented/Segmented.js +4 -2
  89. package/lib/module/components/ui/Segmented/Segmented.js.map +1 -1
  90. package/lib/module/components/ui/Skeleton/Skeleton.js +5 -7
  91. package/lib/module/components/ui/Skeleton/Skeleton.js.map +1 -1
  92. package/lib/module/components/ui/Spinner/Spinner.js +18 -11
  93. package/lib/module/components/ui/Spinner/Spinner.js.map +1 -1
  94. package/lib/module/components/ui/Spinner/Spinner.web.js +18 -14
  95. package/lib/module/components/ui/Spinner/Spinner.web.js.map +1 -1
  96. package/lib/module/components/ui/Spinner/shared.js +6 -0
  97. package/lib/module/components/ui/Spinner/shared.js.map +1 -1
  98. package/lib/module/components/ui/Stepper/Stepper.js +131 -99
  99. package/lib/module/components/ui/Stepper/Stepper.js.map +1 -1
  100. package/lib/module/components/ui/Stepper/StepperPressable.js +4 -0
  101. package/lib/module/components/ui/Stepper/StepperPressable.js.map +1 -0
  102. package/lib/module/components/ui/Stepper/StepperPressable.web.js +4 -0
  103. package/lib/module/components/ui/Stepper/StepperPressable.web.js.map +1 -0
  104. package/lib/module/components/ui/Stepper/accessibility.js +30 -0
  105. package/lib/module/components/ui/Stepper/accessibility.js.map +1 -0
  106. package/lib/module/components/ui/Stepper/accessibility.types.js +4 -0
  107. package/lib/module/components/ui/Stepper/accessibility.types.js.map +1 -0
  108. package/lib/module/components/ui/Stepper/accessibility.web.js +57 -0
  109. package/lib/module/components/ui/Stepper/accessibility.web.js.map +1 -0
  110. package/lib/module/components/ui/Stepper/layout.js +28 -0
  111. package/lib/module/components/ui/Stepper/layout.js.map +1 -0
  112. package/lib/module/components/ui/Stepper/normalizeStepper.js +53 -0
  113. package/lib/module/components/ui/Stepper/normalizeStepper.js.map +1 -0
  114. package/lib/module/components/ui/Stepper/styles.js +9 -2
  115. package/lib/module/components/ui/Stepper/styles.js.map +1 -1
  116. package/lib/module/components/ui/Switch/Switch.js +45 -19
  117. package/lib/module/components/ui/Switch/Switch.js.map +1 -1
  118. package/lib/module/components/ui/Switch/Switch.web.js +47 -20
  119. package/lib/module/components/ui/Switch/Switch.web.js.map +1 -1
  120. package/lib/module/components/ui/Switch/styles.js +12 -5
  121. package/lib/module/components/ui/Switch/styles.js.map +1 -1
  122. package/lib/module/components/ui/Tag/Tag.js +3 -2
  123. package/lib/module/components/ui/Tag/Tag.js.map +1 -1
  124. package/lib/module/components/ui/TextField/TextFieldBase.js +131 -86
  125. package/lib/module/components/ui/TextField/TextFieldBase.js.map +1 -1
  126. package/lib/module/components/ui/TextField/TextFieldSlot.js +82 -0
  127. package/lib/module/components/ui/TextField/TextFieldSlot.js.map +1 -0
  128. package/lib/module/components/ui/TextField/normalize.js +238 -0
  129. package/lib/module/components/ui/TextField/normalize.js.map +1 -0
  130. package/lib/module/components/ui/TextField/styles.js +31 -0
  131. package/lib/module/components/ui/TextField/styles.js.map +1 -1
  132. package/lib/module/components/ui/TextField/useErrorAnnouncement.js +27 -0
  133. package/lib/module/components/ui/TextField/useErrorAnnouncement.js.map +1 -0
  134. package/lib/module/components/ui/TextField/useTextFieldValue.js +66 -0
  135. package/lib/module/components/ui/TextField/useTextFieldValue.js.map +1 -0
  136. package/lib/module/components/ui/TextField/valueState.js +93 -0
  137. package/lib/module/components/ui/TextField/valueState.js.map +1 -0
  138. package/lib/module/components/ui/Textarea/Textarea.js +7 -3
  139. package/lib/module/components/ui/Textarea/Textarea.js.map +1 -1
  140. package/lib/module/components/ui/Thumbnail/Thumbnail.js +67 -48
  141. package/lib/module/components/ui/Thumbnail/Thumbnail.js.map +1 -1
  142. package/lib/module/components/ui/Thumbnail/normalize.js +58 -0
  143. package/lib/module/components/ui/Thumbnail/normalize.js.map +1 -0
  144. package/lib/module/components/ui/Thumbnail/styles.js +6 -11
  145. package/lib/module/components/ui/Thumbnail/styles.js.map +1 -1
  146. package/lib/module/components/ui/Toast/ToastHost.js +64 -21
  147. package/lib/module/components/ui/Toast/ToastHost.js.map +1 -1
  148. package/lib/module/components/ui/Toast/ToastHost.web.js +73 -24
  149. package/lib/module/components/ui/Toast/ToastHost.web.js.map +1 -1
  150. package/lib/module/components/ui/Toast/store.js +110 -0
  151. package/lib/module/components/ui/Toast/store.js.map +1 -0
  152. package/lib/module/components/ui/Toast/toast.js +17 -7
  153. package/lib/module/components/ui/Toast/toast.js.map +1 -1
  154. package/lib/module/components/ui/index.js.map +1 -1
  155. package/lib/module/components/ui/shared/ImageAttempt.js +28 -0
  156. package/lib/module/components/ui/shared/ImageAttempt.js.map +1 -0
  157. package/lib/module/components/ui/shared/a11y.js +21 -0
  158. package/lib/module/components/ui/shared/a11y.js.map +1 -0
  159. package/lib/module/components/ui/shared/accessibilityName.js +9 -0
  160. package/lib/module/components/ui/shared/accessibilityName.js.map +1 -0
  161. package/lib/module/components/ui/shared/selectImageAttemptSource.js +5 -0
  162. package/lib/module/components/ui/shared/selectImageAttemptSource.js.map +1 -0
  163. package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js +13 -0
  164. package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js.map +1 -0
  165. package/lib/module/components/ui/shared/selectImageAttemptSource.web.js +5 -0
  166. package/lib/module/components/ui/shared/selectImageAttemptSource.web.js.map +1 -0
  167. package/lib/module/icons/data.js +1 -1
  168. package/lib/module/icons/data.js.map +1 -1
  169. package/lib/module/theme/ThemeProvider.js +14 -4
  170. package/lib/module/theme/ThemeProvider.js.map +1 -1
  171. package/lib/module/theme/fontScale.js +13 -0
  172. package/lib/module/theme/fontScale.js.map +1 -0
  173. package/lib/module/theme/index.js +2 -4
  174. package/lib/module/theme/index.js.map +1 -1
  175. package/lib/module/theme/themeContext.js +15 -0
  176. package/lib/module/theme/themeContext.js.map +1 -0
  177. package/lib/module/theme/themeDiagnostics.js +29 -0
  178. package/lib/module/theme/themeDiagnostics.js.map +1 -0
  179. package/lib/module/theme/usePrefersReducedMotion.js +11 -4
  180. package/lib/module/theme/usePrefersReducedMotion.js.map +1 -1
  181. package/lib/module/theme/usePrefersReducedMotion.web.js +5 -2
  182. package/lib/module/theme/usePrefersReducedMotion.web.js.map +1 -1
  183. package/lib/module/theme/useTheme.js +12 -25
  184. package/lib/module/theme/useTheme.js.map +1 -1
  185. package/lib/module/theme/useThemedStyles.js +9 -6
  186. package/lib/module/theme/useThemedStyles.js.map +1 -1
  187. package/lib/module/utils/imageSource.js +198 -0
  188. package/lib/module/utils/imageSource.js.map +1 -0
  189. package/lib/typescript/manual-tests/runtime-api/RuntimeApiScreen.d.ts +12 -0
  190. package/lib/typescript/manual-tests/runtime-api/RuntimeApiScreen.d.ts.map +1 -0
  191. package/lib/typescript/src/components/business/AvatarWithRing/AvatarWithRing.d.ts.map +1 -1
  192. package/lib/typescript/src/components/business/AvatarWithRing/styles.d.ts +8 -7
  193. package/lib/typescript/src/components/business/AvatarWithRing/styles.d.ts.map +1 -1
  194. package/lib/typescript/src/components/business/VersionPill/VersionPill.d.ts +1 -1
  195. package/lib/typescript/src/components/business/VersionPill/VersionPill.d.ts.map +1 -1
  196. package/lib/typescript/src/components/business/VersionPill/content.d.ts +19 -0
  197. package/lib/typescript/src/components/business/VersionPill/content.d.ts.map +1 -0
  198. package/lib/typescript/src/components/business/VersionPill/index.d.ts +1 -1
  199. package/lib/typescript/src/components/business/VersionPill/index.d.ts.map +1 -1
  200. package/lib/typescript/src/components/business/VersionPill/styles.d.ts +4 -0
  201. package/lib/typescript/src/components/business/VersionPill/styles.d.ts.map +1 -1
  202. package/lib/typescript/src/components/business/VersionPill/types.d.ts +6 -2
  203. package/lib/typescript/src/components/business/VersionPill/types.d.ts.map +1 -1
  204. package/lib/typescript/src/components/business/index.d.ts +1 -1
  205. package/lib/typescript/src/components/business/index.d.ts.map +1 -1
  206. package/lib/typescript/src/components/business/useSvgId.d.ts +6 -5
  207. package/lib/typescript/src/components/business/useSvgId.d.ts.map +1 -1
  208. package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts +2 -2
  209. package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts.map +1 -1
  210. package/lib/typescript/src/components/ui/Avatar/types.d.ts +6 -2
  211. package/lib/typescript/src/components/ui/Avatar/types.d.ts.map +1 -1
  212. package/lib/typescript/src/components/ui/Button/Button.d.ts +1 -1
  213. package/lib/typescript/src/components/ui/Button/Button.d.ts.map +1 -1
  214. package/lib/typescript/src/components/ui/Button/ButtonBase.d.ts +5 -3
  215. package/lib/typescript/src/components/ui/Button/ButtonBase.d.ts.map +1 -1
  216. package/lib/typescript/src/components/ui/Button/types.d.ts +5 -3
  217. package/lib/typescript/src/components/ui/Button/types.d.ts.map +1 -1
  218. package/lib/typescript/src/components/ui/Carousel/Carousel.d.ts.map +1 -1
  219. package/lib/typescript/src/components/ui/Carousel/behavior.d.ts +25 -0
  220. package/lib/typescript/src/components/ui/Carousel/behavior.d.ts.map +1 -0
  221. package/lib/typescript/src/components/ui/Carousel/styles.d.ts +4 -6
  222. package/lib/typescript/src/components/ui/Carousel/styles.d.ts.map +1 -1
  223. package/lib/typescript/src/components/ui/Carousel/types.d.ts +14 -6
  224. package/lib/typescript/src/components/ui/Carousel/types.d.ts.map +1 -1
  225. package/lib/typescript/src/components/ui/Cell/Cell.d.ts +1 -1
  226. package/lib/typescript/src/components/ui/Cell/Cell.d.ts.map +1 -1
  227. package/lib/typescript/src/components/ui/Cell/Leading.d.ts +2 -3
  228. package/lib/typescript/src/components/ui/Cell/Leading.d.ts.map +1 -1
  229. package/lib/typescript/src/components/ui/Cell/content.d.ts +18 -0
  230. package/lib/typescript/src/components/ui/Cell/content.d.ts.map +1 -0
  231. package/lib/typescript/src/components/ui/Cell/index.d.ts +1 -1
  232. package/lib/typescript/src/components/ui/Cell/index.d.ts.map +1 -1
  233. package/lib/typescript/src/components/ui/Cell/types.d.ts +66 -30
  234. package/lib/typescript/src/components/ui/Cell/types.d.ts.map +1 -1
  235. package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts +1 -1
  236. package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts.map +1 -1
  237. package/lib/typescript/src/components/ui/Checkbox/types.d.ts +12 -3
  238. package/lib/typescript/src/components/ui/Checkbox/types.d.ts.map +1 -1
  239. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts +6 -3
  240. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts.map +1 -1
  241. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts +10 -4
  242. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts.map +1 -1
  243. package/lib/typescript/src/components/ui/Confirm/labels.d.ts +6 -0
  244. package/lib/typescript/src/components/ui/Confirm/labels.d.ts.map +1 -0
  245. package/lib/typescript/src/components/ui/Confirm/store.d.ts +44 -0
  246. package/lib/typescript/src/components/ui/Confirm/store.d.ts.map +1 -0
  247. package/lib/typescript/src/components/ui/Confirm/styles.d.ts +3 -0
  248. package/lib/typescript/src/components/ui/Confirm/styles.d.ts.map +1 -1
  249. package/lib/typescript/src/components/ui/Confirm/types.d.ts +0 -9
  250. package/lib/typescript/src/components/ui/Confirm/types.d.ts.map +1 -1
  251. package/lib/typescript/src/components/ui/DrawerHeader/DrawerHeader.d.ts.map +1 -1
  252. package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts +7 -1
  253. package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts.map +1 -1
  254. package/lib/typescript/src/components/ui/Grid/Grid.d.ts.map +1 -1
  255. package/lib/typescript/src/components/ui/Grid/accessibility.d.ts +5 -0
  256. package/lib/typescript/src/components/ui/Grid/accessibility.d.ts.map +1 -0
  257. package/lib/typescript/src/components/ui/Grid/types.d.ts +2 -0
  258. package/lib/typescript/src/components/ui/Grid/types.d.ts.map +1 -1
  259. package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts +1 -1
  260. package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts.map +1 -1
  261. package/lib/typescript/src/components/ui/IconButton/types.d.ts +4 -2
  262. package/lib/typescript/src/components/ui/IconButton/types.d.ts.map +1 -1
  263. package/lib/typescript/src/components/ui/Input/Input.d.ts +5 -383
  264. package/lib/typescript/src/components/ui/Input/Input.d.ts.map +1 -1
  265. package/lib/typescript/src/components/ui/Input/index.d.ts +1 -0
  266. package/lib/typescript/src/components/ui/Input/index.d.ts.map +1 -1
  267. package/lib/typescript/src/components/ui/Input/types.d.ts +3 -17
  268. package/lib/typescript/src/components/ui/Input/types.d.ts.map +1 -1
  269. package/lib/typescript/src/components/ui/Logo/Logo.d.ts +2 -2
  270. package/lib/typescript/src/components/ui/Logo/Logo.d.ts.map +1 -1
  271. package/lib/typescript/src/components/ui/Logo/types.d.ts +2 -2
  272. package/lib/typescript/src/components/ui/Logo/types.d.ts.map +1 -1
  273. package/lib/typescript/src/components/ui/NavBar/NavBar.d.ts.map +1 -1
  274. package/lib/typescript/src/components/ui/NavBar/index.d.ts +1 -1
  275. package/lib/typescript/src/components/ui/NavBar/index.d.ts.map +1 -1
  276. package/lib/typescript/src/components/ui/NavBar/isSlot.d.ts +24 -4
  277. package/lib/typescript/src/components/ui/NavBar/isSlot.d.ts.map +1 -1
  278. package/lib/typescript/src/components/ui/NavBar/types.d.ts +8 -8
  279. package/lib/typescript/src/components/ui/NavBar/types.d.ts.map +1 -1
  280. package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts +6 -14
  281. package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts.map +1 -1
  282. package/lib/typescript/src/components/ui/PasswordInput/types.d.ts +4 -14
  283. package/lib/typescript/src/components/ui/PasswordInput/types.d.ts.map +1 -1
  284. package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts +1 -1
  285. package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts.map +1 -1
  286. package/lib/typescript/src/components/ui/Pulse/normalizePulseOptions.d.ts +32 -0
  287. package/lib/typescript/src/components/ui/Pulse/normalizePulseOptions.d.ts.map +1 -0
  288. package/lib/typescript/src/components/ui/Pulse/usePulse.d.ts +10 -5
  289. package/lib/typescript/src/components/ui/Pulse/usePulse.d.ts.map +1 -1
  290. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.d.ts +11 -0
  291. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.d.ts.map +1 -0
  292. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.web.d.ts +18 -0
  293. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.web.d.ts.map +1 -0
  294. package/lib/typescript/src/components/ui/Radio/Radio.d.ts +1 -1
  295. package/lib/typescript/src/components/ui/Radio/Radio.d.ts.map +1 -1
  296. package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts +2 -2
  297. package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts.map +1 -1
  298. package/lib/typescript/src/components/ui/Radio/types.d.ts +14 -3
  299. package/lib/typescript/src/components/ui/Radio/types.d.ts.map +1 -1
  300. package/lib/typescript/src/components/ui/Reveal/Reveal.d.ts.map +1 -1
  301. package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts +2 -8
  302. package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts.map +1 -1
  303. package/lib/typescript/src/components/ui/Reveal/types.d.ts +1 -1
  304. package/lib/typescript/src/components/ui/Reveal/types.d.ts.map +1 -1
  305. package/lib/typescript/src/components/ui/Reveal/webTransition.d.ts +38 -0
  306. package/lib/typescript/src/components/ui/Reveal/webTransition.d.ts.map +1 -0
  307. package/lib/typescript/src/components/ui/Search/Search.d.ts +4 -214
  308. package/lib/typescript/src/components/ui/Search/Search.d.ts.map +1 -1
  309. package/lib/typescript/src/components/ui/Search/types.d.ts +13 -6
  310. package/lib/typescript/src/components/ui/Search/types.d.ts.map +1 -1
  311. package/lib/typescript/src/components/ui/Segmented/Segmented.d.ts.map +1 -1
  312. package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts +3 -3
  313. package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts.map +1 -1
  314. package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts +1 -1
  315. package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts.map +1 -1
  316. package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts +1 -1
  317. package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts.map +1 -1
  318. package/lib/typescript/src/components/ui/Spinner/shared.d.ts +5 -0
  319. package/lib/typescript/src/components/ui/Spinner/shared.d.ts.map +1 -1
  320. package/lib/typescript/src/components/ui/Spinner/types.d.ts +1 -1
  321. package/lib/typescript/src/components/ui/Spinner/types.d.ts.map +1 -1
  322. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts +3 -3
  323. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts.map +1 -1
  324. package/lib/typescript/src/components/ui/Stepper/StepperPressable.d.ts +2 -0
  325. package/lib/typescript/src/components/ui/Stepper/StepperPressable.d.ts.map +1 -0
  326. package/lib/typescript/src/components/ui/Stepper/StepperPressable.web.d.ts +2 -0
  327. package/lib/typescript/src/components/ui/Stepper/StepperPressable.web.d.ts.map +1 -0
  328. package/lib/typescript/src/components/ui/Stepper/accessibility.d.ts +3 -0
  329. package/lib/typescript/src/components/ui/Stepper/accessibility.d.ts.map +1 -0
  330. package/lib/typescript/src/components/ui/Stepper/accessibility.types.d.ts +23 -0
  331. package/lib/typescript/src/components/ui/Stepper/accessibility.types.d.ts.map +1 -0
  332. package/lib/typescript/src/components/ui/Stepper/accessibility.web.d.ts +9 -0
  333. package/lib/typescript/src/components/ui/Stepper/accessibility.web.d.ts.map +1 -0
  334. package/lib/typescript/src/components/ui/Stepper/layout.d.ts +22 -0
  335. package/lib/typescript/src/components/ui/Stepper/layout.d.ts.map +1 -0
  336. package/lib/typescript/src/components/ui/Stepper/normalizeStepper.d.ts +31 -0
  337. package/lib/typescript/src/components/ui/Stepper/normalizeStepper.d.ts.map +1 -0
  338. package/lib/typescript/src/components/ui/Stepper/styles.d.ts +9 -2
  339. package/lib/typescript/src/components/ui/Stepper/styles.d.ts.map +1 -1
  340. package/lib/typescript/src/components/ui/Stepper/types.d.ts +3 -1
  341. package/lib/typescript/src/components/ui/Stepper/types.d.ts.map +1 -1
  342. package/lib/typescript/src/components/ui/Switch/Switch.d.ts.map +1 -1
  343. package/lib/typescript/src/components/ui/Switch/Switch.web.d.ts.map +1 -1
  344. package/lib/typescript/src/components/ui/Switch/styles.d.ts +9 -3
  345. package/lib/typescript/src/components/ui/Switch/styles.d.ts.map +1 -1
  346. package/lib/typescript/src/components/ui/Switch/types.d.ts +2 -2
  347. package/lib/typescript/src/components/ui/Switch/types.d.ts.map +1 -1
  348. package/lib/typescript/src/components/ui/Tag/Tag.d.ts.map +1 -1
  349. package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts +4 -401
  350. package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts.map +1 -1
  351. package/lib/typescript/src/components/ui/TextField/TextFieldSlot.d.ts +13 -0
  352. package/lib/typescript/src/components/ui/TextField/TextFieldSlot.d.ts.map +1 -0
  353. package/lib/typescript/src/components/ui/TextField/normalize.d.ts +51 -0
  354. package/lib/typescript/src/components/ui/TextField/normalize.d.ts.map +1 -0
  355. package/lib/typescript/src/components/ui/TextField/styles.d.ts +30 -0
  356. package/lib/typescript/src/components/ui/TextField/styles.d.ts.map +1 -1
  357. package/lib/typescript/src/components/ui/TextField/types.d.ts +92 -18
  358. package/lib/typescript/src/components/ui/TextField/types.d.ts.map +1 -1
  359. package/lib/typescript/src/components/ui/TextField/useErrorAnnouncement.d.ts +3 -0
  360. package/lib/typescript/src/components/ui/TextField/useErrorAnnouncement.d.ts.map +1 -0
  361. package/lib/typescript/src/components/ui/TextField/useTextFieldValue.d.ts +18 -0
  362. package/lib/typescript/src/components/ui/TextField/useTextFieldValue.d.ts.map +1 -0
  363. package/lib/typescript/src/components/ui/TextField/valueState.d.ts +50 -0
  364. package/lib/typescript/src/components/ui/TextField/valueState.d.ts.map +1 -0
  365. package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts +4 -382
  366. package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts.map +1 -1
  367. package/lib/typescript/src/components/ui/Textarea/index.d.ts +1 -0
  368. package/lib/typescript/src/components/ui/Textarea/index.d.ts.map +1 -1
  369. package/lib/typescript/src/components/ui/Textarea/types.d.ts +3 -14
  370. package/lib/typescript/src/components/ui/Textarea/types.d.ts.map +1 -1
  371. package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts +5 -12
  372. package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts.map +1 -1
  373. package/lib/typescript/src/components/ui/Thumbnail/index.d.ts +1 -1
  374. package/lib/typescript/src/components/ui/Thumbnail/index.d.ts.map +1 -1
  375. package/lib/typescript/src/components/ui/Thumbnail/normalize.d.ts +13 -0
  376. package/lib/typescript/src/components/ui/Thumbnail/normalize.d.ts.map +1 -0
  377. package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts +4 -8
  378. package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts.map +1 -1
  379. package/lib/typescript/src/components/ui/Thumbnail/types.d.ts +21 -13
  380. package/lib/typescript/src/components/ui/Thumbnail/types.d.ts.map +1 -1
  381. package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts +6 -2
  382. package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts.map +1 -1
  383. package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts +6 -3
  384. package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts.map +1 -1
  385. package/lib/typescript/src/components/ui/Toast/store.d.ts +39 -0
  386. package/lib/typescript/src/components/ui/Toast/store.d.ts.map +1 -0
  387. package/lib/typescript/src/components/ui/Toast/toast.d.ts +7 -2
  388. package/lib/typescript/src/components/ui/Toast/toast.d.ts.map +1 -1
  389. package/lib/typescript/src/components/ui/Toast/types.d.ts +5 -3
  390. package/lib/typescript/src/components/ui/Toast/types.d.ts.map +1 -1
  391. package/lib/typescript/src/components/ui/index.d.ts +4 -4
  392. package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
  393. package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts +13 -0
  394. package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts.map +1 -0
  395. package/lib/typescript/src/components/ui/shared/a11y.d.ts +19 -0
  396. package/lib/typescript/src/components/ui/shared/a11y.d.ts.map +1 -0
  397. package/lib/typescript/src/components/ui/shared/accessibilityName.d.ts +3 -0
  398. package/lib/typescript/src/components/ui/shared/accessibilityName.d.ts.map +1 -0
  399. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.d.ts +3 -0
  400. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.d.ts.map +1 -0
  401. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts +4 -0
  402. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts.map +1 -0
  403. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.web.d.ts +3 -0
  404. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.web.d.ts.map +1 -0
  405. package/lib/typescript/src/theme/ThemeProvider.d.ts +2 -3
  406. package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
  407. package/lib/typescript/src/theme/fontScale.d.ts +4 -0
  408. package/lib/typescript/src/theme/fontScale.d.ts.map +1 -0
  409. package/lib/typescript/src/theme/index.d.ts +2 -1
  410. package/lib/typescript/src/theme/index.d.ts.map +1 -1
  411. package/lib/typescript/src/theme/themeContext.d.ts +6 -0
  412. package/lib/typescript/src/theme/themeContext.d.ts.map +1 -0
  413. package/lib/typescript/src/theme/themeDiagnostics.d.ts +6 -0
  414. package/lib/typescript/src/theme/themeDiagnostics.d.ts.map +1 -0
  415. package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts +8 -3
  416. package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts.map +1 -1
  417. package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts +5 -2
  418. package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts.map +1 -1
  419. package/lib/typescript/src/theme/useTheme.d.ts +1 -1
  420. package/lib/typescript/src/theme/useTheme.d.ts.map +1 -1
  421. package/lib/typescript/src/theme/useThemedStyles.d.ts +1 -1
  422. package/lib/typescript/src/theme/useThemedStyles.d.ts.map +1 -1
  423. package/lib/typescript/src/utils/imageSource.d.ts +20 -0
  424. package/lib/typescript/src/utils/imageSource.d.ts.map +1 -0
  425. package/lib/typescript/type-tests/public-api.d.ts +2 -0
  426. package/lib/typescript/type-tests/public-api.d.ts.map +1 -0
  427. package/lib/typescript/website/src/components/iconCatalogCategories.d.ts +11 -0
  428. package/lib/typescript/website/src/components/iconCatalogCategories.d.ts.map +1 -0
  429. package/package.json +30 -14
  430. package/src/components/business/AvatarWithRing/AvatarWithRing.tsx +11 -4
  431. package/src/components/business/AvatarWithRing/styles.ts +11 -9
  432. package/src/components/business/VersionPill/VersionPill.tsx +31 -25
  433. package/src/components/business/VersionPill/content.ts +47 -0
  434. package/src/components/business/VersionPill/index.ts +1 -1
  435. package/src/components/business/VersionPill/styles.ts +4 -0
  436. package/src/components/business/VersionPill/types.ts +7 -2
  437. package/src/components/business/index.ts +1 -1
  438. package/src/components/business/useSvgId.ts +29 -8
  439. package/src/components/ui/Avatar/Avatar.tsx +25 -34
  440. package/src/components/ui/Avatar/types.ts +6 -2
  441. package/src/components/ui/Button/Button.tsx +39 -20
  442. package/src/components/ui/Button/ButtonBase.tsx +21 -12
  443. package/src/components/ui/Button/types.ts +5 -3
  444. package/src/components/ui/Carousel/Carousel.tsx +102 -40
  445. package/src/components/ui/Carousel/behavior.ts +78 -0
  446. package/src/components/ui/Carousel/styles.ts +5 -7
  447. package/src/components/ui/Carousel/types.ts +18 -6
  448. package/src/components/ui/Cell/Cell.tsx +85 -74
  449. package/src/components/ui/Cell/Leading.tsx +14 -14
  450. package/src/components/ui/Cell/content.ts +53 -0
  451. package/src/components/ui/Cell/index.ts +7 -1
  452. package/src/components/ui/Cell/types.ts +64 -30
  453. package/src/components/ui/Checkbox/Checkbox.tsx +35 -8
  454. package/src/components/ui/Checkbox/types.ts +15 -3
  455. package/src/components/ui/Confirm/ConfirmHost.tsx +51 -26
  456. package/src/components/ui/Confirm/confirm.ts +17 -34
  457. package/src/components/ui/Confirm/labels.ts +14 -0
  458. package/src/components/ui/Confirm/store.ts +147 -0
  459. package/src/components/ui/Confirm/styles.ts +4 -0
  460. package/src/components/ui/Confirm/types.ts +2 -10
  461. package/src/components/ui/DrawerHeader/DrawerHeader.tsx +22 -27
  462. package/src/components/ui/DrawerHeader/types.ts +7 -1
  463. package/src/components/ui/Grid/Grid.tsx +44 -12
  464. package/src/components/ui/Grid/accessibility.ts +21 -0
  465. package/src/components/ui/Grid/types.ts +2 -0
  466. package/src/components/ui/IconButton/IconButton.tsx +20 -3
  467. package/src/components/ui/IconButton/types.ts +4 -2
  468. package/src/components/ui/Input/Input.tsx +16 -6
  469. package/src/components/ui/Input/index.ts +5 -0
  470. package/src/components/ui/Input/types.ts +12 -23
  471. package/src/components/ui/Logo/Logo.tsx +27 -4
  472. package/src/components/ui/Logo/types.ts +2 -2
  473. package/src/components/ui/NavBar/NavBar.tsx +27 -19
  474. package/src/components/ui/NavBar/index.ts +1 -1
  475. package/src/components/ui/NavBar/isSlot.ts +372 -5
  476. package/src/components/ui/NavBar/types.ts +9 -8
  477. package/src/components/ui/PasswordInput/PasswordInput.tsx +67 -69
  478. package/src/components/ui/PasswordInput/types.ts +12 -14
  479. package/src/components/ui/Pulse/PulseDot.tsx +5 -4
  480. package/src/components/ui/Pulse/normalizePulseOptions.ts +76 -0
  481. package/src/components/ui/Pulse/usePulse.ts +80 -34
  482. package/src/components/ui/Pulse/usePulseDriver.ts +49 -0
  483. package/src/components/ui/Pulse/usePulseDriver.web.ts +66 -0
  484. package/src/components/ui/Radio/Radio.tsx +44 -15
  485. package/src/components/ui/Radio/RadioGroup.tsx +21 -3
  486. package/src/components/ui/Radio/types.ts +17 -3
  487. package/src/components/ui/Reveal/Reveal.tsx +5 -3
  488. package/src/components/ui/Reveal/Reveal.web.tsx +72 -29
  489. package/src/components/ui/Reveal/types.ts +1 -1
  490. package/src/components/ui/Reveal/webTransition.ts +206 -0
  491. package/src/components/ui/Search/Search.tsx +127 -58
  492. package/src/components/ui/Search/types.ts +30 -9
  493. package/src/components/ui/Segmented/Segmented.tsx +10 -2
  494. package/src/components/ui/Skeleton/Skeleton.tsx +9 -5
  495. package/src/components/ui/Spinner/Spinner.tsx +25 -17
  496. package/src/components/ui/Spinner/Spinner.web.tsx +23 -18
  497. package/src/components/ui/Spinner/shared.ts +7 -0
  498. package/src/components/ui/Spinner/types.ts +1 -1
  499. package/src/components/ui/Stepper/Stepper.tsx +166 -86
  500. package/src/components/ui/Stepper/StepperPressable.tsx +1 -0
  501. package/src/components/ui/Stepper/StepperPressable.web.tsx +1 -0
  502. package/src/components/ui/Stepper/accessibility.ts +32 -0
  503. package/src/components/ui/Stepper/accessibility.types.ts +22 -0
  504. package/src/components/ui/Stepper/accessibility.web.ts +65 -0
  505. package/src/components/ui/Stepper/layout.ts +44 -0
  506. package/src/components/ui/Stepper/normalizeStepper.ts +85 -0
  507. package/src/components/ui/Stepper/styles.ts +9 -2
  508. package/src/components/ui/Stepper/types.ts +3 -1
  509. package/src/components/ui/Switch/Switch.tsx +54 -15
  510. package/src/components/ui/Switch/Switch.web.tsx +57 -19
  511. package/src/components/ui/Switch/styles.ts +11 -4
  512. package/src/components/ui/Switch/types.ts +2 -2
  513. package/src/components/ui/Tag/Tag.tsx +6 -2
  514. package/src/components/ui/TextField/TextFieldBase.tsx +175 -70
  515. package/src/components/ui/TextField/TextFieldSlot.tsx +91 -0
  516. package/src/components/ui/TextField/normalize.ts +280 -0
  517. package/src/components/ui/TextField/styles.ts +31 -0
  518. package/src/components/ui/TextField/types.ts +118 -22
  519. package/src/components/ui/TextField/useErrorAnnouncement.ts +27 -0
  520. package/src/components/ui/TextField/useTextFieldValue.ts +94 -0
  521. package/src/components/ui/TextField/valueState.ts +125 -0
  522. package/src/components/ui/Textarea/Textarea.tsx +11 -4
  523. package/src/components/ui/Textarea/index.ts +5 -0
  524. package/src/components/ui/Textarea/types.ts +14 -22
  525. package/src/components/ui/Thumbnail/Thumbnail.tsx +86 -51
  526. package/src/components/ui/Thumbnail/index.ts +5 -1
  527. package/src/components/ui/Thumbnail/normalize.ts +78 -0
  528. package/src/components/ui/Thumbnail/styles.ts +5 -10
  529. package/src/components/ui/Thumbnail/types.ts +43 -13
  530. package/src/components/ui/Toast/ToastHost.tsx +81 -22
  531. package/src/components/ui/Toast/ToastHost.web.tsx +91 -29
  532. package/src/components/ui/Toast/store.ts +148 -0
  533. package/src/components/ui/Toast/toast.ts +19 -10
  534. package/src/components/ui/Toast/types.ts +7 -3
  535. package/src/components/ui/index.ts +19 -4
  536. package/src/components/ui/shared/ImageAttempt.tsx +30 -0
  537. package/src/components/ui/shared/a11y.ts +18 -0
  538. package/src/components/ui/shared/accessibilityName.ts +6 -0
  539. package/src/components/ui/shared/selectImageAttemptSource.shared.ts +17 -0
  540. package/src/components/ui/shared/selectImageAttemptSource.ts +3 -0
  541. package/src/components/ui/shared/selectImageAttemptSource.web.ts +3 -0
  542. package/src/icons/data.ts +1 -1
  543. package/src/theme/ThemeProvider.tsx +18 -7
  544. package/src/theme/fontScale.ts +15 -0
  545. package/src/theme/index.ts +2 -3
  546. package/src/theme/themeContext.ts +24 -0
  547. package/src/theme/themeDiagnostics.ts +41 -0
  548. package/src/theme/usePrefersReducedMotion.ts +11 -4
  549. package/src/theme/usePrefersReducedMotion.web.ts +5 -2
  550. package/src/theme/useTheme.ts +19 -27
  551. package/src/theme/useThemedStyles.ts +12 -7
  552. package/src/utils/imageSource.ts +303 -0
  553. package/lib/module/components/ui/PasswordInput/styles.js +0 -12
  554. package/lib/module/components/ui/PasswordInput/styles.js.map +0 -1
  555. package/lib/module/components/ui/Pulse/usePulse.web.js +0 -76
  556. package/lib/module/components/ui/Pulse/usePulse.web.js.map +0 -1
  557. package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts +0 -7
  558. package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts.map +0 -1
  559. package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts +0 -21
  560. package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts.map +0 -1
  561. package/src/components/ui/PasswordInput/styles.ts +0 -7
  562. package/src/components/ui/Pulse/usePulse.web.ts +0 -74
@@ -7,14 +7,20 @@ import Animated, { cancelAnimation, runOnJS, useAnimatedStyle, useSharedValue, w
7
7
  import { useColors, useThemedStyles, motion, space } from "../../../theme/index.js";
8
8
  import { childTestID } from "../../../utils/testID/index.js";
9
9
  import { dotColorFor, makeStyles } from "./styles.js";
10
- import { _subs } from "./toast.js";
10
+ import { completeToast, isCurrentToastDelivery, registerToastHost } from "./toast.js";
11
+
12
+ /** Host 侧的同步身份副本 —— 迟到回调据此在动 UI 前自证「我还是当前那一次投递」。 */
11
13
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
14
  /**
13
- * 在根附近挂一次。监听 toast() 调用并渲染当前 toast。
14
- * 同一时间只显示一条 —— 新的会替换旧的。
15
+ * 在根附近挂**一次**。监听 toast() 调用并渲染当前 toast。
16
+ * 同一时间只显示一条 —— 新的会替换旧的(latest-wins)。
15
17
  *
16
18
  * 位置由 `entry.position`('top' / 'bottom' / 'center')决定,top/bottom 自动避让
17
19
  * safe-area;进入动画方向随位置(top 从上滑、bottom/center 从下滑)。
20
+ *
21
+ * 竞态纪律:每个 timer / 动画完成回调在改 UI 或上报完成前,都要同时通过同步 ref
22
+ * 与 `isCurrentToastDelivery(delivery)` 两道校验 —— 只靠其中之一都不够:ref 挡不住
23
+ * 「Host 重挂后同一 entry 的新投递」,Store 挡不住 React 批处理造成的 state 滞后。
18
24
  */
19
25
  export function ToastHost({
20
26
  testID
@@ -22,32 +28,63 @@ export function ToastHost({
22
28
  const c = useColors();
23
29
  const styles = useThemedStyles(makeStyles);
24
30
  const insets = useSafeAreaInsets();
25
- const [entry, setEntry] = useState(null);
31
+ const [delivery, setDelivery] = useState(null);
32
+ const [inert, setInert] = useState(false);
26
33
  const op = useSharedValue(0);
27
34
  const ty = useSharedValue(8);
28
35
  const dismissTimer = useRef(null);
36
+ const currentDeliveryRef = useRef(null);
29
37
  useEffect(() => {
30
- const sub = next => {
31
- if (dismissTimer.current) clearTimeout(dismissTimer.current);
32
- setEntry(next);
38
+ const subscriber = next => {
39
+ // 顺序固定:先撤销旧回调 → 再写同步身份 ref → 最后才动 React state。
40
+ if (dismissTimer.current) {
41
+ clearTimeout(dismissTimer.current);
42
+ dismissTimer.current = null;
43
+ }
44
+ cancelAnimation(op);
45
+ cancelAnimation(ty);
46
+ currentDeliveryRef.current = {
47
+ ownerToken: next.ownerToken,
48
+ leaseId: next.leaseId,
49
+ entryId: next.entry.id
50
+ };
51
+ setDelivery(next);
33
52
  };
34
- _subs.add(sub);
53
+ const lease = registerToastHost(subscriber);
54
+ if (!lease) {
55
+ setInert(true);
56
+ return;
57
+ }
35
58
  return () => {
36
- _subs.delete(sub);
59
+ // 顺序固定:先清身份 ref(让所有在途回调立刻失效)→ 撤销 timer/动画 → 最后释放 owner。
60
+ currentDeliveryRef.current = null;
61
+ if (dismissTimer.current) {
62
+ clearTimeout(dismissTimer.current);
63
+ dismissTimer.current = null;
64
+ }
65
+ cancelAnimation(op);
66
+ cancelAnimation(ty);
67
+ lease.release();
37
68
  };
38
- }, []);
69
+ }, [op, ty]);
39
70
 
40
- // 退场完成只清「仍是自己」的 entry:withTiming 完成回调经 runOnJS 跨线程异步投递,
41
- // 投递到执行之间若来了新 toast,无 id 守卫的 setEntry(null) 会把新 toast 瞬时清掉([M-14])。
42
- const dismissIfCurrent = useCallback(id => {
43
- setEntry(cur => cur?.id === id ? null : cur);
71
+ /** 退场完成:双重校验通过才清 UI 并上报完成,避免抹掉竞态期到达的新 toast([M-14])。 */
72
+ const finishIfCurrent = useCallback(finished => {
73
+ const identity = currentDeliveryRef.current;
74
+ if (!identity || identity.ownerToken !== finished.ownerToken || identity.leaseId !== finished.leaseId || identity.entryId !== finished.entry.id) {
75
+ return;
76
+ }
77
+ if (!isCurrentToastDelivery(finished)) return;
78
+ completeToast(finished.ownerToken, finished.leaseId, finished.entry.id);
79
+ currentDeliveryRef.current = null;
80
+ setDelivery(current => current === finished ? null : current);
44
81
  }, []);
45
82
  useEffect(() => {
46
- if (!entry) return;
83
+ if (!delivery) return;
84
+ const entry = delivery.entry;
47
85
  // [M-15] toast 出现时主动播报 —— 容器 pointerEvents="none" + 3s 自动消失,
48
86
  // SR 用户对一闪而过的反馈本无任何感知通道。
49
87
  AccessibilityInfo.announceForAccessibility(entry.message);
50
- const id = entry.id;
51
88
  // 进入方向:top 从上(-8)滑入,bottom / center 从下(8)滑入
52
89
  const from = entry.position === 'top' ? -8 : 8;
53
90
  cancelAnimation(op);
@@ -61,28 +98,34 @@ export function ToastHost({
61
98
  duration: motion.base
62
99
  });
63
100
  dismissTimer.current = setTimeout(() => {
101
+ // 定时器触发时可能早已不是当前投递(新 toast 抢先)—— 先自证再播退场动画。
102
+ if (!isCurrentToastDelivery(delivery)) return;
64
103
  op.value = withTiming(0, {
65
104
  duration: motion.base
66
105
  });
67
106
  ty.value = withTiming(from, {
68
107
  duration: motion.base
69
- }, finished => {
70
- if (finished) runOnJS(dismissIfCurrent)(id);
108
+ }, done => {
109
+ if (done) runOnJS(finishIfCurrent)(delivery);
71
110
  });
72
111
  }, entry.duration);
73
112
  return () => {
74
- if (dismissTimer.current) clearTimeout(dismissTimer.current);
113
+ if (dismissTimer.current) {
114
+ clearTimeout(dismissTimer.current);
115
+ dismissTimer.current = null;
116
+ }
75
117
  cancelAnimation(op);
76
118
  cancelAnimation(ty);
77
119
  };
78
- }, [entry, op, ty, dismissIfCurrent]);
120
+ }, [delivery, op, ty, finishIfCurrent]);
79
121
  const animatedStyle = useAnimatedStyle(() => ({
80
122
  opacity: op.value,
81
123
  transform: [{
82
124
  translateY: ty.value
83
125
  }]
84
126
  }));
85
- if (!entry) return null;
127
+ if (inert || !delivery) return null;
128
+ const entry = delivery.entry;
86
129
 
87
130
  // 位置:top=顶部(safe-area + 间距)/ center=屏幕居中 / bottom=底部(默认)
88
131
  const posStyle = entry.position === 'top' ? {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","useRef","useState","AccessibilityInfo","Text","View","useSafeAreaInsets","Animated","cancelAnimation","runOnJS","useAnimatedStyle","useSharedValue","withTiming","useColors","useThemedStyles","motion","space","childTestID","dotColorFor","makeStyles","_subs","jsx","_jsx","jsxs","_jsxs","ToastHost","testID","c","styles","insets","entry","setEntry","op","ty","dismissTimer","sub","next","current","clearTimeout","add","delete","dismissIfCurrent","id","cur","announceForAccessibility","message","from","position","value","duration","base","setTimeout","finished","animatedStyle","opacity","transform","translateY","posStyle","top","bottom","justifyContent","dotColor","kind","style","host","pointerEvents","children","toast","dot","backgroundColor","text"],"sourceRoot":"../../../../../src","sources":["components/ui/Toast/ToastHost.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useEffect","useRef","useState","AccessibilityInfo","Text","View","useSafeAreaInsets","Animated","cancelAnimation","runOnJS","useAnimatedStyle","useSharedValue","withTiming","useColors","useThemedStyles","motion","space","childTestID","dotColorFor","makeStyles","completeToast","isCurrentToastDelivery","registerToastHost","jsx","_jsx","jsxs","_jsxs","ToastHost","testID","c","styles","insets","delivery","setDelivery","inert","setInert","op","ty","dismissTimer","currentDeliveryRef","subscriber","next","current","clearTimeout","ownerToken","leaseId","entryId","entry","id","lease","release","finishIfCurrent","finished","identity","announceForAccessibility","message","from","position","value","duration","base","setTimeout","done","animatedStyle","opacity","transform","translateY","posStyle","top","bottom","justifyContent","dotColor","kind","style","host","pointerEvents","children","toast","dot","backgroundColor","text"],"sourceRoot":"../../../../../src","sources":["components/ui/Toast/ToastHost.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,21 +1,27 @@
1
1
  "use strict";
2
2
 
3
- import React, { useEffect, useRef, useState } from 'react';
3
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
4
4
  import { AccessibilityInfo, Text, View } from 'react-native';
5
5
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
6
  import { motion, space, useColors, usePrefersReducedMotion, useThemedStyles } from "../../../theme/index.js";
7
+ import { childTestID } from "../../../utils/testID/index.js";
7
8
  import { dotColorFor, makeStyles } from "./styles.js";
8
- import { _subs } from "./toast.js";
9
+ import { completeToast, isCurrentToastDelivery, registerToastHost } from "./toast.js";
10
+
11
+ /** Host 侧的同步身份副本 —— 迟到回调据此在动 UI 前自证「我还是当前那一次投递」。 */
9
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
13
  /**
11
- * Web 端 ToastHost —— RN-Web 上 reanimated 4 + worklets 0.9.x 的 useAnimatedStyle
12
- * 链路会在 _updatePropsJS 里 Object.keys 抛 TypeError(点击就崩),走纯 React + CSS
13
- * transition 实现 fade + slide,native 端仍走 ToastHost.tsx 的 reanimated 实现。
14
+ * Web 端 ToastHost —— RN-Web 上 reanimated 的 useAnimatedStyle 链路会在
15
+ * `_updatePropsJS``Object.keys` 抛 TypeError(点击就崩),故走纯 React + CSS
16
+ * transition 实现 fade + slide;native 端仍走 ToastHost.tsx 的 reanimated 实现。
14
17
  *
15
18
  * 行为复刻 native 版:
16
19
  * - opacity 0→1 + translateY 8→0 入场(motion.base ms)
17
20
  * - 停留 entry.duration ms
18
21
  * - opacity 1→0 + translateY 0→8 退场后 unmount
22
+ *
23
+ * 竞态纪律与 native 版一致:timer / RAF 在改 UI 或上报完成前,都要同时通过同步 ref
24
+ * 与 `isCurrentToastDelivery(delivery)` 两道校验。
19
25
  */
20
26
  export function ToastHost({
21
27
  testID
@@ -24,59 +30,102 @@ export function ToastHost({
24
30
  const styles = useThemedStyles(makeStyles);
25
31
  const insets = useSafeAreaInsets();
26
32
  const reduced = usePrefersReducedMotion();
27
- const [entry, setEntry] = useState(null);
33
+ const [delivery, setDelivery] = useState(null);
34
+ const [inert, setInert] = useState(false);
28
35
  const [visible, setVisible] = useState(false);
29
36
  const dismissTimerRef = useRef(null);
30
37
  const exitTimerRef = useRef(null);
31
38
  const enterRafRef = useRef(null);
39
+ const currentDeliveryRef = useRef(null);
40
+ const cancelCallbacks = useCallback(() => {
41
+ if (dismissTimerRef.current) {
42
+ clearTimeout(dismissTimerRef.current);
43
+ dismissTimerRef.current = null;
44
+ }
45
+ if (exitTimerRef.current) {
46
+ clearTimeout(exitTimerRef.current);
47
+ exitTimerRef.current = null;
48
+ }
49
+ if (enterRafRef.current != null) {
50
+ cancelAnimationFrame(enterRafRef.current);
51
+ enterRafRef.current = null;
52
+ }
53
+ }, []);
32
54
  useEffect(() => {
33
- const sub = next => {
34
- setEntry(next);
55
+ const subscriber = next => {
56
+ // 顺序固定:先撤销旧回调 → 再写同步身份 ref → 最后才动 React state。
57
+ cancelCallbacks();
58
+ currentDeliveryRef.current = {
59
+ ownerToken: next.ownerToken,
60
+ leaseId: next.leaseId,
61
+ entryId: next.entry.id
62
+ };
63
+ setDelivery(next);
35
64
  };
36
- _subs.add(sub);
65
+ const lease = registerToastHost(subscriber);
66
+ if (!lease) {
67
+ setInert(true);
68
+ return;
69
+ }
37
70
  return () => {
38
- _subs.delete(sub);
71
+ // 顺序固定:先清身份 ref(让所有在途回调立刻失效)→ 撤销 timer/RAF → 最后释放 owner。
72
+ currentDeliveryRef.current = null;
73
+ cancelCallbacks();
74
+ lease.release();
39
75
  };
76
+ }, [cancelCallbacks]);
77
+
78
+ /** 退场完成:双重校验通过才清 UI 并上报完成。 */
79
+ const finishIfCurrent = useCallback(finished => {
80
+ const identity = currentDeliveryRef.current;
81
+ if (!identity || identity.ownerToken !== finished.ownerToken || identity.leaseId !== finished.leaseId || identity.entryId !== finished.entry.id) {
82
+ return;
83
+ }
84
+ if (!isCurrentToastDelivery(finished)) return;
85
+ completeToast(finished.ownerToken, finished.leaseId, finished.entry.id);
86
+ currentDeliveryRef.current = null;
87
+ setDelivery(current => current === finished ? null : current);
40
88
  }, []);
41
89
  useEffect(() => {
42
- // entry=null:上一轮 effect 的 cleanup 已清 timer/RAF,这里无需重复。
43
- if (!entry) return;
90
+ // delivery=null:上一轮 effect 的 cleanup 已清 timer/RAF,这里无需重复。
91
+ if (!delivery) return;
92
+ const entry = delivery.entry;
44
93
  // [M-15] web 同样主动播报(RN-Web announceForAccessibility 注入 aria-live region)。
45
94
  AccessibilityInfo.announceForAccessibility(entry.message);
46
95
 
47
- // cancelled 标志:entry 快速连续切换 / 组件卸载时,cleanup 置 true。RAF 与
96
+ // cancelled 标志:delivery 快速连续切换 / 组件卸载时,cleanup 置 true。RAF 与
48
97
  // timer 回调执行前都检查它 —— cancelAnimationFrame 在部分浏览器不保证取消
49
98
  // 已排队回调,且双 RAF 的外层回调可能在 cleanup 后仍跑并 queue 内层,光靠
50
99
  // cancel 防不住。cancelled 兜底,杜绝 unmount 后 setState 警告 + 状态错位。
51
100
  let cancelled = false;
52
- // 进场:每次 entry 切换都从 visible=false 开始,确保 CSS transition 有起点
101
+ // 进场:每次切换都从 visible=false 开始,确保 CSS transition 有起点
53
102
  setVisible(false);
54
103
  // 双 RAF 才能稳过 React commit/paint 一帧 —— 否则同一 microtask 内 visible
55
104
  // 还是 true(未刷),CSS transition 没起点。
56
105
  enterRafRef.current = requestAnimationFrame(() => {
57
106
  if (cancelled) return;
58
107
  enterRafRef.current = requestAnimationFrame(() => {
59
- if (cancelled) return;
108
+ if (cancelled || !isCurrentToastDelivery(delivery)) return;
109
+ enterRafRef.current = null;
60
110
  setVisible(true);
61
111
  });
62
112
  });
63
- // 停留时长:从 setEntry 到关闭 = entry.duration ms。
113
+ // 停留时长:从投递到关闭 = entry.duration ms。
64
114
  dismissTimerRef.current = setTimeout(() => {
65
- if (cancelled) return;
115
+ if (cancelled || !isCurrentToastDelivery(delivery)) return;
66
116
  setVisible(false);
67
117
  exitTimerRef.current = setTimeout(() => {
68
118
  if (cancelled) return;
69
- setEntry(null);
119
+ finishIfCurrent(delivery);
70
120
  }, motion.base);
71
121
  }, entry.duration);
72
122
  return () => {
73
123
  cancelled = true;
74
- if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);
75
- if (exitTimerRef.current) clearTimeout(exitTimerRef.current);
76
- if (enterRafRef.current != null) cancelAnimationFrame(enterRafRef.current);
124
+ cancelCallbacks();
77
125
  };
78
- }, [entry]);
79
- if (!entry) return null;
126
+ }, [delivery, cancelCallbacks, finishIfCurrent]);
127
+ if (inert || !delivery) return null;
128
+ const entry = delivery.entry;
80
129
 
81
130
  // 位置:top=顶部(safe-area + 间距)/ center=屏幕居中 / bottom=底部(默认),复刻 native 版。
82
131
  // 此前 web 完全未注入定位,position 参数被静默忽略、垂直位置随挂载次序漂移([H-6])。
@@ -109,7 +158,7 @@ export function ToastHost({
109
158
  }]
110
159
  }) : null, /*#__PURE__*/_jsx(Text, {
111
160
  style: styles.text,
112
- testID: testID ? `${testID}-text` : undefined,
161
+ testID: childTestID(testID, 'text'),
113
162
  children: entry.message
114
163
  })]
115
164
  })
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useRef","useState","AccessibilityInfo","Text","View","useSafeAreaInsets","motion","space","useColors","usePrefersReducedMotion","useThemedStyles","dotColorFor","makeStyles","_subs","jsx","_jsx","jsxs","_jsxs","ToastHost","testID","c","styles","insets","reduced","entry","setEntry","visible","setVisible","dismissTimerRef","exitTimerRef","enterRafRef","sub","next","add","delete","announceForAccessibility","message","cancelled","current","requestAnimationFrame","setTimeout","base","duration","clearTimeout","cancelAnimationFrame","posStyle","position","top","bottom","justifyContent","dotColor","kind","animatedWebStyle","opacity","transform","transition","style","host","pointerEvents","children","toast","dot","backgroundColor","text","undefined"],"sourceRoot":"../../../../../src","sources":["components/ui/Toast/ToastHost.web.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useEffect","useRef","useState","AccessibilityInfo","Text","View","useSafeAreaInsets","motion","space","useColors","usePrefersReducedMotion","useThemedStyles","childTestID","dotColorFor","makeStyles","completeToast","isCurrentToastDelivery","registerToastHost","jsx","_jsx","jsxs","_jsxs","ToastHost","testID","c","styles","insets","reduced","delivery","setDelivery","inert","setInert","visible","setVisible","dismissTimerRef","exitTimerRef","enterRafRef","currentDeliveryRef","cancelCallbacks","current","clearTimeout","cancelAnimationFrame","subscriber","next","ownerToken","leaseId","entryId","entry","id","lease","release","finishIfCurrent","finished","identity","announceForAccessibility","message","cancelled","requestAnimationFrame","setTimeout","base","duration","posStyle","position","top","bottom","justifyContent","dotColor","kind","animatedWebStyle","opacity","transform","transition","style","host","pointerEvents","children","toast","dot","backgroundColor","text"],"sourceRoot":"../../../../../src","sources":["components/ui/Toast/ToastHost.web.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Toast 的纯状态机 —— 不含任何 React / 渲染依赖,可直接单测。
5
+ *
6
+ * 与 Confirm 的语义**不同**,故意不抽成泛型事件总线:
7
+ * - Confirm 是「一次决策」,需要 active entry + Promise;
8
+ * - Toast 是「最新一条覆盖旧的」,需要 pending / delivery 双态。
9
+ *
10
+ * 双态模型:
11
+ * - `pending` —— 还没有 Host 接住的最新一条消息。**latest-wins**:后来的直接覆盖,
12
+ * 不排队(toast 是瞬时反馈,补投一串历史消息毫无意义)。
13
+ * - `delivered` —— 已交给当前 Host 的那一条,带 `ownerToken` + `leaseId` + `entry.id`
14
+ * 三重身份。Host 的每个 timer / RAF / 动画完成回调在动 UI 前都必须用这三项做 CAS,
15
+ * 否则旧回调会把新 toast 提前抹掉(经典竞态:A 的 3s 定时器在 B 显示后才触发)。
16
+ *
17
+ * `leaseId` 单调递增,同一 entry 被重新投递(Host 重挂)也会拿到新的 leaseId ——
18
+ * 仅比较 entry.id 不足以区分「同一条消息的两次投递」。
19
+ */
20
+
21
+ export function createToastStore(log) {
22
+ let pending = null;
23
+ let delivered = null;
24
+ let owner = null;
25
+ let leaseCounter = 0;
26
+ function beginDelivery(entry, capturedOwner) {
27
+ const delivery = {
28
+ entry,
29
+ ownerToken: capturedOwner.token,
30
+ leaseId: ++leaseCounter
31
+ };
32
+ // 先原子地把 pending 取走并落 delivered,再调 subscriber:subscriber 内同步
33
+ // 再 publish 时看到的必须是「已投递」而不是「还在 pending」的半状态。
34
+ pending = null;
35
+ delivered = delivery;
36
+ try {
37
+ capturedOwner.subscriber?.(delivery);
38
+ } catch (error) {
39
+ log.error('ToastHost subscriber 抛错', error);
40
+ // 期间若 owner 已换人 / 已被作废,这次抛错不能牵连新 owner 或覆盖更新的 pending。
41
+ if (owner?.token !== capturedOwner.token) return;
42
+ owner = null;
43
+ if (delivered?.ownerToken === capturedOwner.token) {
44
+ // 回存的是 delivered 而非 entry:subscriber 内可能已同步投递了更新的一条,
45
+ // 那条才是当前逻辑消息(latest-wins)。已 complete 的则 delivered 为 null,不复活。
46
+ pending = delivered.entry;
47
+ delivered = null;
48
+ }
49
+ }
50
+ }
51
+ function publish(entry) {
52
+ const current = owner;
53
+ // 未挂 Host 是**受支持路径**,不告警:启动早期的 toast 应当在 Host 挂上后补投。
54
+ if (!current?.subscriber) {
55
+ pending = entry;
56
+ return;
57
+ }
58
+ beginDelivery(entry, current);
59
+ }
60
+ function registerHost(subscriber) {
61
+ if (owner) {
62
+ log.warn('检测到多个 <ToastHost />。只有第一个生效,重复挂载的实例保持惰性 —— 请在 app 根只挂一次。');
63
+ return null;
64
+ }
65
+ const token = Symbol('ToastHostOwner');
66
+ const self = {
67
+ token,
68
+ subscriber
69
+ };
70
+ owner = self;
71
+ if (pending) beginDelivery(pending, self);
72
+ // 首投期间 subscriber 抛错会把 owner 作废 —— 此时不能发出可用的 lease。
73
+ if (owner?.token !== token) return null;
74
+ return {
75
+ ownerToken: token,
76
+ release() {
77
+ if (owner?.token !== token) return;
78
+ self.subscriber = null;
79
+ owner = null;
80
+ if (delivered?.ownerToken === token) {
81
+ // 未完成的投递退回 pending,让下一个 Host 能补投;但更新的 pending 优先。
82
+ if (!pending) pending = delivered.entry;
83
+ delivered = null;
84
+ }
85
+ }
86
+ };
87
+ }
88
+ function complete(ownerToken, leaseId, entryId) {
89
+ const current = delivered;
90
+ if (!current) return false;
91
+ if (current.ownerToken !== ownerToken) return false;
92
+ if (current.leaseId !== leaseId) return false;
93
+ if (current.entry.id !== entryId) return false;
94
+ delivered = null;
95
+ return true;
96
+ }
97
+ function isCurrent(delivery) {
98
+ const current = delivered;
99
+ return current !== null && current.ownerToken === delivery.ownerToken && current.leaseId === delivery.leaseId && current.entry.id === delivery.entry.id;
100
+ }
101
+ return {
102
+ publish,
103
+ registerHost,
104
+ complete,
105
+ isCurrent,
106
+ pendingEntry: () => pending,
107
+ currentDelivery: () => delivered
108
+ };
109
+ }
110
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createToastStore","log","pending","delivered","owner","leaseCounter","beginDelivery","entry","capturedOwner","delivery","ownerToken","token","leaseId","subscriber","error","publish","current","registerHost","warn","Symbol","self","release","complete","entryId","id","isCurrent","pendingEntry","currentDelivery"],"sourceRoot":"../../../../../src","sources":["components/ui/Toast/store.ts"],"mappings":"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","ignoreList":[]}
@@ -4,11 +4,15 @@
4
4
  * 命令式 `toast()` API —— 与 `<ToastHost />` 配对使用。
5
5
  *
6
6
  * 文件名故意小写 `toast.ts`,host 组件叫 `ToastHost.tsx`,避免 APFS 大小写冲突。
7
+ *
8
+ * 本文件只做公共入参归一化(kind / duration / position),投递与身份仲裁全部在
9
+ * `store.ts`。下面三个内部导出只给两个 Host 用,**不进公共 barrel**。
7
10
  */
8
11
  import { createLogger } from "../../../utils/logger/index.js";
12
+ import { createToastStore } from "./store.js";
9
13
  const log = createLogger('toast');
14
+ const store = createToastStore(log);
10
15
  let _id = 0;
11
- export const _subs = new Set();
12
16
  const DEFAULT_DURATION = 3000;
13
17
  // [L-55] duration 合法域:[1, 2^31)。INT32_MAX = 2^31-1 = 2147483647,
14
18
  // setTimeout 内部用 int32 存储,超出会溢出变成 0 立即触发。
@@ -37,12 +41,9 @@ function emit(input, kind = 'info') {
37
41
  duration: clampDuration(input.duration),
38
42
  position: input.position ?? 'bottom'
39
43
  };
40
- // 未挂 <ToastHost />:消息无人接收,告警提示集成漏挂(对照 confirm 重入告警的纪律)。
41
- if (_subs.size === 0) {
42
- log.warn('toast() 调用时未挂载 <ToastHost />,消息被丢弃。请在 app 根附近挂一次 <ToastHost />。');
43
- return;
44
- }
45
- _subs.forEach(s => s(entry));
44
+ // 未挂 <ToastHost /> 是**受支持路径**:消息留在 pending,Host 挂上后立即补投。
45
+ // 故这里不告警 —— 启动早期的 toast 本来就可能先于 Host。
46
+ store.publish(entry);
46
47
  }
47
48
 
48
49
  /**
@@ -58,4 +59,13 @@ export const toast = Object.assign(input => emit(input, 'info'), {
58
59
  success: input => emit(input, 'success'),
59
60
  error: input => emit(input, 'error')
60
61
  });
62
+
63
+ /** 内部:ToastHost 挂载时注册唯一 owner;重复挂载得到 null。 */
64
+ export const registerToastHost = store.registerHost;
65
+
66
+ /** 内部:三重身份 CAS —— owner token + leaseId + entry id 全对才算完成。 */
67
+ export const completeToast = store.complete;
68
+
69
+ /** 内部:timer / RAF / 动画回调动 UI 前的守卫。 */
70
+ export const isCurrentToastDelivery = store.isCurrent;
61
71
  //# sourceMappingURL=toast.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createLogger","log","_id","_subs","Set","DEFAULT_DURATION","MAX_DURATION","clampDuration","raw","Number","isFinite","warn","Math","trunc","emit","input","kind","entry","id","message","duration","position","size","forEach","s","toast","Object","assign","info","success","error"],"sourceRoot":"../../../../../src","sources":["components/ui/Toast/toast.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA,SAASA,YAAY,QAAQ,gCAAuB;AAGpD,MAAMC,GAAG,GAAGD,YAAY,CAAC,OAAO,CAAC;AAEjC,IAAIE,GAAG,GAAG,CAAC;AACX,OAAO,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAAa,CAAC;AAE1C,MAAMC,gBAAgB,GAAG,IAAI;AAC7B;AACA;AACA,MAAMC,YAAY,GAAG,UAAU;;AAE/B;AACA,SAASC,aAAaA,CAACC,GAAuB,EAAU;EACtD,IAAIA,GAAG,IAAI,IAAI,EAAE,OAAOH,gBAAgB;EACxC,IAAI,CAACI,MAAM,CAACC,QAAQ,CAACF,GAAG,CAAC,IAAIA,GAAG,GAAG,CAAC,IAAIA,GAAG,IAAIF,YAAY,EAAE;IAC3DL,GAAG,CAACU,IAAI,CACN,kBAAkBH,GAAG,yBAAyBH,gBAAgB,KAChE,CAAC;IACD,OAAOA,gBAAgB;EACzB;EACA,OAAOO,IAAI,CAACC,KAAK,CAACL,GAAG,CAAC;AACxB;AAEA,SAASM,IAAIA,CAACC,KAAiB,EAAEC,IAAe,GAAG,MAAM,EAAE;EACzD,MAAMC,KAAiB,GACrB,OAAOF,KAAK,KAAK,QAAQ,GACrB;IACEG,EAAE,EAAE,EAAEhB,GAAG;IACTiB,OAAO,EAAEJ,KAAK;IACdC,IAAI;IACJI,QAAQ,EAAEf,gBAAgB;IAC1BgB,QAAQ,EAAE;EACZ,CAAC,GACD;IACEH,EAAE,EAAE,EAAEhB,GAAG;IACTiB,OAAO,EAAEJ,KAAK,CAACI,OAAO;IACtBH,IAAI,EAAED,KAAK,CAACC,IAAI,IAAIA,IAAI;IACxBI,QAAQ,EAAEb,aAAa,CAACQ,KAAK,CAACK,QAAQ,CAAC;IACvCC,QAAQ,EAAEN,KAAK,CAACM,QAAQ,IAAI;EAC9B,CAAC;EACP;EACA,IAAIlB,KAAK,CAACmB,IAAI,KAAK,CAAC,EAAE;IACpBrB,GAAG,CAACU,IAAI,CACN,iEACF,CAAC;IACD;EACF;EACAR,KAAK,CAACoB,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAACP,KAAK,CAAC,CAAC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMQ,KAAK,GAAGC,MAAM,CAACC,MAAM,CAAEZ,KAAiB,IAAKD,IAAI,CAACC,KAAK,EAAE,MAAM,CAAC,EAAE;EAC7Ea,IAAI,EAAGb,KAAiB,IAAKD,IAAI,CAACC,KAAK,EAAE,MAAM,CAAC;EAChDc,OAAO,EAAGd,KAAiB,IAAKD,IAAI,CAACC,KAAK,EAAE,SAAS,CAAC;EACtDe,KAAK,EAAGf,KAAiB,IAAKD,IAAI,CAACC,KAAK,EAAE,OAAO;AACnD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createLogger","createToastStore","log","store","_id","DEFAULT_DURATION","MAX_DURATION","clampDuration","raw","Number","isFinite","warn","Math","trunc","emit","input","kind","entry","id","message","duration","position","publish","toast","Object","assign","info","success","error","registerToastHost","registerHost","completeToast","complete","isCurrentToastDelivery","isCurrent"],"sourceRoot":"../../../../../src","sources":["components/ui/Toast/toast.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,YAAY,QAAQ,gCAAuB;AACpD,SAASC,gBAAgB,QAAQ,YAAS;AAG1C,MAAMC,GAAG,GAAGF,YAAY,CAAC,OAAO,CAAC;AAEjC,MAAMG,KAAK,GAAGF,gBAAgB,CAACC,GAAG,CAAC;AAEnC,IAAIE,GAAG,GAAG,CAAC;AAEX,MAAMC,gBAAgB,GAAG,IAAI;AAC7B;AACA;AACA,MAAMC,YAAY,GAAG,UAAU;;AAE/B;AACA,SAASC,aAAaA,CAACC,GAAuB,EAAU;EACtD,IAAIA,GAAG,IAAI,IAAI,EAAE,OAAOH,gBAAgB;EACxC,IAAI,CAACI,MAAM,CAACC,QAAQ,CAACF,GAAG,CAAC,IAAIA,GAAG,GAAG,CAAC,IAAIA,GAAG,IAAIF,YAAY,EAAE;IAC3DJ,GAAG,CAACS,IAAI,CACN,kBAAkBH,GAAG,yBAAyBH,gBAAgB,KAChE,CAAC;IACD,OAAOA,gBAAgB;EACzB;EACA,OAAOO,IAAI,CAACC,KAAK,CAACL,GAAG,CAAC;AACxB;AAEA,SAASM,IAAIA,CAACC,KAAiB,EAAEC,IAAe,GAAG,MAAM,EAAE;EACzD,MAAMC,KAAiB,GACrB,OAAOF,KAAK,KAAK,QAAQ,GACrB;IACEG,EAAE,EAAE,EAAEd,GAAG;IACTe,OAAO,EAAEJ,KAAK;IACdC,IAAI;IACJI,QAAQ,EAAEf,gBAAgB;IAC1BgB,QAAQ,EAAE;EACZ,CAAC,GACD;IACEH,EAAE,EAAE,EAAEd,GAAG;IACTe,OAAO,EAAEJ,KAAK,CAACI,OAAO;IACtBH,IAAI,EAAED,KAAK,CAACC,IAAI,IAAIA,IAAI;IACxBI,QAAQ,EAAEb,aAAa,CAACQ,KAAK,CAACK,QAAQ,CAAC;IACvCC,QAAQ,EAAEN,KAAK,CAACM,QAAQ,IAAI;EAC9B,CAAC;EACP;EACA;EACAlB,KAAK,CAACmB,OAAO,CAACL,KAAK,CAAC;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMM,KAAK,GAAGC,MAAM,CAACC,MAAM,CAAEV,KAAiB,IAAKD,IAAI,CAACC,KAAK,EAAE,MAAM,CAAC,EAAE;EAC7EW,IAAI,EAAGX,KAAiB,IAAKD,IAAI,CAACC,KAAK,EAAE,MAAM,CAAC;EAChDY,OAAO,EAAGZ,KAAiB,IAAKD,IAAI,CAACC,KAAK,EAAE,SAAS,CAAC;EACtDa,KAAK,EAAGb,KAAiB,IAAKD,IAAI,CAACC,KAAK,EAAE,OAAO;AACnD,CAAC,CAAC;;AAEF;AACA,OAAO,MAAMc,iBAAiB,GAAG1B,KAAK,CAAC2B,YAAY;;AAEnD;AACA,OAAO,MAAMC,aAAa,GAAG5B,KAAK,CAAC6B,QAAQ;;AAE3C;AACA,OAAO,MAAMC,sBAAsB,GAAG9B,KAAK,CAAC+B,SAAS","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["Avatar","BlurLayer","Button","Card","Carousel","Cell","List","Checkbox","Chip","confirm","ConfirmHost","DrawerHeader","Empty","EntryCard","Form","FormGroup","FormRow","Grid","Icon","IconButton","Input","Logo","NavBar","PasswordInput","Pulse","PulseDot","usePulse","Radio","Reveal","Search","Skeleton","Segmented","Spinner","StatusDot","Stepper","Switch","TabBar","Tabs","Tag","Textarea","Thumbnail","toast","ToastHost"],"sourceRoot":"../../../../src","sources":["components/ui/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,mBAAU;AAEjC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,EAAEC,IAAI,QAAQ,iBAAQ;AAEnC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,OAAO,EAAEC,WAAW,QAAQ,oBAAW;AAEhD,SAASC,YAAY,QAAQ,yBAAgB;AAE7C,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,IAAI,EAAEC,SAAS,EAAEC,OAAO,QAAQ,iBAAQ;AAEjD,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,UAAU,QAAQ,uBAAc;AAEzC,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,aAAa,QAAQ,0BAAiB;AAE/C,SAASC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,QAAQ,kBAAS;AAEnD,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,GAAG,QAAQ,gBAAO;AAE3B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,KAAK,EAAEC,SAAS,QAAQ,kBAAS","ignoreList":[]}
1
+ {"version":3,"names":["Avatar","BlurLayer","Button","Card","Carousel","Cell","List","Checkbox","Chip","confirm","ConfirmHost","DrawerHeader","Empty","EntryCard","Form","FormGroup","FormRow","Grid","Icon","IconButton","Input","Logo","NavBar","PasswordInput","Pulse","PulseDot","usePulse","Radio","Reveal","Search","Skeleton","Segmented","Spinner","StatusDot","Stepper","Switch","TabBar","Tabs","Tag","Textarea","Thumbnail","toast","ToastHost"],"sourceRoot":"../../../../src","sources":["components/ui/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,mBAAU;AAEjC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,EAAEC,IAAI,QAAQ,iBAAQ;AAQnC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,OAAO,EAAEC,WAAW,QAAQ,oBAAW;AAEhD,SAASC,YAAY,QAAQ,yBAAgB;AAE7C,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,IAAI,EAAEC,SAAS,EAAEC,OAAO,QAAQ,iBAAQ;AAEjD,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,UAAU,QAAQ,uBAAc;AAEzC,SAASC,KAAK,QAAQ,kBAAS;AAO/B,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,aAAa,QAAQ,0BAAiB;AAE/C,SAASC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,QAAQ,kBAAS;AAEnD,SAASC,KAAK,QAAQ,kBAAS;AAE/B,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAEvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,OAAO,QAAQ,oBAAW;AAEnC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,MAAM,QAAQ,mBAAU;AAEjC,SAASC,IAAI,QAAQ,iBAAQ;AAE7B,SAASC,GAAG,QAAQ,gBAAO;AAE3B,SAASC,QAAQ,QAAQ,qBAAY;AAErC,SAASC,SAAS,QAAQ,sBAAa;AAMvC,SAASC,KAAK,EAAEC,SAAS,QAAQ,kBAAS","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ import React, { useCallback, useState } from 'react';
4
+ import { Image } from 'react-native';
5
+ import { selectImageAttemptSource } from './selectImageAttemptSource';
6
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
7
+ /**
8
+ * 每个 keyed 挂载实例只拥有自己的失败状态。source identity 变化时由父级 key
9
+ * 同步换实例,旧 onError 无法写入新 attempt。
10
+ */
11
+ export function ImageAttempt({
12
+ source,
13
+ fallback,
14
+ ...imageProps
15
+ }) {
16
+ const [failed, setFailed] = useState(false);
17
+ // RNW 的加载 effect 依赖 onError identity;等价 render 不应中止并重发请求。
18
+ const handleError = useCallback(() => setFailed(true), []);
19
+ const selectedSource = selectImageAttemptSource(source);
20
+ return failed || selectedSource === undefined ? /*#__PURE__*/_jsx(_Fragment, {
21
+ children: fallback
22
+ }) : /*#__PURE__*/_jsx(Image, {
23
+ ...imageProps,
24
+ source: selectedSource,
25
+ onError: handleError
26
+ });
27
+ }
28
+ //# sourceMappingURL=ImageAttempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useState","Image","selectImageAttemptSource","Fragment","_Fragment","jsx","_jsx","ImageAttempt","source","fallback","imageProps","failed","setFailed","handleError","selectedSource","undefined","children","onError"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/ImageAttempt.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,KAAK,QAAQ,cAAc;AAEpC,SAASC,wBAAwB,QAAQ,4BAA4B;AAAC,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AAOtE;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,MAAM;EACNC,QAAQ;EACR,GAAGC;AACc,CAAC,EAAqB;EACvC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGZ,QAAQ,CAAC,KAAK,CAAC;EAC3C;EACA,MAAMa,WAAW,GAAGd,WAAW,CAAC,MAAMa,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;EAC1D,MAAME,cAAc,GAAGZ,wBAAwB,CAACM,MAAM,CAAC;EAEvD,OAAOG,MAAM,IAAIG,cAAc,KAAKC,SAAS,gBAC3CT,IAAA,CAAAF,SAAA;IAAAY,QAAA,EAAGP;EAAQ,CAAG,CAAC,gBAEfH,IAAA,CAACL,KAAK;IAAA,GAAKS,UAAU;IAAEF,MAAM,EAAEM,cAAe;IAACG,OAAO,EAAEJ;EAAY,CAAE,CACvE;AACH","ignoreList":[]}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * 装饰性节点从 a11y 树里隐藏所需的**全套**属性 —— 四个平台各认一个,少一个就漏。
5
+ *
6
+ * - `accessible: false` —— iOS/Android 都不把该节点合并成可聚焦元素
7
+ * - `accessibilityElementsHidden` —— iOS 连同后代一起移出 a11y 树
8
+ * - `importantForAccessibility: 'no-hide-descendants'` —— Android 同上
9
+ * - `aria-hidden` —— react-native-web 映射到 DOM 的 `aria-hidden`
10
+ *
11
+ * **只能**落在库内本地的 RN `View` / `Image` / `Text` 上。绝不要展开给未知第三方组件:
12
+ * 它们可能把未识别的 props 原样透传到原生层,或者干脆用同名 prop 表达别的语义。
13
+ * 需要隐藏第三方子树时,用一个本地 View 包住它,把这些属性挂在包装层。
14
+ */
15
+ export const A11Y_HIDDEN_PROPS = {
16
+ 'accessible': false,
17
+ 'accessibilityElementsHidden': true,
18
+ 'importantForAccessibility': 'no-hide-descendants',
19
+ 'aria-hidden': true
20
+ };
21
+ //# sourceMappingURL=a11y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["A11Y_HIDDEN_PROPS"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/a11y.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,iBAAiB,GAAG;EAC/B,YAAY,EAAE,KAAK;EACnB,6BAA6B,EAAE,IAAI;EACnC,2BAA2B,EAAE,qBAAqB;EAClD,aAAa,EAAE;AACjB,CAAU","ignoreList":[]}