@unif/react-native-design 0.19.0 → 0.21.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 (566) hide show
  1. package/README.md +68 -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 +89 -65
  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 +9 -14
  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 +3 -3
  219. package/lib/typescript/src/components/ui/Carousel/Carousel.d.ts.map +1 -1
  220. package/lib/typescript/src/components/ui/Carousel/behavior.d.ts +25 -0
  221. package/lib/typescript/src/components/ui/Carousel/behavior.d.ts.map +1 -0
  222. package/lib/typescript/src/components/ui/Carousel/index.d.ts +1 -1
  223. package/lib/typescript/src/components/ui/Carousel/index.d.ts.map +1 -1
  224. package/lib/typescript/src/components/ui/Carousel/styles.d.ts +7 -12
  225. package/lib/typescript/src/components/ui/Carousel/styles.d.ts.map +1 -1
  226. package/lib/typescript/src/components/ui/Carousel/types.d.ts +28 -17
  227. package/lib/typescript/src/components/ui/Carousel/types.d.ts.map +1 -1
  228. package/lib/typescript/src/components/ui/Cell/Cell.d.ts +1 -1
  229. package/lib/typescript/src/components/ui/Cell/Cell.d.ts.map +1 -1
  230. package/lib/typescript/src/components/ui/Cell/Leading.d.ts +2 -3
  231. package/lib/typescript/src/components/ui/Cell/Leading.d.ts.map +1 -1
  232. package/lib/typescript/src/components/ui/Cell/content.d.ts +18 -0
  233. package/lib/typescript/src/components/ui/Cell/content.d.ts.map +1 -0
  234. package/lib/typescript/src/components/ui/Cell/index.d.ts +1 -1
  235. package/lib/typescript/src/components/ui/Cell/index.d.ts.map +1 -1
  236. package/lib/typescript/src/components/ui/Cell/types.d.ts +66 -30
  237. package/lib/typescript/src/components/ui/Cell/types.d.ts.map +1 -1
  238. package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts +1 -1
  239. package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts.map +1 -1
  240. package/lib/typescript/src/components/ui/Checkbox/types.d.ts +12 -3
  241. package/lib/typescript/src/components/ui/Checkbox/types.d.ts.map +1 -1
  242. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts +6 -3
  243. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts.map +1 -1
  244. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts +10 -4
  245. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts.map +1 -1
  246. package/lib/typescript/src/components/ui/Confirm/labels.d.ts +6 -0
  247. package/lib/typescript/src/components/ui/Confirm/labels.d.ts.map +1 -0
  248. package/lib/typescript/src/components/ui/Confirm/store.d.ts +44 -0
  249. package/lib/typescript/src/components/ui/Confirm/store.d.ts.map +1 -0
  250. package/lib/typescript/src/components/ui/Confirm/styles.d.ts +3 -0
  251. package/lib/typescript/src/components/ui/Confirm/styles.d.ts.map +1 -1
  252. package/lib/typescript/src/components/ui/Confirm/types.d.ts +0 -9
  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.map +1 -1
  255. package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts +7 -1
  256. package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts.map +1 -1
  257. package/lib/typescript/src/components/ui/Grid/Grid.d.ts.map +1 -1
  258. package/lib/typescript/src/components/ui/Grid/accessibility.d.ts +5 -0
  259. package/lib/typescript/src/components/ui/Grid/accessibility.d.ts.map +1 -0
  260. package/lib/typescript/src/components/ui/Grid/types.d.ts +2 -0
  261. package/lib/typescript/src/components/ui/Grid/types.d.ts.map +1 -1
  262. package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts +1 -1
  263. package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts.map +1 -1
  264. package/lib/typescript/src/components/ui/IconButton/types.d.ts +4 -2
  265. package/lib/typescript/src/components/ui/IconButton/types.d.ts.map +1 -1
  266. package/lib/typescript/src/components/ui/Input/Input.d.ts +5 -383
  267. package/lib/typescript/src/components/ui/Input/Input.d.ts.map +1 -1
  268. package/lib/typescript/src/components/ui/Input/index.d.ts +1 -0
  269. package/lib/typescript/src/components/ui/Input/index.d.ts.map +1 -1
  270. package/lib/typescript/src/components/ui/Input/types.d.ts +3 -17
  271. package/lib/typescript/src/components/ui/Input/types.d.ts.map +1 -1
  272. package/lib/typescript/src/components/ui/Logo/Logo.d.ts +2 -2
  273. package/lib/typescript/src/components/ui/Logo/Logo.d.ts.map +1 -1
  274. package/lib/typescript/src/components/ui/Logo/types.d.ts +2 -2
  275. package/lib/typescript/src/components/ui/Logo/types.d.ts.map +1 -1
  276. package/lib/typescript/src/components/ui/NavBar/NavBar.d.ts.map +1 -1
  277. package/lib/typescript/src/components/ui/NavBar/index.d.ts +1 -1
  278. package/lib/typescript/src/components/ui/NavBar/index.d.ts.map +1 -1
  279. package/lib/typescript/src/components/ui/NavBar/isSlot.d.ts +24 -4
  280. package/lib/typescript/src/components/ui/NavBar/isSlot.d.ts.map +1 -1
  281. package/lib/typescript/src/components/ui/NavBar/types.d.ts +8 -8
  282. package/lib/typescript/src/components/ui/NavBar/types.d.ts.map +1 -1
  283. package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts +6 -14
  284. package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts.map +1 -1
  285. package/lib/typescript/src/components/ui/PasswordInput/types.d.ts +4 -14
  286. package/lib/typescript/src/components/ui/PasswordInput/types.d.ts.map +1 -1
  287. package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts +1 -1
  288. package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts.map +1 -1
  289. package/lib/typescript/src/components/ui/Pulse/normalizePulseOptions.d.ts +32 -0
  290. package/lib/typescript/src/components/ui/Pulse/normalizePulseOptions.d.ts.map +1 -0
  291. package/lib/typescript/src/components/ui/Pulse/usePulse.d.ts +10 -5
  292. package/lib/typescript/src/components/ui/Pulse/usePulse.d.ts.map +1 -1
  293. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.d.ts +11 -0
  294. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.d.ts.map +1 -0
  295. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.web.d.ts +18 -0
  296. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.web.d.ts.map +1 -0
  297. package/lib/typescript/src/components/ui/Radio/Radio.d.ts +1 -1
  298. package/lib/typescript/src/components/ui/Radio/Radio.d.ts.map +1 -1
  299. package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts +2 -2
  300. package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts.map +1 -1
  301. package/lib/typescript/src/components/ui/Radio/types.d.ts +14 -3
  302. package/lib/typescript/src/components/ui/Radio/types.d.ts.map +1 -1
  303. package/lib/typescript/src/components/ui/Reveal/Reveal.d.ts.map +1 -1
  304. package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts +2 -8
  305. package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts.map +1 -1
  306. package/lib/typescript/src/components/ui/Reveal/types.d.ts +1 -1
  307. package/lib/typescript/src/components/ui/Reveal/types.d.ts.map +1 -1
  308. package/lib/typescript/src/components/ui/Reveal/webTransition.d.ts +38 -0
  309. package/lib/typescript/src/components/ui/Reveal/webTransition.d.ts.map +1 -0
  310. package/lib/typescript/src/components/ui/Search/Search.d.ts +4 -214
  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 +13 -6
  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.map +1 -1
  315. package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts +3 -3
  316. package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts.map +1 -1
  317. package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts +1 -1
  318. package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts.map +1 -1
  319. package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts +1 -1
  320. package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts.map +1 -1
  321. package/lib/typescript/src/components/ui/Spinner/shared.d.ts +5 -0
  322. package/lib/typescript/src/components/ui/Spinner/shared.d.ts.map +1 -1
  323. package/lib/typescript/src/components/ui/Spinner/types.d.ts +1 -1
  324. package/lib/typescript/src/components/ui/Spinner/types.d.ts.map +1 -1
  325. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts +3 -3
  326. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts.map +1 -1
  327. package/lib/typescript/src/components/ui/Stepper/StepperPressable.d.ts +2 -0
  328. package/lib/typescript/src/components/ui/Stepper/StepperPressable.d.ts.map +1 -0
  329. package/lib/typescript/src/components/ui/Stepper/StepperPressable.web.d.ts +2 -0
  330. package/lib/typescript/src/components/ui/Stepper/StepperPressable.web.d.ts.map +1 -0
  331. package/lib/typescript/src/components/ui/Stepper/accessibility.d.ts +3 -0
  332. package/lib/typescript/src/components/ui/Stepper/accessibility.d.ts.map +1 -0
  333. package/lib/typescript/src/components/ui/Stepper/accessibility.types.d.ts +23 -0
  334. package/lib/typescript/src/components/ui/Stepper/accessibility.types.d.ts.map +1 -0
  335. package/lib/typescript/src/components/ui/Stepper/accessibility.web.d.ts +9 -0
  336. package/lib/typescript/src/components/ui/Stepper/accessibility.web.d.ts.map +1 -0
  337. package/lib/typescript/src/components/ui/Stepper/layout.d.ts +22 -0
  338. package/lib/typescript/src/components/ui/Stepper/layout.d.ts.map +1 -0
  339. package/lib/typescript/src/components/ui/Stepper/normalizeStepper.d.ts +31 -0
  340. package/lib/typescript/src/components/ui/Stepper/normalizeStepper.d.ts.map +1 -0
  341. package/lib/typescript/src/components/ui/Stepper/styles.d.ts +9 -2
  342. package/lib/typescript/src/components/ui/Stepper/styles.d.ts.map +1 -1
  343. package/lib/typescript/src/components/ui/Stepper/types.d.ts +3 -1
  344. package/lib/typescript/src/components/ui/Stepper/types.d.ts.map +1 -1
  345. package/lib/typescript/src/components/ui/Switch/Switch.d.ts.map +1 -1
  346. package/lib/typescript/src/components/ui/Switch/Switch.web.d.ts.map +1 -1
  347. package/lib/typescript/src/components/ui/Switch/styles.d.ts +9 -3
  348. package/lib/typescript/src/components/ui/Switch/styles.d.ts.map +1 -1
  349. package/lib/typescript/src/components/ui/Switch/types.d.ts +2 -2
  350. package/lib/typescript/src/components/ui/Switch/types.d.ts.map +1 -1
  351. package/lib/typescript/src/components/ui/Tag/Tag.d.ts.map +1 -1
  352. package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts +4 -401
  353. package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts.map +1 -1
  354. package/lib/typescript/src/components/ui/TextField/TextFieldSlot.d.ts +13 -0
  355. package/lib/typescript/src/components/ui/TextField/TextFieldSlot.d.ts.map +1 -0
  356. package/lib/typescript/src/components/ui/TextField/normalize.d.ts +51 -0
  357. package/lib/typescript/src/components/ui/TextField/normalize.d.ts.map +1 -0
  358. package/lib/typescript/src/components/ui/TextField/styles.d.ts +30 -0
  359. package/lib/typescript/src/components/ui/TextField/styles.d.ts.map +1 -1
  360. package/lib/typescript/src/components/ui/TextField/types.d.ts +92 -18
  361. package/lib/typescript/src/components/ui/TextField/types.d.ts.map +1 -1
  362. package/lib/typescript/src/components/ui/TextField/useErrorAnnouncement.d.ts +3 -0
  363. package/lib/typescript/src/components/ui/TextField/useErrorAnnouncement.d.ts.map +1 -0
  364. package/lib/typescript/src/components/ui/TextField/useTextFieldValue.d.ts +18 -0
  365. package/lib/typescript/src/components/ui/TextField/useTextFieldValue.d.ts.map +1 -0
  366. package/lib/typescript/src/components/ui/TextField/valueState.d.ts +50 -0
  367. package/lib/typescript/src/components/ui/TextField/valueState.d.ts.map +1 -0
  368. package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts +4 -382
  369. package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts.map +1 -1
  370. package/lib/typescript/src/components/ui/Textarea/index.d.ts +1 -0
  371. package/lib/typescript/src/components/ui/Textarea/index.d.ts.map +1 -1
  372. package/lib/typescript/src/components/ui/Textarea/types.d.ts +3 -14
  373. package/lib/typescript/src/components/ui/Textarea/types.d.ts.map +1 -1
  374. package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts +5 -12
  375. package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts.map +1 -1
  376. package/lib/typescript/src/components/ui/Thumbnail/index.d.ts +1 -1
  377. package/lib/typescript/src/components/ui/Thumbnail/index.d.ts.map +1 -1
  378. package/lib/typescript/src/components/ui/Thumbnail/normalize.d.ts +13 -0
  379. package/lib/typescript/src/components/ui/Thumbnail/normalize.d.ts.map +1 -0
  380. package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts +4 -8
  381. package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts.map +1 -1
  382. package/lib/typescript/src/components/ui/Thumbnail/types.d.ts +21 -13
  383. package/lib/typescript/src/components/ui/Thumbnail/types.d.ts.map +1 -1
  384. package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts +6 -2
  385. package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts.map +1 -1
  386. package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts +6 -3
  387. package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts.map +1 -1
  388. package/lib/typescript/src/components/ui/Toast/store.d.ts +39 -0
  389. package/lib/typescript/src/components/ui/Toast/store.d.ts.map +1 -0
  390. package/lib/typescript/src/components/ui/Toast/toast.d.ts +7 -2
  391. package/lib/typescript/src/components/ui/Toast/toast.d.ts.map +1 -1
  392. package/lib/typescript/src/components/ui/Toast/types.d.ts +5 -3
  393. package/lib/typescript/src/components/ui/Toast/types.d.ts.map +1 -1
  394. package/lib/typescript/src/components/ui/index.d.ts +5 -5
  395. package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
  396. package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts +13 -0
  397. package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts.map +1 -0
  398. package/lib/typescript/src/components/ui/shared/a11y.d.ts +19 -0
  399. package/lib/typescript/src/components/ui/shared/a11y.d.ts.map +1 -0
  400. package/lib/typescript/src/components/ui/shared/accessibilityName.d.ts +3 -0
  401. package/lib/typescript/src/components/ui/shared/accessibilityName.d.ts.map +1 -0
  402. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.d.ts +3 -0
  403. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.d.ts.map +1 -0
  404. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts +4 -0
  405. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts.map +1 -0
  406. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.web.d.ts +3 -0
  407. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.web.d.ts.map +1 -0
  408. package/lib/typescript/src/theme/ThemeProvider.d.ts +2 -3
  409. package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
  410. package/lib/typescript/src/theme/fontScale.d.ts +4 -0
  411. package/lib/typescript/src/theme/fontScale.d.ts.map +1 -0
  412. package/lib/typescript/src/theme/index.d.ts +2 -1
  413. package/lib/typescript/src/theme/index.d.ts.map +1 -1
  414. package/lib/typescript/src/theme/themeContext.d.ts +6 -0
  415. package/lib/typescript/src/theme/themeContext.d.ts.map +1 -0
  416. package/lib/typescript/src/theme/themeDiagnostics.d.ts +6 -0
  417. package/lib/typescript/src/theme/themeDiagnostics.d.ts.map +1 -0
  418. package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts +8 -3
  419. package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts.map +1 -1
  420. package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts +5 -2
  421. package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts.map +1 -1
  422. package/lib/typescript/src/theme/useTheme.d.ts +1 -1
  423. package/lib/typescript/src/theme/useTheme.d.ts.map +1 -1
  424. package/lib/typescript/src/theme/useThemedStyles.d.ts +1 -1
  425. package/lib/typescript/src/theme/useThemedStyles.d.ts.map +1 -1
  426. package/lib/typescript/src/utils/imageSource.d.ts +20 -0
  427. package/lib/typescript/src/utils/imageSource.d.ts.map +1 -0
  428. package/lib/typescript/type-tests/public-api.d.ts +2 -0
  429. package/lib/typescript/type-tests/public-api.d.ts.map +1 -0
  430. package/lib/typescript/website/src/components/iconCatalogCategories.d.ts +11 -0
  431. package/lib/typescript/website/src/components/iconCatalogCategories.d.ts.map +1 -0
  432. package/package.json +31 -17
  433. package/src/components/business/AvatarWithRing/AvatarWithRing.tsx +11 -4
  434. package/src/components/business/AvatarWithRing/styles.ts +11 -9
  435. package/src/components/business/VersionPill/VersionPill.tsx +31 -25
  436. package/src/components/business/VersionPill/content.ts +47 -0
  437. package/src/components/business/VersionPill/index.ts +1 -1
  438. package/src/components/business/VersionPill/styles.ts +4 -0
  439. package/src/components/business/VersionPill/types.ts +7 -2
  440. package/src/components/business/index.ts +1 -1
  441. package/src/components/business/useSvgId.ts +29 -8
  442. package/src/components/ui/Avatar/Avatar.tsx +25 -34
  443. package/src/components/ui/Avatar/types.ts +6 -2
  444. package/src/components/ui/Button/Button.tsx +39 -20
  445. package/src/components/ui/Button/ButtonBase.tsx +21 -12
  446. package/src/components/ui/Button/types.ts +5 -3
  447. package/src/components/ui/Carousel/Carousel.tsx +125 -71
  448. package/src/components/ui/Carousel/behavior.ts +78 -0
  449. package/src/components/ui/Carousel/index.ts +1 -1
  450. package/src/components/ui/Carousel/styles.ts +8 -13
  451. package/src/components/ui/Carousel/types.ts +35 -17
  452. package/src/components/ui/Cell/Cell.tsx +85 -74
  453. package/src/components/ui/Cell/Leading.tsx +14 -14
  454. package/src/components/ui/Cell/content.ts +53 -0
  455. package/src/components/ui/Cell/index.ts +7 -1
  456. package/src/components/ui/Cell/types.ts +64 -30
  457. package/src/components/ui/Checkbox/Checkbox.tsx +35 -8
  458. package/src/components/ui/Checkbox/types.ts +15 -3
  459. package/src/components/ui/Confirm/ConfirmHost.tsx +51 -26
  460. package/src/components/ui/Confirm/confirm.ts +17 -34
  461. package/src/components/ui/Confirm/labels.ts +14 -0
  462. package/src/components/ui/Confirm/store.ts +147 -0
  463. package/src/components/ui/Confirm/styles.ts +4 -0
  464. package/src/components/ui/Confirm/types.ts +2 -10
  465. package/src/components/ui/DrawerHeader/DrawerHeader.tsx +22 -27
  466. package/src/components/ui/DrawerHeader/types.ts +7 -1
  467. package/src/components/ui/Grid/Grid.tsx +44 -12
  468. package/src/components/ui/Grid/accessibility.ts +21 -0
  469. package/src/components/ui/Grid/types.ts +2 -0
  470. package/src/components/ui/IconButton/IconButton.tsx +20 -3
  471. package/src/components/ui/IconButton/types.ts +4 -2
  472. package/src/components/ui/Input/Input.tsx +16 -6
  473. package/src/components/ui/Input/index.ts +5 -0
  474. package/src/components/ui/Input/types.ts +12 -23
  475. package/src/components/ui/Logo/Logo.tsx +27 -4
  476. package/src/components/ui/Logo/types.ts +2 -2
  477. package/src/components/ui/NavBar/NavBar.tsx +27 -19
  478. package/src/components/ui/NavBar/index.ts +1 -1
  479. package/src/components/ui/NavBar/isSlot.ts +372 -5
  480. package/src/components/ui/NavBar/types.ts +9 -8
  481. package/src/components/ui/PasswordInput/PasswordInput.tsx +67 -69
  482. package/src/components/ui/PasswordInput/types.ts +12 -14
  483. package/src/components/ui/Pulse/PulseDot.tsx +5 -4
  484. package/src/components/ui/Pulse/normalizePulseOptions.ts +76 -0
  485. package/src/components/ui/Pulse/usePulse.ts +80 -34
  486. package/src/components/ui/Pulse/usePulseDriver.ts +49 -0
  487. package/src/components/ui/Pulse/usePulseDriver.web.ts +66 -0
  488. package/src/components/ui/Radio/Radio.tsx +44 -15
  489. package/src/components/ui/Radio/RadioGroup.tsx +21 -3
  490. package/src/components/ui/Radio/types.ts +17 -3
  491. package/src/components/ui/Reveal/Reveal.tsx +5 -3
  492. package/src/components/ui/Reveal/Reveal.web.tsx +72 -29
  493. package/src/components/ui/Reveal/types.ts +1 -1
  494. package/src/components/ui/Reveal/webTransition.ts +206 -0
  495. package/src/components/ui/Search/Search.tsx +127 -58
  496. package/src/components/ui/Search/types.ts +30 -9
  497. package/src/components/ui/Segmented/Segmented.tsx +10 -2
  498. package/src/components/ui/Skeleton/Skeleton.tsx +9 -5
  499. package/src/components/ui/Spinner/Spinner.tsx +25 -17
  500. package/src/components/ui/Spinner/Spinner.web.tsx +23 -18
  501. package/src/components/ui/Spinner/shared.ts +7 -0
  502. package/src/components/ui/Spinner/types.ts +1 -1
  503. package/src/components/ui/Stepper/Stepper.tsx +166 -86
  504. package/src/components/ui/Stepper/StepperPressable.tsx +1 -0
  505. package/src/components/ui/Stepper/StepperPressable.web.tsx +1 -0
  506. package/src/components/ui/Stepper/accessibility.ts +32 -0
  507. package/src/components/ui/Stepper/accessibility.types.ts +22 -0
  508. package/src/components/ui/Stepper/accessibility.web.ts +65 -0
  509. package/src/components/ui/Stepper/layout.ts +44 -0
  510. package/src/components/ui/Stepper/normalizeStepper.ts +85 -0
  511. package/src/components/ui/Stepper/styles.ts +9 -2
  512. package/src/components/ui/Stepper/types.ts +3 -1
  513. package/src/components/ui/Switch/Switch.tsx +54 -15
  514. package/src/components/ui/Switch/Switch.web.tsx +57 -19
  515. package/src/components/ui/Switch/styles.ts +11 -4
  516. package/src/components/ui/Switch/types.ts +2 -2
  517. package/src/components/ui/Tag/Tag.tsx +6 -2
  518. package/src/components/ui/TextField/TextFieldBase.tsx +175 -70
  519. package/src/components/ui/TextField/TextFieldSlot.tsx +91 -0
  520. package/src/components/ui/TextField/normalize.ts +280 -0
  521. package/src/components/ui/TextField/styles.ts +31 -0
  522. package/src/components/ui/TextField/types.ts +118 -22
  523. package/src/components/ui/TextField/useErrorAnnouncement.ts +27 -0
  524. package/src/components/ui/TextField/useTextFieldValue.ts +94 -0
  525. package/src/components/ui/TextField/valueState.ts +125 -0
  526. package/src/components/ui/Textarea/Textarea.tsx +11 -4
  527. package/src/components/ui/Textarea/index.ts +5 -0
  528. package/src/components/ui/Textarea/types.ts +14 -22
  529. package/src/components/ui/Thumbnail/Thumbnail.tsx +86 -51
  530. package/src/components/ui/Thumbnail/index.ts +5 -1
  531. package/src/components/ui/Thumbnail/normalize.ts +78 -0
  532. package/src/components/ui/Thumbnail/styles.ts +5 -10
  533. package/src/components/ui/Thumbnail/types.ts +43 -13
  534. package/src/components/ui/Toast/ToastHost.tsx +81 -22
  535. package/src/components/ui/Toast/ToastHost.web.tsx +91 -29
  536. package/src/components/ui/Toast/store.ts +148 -0
  537. package/src/components/ui/Toast/toast.ts +19 -10
  538. package/src/components/ui/Toast/types.ts +7 -3
  539. package/src/components/ui/index.ts +20 -5
  540. package/src/components/ui/shared/ImageAttempt.tsx +30 -0
  541. package/src/components/ui/shared/a11y.ts +18 -0
  542. package/src/components/ui/shared/accessibilityName.ts +6 -0
  543. package/src/components/ui/shared/selectImageAttemptSource.shared.ts +17 -0
  544. package/src/components/ui/shared/selectImageAttemptSource.ts +3 -0
  545. package/src/components/ui/shared/selectImageAttemptSource.web.ts +3 -0
  546. package/src/icons/data.ts +1 -1
  547. package/src/theme/ThemeProvider.tsx +18 -7
  548. package/src/theme/fontScale.ts +15 -0
  549. package/src/theme/index.ts +2 -3
  550. package/src/theme/themeContext.ts +24 -0
  551. package/src/theme/themeDiagnostics.ts +41 -0
  552. package/src/theme/usePrefersReducedMotion.ts +11 -4
  553. package/src/theme/usePrefersReducedMotion.web.ts +5 -2
  554. package/src/theme/useTheme.ts +19 -27
  555. package/src/theme/useThemedStyles.ts +12 -7
  556. package/src/utils/imageSource.ts +303 -0
  557. package/lib/module/components/ui/PasswordInput/styles.js +0 -12
  558. package/lib/module/components/ui/PasswordInput/styles.js.map +0 -1
  559. package/lib/module/components/ui/Pulse/usePulse.web.js +0 -76
  560. package/lib/module/components/ui/Pulse/usePulse.web.js.map +0 -1
  561. package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts +0 -7
  562. package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts.map +0 -1
  563. package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts +0 -21
  564. package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts.map +0 -1
  565. package/src/components/ui/PasswordInput/styles.ts +0 -7
  566. package/src/components/ui/Pulse/usePulse.web.ts +0 -74
@@ -0,0 +1,6 @@
1
+ /** 未类型化边界只接受 trim 后非空的 string 作为业务可访问名称。 */
2
+ export function normalizeNonBlankText(value: unknown): string | undefined {
3
+ if (typeof value !== 'string') return undefined;
4
+ const normalized = value.trim();
5
+ return normalized.length > 0 ? normalized : undefined;
6
+ }
@@ -0,0 +1,17 @@
1
+ import type { ImageSourcePropType } from 'react-native';
2
+ import { isValidImageSource } from '../../../utils/imageSource';
3
+
4
+ export function selectNativeImageAttemptSource(
5
+ source: unknown
6
+ ): ImageSourcePropType | undefined {
7
+ return isValidImageSource(source) ? source : undefined;
8
+ }
9
+
10
+ export function selectWebImageAttemptSource(
11
+ source: unknown
12
+ ): ImageSourcePropType | undefined {
13
+ if (!isValidImageSource(source)) return undefined;
14
+
15
+ // RNW 0.21 不解析 native 的 candidate 数组;Web 明确使用第一候选项。
16
+ return Array.isArray(source) ? source[0] : source;
17
+ }
@@ -0,0 +1,3 @@
1
+ import { selectNativeImageAttemptSource } from './selectImageAttemptSource.shared';
2
+
3
+ export const selectImageAttemptSource = selectNativeImageAttemptSource;
@@ -0,0 +1,3 @@
1
+ import { selectWebImageAttemptSource } from './selectImageAttemptSource.shared';
2
+
3
+ export const selectImageAttemptSource = selectWebImageAttemptSource;
package/src/icons/data.ts CHANGED
@@ -679,7 +679,7 @@ export const ICONS: Record<IconName, IconDef> = {
679
679
  ],
680
680
  },
681
681
  'check': {
682
- strokeWidth: 2,
682
+ strokeWidth: 1.75,
683
683
  elements: [
684
684
  {
685
685
  kind: 'path',
@@ -1,7 +1,11 @@
1
- import React, { createContext, useMemo } from 'react';
1
+ import React, { useEffect, useMemo } from 'react';
2
2
  import { useColorScheme } from 'react-native';
3
3
  import { lightColors, darkColors, type ColorTokens } from './colors';
4
+ import { normalizeFontScale } from './fontScale';
4
5
  import { lightShadow, darkShadow, type ShadowTokens } from './shadow';
6
+ import { ThemeContext } from './themeContext';
7
+ import { createInvalidFontScaleDiagnostic } from './themeDiagnostics';
8
+ import { createLogger } from '../utils/logger';
5
9
 
6
10
  export type ColorScheme = 'light' | 'dark';
7
11
 
@@ -10,21 +14,23 @@ export type ThemeContextValue = {
10
14
  colors: ColorTokens;
11
15
  shadow: ShadowTokens;
12
16
  /** 应用级字号缩放倍数(app 内字体大小档)。useThemedStyles 出口对
13
- * fontSize / lineHeight / letterSpacing 生效;1 = 不缩放。 */
17
+ * fontSize / lineHeight / letterSpacing 生效;非法值回退 1 */
14
18
  fontScale: number;
15
19
  };
16
20
 
17
- export const ThemeContext = createContext<ThemeContextValue | null>(null);
18
-
19
21
  type ThemeProviderProps = {
20
22
  children: React.ReactNode;
21
23
  /** 强制使用某个 scheme(覆盖 useColorScheme)。用于测试或 settingsStore 接入。 */
22
24
  forceScheme?: ColorScheme;
23
25
  /** 应用级字号缩放倍数,默认 1(不缩放)。接入方自持档位状态(persist
24
- * store 等)并传入;变更即触发全树 themed 样式重算。 */
26
+ * store 等)并传入;仅接受有限正数,不设上限。 */
25
27
  fontScale?: number;
26
28
  };
27
29
 
30
+ const isDev = typeof __DEV__ !== 'undefined' && __DEV__;
31
+ const log = createLogger('ThemeProvider');
32
+ const reportInvalidFontScale = createInvalidFontScaleDiagnostic(log.warn);
33
+
28
34
  export function ThemeProvider({
29
35
  children,
30
36
  forceScheme,
@@ -33,6 +39,11 @@ export function ThemeProvider({
33
39
  const sysScheme = useColorScheme();
34
40
  const scheme: ColorScheme =
35
41
  forceScheme ?? (sysScheme === 'dark' ? 'dark' : 'light');
42
+ const normalizedFontScale = normalizeFontScale(fontScale);
43
+
44
+ useEffect(() => {
45
+ reportInvalidFontScale(fontScale, normalizedFontScale, isDev);
46
+ }, [fontScale, normalizedFontScale]);
36
47
 
37
48
  // useMemo 必须依赖 scheme,不要依赖 light/dark 对象本身 —— 这是 useThemedStyles
38
49
  // 缓存生效的前提(每次渲染拿到稳定 colors / shadow 引用)。
@@ -41,9 +52,9 @@ export function ThemeProvider({
41
52
  scheme,
42
53
  colors: scheme === 'dark' ? darkColors : lightColors,
43
54
  shadow: scheme === 'dark' ? darkShadow : lightShadow,
44
- fontScale,
55
+ fontScale: normalizedFontScale,
45
56
  }),
46
- [scheme, fontScale]
57
+ [scheme, normalizedFontScale]
47
58
  );
48
59
 
49
60
  return (
@@ -0,0 +1,15 @@
1
+ import { useTheme } from './useTheme';
2
+
3
+ export function normalizeFontScale(value: unknown): number {
4
+ return typeof value === 'number' && Number.isFinite(value) && value > 0
5
+ ? value
6
+ : 1;
7
+ }
8
+
9
+ export function scaleFontMetric(value: number, fontScale: number): number {
10
+ return value * normalizeFontScale(fontScale);
11
+ }
12
+
13
+ export function useFontScale(): number {
14
+ return normalizeFontScale(useTheme().fontScale);
15
+ }
@@ -11,12 +11,11 @@ export { warmOrangePalette } from './palettes';
11
11
  export { lightShadow, darkShadow } from './shadow';
12
12
  export type { ShadowTokens } from './shadow';
13
13
 
14
- export { ThemeProvider, ThemeContext } from './ThemeProvider';
14
+ export { ThemeProvider } from './ThemeProvider';
15
15
  export type { ColorScheme, ThemeContextValue } from './ThemeProvider';
16
- // ThemeContext 为内部用途导出:若需子树强制主题,优先用 <ThemeProvider forceScheme> 嵌套。
17
- // 直接自挂 Provider 须保证 value 引用稳定(每渲染新对象会打穿 useThemedStyles 缓存)。
18
16
 
19
17
  export { useTheme, useColors, useShadow } from './useTheme';
18
+ export { normalizeFontScale, scaleFontMetric, useFontScale } from './fontScale';
20
19
  export { useThemedStyles } from './useThemedStyles';
21
20
  export type { StylesMaker } from './useThemedStyles';
22
21
  export { usePrefersReducedMotion } from './usePrefersReducedMotion';
@@ -0,0 +1,24 @@
1
+ import { createContext } from 'react';
2
+ import { lightColors } from './colors';
3
+ import { lightShadow } from './shadow';
4
+ import type { ThemeContextValue } from './ThemeProvider';
5
+
6
+ export const FALLBACK_THEME: ThemeContextValue = {
7
+ scheme: 'light',
8
+ colors: lightColors,
9
+ shadow: lightShadow,
10
+ fontScale: 1,
11
+ };
12
+
13
+ export const ThemeContext = createContext<ThemeContextValue | undefined>(
14
+ undefined
15
+ );
16
+
17
+ export const resolveThemeContext = (
18
+ value: ThemeContextValue | undefined
19
+ ): ThemeContextValue => value ?? FALLBACK_THEME;
20
+
21
+ export const shouldWarnMissingThemeProvider = (
22
+ value: ThemeContextValue | undefined,
23
+ isDev: boolean
24
+ ): boolean => value === undefined && isDev;
@@ -0,0 +1,41 @@
1
+ type DiagnosticWarn = (message: string) => void;
2
+ type DiagnosticFormatter = (value: unknown) => string;
3
+
4
+ const formatDiagnosticValue: DiagnosticFormatter = (value) => {
5
+ try {
6
+ return String(value);
7
+ } catch {
8
+ return '<无法序列化>';
9
+ }
10
+ };
11
+
12
+ export function createInvalidFontScaleDiagnostic(
13
+ warn: DiagnosticWarn,
14
+ formatValue: DiagnosticFormatter = formatDiagnosticValue
15
+ ): (value: unknown, normalizedFontScale: number, isDev: boolean) => void {
16
+ const warnedValues = new Set<string>();
17
+
18
+ return (value, normalizedFontScale, isDev) => {
19
+ if (!isDev || normalizedFontScale === value) return;
20
+
21
+ const formattedValue = formatValue(value);
22
+ const warningKey = `${typeof value}:${formattedValue}`;
23
+ if (warnedValues.has(warningKey)) return;
24
+
25
+ warnedValues.add(warningKey);
26
+ warn(`fontScale=${formattedValue} 无效,已回退为 1`);
27
+ };
28
+ }
29
+
30
+ export function createMissingThemeProviderDiagnostic(
31
+ warn: DiagnosticWarn
32
+ ): (shouldWarn: boolean) => void {
33
+ let warned = false;
34
+
35
+ return (shouldWarn) => {
36
+ if (!shouldWarn || warned) return;
37
+
38
+ warned = true;
39
+ warn('缺少 ThemeProvider,已使用稳定 light fallback');
40
+ };
41
+ }
@@ -1,9 +1,16 @@
1
+ import { useReducedMotion } from 'react-native-reanimated';
2
+
1
3
  /**
2
- * 系统「减弱动态效果」开关。
4
+ * native:读取 iOS / Android 系统「减弱动态效果」设置。
3
5
  *
4
- * native 端的动画由 reanimated 默认 `ReduceMotion.System` 处理(reduce-motion 下自动
5
- * 跳到端值),此 hook 只有 web 平台的 CSS/JS 动画需要 —— native 恒返回 false,见 `.web.ts`。
6
+ * 为什么必须真读系统值 —— Reanimated `ReduceMotion.System` 只覆盖它自己驱动的
7
+ * `withTiming` / `withSpring` 等动画;组件自己用 `setInterval`、RAF、Modal 转场或
8
+ * autoplay 做的动效完全不在它管辖内。本 hook 曾恒返回 `false`,导致 native 端
9
+ * Pulse、Carousel autoplay 等路径在系统开启减弱动效后仍继续动。
10
+ *
11
+ * 消费方(Pulse、Switch、Carousel、Reveal……)必须显式分支到这个 hook,不能假设
12
+ * 动画引擎已替自己处理了该偏好。
6
13
  */
7
14
  export function usePrefersReducedMotion(): boolean {
8
- return false;
15
+ return useReducedMotion();
9
16
  }
@@ -7,8 +7,11 @@ const QUERY = '(prefers-reduced-motion: reduce)';
7
7
  const win: any = globalThis as any;
8
8
 
9
9
  /**
10
- * web:监听系统「减弱动态效果」开关,返回当前是否开启;开关变化时自动更新。
11
- * native 端走 reanimated 的 `ReduceMotion.System`,对应 `.ts` 版恒返回 false。
10
+ * web:监听系统「减弱动态效果」开关(`matchMedia`),返回当前是否开启;开关变化时自动更新。
11
+ *
12
+ * native 兄弟实现读 Reanimated 的系统信号(`useReducedMotion()`),两端语义一致 ——
13
+ * 都返回真实的系统偏好。Reanimated 只自动处理它自己驱动的动画,timer / RAF / CSS
14
+ * transition / autoplay 一律要由消费方显式分支到本 hook。
12
15
  */
13
16
  export function usePrefersReducedMotion(): boolean {
14
17
  const [reduced, setReduced] = useState<boolean>(() =>
@@ -1,33 +1,25 @@
1
- import { useContext } from 'react';
2
- import { ThemeContext, type ThemeContextValue } from './ThemeProvider';
3
- import { lightColors } from './colors';
4
- import { lightShadow } from './shadow';
1
+ import { useContext, useEffect } from 'react';
2
+ import type { ThemeContextValue } from './ThemeProvider';
3
+ import {
4
+ resolveThemeContext,
5
+ shouldWarnMissingThemeProvider,
6
+ ThemeContext,
7
+ } from './themeContext';
8
+ import { createMissingThemeProviderDiagnostic } from './themeDiagnostics';
9
+ import { createLogger } from '../utils/logger';
5
10
 
6
- const FALLBACK: ThemeContextValue = {
7
- scheme: 'light',
8
- colors: lightColors,
9
- shadow: lightShadow,
10
- fontScale: 1,
11
- };
12
-
13
- // 静默回退而非 throw:FALLBACK 是模块级稳定引用,useThemedStyles 缓存契约不受影响。
14
- // 缺点:漏包 ThemeProvider 时整 app 永远 light、暗色失效且零信号——
15
- // 因此在 dev 下一次性告警提示接入方补 Provider。
16
- // 用 typeof __DEV__ 守卫:裸 __DEV__ 在非 Metro 打包器(Webpack/Next.js)下会 ReferenceError,
17
- // logger.ts:12 已有同等先例。
18
- let _warnedMissingProvider = false;
11
+ const isDev = typeof __DEV__ !== 'undefined' && __DEV__;
12
+ const log = createLogger('useTheme');
13
+ const reportMissingProvider = createMissingThemeProviderDiagnostic(log.warn);
19
14
 
20
15
  export function useTheme(): ThemeContextValue {
21
- const ctx = useContext(ThemeContext);
22
- if (ctx === undefined && !_warnedMissingProvider) {
23
- _warnedMissingProvider = true;
24
- if (typeof __DEV__ !== 'undefined' && __DEV__) {
25
- console.warn(
26
- '[unif/theme] useTheme: ThemeContext 未找到 —— 请在 app 根部渲染 <ThemeProvider>,否则暗色切换不生效。'
27
- );
28
- }
29
- }
30
- return ctx ?? FALLBACK;
16
+ const context = useContext(ThemeContext);
17
+
18
+ useEffect(() => {
19
+ reportMissingProvider(shouldWarnMissingThemeProvider(context, isDev));
20
+ }, [context]);
21
+
22
+ return resolveThemeContext(context);
31
23
  }
32
24
 
33
25
  export function useColors() {
@@ -1,6 +1,7 @@
1
1
  import { useMemo } from 'react';
2
2
  import type { ImageStyle, TextStyle, ViewStyle } from 'react-native';
3
3
  import type { ColorTokens } from './colors';
4
+ import { normalizeFontScale, scaleFontMetric } from './fontScale';
4
5
  import type { ShadowTokens } from './shadow';
5
6
  import { useTheme } from './useTheme';
6
7
 
@@ -27,12 +28,14 @@ function scaleTextStyle(style: TextStyle, factor: number): TextStyle {
27
28
  }
28
29
  return {
29
30
  ...style,
30
- ...(typeof fontSize === 'number' ? { fontSize: fontSize * factor } : null),
31
+ ...(typeof fontSize === 'number'
32
+ ? { fontSize: scaleFontMetric(fontSize, factor) }
33
+ : null),
31
34
  ...(typeof lineHeight === 'number'
32
- ? { lineHeight: lineHeight * factor }
35
+ ? { lineHeight: scaleFontMetric(lineHeight, factor) }
33
36
  : null),
34
37
  ...(typeof letterSpacing === 'number'
35
- ? { letterSpacing: letterSpacing * factor }
38
+ ? { letterSpacing: scaleFontMetric(letterSpacing, factor) }
36
39
  : null),
37
40
  };
38
41
  }
@@ -42,9 +45,10 @@ function scaleTextStyle(style: TextStyle, factor: number): TextStyle {
42
45
  * 导出仅供单测,不进 barrel。 */
43
46
  export function scaleNamedStyles<S extends NamedStyles<S>>(
44
47
  styles: S,
45
- factor: number
48
+ factor: unknown
46
49
  ): S {
47
- if (factor === 1) return styles;
50
+ const fontScale = normalizeFontScale(factor);
51
+ if (fontScale === 1) return styles;
48
52
  const out: Record<string, ViewStyle | TextStyle | ImageStyle> = {};
49
53
  for (const [key, style] of Object.entries(
50
54
  styles as Record<string, ViewStyle | TextStyle | ImageStyle>
@@ -52,7 +56,7 @@ export function scaleNamedStyles<S extends NamedStyles<S>>(
52
56
  // ViewStyle / ImageStyle 无字号三属性,按 TextStyle 探测后恒等返回原引用。
53
57
  out[key] =
54
58
  style && typeof style === 'object'
55
- ? scaleTextStyle(style as TextStyle, factor)
59
+ ? scaleTextStyle(style as TextStyle, fontScale)
56
60
  : style;
57
61
  }
58
62
  return out as S;
@@ -70,7 +74,8 @@ export function scaleNamedStyles<S extends NamedStyles<S>>(
70
74
  export function useThemedStyles<S extends NamedStyles<S>>(
71
75
  maker: StylesMaker<S>
72
76
  ): S {
73
- const { colors, shadow, fontScale } = useTheme();
77
+ const { colors, shadow, fontScale: rawFontScale } = useTheme();
78
+ const fontScale = normalizeFontScale(rawFontScale);
74
79
  return useMemo(
75
80
  () => scaleNamedStyles(maker(colors, shadow), fontScale),
76
81
  [colors, shadow, fontScale, maker]
@@ -0,0 +1,303 @@
1
+ import type { ImageSourcePropType } from 'react-native';
2
+
3
+ interface SnapshotObject {
4
+ readonly [key: string]: SnapshotValue;
5
+ }
6
+
7
+ interface SnapshotArray extends ReadonlyArray<SnapshotValue> {}
8
+
9
+ type SnapshotValue =
10
+ | undefined
11
+ | null
12
+ | string
13
+ | number
14
+ | boolean
15
+ | SnapshotObject
16
+ | SnapshotArray;
17
+
18
+ type SnapshotResult =
19
+ | {
20
+ valid: true;
21
+ snapshot: SnapshotValue;
22
+ canonical: string;
23
+ }
24
+ | {
25
+ valid: false;
26
+ canonical: string;
27
+ };
28
+
29
+ type ResolvedImageSource = Readonly<{
30
+ source: ImageSourcePropType;
31
+ key: string;
32
+ }>;
33
+
34
+ const hasOwn = (value: object, key: PropertyKey): boolean =>
35
+ Object.prototype.hasOwnProperty.call(value, key);
36
+
37
+ function valid(snapshot: SnapshotValue, canonical: string): SnapshotResult {
38
+ return { valid: true, snapshot, canonical };
39
+ }
40
+
41
+ function invalid(kind: string): SnapshotResult {
42
+ return { valid: false, canonical: `invalid:${kind}` };
43
+ }
44
+
45
+ function visitArray(
46
+ value: object,
47
+ keys: readonly string[],
48
+ seen: WeakSet<object>
49
+ ): SnapshotResult {
50
+ if (!keys.includes('length')) return invalid('descriptor');
51
+
52
+ const lengthDescriptor = Reflect.getOwnPropertyDescriptor(value, 'length');
53
+ if (
54
+ lengthDescriptor === undefined ||
55
+ lengthDescriptor.enumerable ||
56
+ !hasOwn(lengthDescriptor, 'value') ||
57
+ typeof lengthDescriptor.value !== 'number' ||
58
+ !Number.isInteger(lengthDescriptor.value) ||
59
+ lengthDescriptor.value < 0
60
+ ) {
61
+ return invalid('descriptor');
62
+ }
63
+
64
+ const length = lengthDescriptor.value;
65
+ if (keys.length !== length + 1) return invalid('descriptor');
66
+
67
+ const keySet = new Set(keys);
68
+ const parts: string[] = [];
69
+ const snapshot: SnapshotValue[] = [];
70
+ let allValid = true;
71
+
72
+ for (let index = 0; index < length; index += 1) {
73
+ const key = String(index);
74
+ if (!keySet.has(key)) return invalid('descriptor');
75
+
76
+ const descriptor = Reflect.getOwnPropertyDescriptor(value, key);
77
+ if (
78
+ descriptor === undefined ||
79
+ !descriptor.enumerable ||
80
+ !hasOwn(descriptor, 'value')
81
+ ) {
82
+ return invalid('descriptor');
83
+ }
84
+
85
+ const item = visit(descriptor.value, seen);
86
+ parts.push(item.canonical);
87
+ if (item.valid) {
88
+ snapshot.push(item.snapshot);
89
+ } else {
90
+ allValid = false;
91
+ }
92
+ }
93
+
94
+ const canonical = `array:[${parts.join(',')}]`;
95
+ return allValid
96
+ ? valid(Object.freeze(snapshot), canonical)
97
+ : { valid: false, canonical };
98
+ }
99
+
100
+ function visitObject(
101
+ value: object,
102
+ keys: readonly string[],
103
+ seen: WeakSet<object>
104
+ ): SnapshotResult {
105
+ const snapshot: Record<string, SnapshotValue> = {};
106
+ const parts: string[] = [];
107
+ let allValid = true;
108
+
109
+ for (const key of [...keys].sort()) {
110
+ const descriptor = Reflect.getOwnPropertyDescriptor(value, key);
111
+ if (descriptor === undefined) return invalid('descriptor');
112
+ if (!descriptor.enumerable) return invalid('non-enumerable');
113
+ if (!hasOwn(descriptor, 'value')) return invalid('accessor');
114
+
115
+ const item = visit(descriptor.value, seen);
116
+ parts.push(`${JSON.stringify(key)}:${item.canonical}`);
117
+ if (item.valid) {
118
+ Object.defineProperty(snapshot, key, {
119
+ configurable: false,
120
+ enumerable: true,
121
+ value: item.snapshot,
122
+ writable: false,
123
+ });
124
+ } else {
125
+ allValid = false;
126
+ }
127
+ }
128
+
129
+ const canonical = `object:{${parts.join(',')}}`;
130
+ return allValid
131
+ ? valid(Object.freeze(snapshot), canonical)
132
+ : { valid: false, canonical };
133
+ }
134
+
135
+ /**
136
+ * 只从 own data descriptor 读取一次,绝不执行 getter。snapshot 与 canonical
137
+ * key 因而来自同一份值;任何 descriptor / Proxy 异常都失败关闭。
138
+ */
139
+ function visit(value: unknown, seen: WeakSet<object>): SnapshotResult {
140
+ if (value === undefined) return valid(undefined, 'undefined:');
141
+ if (value === null) return valid(null, 'null:');
142
+
143
+ switch (typeof value) {
144
+ case 'string':
145
+ return valid(value, `string:${JSON.stringify(value)}`);
146
+ case 'number':
147
+ return Number.isFinite(value)
148
+ ? valid(value, `number:${value}`)
149
+ : invalid('number');
150
+ case 'boolean':
151
+ return valid(value, `boolean:${String(value)}`);
152
+ case 'function':
153
+ case 'symbol':
154
+ case 'bigint':
155
+ return invalid(typeof value);
156
+ case 'object':
157
+ break;
158
+ case 'undefined':
159
+ return valid(undefined, 'undefined:');
160
+ }
161
+
162
+ try {
163
+ if (seen.has(value)) return invalid('cycle');
164
+
165
+ const isArray = Array.isArray(value);
166
+ const ownKeys = Reflect.ownKeys(value);
167
+ const keys: string[] = [];
168
+ for (const key of ownKeys) {
169
+ if (typeof key === 'symbol') return invalid('symbol-key');
170
+ keys.push(key);
171
+ }
172
+
173
+ seen.add(value);
174
+ try {
175
+ return isArray
176
+ ? visitArray(value, keys, seen)
177
+ : visitObject(value, keys, seen);
178
+ } finally {
179
+ seen.delete(value);
180
+ }
181
+ } catch {
182
+ return invalid('exception');
183
+ }
184
+ }
185
+
186
+ function snapshotValue(value: unknown): SnapshotResult {
187
+ try {
188
+ return visit(value, new WeakSet<object>());
189
+ } catch {
190
+ return invalid('exception');
191
+ }
192
+ }
193
+
194
+ export function canonicalSourceValue(value: unknown): string {
195
+ return snapshotValue(value).canonical;
196
+ }
197
+
198
+ const URI_STRING_FIELDS = ['bundle', 'method', 'body'] as const;
199
+ const CACHE_POLICIES = new Set([
200
+ 'default',
201
+ 'reload',
202
+ 'force-cache',
203
+ 'only-if-cached',
204
+ ]);
205
+
206
+ function isSnapshotObject(value: SnapshotValue): value is SnapshotObject {
207
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
208
+ }
209
+
210
+ function isValidHeaders(value: SnapshotValue): boolean {
211
+ if (value === undefined) return true;
212
+ if (!isSnapshotObject(value)) return false;
213
+ return Object.keys(value).every((key) => typeof value[key] === 'string');
214
+ }
215
+
216
+ function isValidUriSource(value: SnapshotValue): boolean {
217
+ if (!isSnapshotObject(value) || !hasOwn(value, 'uri')) return false;
218
+
219
+ const uri = value.uri;
220
+ if (typeof uri !== 'string' || uri.trim().length === 0) return false;
221
+
222
+ for (const field of URI_STRING_FIELDS) {
223
+ const fieldValue = value[field];
224
+ if (fieldValue !== undefined && typeof fieldValue !== 'string') {
225
+ return false;
226
+ }
227
+ }
228
+
229
+ if (!isValidHeaders(value.headers)) return false;
230
+
231
+ const cache = value.cache;
232
+ if (cache !== undefined && !CACHE_POLICIES.has(cache as string)) return false;
233
+
234
+ for (const field of ['width', 'height', 'scale'] as const) {
235
+ const fieldValue = value[field];
236
+ if (
237
+ fieldValue !== undefined &&
238
+ (typeof fieldValue !== 'number' || !Number.isFinite(fieldValue))
239
+ ) {
240
+ return false;
241
+ }
242
+ }
243
+
244
+ return true;
245
+ }
246
+
247
+ function asImageSource(
248
+ snapshot: SnapshotValue
249
+ ): ImageSourcePropType | undefined {
250
+ if (typeof snapshot === 'number') {
251
+ return Number.isFinite(snapshot) &&
252
+ snapshot > 0 &&
253
+ Number.isInteger(snapshot)
254
+ ? snapshot
255
+ : undefined;
256
+ }
257
+
258
+ if (Array.isArray(snapshot)) {
259
+ return snapshot.length > 0 && snapshot.every(isValidUriSource)
260
+ ? (snapshot as ImageSourcePropType)
261
+ : undefined;
262
+ }
263
+
264
+ return isValidUriSource(snapshot)
265
+ ? (snapshot as ImageSourcePropType)
266
+ : undefined;
267
+ }
268
+
269
+ /**
270
+ * 组件唯一入口:一次读取完成 runtime validation、deep-frozen plain snapshot
271
+ * 与 semantic key。调用方必须把同一返回值里的 source / key 一起交给 attempt。
272
+ */
273
+ export function resolveImageSource(
274
+ source: unknown
275
+ ): ResolvedImageSource | undefined {
276
+ const result = snapshotValue(source);
277
+ if (!result.valid) return undefined;
278
+
279
+ const snapshot = asImageSource(result.snapshot);
280
+ if (snapshot === undefined) return undefined;
281
+
282
+ return Object.freeze({
283
+ source: snapshot,
284
+ key: `image-source:${result.canonical}`,
285
+ });
286
+ }
287
+
288
+ export function imageSourceKey(
289
+ source: ImageSourcePropType | undefined
290
+ ): string {
291
+ return `image-source:${snapshotValue(source).canonical}`;
292
+ }
293
+
294
+ /**
295
+ * JS 消费者可能绕过类型系统。只有能安全 snapshot 的 asset id、URI object 或
296
+ * URI object 数组能进入 Image;accessor、异常 descriptor 与非法 nested value
297
+ * 一律失败关闭。
298
+ */
299
+ export function isValidImageSource(
300
+ source: unknown
301
+ ): source is ImageSourcePropType {
302
+ return resolveImageSource(source) !== undefined;
303
+ }
@@ -1,12 +0,0 @@
1
- "use strict";
2
-
3
- import { StyleSheet } from 'react-native';
4
- import { space } from "../../../theme/index.js";
5
-
6
- /** eye Pressable hit area 微间距 4px。 */
7
- export const styles = StyleSheet.create({
8
- eyeBtn: {
9
- paddingHorizontal: space['1']
10
- }
11
- });
12
- //# sourceMappingURL=styles.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["StyleSheet","space","styles","create","eyeBtn","paddingHorizontal"],"sourceRoot":"../../../../../src","sources":["components/ui/PasswordInput/styles.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SAASC,KAAK,QAAQ,yBAAgB;;AAEtC;AACA,OAAO,MAAMC,MAAM,GAAGF,UAAU,CAACG,MAAM,CAAC;EACtCC,MAAM,EAAE;IAAEC,iBAAiB,EAAEJ,KAAK,CAAC,GAAG;EAAE;AAC1C,CAAC,CAAC","ignoreList":[]}