@unif/react-native-design 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/README.md +3 -4
  2. package/lib/module/components/business/AvatarWithRing/AvatarWithRing.js +6 -4
  3. package/lib/module/components/business/AvatarWithRing/AvatarWithRing.js.map +1 -1
  4. package/lib/module/components/business/AvatarWithRing/styles.js +15 -3
  5. package/lib/module/components/business/AvatarWithRing/styles.js.map +1 -1
  6. package/lib/module/components/business/Decorations/GradientWash.js +50 -36
  7. package/lib/module/components/business/Decorations/GradientWash.js.map +1 -1
  8. package/lib/module/components/business/Decorations/RadialHalo.js +10 -4
  9. package/lib/module/components/business/Decorations/RadialHalo.js.map +1 -1
  10. package/lib/module/components/business/Decorations/ScreenBackdrop.js +22 -14
  11. package/lib/module/components/business/Decorations/ScreenBackdrop.js.map +1 -1
  12. package/lib/module/components/business/Decorations/index.js +3 -0
  13. package/lib/module/components/business/Decorations/index.js.map +1 -1
  14. package/lib/module/components/business/GlassStats/GlassStats.js +7 -4
  15. package/lib/module/components/business/GlassStats/GlassStats.js.map +1 -1
  16. package/lib/module/components/business/GlassStats/types.js +2 -0
  17. package/lib/module/components/business/VersionPill/VersionPill.js +23 -5
  18. package/lib/module/components/business/VersionPill/VersionPill.js.map +1 -1
  19. package/lib/module/components/business/VersionPill/styles.js +1 -1
  20. package/lib/module/components/business/index.js.map +1 -1
  21. package/lib/module/components/business/useSvgId.js +20 -0
  22. package/lib/module/components/business/useSvgId.js.map +1 -0
  23. package/lib/module/components/ui/Avatar/Avatar.js +13 -8
  24. package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
  25. package/lib/module/components/ui/Avatar/styles.js +7 -7
  26. package/lib/module/components/ui/Avatar/styles.js.map +1 -1
  27. package/lib/module/components/ui/BlurLayer/BlurLayer.js +5 -1
  28. package/lib/module/components/ui/BlurLayer/BlurLayer.js.map +1 -1
  29. package/lib/module/components/ui/BlurLayer/BlurLayer.web.js +7 -1
  30. package/lib/module/components/ui/BlurLayer/BlurLayer.web.js.map +1 -1
  31. package/lib/module/components/ui/Button/Button.js +2 -1
  32. package/lib/module/components/ui/Button/Button.js.map +1 -1
  33. package/lib/module/components/ui/Button/ButtonBase.js +36 -2
  34. package/lib/module/components/ui/Button/ButtonBase.js.map +1 -1
  35. package/lib/module/components/ui/Button/styles.js +27 -25
  36. package/lib/module/components/ui/Button/styles.js.map +1 -1
  37. package/lib/module/components/ui/Card/Card.js +17 -8
  38. package/lib/module/components/ui/Card/Card.js.map +1 -1
  39. package/lib/module/components/ui/Card/styles.js +6 -1
  40. package/lib/module/components/ui/Card/styles.js.map +1 -1
  41. package/lib/module/components/ui/Carousel/Carousel.js +36 -6
  42. package/lib/module/components/ui/Carousel/Carousel.js.map +1 -1
  43. package/lib/module/components/ui/Cell/Cell.js +23 -5
  44. package/lib/module/components/ui/Cell/Cell.js.map +1 -1
  45. package/lib/module/components/ui/Cell/Leading.js +2 -2
  46. package/lib/module/components/ui/Cell/Leading.js.map +1 -1
  47. package/lib/module/components/ui/Cell/List.js +10 -5
  48. package/lib/module/components/ui/Cell/List.js.map +1 -1
  49. package/lib/module/components/ui/Cell/styles.js +7 -6
  50. package/lib/module/components/ui/Cell/styles.js.map +1 -1
  51. package/lib/module/components/ui/Checkbox/Checkbox.js +10 -8
  52. package/lib/module/components/ui/Checkbox/Checkbox.js.map +1 -1
  53. package/lib/module/components/ui/Checkbox/styles.js +9 -1
  54. package/lib/module/components/ui/Checkbox/styles.js.map +1 -1
  55. package/lib/module/components/ui/Chip/Chip.js +19 -5
  56. package/lib/module/components/ui/Chip/Chip.js.map +1 -1
  57. package/lib/module/components/ui/Confirm/ConfirmHost.js +28 -11
  58. package/lib/module/components/ui/Confirm/ConfirmHost.js.map +1 -1
  59. package/lib/module/components/ui/Confirm/confirm.js +6 -0
  60. package/lib/module/components/ui/Confirm/confirm.js.map +1 -1
  61. package/lib/module/components/ui/DrawerHeader/DrawerHeader.js +14 -9
  62. package/lib/module/components/ui/DrawerHeader/DrawerHeader.js.map +1 -1
  63. package/lib/module/components/ui/DrawerHeader/styles.js +10 -6
  64. package/lib/module/components/ui/DrawerHeader/styles.js.map +1 -1
  65. package/lib/module/components/ui/Empty/Empty.js +5 -4
  66. package/lib/module/components/ui/Empty/Empty.js.map +1 -1
  67. package/lib/module/components/ui/EntryCard/EntryCard.js +5 -3
  68. package/lib/module/components/ui/EntryCard/EntryCard.js.map +1 -1
  69. package/lib/module/components/ui/EntryCard/styles.js +4 -4
  70. package/lib/module/components/ui/EntryCard/styles.js.map +1 -1
  71. package/lib/module/components/ui/Form/FormRow.js +1 -0
  72. package/lib/module/components/ui/Form/FormRow.js.map +1 -1
  73. package/lib/module/components/ui/Form/styles.js +3 -1
  74. package/lib/module/components/ui/Form/styles.js.map +1 -1
  75. package/lib/module/components/ui/Grid/Grid.js +39 -24
  76. package/lib/module/components/ui/Grid/Grid.js.map +1 -1
  77. package/lib/module/components/ui/Grid/styles.js +35 -46
  78. package/lib/module/components/ui/Grid/styles.js.map +1 -1
  79. package/lib/module/components/ui/Icon/Icon.js +46 -29
  80. package/lib/module/components/ui/Icon/Icon.js.map +1 -1
  81. package/lib/module/components/ui/IconButton/IconButton.js +2 -0
  82. package/lib/module/components/ui/IconButton/IconButton.js.map +1 -1
  83. package/lib/module/components/ui/Logo/Logo.js +2 -1
  84. package/lib/module/components/ui/Logo/Logo.js.map +1 -1
  85. package/lib/module/components/ui/NavBar/NavBar.js +15 -3
  86. package/lib/module/components/ui/NavBar/NavBar.js.map +1 -1
  87. package/lib/module/components/ui/PasswordInput/PasswordInput.js +43 -14
  88. package/lib/module/components/ui/PasswordInput/PasswordInput.js.map +1 -1
  89. package/lib/module/components/ui/PasswordInput/styles.js +1 -1
  90. package/lib/module/components/ui/Pulse/Pulse.js +2 -1
  91. package/lib/module/components/ui/Pulse/Pulse.js.map +1 -1
  92. package/lib/module/components/ui/Pulse/PulseDot.js +8 -10
  93. package/lib/module/components/ui/Pulse/PulseDot.js.map +1 -1
  94. package/lib/module/components/ui/Pulse/types.js +2 -0
  95. package/lib/module/components/ui/Pulse/usePulse.web.js +51 -30
  96. package/lib/module/components/ui/Pulse/usePulse.web.js.map +1 -1
  97. package/lib/module/components/ui/Radio/Radio.js +19 -5
  98. package/lib/module/components/ui/Radio/Radio.js.map +1 -1
  99. package/lib/module/components/ui/Radio/RadioGroup.js +10 -6
  100. package/lib/module/components/ui/Radio/RadioGroup.js.map +1 -1
  101. package/lib/module/components/ui/Radio/styles.js +10 -3
  102. package/lib/module/components/ui/Radio/styles.js.map +1 -1
  103. package/lib/module/components/ui/Reveal/Reveal.web.js +18 -3
  104. package/lib/module/components/ui/Reveal/Reveal.web.js.map +1 -1
  105. package/lib/module/components/ui/Search/Search.js +26 -10
  106. package/lib/module/components/ui/Search/Search.js.map +1 -1
  107. package/lib/module/components/ui/Segmented/Segmented.js +40 -30
  108. package/lib/module/components/ui/Segmented/Segmented.js.map +1 -1
  109. package/lib/module/components/ui/Segmented/styles.js +4 -2
  110. package/lib/module/components/ui/Segmented/styles.js.map +1 -1
  111. package/lib/module/components/ui/Skeleton/Skeleton.js +9 -8
  112. package/lib/module/components/ui/Skeleton/Skeleton.js.map +1 -1
  113. package/lib/module/components/ui/Spinner/Spinner.js +15 -16
  114. package/lib/module/components/ui/Spinner/Spinner.js.map +1 -1
  115. package/lib/module/components/ui/Spinner/Spinner.web.js +10 -14
  116. package/lib/module/components/ui/Spinner/Spinner.web.js.map +1 -1
  117. package/lib/module/components/ui/Spinner/shared.js +31 -0
  118. package/lib/module/components/ui/Spinner/shared.js.map +1 -0
  119. package/lib/module/components/ui/StatusDot/StatusDot.js +21 -4
  120. package/lib/module/components/ui/StatusDot/StatusDot.js.map +1 -1
  121. package/lib/module/components/ui/StatusDot/styles.js +1 -1
  122. package/lib/module/components/ui/StatusDot/types.js +2 -0
  123. package/lib/module/components/ui/Stepper/Stepper.js +46 -10
  124. package/lib/module/components/ui/Stepper/Stepper.js.map +1 -1
  125. package/lib/module/components/ui/Switch/Switch.js +6 -11
  126. package/lib/module/components/ui/Switch/Switch.js.map +1 -1
  127. package/lib/module/components/ui/Switch/Switch.web.js +2 -8
  128. package/lib/module/components/ui/Switch/Switch.web.js.map +1 -1
  129. package/lib/module/components/ui/Switch/styles.js +12 -3
  130. package/lib/module/components/ui/Switch/styles.js.map +1 -1
  131. package/lib/module/components/ui/TabBar/TabBar.js +10 -6
  132. package/lib/module/components/ui/TabBar/TabBar.js.map +1 -1
  133. package/lib/module/components/ui/TabBar/styles.js +28 -39
  134. package/lib/module/components/ui/TabBar/styles.js.map +1 -1
  135. package/lib/module/components/ui/Tabs/Tabs.js +19 -5
  136. package/lib/module/components/ui/Tabs/Tabs.js.map +1 -1
  137. package/lib/module/components/ui/Tabs/styles.js +6 -2
  138. package/lib/module/components/ui/Tabs/styles.js.map +1 -1
  139. package/lib/module/components/ui/Tabs/types.js +2 -0
  140. package/lib/module/components/ui/Tag/styles.js +15 -14
  141. package/lib/module/components/ui/Tag/styles.js.map +1 -1
  142. package/lib/module/components/ui/TextField/TextFieldBase.js +24 -6
  143. package/lib/module/components/ui/TextField/TextFieldBase.js.map +1 -1
  144. package/lib/module/components/ui/Thumbnail/Thumbnail.js +11 -3
  145. package/lib/module/components/ui/Thumbnail/Thumbnail.js.map +1 -1
  146. package/lib/module/components/ui/Thumbnail/styles.js +6 -2
  147. package/lib/module/components/ui/Thumbnail/styles.js.map +1 -1
  148. package/lib/module/components/ui/Toast/ToastHost.js +16 -5
  149. package/lib/module/components/ui/Toast/ToastHost.js.map +1 -1
  150. package/lib/module/components/ui/Toast/ToastHost.web.js +21 -4
  151. package/lib/module/components/ui/Toast/ToastHost.web.js.map +1 -1
  152. package/lib/module/components/ui/Toast/styles.js +2 -0
  153. package/lib/module/components/ui/Toast/styles.js.map +1 -1
  154. package/lib/module/components/ui/Toast/toast.js +23 -3
  155. package/lib/module/components/ui/Toast/toast.js.map +1 -1
  156. package/lib/module/components/ui/shared/badgeStyles.js +31 -0
  157. package/lib/module/components/ui/shared/badgeStyles.js.map +1 -0
  158. package/lib/module/icons/data.js +43 -18
  159. package/lib/module/icons/data.js.map +1 -1
  160. package/lib/module/theme/colors.js +28 -10
  161. package/lib/module/theme/colors.js.map +1 -1
  162. package/lib/module/theme/index.js +6 -2
  163. package/lib/module/theme/index.js.map +1 -1
  164. package/lib/module/theme/scale.js +9 -1
  165. package/lib/module/theme/scale.js.map +1 -1
  166. package/lib/module/theme/shadow.js +24 -41
  167. package/lib/module/theme/shadow.js.map +1 -1
  168. package/lib/module/theme/tokens.js +10 -5
  169. package/lib/module/theme/tokens.js.map +1 -1
  170. package/lib/module/theme/usePrefersReducedMotion.js +12 -0
  171. package/lib/module/theme/usePrefersReducedMotion.js.map +1 -0
  172. package/lib/module/theme/usePrefersReducedMotion.web.js +25 -0
  173. package/lib/module/theme/usePrefersReducedMotion.web.js.map +1 -0
  174. package/lib/module/theme/useTheme.js +13 -0
  175. package/lib/module/theme/useTheme.js.map +1 -1
  176. package/lib/module/utils/logger/logger.js +5 -1
  177. package/lib/module/utils/logger/logger.js.map +1 -1
  178. package/lib/module/utils/testID/testID.js +6 -3
  179. package/lib/module/utils/testID/testID.js.map +1 -1
  180. package/lib/typescript/src/components/business/AvatarWithRing/AvatarWithRing.d.ts +1 -1
  181. package/lib/typescript/src/components/business/AvatarWithRing/AvatarWithRing.d.ts.map +1 -1
  182. package/lib/typescript/src/components/business/AvatarWithRing/styles.d.ts +5 -5
  183. package/lib/typescript/src/components/business/AvatarWithRing/styles.d.ts.map +1 -1
  184. package/lib/typescript/src/components/business/AvatarWithRing/types.d.ts +3 -1
  185. package/lib/typescript/src/components/business/AvatarWithRing/types.d.ts.map +1 -1
  186. package/lib/typescript/src/components/business/Decorations/GradientWash.d.ts +25 -0
  187. package/lib/typescript/src/components/business/Decorations/GradientWash.d.ts.map +1 -1
  188. package/lib/typescript/src/components/business/Decorations/RadialHalo.d.ts.map +1 -1
  189. package/lib/typescript/src/components/business/Decorations/ScreenBackdrop.d.ts +1 -1
  190. package/lib/typescript/src/components/business/Decorations/ScreenBackdrop.d.ts.map +1 -1
  191. package/lib/typescript/src/components/business/Decorations/index.d.ts +1 -1
  192. package/lib/typescript/src/components/business/Decorations/index.d.ts.map +1 -1
  193. package/lib/typescript/src/components/business/Decorations/types.d.ts +2 -0
  194. package/lib/typescript/src/components/business/Decorations/types.d.ts.map +1 -1
  195. package/lib/typescript/src/components/business/GlassStats/GlassStats.d.ts +1 -1
  196. package/lib/typescript/src/components/business/GlassStats/GlassStats.d.ts.map +1 -1
  197. package/lib/typescript/src/components/business/GlassStats/styles.d.ts +2 -2
  198. package/lib/typescript/src/components/business/GlassStats/types.d.ts +5 -0
  199. package/lib/typescript/src/components/business/GlassStats/types.d.ts.map +1 -1
  200. package/lib/typescript/src/components/business/VersionPill/VersionPill.d.ts +1 -1
  201. package/lib/typescript/src/components/business/VersionPill/VersionPill.d.ts.map +1 -1
  202. package/lib/typescript/src/components/business/VersionPill/styles.d.ts +1 -1
  203. package/lib/typescript/src/components/business/VersionPill/styles.d.ts.map +1 -1
  204. package/lib/typescript/src/components/business/VersionPill/types.d.ts +13 -1
  205. package/lib/typescript/src/components/business/VersionPill/types.d.ts.map +1 -1
  206. package/lib/typescript/src/components/business/index.d.ts +1 -1
  207. package/lib/typescript/src/components/business/index.d.ts.map +1 -1
  208. package/lib/typescript/src/components/business/useSvgId.d.ts +12 -0
  209. package/lib/typescript/src/components/business/useSvgId.d.ts.map +1 -0
  210. package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts +1 -1
  211. package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts.map +1 -1
  212. package/lib/typescript/src/components/ui/Avatar/styles.d.ts +1 -1
  213. package/lib/typescript/src/components/ui/Avatar/styles.d.ts.map +1 -1
  214. package/lib/typescript/src/components/ui/Avatar/types.d.ts +3 -1
  215. package/lib/typescript/src/components/ui/Avatar/types.d.ts.map +1 -1
  216. package/lib/typescript/src/components/ui/BlurLayer/BlurLayer.d.ts +1 -1
  217. package/lib/typescript/src/components/ui/BlurLayer/BlurLayer.d.ts.map +1 -1
  218. package/lib/typescript/src/components/ui/BlurLayer/BlurLayer.web.d.ts.map +1 -1
  219. package/lib/typescript/src/components/ui/Button/Button.d.ts +1 -1
  220. package/lib/typescript/src/components/ui/Button/Button.d.ts.map +1 -1
  221. package/lib/typescript/src/components/ui/Button/ButtonBase.d.ts.map +1 -1
  222. package/lib/typescript/src/components/ui/Button/styles.d.ts +2 -1
  223. package/lib/typescript/src/components/ui/Button/styles.d.ts.map +1 -1
  224. package/lib/typescript/src/components/ui/Button/types.d.ts +1 -1
  225. package/lib/typescript/src/components/ui/Button/types.d.ts.map +1 -1
  226. package/lib/typescript/src/components/ui/Card/Card.d.ts.map +1 -1
  227. package/lib/typescript/src/components/ui/Card/styles.d.ts +2 -0
  228. package/lib/typescript/src/components/ui/Card/styles.d.ts.map +1 -1
  229. package/lib/typescript/src/components/ui/Card/types.d.ts +4 -4
  230. package/lib/typescript/src/components/ui/Card/types.d.ts.map +1 -1
  231. package/lib/typescript/src/components/ui/Carousel/Carousel.d.ts +4 -11
  232. package/lib/typescript/src/components/ui/Carousel/Carousel.d.ts.map +1 -1
  233. package/lib/typescript/src/components/ui/Carousel/index.d.ts +1 -1
  234. package/lib/typescript/src/components/ui/Carousel/index.d.ts.map +1 -1
  235. package/lib/typescript/src/components/ui/Carousel/types.d.ts +4 -0
  236. package/lib/typescript/src/components/ui/Carousel/types.d.ts.map +1 -1
  237. package/lib/typescript/src/components/ui/Cell/Cell.d.ts.map +1 -1
  238. package/lib/typescript/src/components/ui/Cell/List.d.ts.map +1 -1
  239. package/lib/typescript/src/components/ui/Cell/styles.d.ts +1 -1
  240. package/lib/typescript/src/components/ui/Cell/styles.d.ts.map +1 -1
  241. package/lib/typescript/src/components/ui/Cell/types.d.ts +5 -2
  242. package/lib/typescript/src/components/ui/Cell/types.d.ts.map +1 -1
  243. package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts.map +1 -1
  244. package/lib/typescript/src/components/ui/Checkbox/styles.d.ts +6 -0
  245. package/lib/typescript/src/components/ui/Checkbox/styles.d.ts.map +1 -1
  246. package/lib/typescript/src/components/ui/Chip/Chip.d.ts +4 -3
  247. package/lib/typescript/src/components/ui/Chip/Chip.d.ts.map +1 -1
  248. package/lib/typescript/src/components/ui/Chip/types.d.ts +2 -0
  249. package/lib/typescript/src/components/ui/Chip/types.d.ts.map +1 -1
  250. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts.map +1 -1
  251. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts.map +1 -1
  252. package/lib/typescript/src/components/ui/Confirm/types.d.ts +4 -2
  253. package/lib/typescript/src/components/ui/Confirm/types.d.ts.map +1 -1
  254. package/lib/typescript/src/components/ui/DrawerHeader/DrawerHeader.d.ts +1 -1
  255. package/lib/typescript/src/components/ui/DrawerHeader/DrawerHeader.d.ts.map +1 -1
  256. package/lib/typescript/src/components/ui/DrawerHeader/styles.d.ts.map +1 -1
  257. package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts +3 -1
  258. package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts.map +1 -1
  259. package/lib/typescript/src/components/ui/Empty/Empty.d.ts +2 -2
  260. package/lib/typescript/src/components/ui/Empty/Empty.d.ts.map +1 -1
  261. package/lib/typescript/src/components/ui/Empty/types.d.ts +3 -0
  262. package/lib/typescript/src/components/ui/Empty/types.d.ts.map +1 -1
  263. package/lib/typescript/src/components/ui/EntryCard/EntryCard.d.ts.map +1 -1
  264. package/lib/typescript/src/components/ui/EntryCard/styles.d.ts.map +1 -1
  265. package/lib/typescript/src/components/ui/EntryCard/types.d.ts +2 -2
  266. package/lib/typescript/src/components/ui/EntryCard/types.d.ts.map +1 -1
  267. package/lib/typescript/src/components/ui/Form/FormRow.d.ts.map +1 -1
  268. package/lib/typescript/src/components/ui/Form/styles.d.ts +1 -0
  269. package/lib/typescript/src/components/ui/Form/styles.d.ts.map +1 -1
  270. package/lib/typescript/src/components/ui/Form/types.d.ts +7 -2
  271. package/lib/typescript/src/components/ui/Form/types.d.ts.map +1 -1
  272. package/lib/typescript/src/components/ui/Grid/Grid.d.ts +1 -1
  273. package/lib/typescript/src/components/ui/Grid/Grid.d.ts.map +1 -1
  274. package/lib/typescript/src/components/ui/Grid/styles.d.ts.map +1 -1
  275. package/lib/typescript/src/components/ui/Grid/types.d.ts +4 -1
  276. package/lib/typescript/src/components/ui/Grid/types.d.ts.map +1 -1
  277. package/lib/typescript/src/components/ui/Icon/Icon.d.ts.map +1 -1
  278. package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts +1 -1
  279. package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts.map +1 -1
  280. package/lib/typescript/src/components/ui/IconButton/types.d.ts +7 -2
  281. package/lib/typescript/src/components/ui/IconButton/types.d.ts.map +1 -1
  282. package/lib/typescript/src/components/ui/Input/Input.d.ts +16 -16
  283. package/lib/typescript/src/components/ui/Input/types.d.ts +3 -2
  284. package/lib/typescript/src/components/ui/Input/types.d.ts.map +1 -1
  285. package/lib/typescript/src/components/ui/Logo/Logo.d.ts.map +1 -1
  286. package/lib/typescript/src/components/ui/NavBar/NavBar.d.ts +8 -1
  287. package/lib/typescript/src/components/ui/NavBar/NavBar.d.ts.map +1 -1
  288. package/lib/typescript/src/components/ui/NavBar/types.d.ts +5 -1
  289. package/lib/typescript/src/components/ui/NavBar/types.d.ts.map +1 -1
  290. package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts +13 -5
  291. package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts.map +1 -1
  292. package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts +1 -1
  293. package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts.map +1 -1
  294. package/lib/typescript/src/components/ui/PasswordInput/types.d.ts +7 -2
  295. package/lib/typescript/src/components/ui/PasswordInput/types.d.ts.map +1 -1
  296. package/lib/typescript/src/components/ui/Pulse/Pulse.d.ts +1 -1
  297. package/lib/typescript/src/components/ui/Pulse/Pulse.d.ts.map +1 -1
  298. package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts +1 -1
  299. package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts.map +1 -1
  300. package/lib/typescript/src/components/ui/Pulse/types.d.ts +5 -0
  301. package/lib/typescript/src/components/ui/Pulse/types.d.ts.map +1 -1
  302. package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts +12 -8
  303. package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts.map +1 -1
  304. package/lib/typescript/src/components/ui/Radio/Radio.d.ts.map +1 -1
  305. package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts.map +1 -1
  306. package/lib/typescript/src/components/ui/Radio/styles.d.ts +4 -2
  307. package/lib/typescript/src/components/ui/Radio/styles.d.ts.map +1 -1
  308. package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts +9 -0
  309. package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts.map +1 -1
  310. package/lib/typescript/src/components/ui/Search/Search.d.ts +16 -15
  311. package/lib/typescript/src/components/ui/Search/Search.d.ts.map +1 -1
  312. package/lib/typescript/src/components/ui/Search/types.d.ts +3 -1
  313. package/lib/typescript/src/components/ui/Search/types.d.ts.map +1 -1
  314. package/lib/typescript/src/components/ui/Segmented/Segmented.d.ts +1 -1
  315. package/lib/typescript/src/components/ui/Segmented/Segmented.d.ts.map +1 -1
  316. package/lib/typescript/src/components/ui/Segmented/styles.d.ts +1 -1
  317. package/lib/typescript/src/components/ui/Segmented/styles.d.ts.map +1 -1
  318. package/lib/typescript/src/components/ui/Segmented/types.d.ts +2 -0
  319. package/lib/typescript/src/components/ui/Segmented/types.d.ts.map +1 -1
  320. package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts +3 -2
  321. package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts.map +1 -1
  322. package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts.map +1 -1
  323. package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts.map +1 -1
  324. package/lib/typescript/src/components/ui/Spinner/shared.d.ts +5 -0
  325. package/lib/typescript/src/components/ui/Spinner/shared.d.ts.map +1 -0
  326. package/lib/typescript/src/components/ui/StatusDot/StatusDot.d.ts +1 -5
  327. package/lib/typescript/src/components/ui/StatusDot/StatusDot.d.ts.map +1 -1
  328. package/lib/typescript/src/components/ui/StatusDot/styles.d.ts +1 -1
  329. package/lib/typescript/src/components/ui/StatusDot/types.d.ts +13 -1
  330. package/lib/typescript/src/components/ui/StatusDot/types.d.ts.map +1 -1
  331. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts.map +1 -1
  332. package/lib/typescript/src/components/ui/Switch/Switch.d.ts.map +1 -1
  333. package/lib/typescript/src/components/ui/Switch/Switch.web.d.ts.map +1 -1
  334. package/lib/typescript/src/components/ui/Switch/styles.d.ts +7 -1
  335. package/lib/typescript/src/components/ui/Switch/styles.d.ts.map +1 -1
  336. package/lib/typescript/src/components/ui/TabBar/TabBar.d.ts +2 -2
  337. package/lib/typescript/src/components/ui/TabBar/TabBar.d.ts.map +1 -1
  338. package/lib/typescript/src/components/ui/TabBar/styles.d.ts.map +1 -1
  339. package/lib/typescript/src/components/ui/TabBar/types.d.ts +3 -0
  340. package/lib/typescript/src/components/ui/TabBar/types.d.ts.map +1 -1
  341. package/lib/typescript/src/components/ui/Tabs/Tabs.d.ts +1 -1
  342. package/lib/typescript/src/components/ui/Tabs/Tabs.d.ts.map +1 -1
  343. package/lib/typescript/src/components/ui/Tabs/styles.d.ts.map +1 -1
  344. package/lib/typescript/src/components/ui/Tabs/types.d.ts +9 -1
  345. package/lib/typescript/src/components/ui/Tabs/types.d.ts.map +1 -1
  346. package/lib/typescript/src/components/ui/Tag/styles.d.ts +2 -1
  347. package/lib/typescript/src/components/ui/Tag/styles.d.ts.map +1 -1
  348. package/lib/typescript/src/components/ui/Tag/types.d.ts +6 -2
  349. package/lib/typescript/src/components/ui/Tag/types.d.ts.map +1 -1
  350. package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts +16 -16
  351. package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts.map +1 -1
  352. package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts +16 -16
  353. package/lib/typescript/src/components/ui/Textarea/types.d.ts +2 -1
  354. package/lib/typescript/src/components/ui/Textarea/types.d.ts.map +1 -1
  355. package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts.map +1 -1
  356. package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts +3 -0
  357. package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts.map +1 -1
  358. package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts.map +1 -1
  359. package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts.map +1 -1
  360. package/lib/typescript/src/components/ui/Toast/styles.d.ts.map +1 -1
  361. package/lib/typescript/src/components/ui/Toast/toast.d.ts +0 -5
  362. package/lib/typescript/src/components/ui/Toast/toast.d.ts.map +1 -1
  363. package/lib/typescript/src/components/ui/Toast/types.d.ts +1 -1
  364. package/lib/typescript/src/components/ui/Toast/types.d.ts.map +1 -1
  365. package/lib/typescript/src/components/ui/shared/badgeStyles.d.ts +27 -0
  366. package/lib/typescript/src/components/ui/shared/badgeStyles.d.ts.map +1 -0
  367. package/lib/typescript/src/icons/data.d.ts.map +1 -1
  368. package/lib/typescript/src/icons/types.d.ts +18 -12
  369. package/lib/typescript/src/icons/types.d.ts.map +1 -1
  370. package/lib/typescript/src/theme/colors.d.ts +9 -3
  371. package/lib/typescript/src/theme/colors.d.ts.map +1 -1
  372. package/lib/typescript/src/theme/index.d.ts +3 -2
  373. package/lib/typescript/src/theme/index.d.ts.map +1 -1
  374. package/lib/typescript/src/theme/scale.d.ts.map +1 -1
  375. package/lib/typescript/src/theme/shadow.d.ts +8 -8
  376. package/lib/typescript/src/theme/shadow.d.ts.map +1 -1
  377. package/lib/typescript/src/theme/tokens.d.ts +7 -3
  378. package/lib/typescript/src/theme/tokens.d.ts.map +1 -1
  379. package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts +8 -0
  380. package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts.map +1 -0
  381. package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts +6 -0
  382. package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts.map +1 -0
  383. package/lib/typescript/src/theme/useTheme.d.ts.map +1 -1
  384. package/lib/typescript/src/utils/logger/logger.d.ts.map +1 -1
  385. package/lib/typescript/src/utils/testID/testID.d.ts +6 -3
  386. package/lib/typescript/src/utils/testID/testID.d.ts.map +1 -1
  387. package/package.json +2 -1
  388. package/src/components/business/AvatarWithRing/AvatarWithRing.tsx +5 -4
  389. package/src/components/business/AvatarWithRing/styles.ts +21 -3
  390. package/src/components/business/AvatarWithRing/types.ts +3 -1
  391. package/src/components/business/Decorations/GradientWash.tsx +46 -22
  392. package/src/components/business/Decorations/RadialHalo.tsx +8 -4
  393. package/src/components/business/Decorations/ScreenBackdrop.tsx +23 -5
  394. package/src/components/business/Decorations/index.ts +4 -0
  395. package/src/components/business/Decorations/types.ts +2 -0
  396. package/src/components/business/GlassStats/GlassStats.tsx +8 -4
  397. package/src/components/business/GlassStats/types.ts +6 -0
  398. package/src/components/business/VersionPill/VersionPill.tsx +46 -6
  399. package/src/components/business/VersionPill/styles.ts +1 -1
  400. package/src/components/business/VersionPill/types.ts +13 -1
  401. package/src/components/business/index.ts +1 -0
  402. package/src/components/business/useSvgId.ts +17 -0
  403. package/src/components/ui/Avatar/Avatar.tsx +17 -10
  404. package/src/components/ui/Avatar/styles.ts +7 -7
  405. package/src/components/ui/Avatar/types.ts +3 -1
  406. package/src/components/ui/BlurLayer/BlurLayer.tsx +4 -1
  407. package/src/components/ui/BlurLayer/BlurLayer.web.tsx +7 -1
  408. package/src/components/ui/Button/Button.tsx +2 -1
  409. package/src/components/ui/Button/ButtonBase.tsx +26 -2
  410. package/src/components/ui/Button/styles.ts +27 -25
  411. package/src/components/ui/Button/types.ts +1 -1
  412. package/src/components/ui/Card/Card.tsx +17 -7
  413. package/src/components/ui/Card/styles.ts +5 -0
  414. package/src/components/ui/Card/types.ts +4 -4
  415. package/src/components/ui/Carousel/Carousel.tsx +44 -15
  416. package/src/components/ui/Carousel/index.ts +1 -1
  417. package/src/components/ui/Carousel/types.ts +5 -0
  418. package/src/components/ui/Cell/Cell.tsx +28 -6
  419. package/src/components/ui/Cell/Leading.tsx +2 -2
  420. package/src/components/ui/Cell/List.tsx +14 -8
  421. package/src/components/ui/Cell/styles.ts +8 -5
  422. package/src/components/ui/Cell/types.ts +5 -2
  423. package/src/components/ui/Checkbox/Checkbox.tsx +18 -5
  424. package/src/components/ui/Checkbox/styles.ts +8 -0
  425. package/src/components/ui/Chip/Chip.tsx +20 -5
  426. package/src/components/ui/Chip/types.ts +2 -0
  427. package/src/components/ui/Confirm/ConfirmHost.tsx +26 -10
  428. package/src/components/ui/Confirm/confirm.ts +8 -0
  429. package/src/components/ui/Confirm/types.ts +4 -2
  430. package/src/components/ui/DrawerHeader/DrawerHeader.tsx +18 -12
  431. package/src/components/ui/DrawerHeader/styles.ts +10 -6
  432. package/src/components/ui/DrawerHeader/types.ts +3 -1
  433. package/src/components/ui/Empty/Empty.tsx +5 -4
  434. package/src/components/ui/Empty/types.ts +3 -0
  435. package/src/components/ui/EntryCard/EntryCard.tsx +5 -3
  436. package/src/components/ui/EntryCard/styles.ts +13 -4
  437. package/src/components/ui/EntryCard/types.ts +2 -2
  438. package/src/components/ui/Form/FormRow.tsx +7 -1
  439. package/src/components/ui/Form/styles.ts +2 -0
  440. package/src/components/ui/Form/types.ts +7 -2
  441. package/src/components/ui/Grid/Grid.tsx +42 -25
  442. package/src/components/ui/Grid/styles.ts +8 -20
  443. package/src/components/ui/Grid/types.ts +4 -1
  444. package/src/components/ui/Icon/Icon.tsx +42 -27
  445. package/src/components/ui/IconButton/IconButton.tsx +2 -0
  446. package/src/components/ui/IconButton/types.ts +8 -2
  447. package/src/components/ui/Input/types.ts +3 -2
  448. package/src/components/ui/Logo/Logo.tsx +2 -1
  449. package/src/components/ui/NavBar/NavBar.tsx +16 -2
  450. package/src/components/ui/NavBar/types.ts +5 -1
  451. package/src/components/ui/PasswordInput/PasswordInput.tsx +77 -43
  452. package/src/components/ui/PasswordInput/styles.ts +1 -1
  453. package/src/components/ui/PasswordInput/types.ts +7 -2
  454. package/src/components/ui/Pulse/Pulse.tsx +2 -1
  455. package/src/components/ui/Pulse/PulseDot.tsx +7 -6
  456. package/src/components/ui/Pulse/types.ts +6 -0
  457. package/src/components/ui/Pulse/usePulse.web.ts +50 -33
  458. package/src/components/ui/Radio/Radio.tsx +29 -6
  459. package/src/components/ui/Radio/RadioGroup.tsx +10 -3
  460. package/src/components/ui/Radio/styles.ts +9 -2
  461. package/src/components/ui/Reveal/Reveal.web.tsx +18 -3
  462. package/src/components/ui/Search/Search.tsx +22 -9
  463. package/src/components/ui/Search/types.ts +7 -1
  464. package/src/components/ui/Segmented/Segmented.tsx +8 -3
  465. package/src/components/ui/Segmented/styles.ts +4 -2
  466. package/src/components/ui/Segmented/types.ts +2 -0
  467. package/src/components/ui/Skeleton/Skeleton.tsx +9 -8
  468. package/src/components/ui/Spinner/Spinner.tsx +17 -17
  469. package/src/components/ui/Spinner/Spinner.web.tsx +7 -15
  470. package/src/components/ui/Spinner/shared.ts +37 -0
  471. package/src/components/ui/StatusDot/StatusDot.tsx +21 -3
  472. package/src/components/ui/StatusDot/styles.ts +1 -1
  473. package/src/components/ui/StatusDot/types.ts +14 -1
  474. package/src/components/ui/Stepper/Stepper.tsx +45 -10
  475. package/src/components/ui/Switch/Switch.tsx +4 -10
  476. package/src/components/ui/Switch/Switch.web.tsx +2 -8
  477. package/src/components/ui/Switch/styles.ts +10 -1
  478. package/src/components/ui/TabBar/TabBar.tsx +14 -6
  479. package/src/components/ui/TabBar/styles.ts +9 -21
  480. package/src/components/ui/TabBar/types.ts +3 -0
  481. package/src/components/ui/Tabs/Tabs.tsx +24 -5
  482. package/src/components/ui/Tabs/styles.ts +6 -2
  483. package/src/components/ui/Tabs/types.ts +10 -1
  484. package/src/components/ui/Tag/styles.ts +18 -10
  485. package/src/components/ui/Tag/types.ts +6 -2
  486. package/src/components/ui/TextField/TextFieldBase.tsx +31 -6
  487. package/src/components/ui/Textarea/types.ts +2 -1
  488. package/src/components/ui/Thumbnail/Thumbnail.tsx +14 -3
  489. package/src/components/ui/Thumbnail/styles.ts +6 -2
  490. package/src/components/ui/Toast/ToastHost.tsx +16 -8
  491. package/src/components/ui/Toast/ToastHost.web.tsx +26 -4
  492. package/src/components/ui/Toast/styles.ts +2 -0
  493. package/src/components/ui/Toast/toast.ts +35 -2
  494. package/src/components/ui/Toast/types.ts +1 -1
  495. package/src/components/ui/shared/badgeStyles.ts +36 -0
  496. package/src/icons/data.ts +27 -0
  497. package/src/icons/types.ts +25 -10
  498. package/src/theme/colors.ts +29 -10
  499. package/src/theme/index.ts +10 -1
  500. package/src/theme/scale.ts +5 -1
  501. package/src/theme/shadow.ts +33 -24
  502. package/src/theme/tokens.ts +10 -5
  503. package/src/theme/usePrefersReducedMotion.ts +9 -0
  504. package/src/theme/usePrefersReducedMotion.web.ts +27 -0
  505. package/src/theme/useTheme.ts +15 -0
  506. package/src/utils/logger/logger.ts +5 -1
  507. package/src/utils/testID/testID.ts +6 -3
  508. package/lib/module/components/index.js +0 -5
  509. package/lib/module/components/index.js.map +0 -1
  510. package/lib/typescript/src/components/index.d.ts +0 -3
  511. package/lib/typescript/src/components/index.d.ts.map +0 -1
  512. package/src/components/index.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/theme/tokens.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,QAInB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;IAYf,8EAA8E;;IAE9E,uCAAuC;;IAEvC;2DACuD;;IAEvD,gDAAgD;;IAEhD,uDAAuD;;IAEvD,yCAAyC;;CAEjC,CAAC;AAEX,eAAO,MAAM,EAAE;;;;;;CAML,CAAC;AAEX,eAAO,MAAM,KAAK;;;;;;;;;;;;CAYR,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX;4DAC4D;AAC5D,eAAO,MAAM,IAAI;;;;;;;CAOP,CAAC;AAEX;;YAEY;AACZ,eAAO,MAAM,OAAO;;;;CAIV,CAAC;AAEX,8CAA8C;AAC9C,eAAO,MAAM,GAAG;IACd,6DAA6D;;CAErD,CAAC;AAEX;+BAC+B;AAC/B,eAAO,MAAM,KAAK;;;;;CAKR,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;CAKT,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/theme/tokens.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,QAInB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;IAYf,gEAAgE;;IAEhE,uCAAuC;;IAEvC;2DACuD;;IAEvD,gDAAgD;;IAEhD,wCAAwC;;IAExC,yCAAyC;;CAEjC,CAAC;AAEX,eAAO,MAAM,EAAE;;;;;;CAML,CAAC;AAEX,eAAO,MAAM,KAAK;;;;;;;;;;;;CAYR,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX;4DAC4D;AAC5D,eAAO,MAAM,IAAI;;;;;;;CAOP,CAAC;AAEX;;YAEY;AACZ,eAAO,MAAM,OAAO;;;;CAIV,CAAC;AAEX,8CAA8C;AAC9C,eAAO,MAAM,GAAG;IACd,6CAA6C;;CAErC,CAAC;AAEX;+BAC+B;AAC/B,eAAO,MAAM,KAAK;;;;;CAKR,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;CAKT,CAAC;AAEX;;4CAE4C;AAC5C,eAAO,MAAM,cAAc,MAAM,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 系统「减弱动态效果」开关。
3
+ *
4
+ * native 端的动画由 reanimated 默认 `ReduceMotion.System` 处理(reduce-motion 下自动
5
+ * 跳到端值),此 hook 只有 web 平台的 CSS/JS 动画需要 —— native 恒返回 false,见 `.web.ts`。
6
+ */
7
+ export declare function usePrefersReducedMotion(): boolean;
8
+ //# sourceMappingURL=usePrefersReducedMotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePrefersReducedMotion.d.ts","sourceRoot":"","sources":["../../../../src/theme/usePrefersReducedMotion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * web:监听系统「减弱动态效果」开关,返回当前是否开启;开关变化时自动更新。
3
+ * native 端走 reanimated 的 `ReduceMotion.System`,对应 `.ts` 版恒返回 false。
4
+ */
5
+ export declare function usePrefersReducedMotion(): boolean;
6
+ //# sourceMappingURL=usePrefersReducedMotion.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePrefersReducedMotion.web.d.ts","sourceRoot":"","sources":["../../../../src/theme/usePrefersReducedMotion.web.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAcjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../../../src/theme/useTheme.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAUvE,wBAAgB,QAAQ,IAAI,iBAAiB,CAG5C;AAED,wBAAgB,SAAS,mCAExB;AAED,wBAAgB,SAAS,oCAExB"}
1
+ {"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../../../src/theme/useTheme.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAiBvE,wBAAgB,QAAQ,IAAI,iBAAiB,CAW5C;AAED,wBAAgB,SAAS,mCAExB;AAED,wBAAgB,SAAS,oCAExB"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAa,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAuCzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAGlD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEhD"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../../src/utils/logger/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAa,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAuCzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAKlD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIhD"}
@@ -1,17 +1,20 @@
1
1
  /**
2
2
  * `childTestID` —— 把"父 testID + 子 id → 子 testID"的拼接逻辑收口。
3
3
  *
4
- * 业务侧 7 处 list-like 组件(Tabs / Segmented / TabBar / Grid / Task /
5
- * Sources / ChainOfThought)重复同一三元:
4
+ * 本仓已接入的 list-like 组件(Tabs / Segmented / TabBar / Grid)原来各自重复:
6
5
  *
7
6
  * ```ts
8
7
  * const itemTestID = item.testID ?? (testID ? `${testID}-${item.id}` : undefined);
9
8
  * ```
10
9
  *
11
10
  * 抽 helper:
12
- * - `override` 命中 → 用 caller 显式指定
11
+ * - `override` 命中(truthy)→ 用 caller 显式指定
13
12
  * - 父 `parent` 缺失 → undefined(testID 不强制)
14
13
  * - 都没问题 → `{parent}-{id}` 拼接
14
+ *
15
+ * 注意:与旧式 `??` 不同,**空串 override 视为未提供、回落拼接**。
16
+ * 这是刻意设计:空 testID 没有语义价值,用例已钉死此边界
17
+ * (`__tests__/utils/testID.test.ts:31-33`),勿改回 `??` 判定。
15
18
  */
16
19
  export declare function childTestID(parent: string | undefined, id: string | number, override?: string): string | undefined;
17
20
  //# sourceMappingURL=testID.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testID.d.ts","sourceRoot":"","sources":["../../../../../src/utils/testID/testID.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAGpB"}
1
+ {"version":3,"file":"testID.d.ts","sourceRoot":"","sources":["../../../../../src/utils/testID/testID.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAGpB"}
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@unif/react-native-design",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "description": "Unif 设计系统:theme + icons + utils + components",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
7
+ "sideEffects": false,
7
8
  "exports": {
8
9
  ".": {
9
10
  "source": "./src/index.tsx",
@@ -1,4 +1,4 @@
1
- import React, { useId, useMemo } from 'react';
1
+ import React, { useMemo } from 'react';
2
2
  import { StyleSheet, Text, View } from 'react-native';
3
3
  import Svg, {
4
4
  Defs,
@@ -7,6 +7,7 @@ import Svg, {
7
7
  Stop,
8
8
  } from 'react-native-svg';
9
9
  import { avatarGradient, useTheme } from '../../../theme';
10
+ import { useSvgId } from '../useSvgId';
10
11
  import { makeAvatarStyles } from './styles';
11
12
  import type { AvatarWithRingProps } from './types';
12
13
 
@@ -22,17 +23,17 @@ export function AvatarWithRing({
22
23
  size = 64,
23
24
  ringColor,
24
25
  style,
26
+ testID,
25
27
  }: AvatarWithRingProps): React.JSX.Element {
26
28
  const { colors: c, shadow } = useTheme();
27
- const autoId = useId();
28
- const id = `av-${autoId.replace(/[^a-zA-Z0-9_-]/g, '')}`;
29
+ const id = useSvgId('av');
29
30
  const { inner, styles } = useMemo(
30
31
  () =>
31
32
  makeAvatarStyles(size, ringColor ?? c.avatarRing, shadow.brandAvatar, c),
32
33
  [size, ringColor, c, shadow.brandAvatar]
33
34
  );
34
35
  return (
35
- <View style={[styles.shell, style]}>
36
+ <View style={[styles.shell, style]} testID={testID}>
36
37
  <View style={styles.avatarCore}>
37
38
  <Svg width={inner} height={inner} style={StyleSheet.absoluteFill}>
38
39
  <Defs>
@@ -1,5 +1,8 @@
1
1
  import { StyleSheet, type ViewStyle } from 'react-native';
2
2
  import { fw, r, type ColorTokens } from '../../../theme';
3
+ import { createLogger } from '../../../utils/logger';
4
+
5
+ const log = createLogger('AvatarWithRing');
3
6
 
4
7
  /**
5
8
  * 头像样式工厂 —— **非标 maker 签名**:`(size, ringColor, shadowStyle, c)` 4 参,
@@ -26,9 +29,24 @@ export const makeAvatarStyles = (
26
29
  shadowStyle: ViewStyle,
27
30
  c: ColorTokens
28
31
  ) => {
29
- const dim = r(size);
32
+ // 防御非法 size:NaN / 负数 / 0 会导致 inner 为负传入 SVG。
33
+ // 最小合理值 = ringWidth*2 + 1(至少 1pt 圆心可见)。
34
+ // ringWidth 下限为 2(见下方 Math.max),所以 size 至少要大于 4pt。
35
+ const MIN_SIZE = 5;
36
+ const safeSize =
37
+ Number.isFinite(size) && size >= MIN_SIZE
38
+ ? size
39
+ : (() => {
40
+ if (__DEV__) {
41
+ log.warn(
42
+ `AvatarWithRing: size=${size} 无效(须 ≥ ${MIN_SIZE}),已钳制为 ${MIN_SIZE}。`
43
+ );
44
+ }
45
+ return MIN_SIZE;
46
+ })();
47
+ const dim = r(safeSize);
30
48
  const half = dim / 2;
31
- const ringWidth = Math.max(2, r(Math.round(size * 0.0625)));
49
+ const ringWidth = Math.max(2, r(Math.round(safeSize * 0.0625)));
32
50
  const inner = dim - ringWidth * 2;
33
51
  const innerHalf = inner / 2;
34
52
  const styles = StyleSheet.create({
@@ -50,7 +68,7 @@ export const makeAvatarStyles = (
50
68
  justifyContent: 'center',
51
69
  },
52
70
  label: {
53
- fontSize: r(Math.round(size * 0.4)),
71
+ fontSize: r(Math.round(safeSize * 0.4)),
54
72
  fontWeight: fw.bold,
55
73
  color: c.onPrimary,
56
74
  letterSpacing: -0.5,
@@ -8,8 +8,10 @@ export type AvatarWithRingProps = {
8
8
  * 视觉占比:label 字号约 size * 0.40,ring 宽度约 size * 0.0625。
9
9
  */
10
10
  size?: number;
11
- /** ring + 填充背景色,默认 c.primary。 */
11
+ /** ring 颜色,默认 c.avatarRing(白系半透明)。 */
12
12
  ringColor?: string;
13
13
  /** 容器附加样式(margin / position 等定位)。 */
14
14
  style?: StyleProp<ViewStyle>;
15
+ /** E2E / 测试定位 */
16
+ testID?: string;
15
17
  };
@@ -1,4 +1,4 @@
1
- import React, { useId } from 'react';
1
+ import React from 'react';
2
2
  import { View } from 'react-native';
3
3
  import Svg, {
4
4
  Defs,
@@ -6,8 +6,48 @@ import Svg, {
6
6
  Rect,
7
7
  Stop,
8
8
  } from 'react-native-svg';
9
+ import { useSvgId } from '../useSvgId';
9
10
  import type { GradientWashProps } from './types';
10
11
 
12
+ /** 解析 rgba(r,g,b,a) 或 #RRGGBBAA 字符串拆出 alpha,返回 { color: rgb/hex, opacity }。
13
+ * 非支持格式(rgb / hex / named / hsl 等)原样返回 + opacity=1。
14
+ *
15
+ * 支持格式:
16
+ * - 逗号式 rgba(r,g,b,a) → 拆出 alpha
17
+ * - 8 位 hex #RRGGBBAA → 末两位转 alpha
18
+ * - 其它(rgb / hex6 / named) → 原样 + opacity=1
19
+ *
20
+ * Why:react-native-svg `<Stop stopColor>` 接 rgba 时 alpha 可能被忽略
21
+ * (stopColor 只解析 RGB,需要 stopOpacity 分离),拆分后跨平台一致。 */
22
+ export function parseRgba(color: string): { color: string; opacity: number } {
23
+ // 逗号式 rgba(r,g,b,a)
24
+ const mRgba = color.match(/^rgba\(([^)]+)\)$/);
25
+ if (mRgba?.[1]) {
26
+ const parts = mRgba[1].split(',').map((s) => s.trim());
27
+ if (parts.length === 4) {
28
+ const alphaStr = parts[3];
29
+ if (alphaStr !== undefined) {
30
+ const alpha = parseFloat(alphaStr);
31
+ if (!Number.isNaN(alpha)) {
32
+ return {
33
+ color: `rgb(${parts.slice(0, 3).join(',')})`,
34
+ opacity: alpha,
35
+ };
36
+ }
37
+ }
38
+ }
39
+ }
40
+ // 8 位 hex #RRGGBBAA
41
+ const mHex8 = color.match(
42
+ /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
43
+ );
44
+ if (mHex8?.[1] && mHex8[2] && mHex8[3] && mHex8[4]) {
45
+ const alpha = parseInt(mHex8[4], 16) / 255;
46
+ return { color: `#${mHex8[1]}${mHex8[2]}${mHex8[3]}`, opacity: alpha };
47
+ }
48
+ return { color, opacity: 1 };
49
+ }
50
+
11
51
  /**
12
52
  * 垂直线性渐变 wash —— 全宽矩形 + 顶到底的 SVG LinearGradient。
13
53
  *
@@ -17,30 +57,11 @@ import type { GradientWashProps } from './types';
17
57
  *
18
58
  * `pointerEvents="none"` 透传,装饰层不捕事件。
19
59
  *
20
- * gradientId 不传时用 `useId()` 自动唯一;React 19 useId 返回含冒号 `:r0:`,
21
- * 不是合法 SVG id 字符,sanitize 后再用。
60
+ * gradientId 不传时由 useSvgId 自动生成唯一合法 id(消毒 React 19 useId 的冒号)。
22
61
  */
23
- /** 解析 rgba(r,g,b,a) 字符串拆出 alpha,返回 { color: rgb(...), opacity }。
24
- * 非 rgba 输入(hex / rgb / named)原样返回 + opacity=1。
25
- *
26
- * Why:react-native-svg `<Stop stopColor>` 接 rgba 时 alpha 可能被忽略
27
- * (stopColor 只解析 RGB,需要 stopOpacity 分离),拆分后跨平台一致。 */
28
- function parseRgba(color: string): { color: string; opacity: number } {
29
- const m = color.match(/^rgba\(([^)]+)\)$/);
30
- if (!m || !m[1]) return { color, opacity: 1 };
31
- const parts = m[1].split(',').map((s) => s.trim());
32
- if (parts.length !== 4) return { color, opacity: 1 };
33
- const alphaStr = parts[3];
34
- if (alphaStr === undefined) return { color, opacity: 1 };
35
- const alpha = parseFloat(alphaStr);
36
- if (Number.isNaN(alpha)) return { color, opacity: 1 };
37
- return { color: `rgb(${parts.slice(0, 3).join(',')})`, opacity: alpha };
38
- }
39
-
40
62
  export function GradientWash(props: GradientWashProps): React.JSX.Element {
41
63
  const { height, style, gradientId } = props;
42
- const autoId = useId();
43
- const id = gradientId ?? `gw-${autoId.replace(/[^a-zA-Z0-9_-]/g, '')}`;
64
+ const id = useSvgId('gw', gradientId);
44
65
  const stops = props.stops ?? [
45
66
  { offset: 0, color: props.color, opacity: props.fromOpacity ?? 0.1 },
46
67
  { offset: 1, color: props.color, opacity: props.toOpacity ?? 0 },
@@ -62,6 +83,9 @@ export function GradientWash(props: GradientWashProps): React.JSX.Element {
62
83
  >
63
84
  {stops.map((s, i) => {
64
85
  const parsed = parseRgba(s.color);
86
+ // s.opacity 显式传入时优先;未传(undefined)时使用 parseRgba 解出的值。
87
+ // 注:这里是替换而非相乘 —— stops 里的 opacity 字段语义是"最终不透明度",
88
+ // 若需要与解析色 alpha 相乘请在构建 stops 时预先合并。
65
89
  const opacity = s.opacity ?? parsed.opacity;
66
90
  return (
67
91
  <Stop
@@ -1,4 +1,4 @@
1
- import React, { useId } from 'react';
1
+ import React from 'react';
2
2
  import { View } from 'react-native';
3
3
  import Svg, {
4
4
  Defs,
@@ -6,6 +6,8 @@ import Svg, {
6
6
  RadialGradient as SvgRadialGradient,
7
7
  Stop,
8
8
  } from 'react-native-svg';
9
+ import { useSvgId } from '../useSvgId';
10
+ import { parseRgba } from './GradientWash';
9
11
  import type { RadialHaloProps } from './types';
10
12
 
11
13
  const DEFAULT_MAX_OPACITY = 0.16;
@@ -35,13 +37,15 @@ export function RadialHalo({
35
37
  }: RadialHaloProps): React.JSX.Element {
36
38
  const w = size;
37
39
  const h = height ?? size;
38
- const autoId = useId();
39
- const id = gradientId ?? `rh-${autoId.replace(/[^a-zA-Z0-9_-]/g, '')}`;
40
+ const id = useSvgId('rh', gradientId);
40
41
  const resolvedStops = stops ?? buildStops(maxOpacity);
41
42
  const cx = w / 2;
42
43
  const cy = h / 2;
43
44
  // farthest-corner:r = 中心到最远角的距离
44
45
  const r = Math.sqrt(cx * cx + cy * cy);
46
+ // parseRgba:react-native-svg stopColor 只解析 RGB,rgba/8位hex 的 alpha 会被忽略;
47
+ // 拆分为 stopColor(rgb/hex6) + stopOpacity 后跨平台一致(与 GradientWash 同理)。
48
+ const { color: stopColor } = parseRgba(color);
45
49
  return (
46
50
  <View pointerEvents="none" style={[{ width: w, height: h }, style]}>
47
51
  <Svg width={w} height={h}>
@@ -61,7 +65,7 @@ export function RadialHalo({
61
65
  <Stop
62
66
  key={`${s.offset}-${i}`}
63
67
  offset={s.offset}
64
- stopColor={color}
68
+ stopColor={stopColor}
65
69
  stopOpacity={s.opacity}
66
70
  />
67
71
  ))}
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { StyleSheet, useWindowDimensions, View } from 'react-native';
3
- import { useColors, useTheme, warmOrangePalette } from '../../../theme';
3
+ import { r, useColors, useTheme, warmOrangePalette } from '../../../theme';
4
4
  import { GradientWash } from './GradientWash';
5
5
  import { RadialHalo } from './RadialHalo';
6
6
  import type {
@@ -39,9 +39,22 @@ const PRESETS: Record<ScreenBackdropPreset, PresetConfig> = {
39
39
  light: buildStops(warmOrangePalette.light, WARM_ORANGE_OFFSETS),
40
40
  dark: buildStops(warmOrangePalette.dark, WARM_ORANGE_OFFSETS),
41
41
  halos: [
42
- { size: 520, height: 420, maxOpacity: 0.22, top: -120, centerX: true },
43
- { size: 560, height: 380, maxOpacity: 0.18, bottom: -160, centerX: true },
44
- { size: 220, maxOpacity: 0.16, top: 180, right: -80 },
42
+ // [L-88] halo 几何走 r() 对齐缩放纪律;maxOpacity / centerX 是无单位值,不缩放。
43
+ {
44
+ size: r(520),
45
+ height: r(420),
46
+ maxOpacity: 0.22,
47
+ top: r(-120),
48
+ centerX: true,
49
+ },
50
+ {
51
+ size: r(560),
52
+ height: r(380),
53
+ maxOpacity: 0.18,
54
+ bottom: r(-160),
55
+ centerX: true,
56
+ },
57
+ { size: r(220), maxOpacity: 0.16, top: r(180), right: r(-80) },
45
58
  ],
46
59
  },
47
60
  };
@@ -70,6 +83,7 @@ export function ScreenBackdrop({
70
83
  halos,
71
84
  children,
72
85
  style,
86
+ testID,
73
87
  }: ScreenBackdropProps): React.JSX.Element {
74
88
  const c = useColors();
75
89
  const { scheme } = useTheme();
@@ -84,6 +98,7 @@ export function ScreenBackdrop({
84
98
  return (
85
99
  <View
86
100
  style={[backdropStyles.root, { backgroundColor: c.background }, style]}
101
+ testID={testID}
87
102
  >
88
103
  {resolvedStops ? (
89
104
  <GradientWash
@@ -102,7 +117,10 @@ export function ScreenBackdrop({
102
117
  height={h.height}
103
118
  color={h.color ?? c.primary}
104
119
  maxOpacity={h.maxOpacity}
105
- gradientId={`screen-backdrop-halo-${i}`}
120
+ // [L-60] 不传 gradientId —— 让 RadialHalo 走自己的 useSvgId(useId) 默认值。
121
+ // 实例内同名在多 ScreenBackdrop 同挂(keep-mounted 栈、导航页)时会导致
122
+ // web DOM SVG 的 url(#id) 命中文档首个同名渐变,造成跨实例渐变串台。
123
+ // useId 保证每次挂载唯一,「实例内多 halo 不同 id」也由 useSvgId 前缀+'rh' 保证。
106
124
  style={[
107
125
  backdropStyles.haloAbsolute,
108
126
  { top: h.top, bottom: h.bottom, left, right },
@@ -1,7 +1,11 @@
1
+ // Decorations 族:GradientWash / RadialHalo / ScreenBackdrop 三件强内聚,
2
+ // 共享 GradientStop 类型 + parseRgba 工具 —— 刻意共居一目录、共享 types.ts,
3
+ // 不拆单组件目录;CLAUDE.md 组件约定的族式聚合例外。
1
4
  export { GradientWash } from './GradientWash';
2
5
  export { RadialHalo } from './RadialHalo';
3
6
  export { ScreenBackdrop } from './ScreenBackdrop';
4
7
  export type {
8
+ GradientStop,
5
9
  GradientWashProps,
6
10
  RadialHaloProps,
7
11
  ScreenBackdropHalo,
@@ -100,4 +100,6 @@ export type ScreenBackdropProps = {
100
100
  children?: ReactNode;
101
101
  /** 外层附加样式 */
102
102
  style?: StyleProp<ViewStyle>;
103
+ /** E2E / 测试定位 */
104
+ testID?: string;
103
105
  };
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { Text, View } from 'react-native';
3
- import { BlurLayer } from '../../ui';
3
+ import { BlurLayer } from '../../ui/BlurLayer';
4
4
  import { useThemedStyles } from '../../../theme';
5
5
  import { makeGlassStatsStyles } from './styles';
6
6
  import type { GlassStatsProps } from './types';
@@ -11,20 +11,24 @@ import type { GlassStatsProps } from './types';
11
11
  * BlurLayer 接管 backdrop 双层结构(BlurView soft + glassTintLight tint),
12
12
  * blurType 跟 scheme 自动切。
13
13
  */
14
- export function GlassStats({ items }: GlassStatsProps): React.JSX.Element {
14
+ export function GlassStats({
15
+ items,
16
+ style,
17
+ testID,
18
+ }: GlassStatsProps): React.JSX.Element {
15
19
  const styles = useThemedStyles(makeGlassStatsStyles);
16
20
  return (
17
21
  // 外层 shell 承担 shadow(无 overflow,iOS Core Animation masksToBounds=true
18
22
  // 会裁掉 outer shadow);内层 glass 承担 overflow:hidden + border 裁圆角。
19
23
  // 单层 overflow + shadow 在 iOS 上 shadow 完全不可见。
20
- <View style={styles.glassShell}>
24
+ <View style={[styles.glassShell, style]} testID={testID}>
21
25
  <View style={styles.glass}>
22
26
  <BlurLayer intensity="soft" />
23
27
  {/* 顶部 1px inset 白高光,让数据条顶部"凸起" */}
24
28
  <View style={styles.topHighlight} pointerEvents="none" />
25
29
  <View style={styles.inner}>
26
30
  {items.map(([count, label], i) => (
27
- <React.Fragment key={label}>
31
+ <React.Fragment key={`${label}-${i}`}>
28
32
  {i > 0 ? <View style={styles.sep} /> : null}
29
33
  <View style={styles.col}>
30
34
  <Text style={styles.countText}>{count}</Text>
@@ -1,7 +1,13 @@
1
+ import type { StyleProp, ViewStyle } from 'react-native';
2
+
1
3
  /** 单元格元组 —— [count, label] —— count 已格式化好(如 '12' / '¥2,016') */
2
4
  export type GlassStatItem = readonly [count: string, label: string];
3
5
 
4
6
  export type GlassStatsProps = {
5
7
  /** 数据列。一般 2~4 列均可,不强制数量。 */
6
8
  items: ReadonlyArray<GlassStatItem>;
9
+ /** 容器附加样式(margin / position 等布局微调)。 */
10
+ style?: StyleProp<ViewStyle>;
11
+ /** E2E / 测试定位 */
12
+ testID?: string;
7
13
  };
@@ -9,19 +9,59 @@ export function VersionPill({
9
9
  version,
10
10
  build,
11
11
  statusColor,
12
+ versionPrefix = '版本 ',
13
+ buildPrefix = 'build ',
12
14
  style,
15
+ testID,
13
16
  }: VersionPillProps): React.JSX.Element {
14
17
  const c = useColors();
15
18
  const styles = useThemedStyles(makeVersionPillStyles);
16
19
  const dotColor = statusColor ?? c.success;
20
+ // build 的「省略」契约:undefined / null / "" 均视为空;字符串 "0" 不省略。
21
+ const hasBuild = build != null && build !== '';
22
+ // 状态点用颜色传达语义,SR 无法感知;整个 pill 作为分组提供无障碍合并读出。
23
+ const a11yLabel = hasBuild
24
+ ? `${versionPrefix}${version},${buildPrefix}${build}`
25
+ : `${versionPrefix}${version}`;
17
26
  return (
18
- <View style={[styles.pill, style]}>
19
- <View style={[styles.dot, { backgroundColor: dotColor }]} />
20
- <Text style={styles.version}>版本 {version}</Text>
21
- {build ? (
27
+ <View
28
+ accessible
29
+ accessibilityLabel={a11yLabel}
30
+ style={[styles.pill, style]}
31
+ testID={testID}
32
+ >
33
+ {/* 状态点仅颜色通道,屏幕阅读器由外层容器统一朗读,此处隐藏 */}
34
+ <View
35
+ style={[styles.dot, { backgroundColor: dotColor }]}
36
+ accessibilityElementsHidden
37
+ importantForAccessibility="no"
38
+ />
39
+ <Text
40
+ style={styles.version}
41
+ accessibilityElementsHidden
42
+ importantForAccessibility="no"
43
+ >
44
+ {versionPrefix}
45
+ {version}
46
+ </Text>
47
+ {hasBuild ? (
22
48
  <>
23
- <Text style={styles.sep}>·</Text>
24
- <Text style={styles.build}>build {build}</Text>
49
+ {/* 分隔符「·」无语义,隐藏于无障碍树 */}
50
+ <Text
51
+ style={styles.sep}
52
+ accessibilityElementsHidden
53
+ importantForAccessibility="no"
54
+ >
55
+ ·
56
+ </Text>
57
+ <Text
58
+ style={styles.build}
59
+ accessibilityElementsHidden
60
+ importantForAccessibility="no"
61
+ >
62
+ {buildPrefix}
63
+ {build}
64
+ </Text>
25
65
  </>
26
66
  ) : null}
27
67
  </View>
@@ -9,7 +9,7 @@ import {
9
9
  } from '../../../theme';
10
10
 
11
11
  /** VersionPill 样式工厂 —— hairline 描边 + surface 底胶囊。
12
- * 字号走 type.microPlus(11.5),与 SplashScreen / profileCard / carousel 共用。 */
12
+ * 字号走 type.microPlus(11.5),现仓内仅 VersionPill 消费。 */
13
13
  export const makeVersionPillStyles = (c: ColorTokens) =>
14
14
  StyleSheet.create({
15
15
  pill: {
@@ -3,10 +3,22 @@ import type { StyleProp, ViewStyle } from 'react-native';
3
3
  export type VersionPillProps = {
4
4
  /** 版本号,如 "2.8.0"。 */
5
5
  version: string;
6
- /** 可选 build 号;为空时省略分点与 build 字。 */
6
+ /** 可选 build 号;值为 null/undefined/"" 时省略分点与 build 字。 */
7
7
  build?: string;
8
8
  /** 状态点颜色,默认 c.success。 */
9
9
  statusColor?: string;
10
+ /**
11
+ * 版本号前缀文案,默认 "版本 "。
12
+ * 消费者可传 "v" / "Version " 等覆盖(含末尾空格)。
13
+ */
14
+ versionPrefix?: string;
15
+ /**
16
+ * build 号前缀文案,默认 "build "。
17
+ * 消费者可传 "Build " / "#" 等覆盖。
18
+ */
19
+ buildPrefix?: string;
10
20
  /** 容器附加样式覆盖。 */
11
21
  style?: StyleProp<ViewStyle>;
22
+ /** E2E / 测试定位 */
23
+ testID?: string;
12
24
  };
@@ -5,6 +5,7 @@
5
5
  // SmsCodeInput)留在 consumer 仓库
6
6
  export { GradientWash, RadialHalo, ScreenBackdrop } from './Decorations';
7
7
  export type {
8
+ GradientStop,
8
9
  GradientWashProps,
9
10
  RadialHaloProps,
10
11
  ScreenBackdropHalo,
@@ -0,0 +1,17 @@
1
+ import { useId } from 'react';
2
+
3
+ /**
4
+ * SVG 渐变 id 生成 hook —— 消毒 React 19 useId 中的冒号字符。
5
+ *
6
+ * Why:React 19 的 useId() 返回含冒号(`:r0:`)的字符串,不是合法的 SVG id 字符
7
+ * (XML NCName 规则),直接用在 `<LinearGradient id>` / `<RadialGradient id>`
8
+ * 会导致 SVG 引用失败。sanitize 后拼上 prefix 保证唯一且合法。
9
+ *
10
+ * @param prefix 短前缀,区分同屏多 gradient(如 "gw" / "rh" / "av")。
11
+ * @param override 可选:外部传入的 gradientId;有值时直接返回,跳过 useId 分配。
12
+ */
13
+ export function useSvgId(prefix: string, override?: string): string {
14
+ const autoId = useId();
15
+ if (override !== undefined) return override;
16
+ return `${prefix}-${autoId.replace(/[^a-zA-Z0-9_-]/g, '')}`;
17
+ }
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef, useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import { Image, Text, View } from 'react-native';
3
3
  import { useColors } from '../../../theme';
4
4
  import { paletteFor, sizingFor, styles } from './styles';
@@ -15,20 +15,25 @@ export function Avatar({
15
15
  size = 'md',
16
16
  variant = 'neutral',
17
17
  source,
18
+ style,
18
19
  testID,
19
20
  }: AvatarProps): React.JSX.Element {
20
21
  const c = useColors();
21
22
  const [imageFailed, setImageFailed] = useState(false);
22
- // 避免 unmount 后 Image 网络回包仍调 setState 的 React warning
23
- const mountedRef = useRef(true);
24
- useEffect(
25
- () => () => {
26
- mountedRef.current = false;
27
- },
28
- []
29
- );
23
+
24
+ // [M-20] React 18+ 已移除 unmount 后 setState 的 warning,mountedRef 守卫为死码,删除。
25
+ // [L-44] source 变化时重置 imageFailed,否则换图 URL 后仍展示 fallback 文字。
26
+ // source 可能是对象形态({ uri }),按 uri 字段做细粒度比较。
27
+ const uri =
28
+ source != null && typeof source === 'object' && 'uri' in source
29
+ ? (source as { uri?: string }).uri
30
+ : null;
31
+ useEffect(() => {
32
+ setImageFailed(false);
33
+ }, [uri, source]);
34
+
30
35
  const handleImageError = () => {
31
- if (mountedRef.current) setImageFailed(true);
36
+ setImageFailed(true);
32
37
  };
33
38
  const dims = sizingFor(size);
34
39
  const palette = paletteFor(variant, c);
@@ -45,7 +50,9 @@ export function Avatar({
45
50
  borderRadius: dims.box / 2,
46
51
  backgroundColor: palette.bg,
47
52
  },
53
+ style,
48
54
  ]}
55
+ accessible={!!label}
49
56
  accessibilityLabel={label}
50
57
  testID={testID}
51
58
  >