@unif/react-native-design 0.20.0 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. package/README.md +121 -12
  2. package/lib/module/components/business/AvatarWithRing/AvatarWithRing.js +4 -5
  3. package/lib/module/components/business/AvatarWithRing/AvatarWithRing.js.map +1 -1
  4. package/lib/module/components/business/AvatarWithRing/styles.js +10 -9
  5. package/lib/module/components/business/AvatarWithRing/styles.js.map +1 -1
  6. package/lib/module/components/business/VersionPill/VersionPill.js +32 -15
  7. package/lib/module/components/business/VersionPill/VersionPill.js.map +1 -1
  8. package/lib/module/components/business/VersionPill/content.js +30 -0
  9. package/lib/module/components/business/VersionPill/content.js.map +1 -0
  10. package/lib/module/components/business/VersionPill/styles.js +4 -0
  11. package/lib/module/components/business/VersionPill/styles.js.map +1 -1
  12. package/lib/module/components/business/useSvgId.js +17 -8
  13. package/lib/module/components/business/useSvgId.js.map +1 -1
  14. package/lib/module/components/ui/Avatar/Avatar.js +22 -29
  15. package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
  16. package/lib/module/components/ui/Button/Button.js +40 -23
  17. package/lib/module/components/ui/Button/Button.js.map +1 -1
  18. package/lib/module/components/ui/Button/ButtonBase.js +13 -13
  19. package/lib/module/components/ui/Button/ButtonBase.js.map +1 -1
  20. package/lib/module/components/ui/Carousel/Carousel.js +68 -40
  21. package/lib/module/components/ui/Carousel/Carousel.js.map +1 -1
  22. package/lib/module/components/ui/Carousel/behavior.js +60 -0
  23. package/lib/module/components/ui/Carousel/behavior.js.map +1 -0
  24. package/lib/module/components/ui/Carousel/styles.js +6 -8
  25. package/lib/module/components/ui/Carousel/styles.js.map +1 -1
  26. package/lib/module/components/ui/Cell/Cell.js +76 -65
  27. package/lib/module/components/ui/Cell/Cell.js.map +1 -1
  28. package/lib/module/components/ui/Cell/Leading.js +11 -5
  29. package/lib/module/components/ui/Cell/Leading.js.map +1 -1
  30. package/lib/module/components/ui/Cell/content.js +34 -0
  31. package/lib/module/components/ui/Cell/content.js.map +1 -0
  32. package/lib/module/components/ui/Checkbox/Checkbox.js +25 -8
  33. package/lib/module/components/ui/Checkbox/Checkbox.js.map +1 -1
  34. package/lib/module/components/ui/Confirm/ConfirmHost.js +49 -25
  35. package/lib/module/components/ui/Confirm/ConfirmHost.js.map +1 -1
  36. package/lib/module/components/ui/Confirm/confirm.js +15 -29
  37. package/lib/module/components/ui/Confirm/confirm.js.map +1 -1
  38. package/lib/module/components/ui/Confirm/labels.js +10 -0
  39. package/lib/module/components/ui/Confirm/labels.js.map +1 -0
  40. package/lib/module/components/ui/Confirm/store.js +113 -0
  41. package/lib/module/components/ui/Confirm/store.js.map +1 -0
  42. package/lib/module/components/ui/Confirm/styles.js +4 -0
  43. package/lib/module/components/ui/Confirm/styles.js.map +1 -1
  44. package/lib/module/components/ui/DrawerHeader/DrawerHeader.js +17 -25
  45. package/lib/module/components/ui/DrawerHeader/DrawerHeader.js.map +1 -1
  46. package/lib/module/components/ui/Grid/Grid.js +26 -9
  47. package/lib/module/components/ui/Grid/Grid.js.map +1 -1
  48. package/lib/module/components/ui/Grid/accessibility.js +13 -0
  49. package/lib/module/components/ui/Grid/accessibility.js.map +1 -0
  50. package/lib/module/components/ui/IconButton/IconButton.js +16 -3
  51. package/lib/module/components/ui/IconButton/IconButton.js.map +1 -1
  52. package/lib/module/components/ui/Input/Input.js +8 -5
  53. package/lib/module/components/ui/Input/Input.js.map +1 -1
  54. package/lib/module/components/ui/Logo/Logo.js +22 -4
  55. package/lib/module/components/ui/Logo/Logo.js.map +1 -1
  56. package/lib/module/components/ui/NavBar/NavBar.js +23 -14
  57. package/lib/module/components/ui/NavBar/NavBar.js.map +1 -1
  58. package/lib/module/components/ui/NavBar/isSlot.js +297 -4
  59. package/lib/module/components/ui/NavBar/isSlot.js.map +1 -1
  60. package/lib/module/components/ui/PasswordInput/PasswordInput.js +61 -66
  61. package/lib/module/components/ui/PasswordInput/PasswordInput.js.map +1 -1
  62. package/lib/module/components/ui/Pulse/Pulse.js +1 -1
  63. package/lib/module/components/ui/Pulse/Pulse.js.map +1 -1
  64. package/lib/module/components/ui/Pulse/PulseDot.js +5 -7
  65. package/lib/module/components/ui/Pulse/PulseDot.js.map +1 -1
  66. package/lib/module/components/ui/Pulse/index.js +1 -1
  67. package/lib/module/components/ui/Pulse/index.js.map +1 -1
  68. package/lib/module/components/ui/Pulse/normalizePulseOptions.js +45 -0
  69. package/lib/module/components/ui/Pulse/normalizePulseOptions.js.map +1 -0
  70. package/lib/module/components/ui/Pulse/usePulse.js +61 -24
  71. package/lib/module/components/ui/Pulse/usePulse.js.map +1 -1
  72. package/lib/module/components/ui/Pulse/usePulseDriver.js +44 -0
  73. package/lib/module/components/ui/Pulse/usePulseDriver.js.map +1 -0
  74. package/lib/module/components/ui/Pulse/usePulseDriver.web.js +67 -0
  75. package/lib/module/components/ui/Pulse/usePulseDriver.web.js.map +1 -0
  76. package/lib/module/components/ui/Radio/Radio.js +31 -14
  77. package/lib/module/components/ui/Radio/Radio.js.map +1 -1
  78. package/lib/module/components/ui/Radio/RadioGroup.js +15 -2
  79. package/lib/module/components/ui/Radio/RadioGroup.js.map +1 -1
  80. package/lib/module/components/ui/Reveal/Reveal.js +4 -3
  81. package/lib/module/components/ui/Reveal/Reveal.js.map +1 -1
  82. package/lib/module/components/ui/Reveal/Reveal.web.js +55 -32
  83. package/lib/module/components/ui/Reveal/Reveal.web.js.map +1 -1
  84. package/lib/module/components/ui/Reveal/webTransition.js +157 -0
  85. package/lib/module/components/ui/Reveal/webTransition.js.map +1 -0
  86. package/lib/module/components/ui/Search/Search.js +85 -58
  87. package/lib/module/components/ui/Search/Search.js.map +1 -1
  88. package/lib/module/components/ui/Segmented/Segmented.js +4 -2
  89. package/lib/module/components/ui/Segmented/Segmented.js.map +1 -1
  90. package/lib/module/components/ui/Skeleton/Skeleton.js +5 -7
  91. package/lib/module/components/ui/Skeleton/Skeleton.js.map +1 -1
  92. package/lib/module/components/ui/Spinner/Spinner.js +18 -11
  93. package/lib/module/components/ui/Spinner/Spinner.js.map +1 -1
  94. package/lib/module/components/ui/Spinner/Spinner.web.js +18 -14
  95. package/lib/module/components/ui/Spinner/Spinner.web.js.map +1 -1
  96. package/lib/module/components/ui/Spinner/shared.js +6 -0
  97. package/lib/module/components/ui/Spinner/shared.js.map +1 -1
  98. package/lib/module/components/ui/Stepper/Stepper.js +131 -99
  99. package/lib/module/components/ui/Stepper/Stepper.js.map +1 -1
  100. package/lib/module/components/ui/Stepper/StepperPressable.js +4 -0
  101. package/lib/module/components/ui/Stepper/StepperPressable.js.map +1 -0
  102. package/lib/module/components/ui/Stepper/StepperPressable.web.js +4 -0
  103. package/lib/module/components/ui/Stepper/StepperPressable.web.js.map +1 -0
  104. package/lib/module/components/ui/Stepper/accessibility.js +30 -0
  105. package/lib/module/components/ui/Stepper/accessibility.js.map +1 -0
  106. package/lib/module/components/ui/Stepper/accessibility.types.js +4 -0
  107. package/lib/module/components/ui/Stepper/accessibility.types.js.map +1 -0
  108. package/lib/module/components/ui/Stepper/accessibility.web.js +57 -0
  109. package/lib/module/components/ui/Stepper/accessibility.web.js.map +1 -0
  110. package/lib/module/components/ui/Stepper/layout.js +28 -0
  111. package/lib/module/components/ui/Stepper/layout.js.map +1 -0
  112. package/lib/module/components/ui/Stepper/normalizeStepper.js +53 -0
  113. package/lib/module/components/ui/Stepper/normalizeStepper.js.map +1 -0
  114. package/lib/module/components/ui/Stepper/styles.js +9 -2
  115. package/lib/module/components/ui/Stepper/styles.js.map +1 -1
  116. package/lib/module/components/ui/Switch/Switch.js +45 -19
  117. package/lib/module/components/ui/Switch/Switch.js.map +1 -1
  118. package/lib/module/components/ui/Switch/Switch.web.js +47 -20
  119. package/lib/module/components/ui/Switch/Switch.web.js.map +1 -1
  120. package/lib/module/components/ui/Switch/styles.js +12 -5
  121. package/lib/module/components/ui/Switch/styles.js.map +1 -1
  122. package/lib/module/components/ui/Tag/Tag.js +3 -2
  123. package/lib/module/components/ui/Tag/Tag.js.map +1 -1
  124. package/lib/module/components/ui/TextField/TextFieldBase.js +131 -86
  125. package/lib/module/components/ui/TextField/TextFieldBase.js.map +1 -1
  126. package/lib/module/components/ui/TextField/TextFieldSlot.js +82 -0
  127. package/lib/module/components/ui/TextField/TextFieldSlot.js.map +1 -0
  128. package/lib/module/components/ui/TextField/normalize.js +238 -0
  129. package/lib/module/components/ui/TextField/normalize.js.map +1 -0
  130. package/lib/module/components/ui/TextField/styles.js +31 -0
  131. package/lib/module/components/ui/TextField/styles.js.map +1 -1
  132. package/lib/module/components/ui/TextField/useErrorAnnouncement.js +27 -0
  133. package/lib/module/components/ui/TextField/useErrorAnnouncement.js.map +1 -0
  134. package/lib/module/components/ui/TextField/useTextFieldValue.js +66 -0
  135. package/lib/module/components/ui/TextField/useTextFieldValue.js.map +1 -0
  136. package/lib/module/components/ui/TextField/valueState.js +93 -0
  137. package/lib/module/components/ui/TextField/valueState.js.map +1 -0
  138. package/lib/module/components/ui/Textarea/Textarea.js +7 -3
  139. package/lib/module/components/ui/Textarea/Textarea.js.map +1 -1
  140. package/lib/module/components/ui/Thumbnail/Thumbnail.js +67 -48
  141. package/lib/module/components/ui/Thumbnail/Thumbnail.js.map +1 -1
  142. package/lib/module/components/ui/Thumbnail/normalize.js +58 -0
  143. package/lib/module/components/ui/Thumbnail/normalize.js.map +1 -0
  144. package/lib/module/components/ui/Thumbnail/styles.js +6 -11
  145. package/lib/module/components/ui/Thumbnail/styles.js.map +1 -1
  146. package/lib/module/components/ui/Toast/ToastHost.js +64 -21
  147. package/lib/module/components/ui/Toast/ToastHost.js.map +1 -1
  148. package/lib/module/components/ui/Toast/ToastHost.web.js +73 -24
  149. package/lib/module/components/ui/Toast/ToastHost.web.js.map +1 -1
  150. package/lib/module/components/ui/Toast/store.js +110 -0
  151. package/lib/module/components/ui/Toast/store.js.map +1 -0
  152. package/lib/module/components/ui/Toast/toast.js +17 -7
  153. package/lib/module/components/ui/Toast/toast.js.map +1 -1
  154. package/lib/module/components/ui/index.js.map +1 -1
  155. package/lib/module/components/ui/shared/ImageAttempt.js +28 -0
  156. package/lib/module/components/ui/shared/ImageAttempt.js.map +1 -0
  157. package/lib/module/components/ui/shared/a11y.js +21 -0
  158. package/lib/module/components/ui/shared/a11y.js.map +1 -0
  159. package/lib/module/components/ui/shared/accessibilityName.js +9 -0
  160. package/lib/module/components/ui/shared/accessibilityName.js.map +1 -0
  161. package/lib/module/components/ui/shared/selectImageAttemptSource.js +5 -0
  162. package/lib/module/components/ui/shared/selectImageAttemptSource.js.map +1 -0
  163. package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js +13 -0
  164. package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js.map +1 -0
  165. package/lib/module/components/ui/shared/selectImageAttemptSource.web.js +5 -0
  166. package/lib/module/components/ui/shared/selectImageAttemptSource.web.js.map +1 -0
  167. package/lib/module/icons/data.js +1 -1
  168. package/lib/module/icons/data.js.map +1 -1
  169. package/lib/module/theme/ThemeProvider.js +14 -4
  170. package/lib/module/theme/ThemeProvider.js.map +1 -1
  171. package/lib/module/theme/fontScale.js +13 -0
  172. package/lib/module/theme/fontScale.js.map +1 -0
  173. package/lib/module/theme/index.js +2 -4
  174. package/lib/module/theme/index.js.map +1 -1
  175. package/lib/module/theme/themeContext.js +15 -0
  176. package/lib/module/theme/themeContext.js.map +1 -0
  177. package/lib/module/theme/themeDiagnostics.js +29 -0
  178. package/lib/module/theme/themeDiagnostics.js.map +1 -0
  179. package/lib/module/theme/usePrefersReducedMotion.js +11 -4
  180. package/lib/module/theme/usePrefersReducedMotion.js.map +1 -1
  181. package/lib/module/theme/usePrefersReducedMotion.web.js +5 -2
  182. package/lib/module/theme/usePrefersReducedMotion.web.js.map +1 -1
  183. package/lib/module/theme/useTheme.js +12 -25
  184. package/lib/module/theme/useTheme.js.map +1 -1
  185. package/lib/module/theme/useThemedStyles.js +9 -6
  186. package/lib/module/theme/useThemedStyles.js.map +1 -1
  187. package/lib/module/utils/imageSource.js +198 -0
  188. package/lib/module/utils/imageSource.js.map +1 -0
  189. package/lib/typescript/manual-tests/runtime-api/RuntimeApiScreen.d.ts +12 -0
  190. package/lib/typescript/manual-tests/runtime-api/RuntimeApiScreen.d.ts.map +1 -0
  191. package/lib/typescript/src/components/business/AvatarWithRing/AvatarWithRing.d.ts.map +1 -1
  192. package/lib/typescript/src/components/business/AvatarWithRing/styles.d.ts +8 -7
  193. package/lib/typescript/src/components/business/AvatarWithRing/styles.d.ts.map +1 -1
  194. package/lib/typescript/src/components/business/VersionPill/VersionPill.d.ts +1 -1
  195. package/lib/typescript/src/components/business/VersionPill/VersionPill.d.ts.map +1 -1
  196. package/lib/typescript/src/components/business/VersionPill/content.d.ts +19 -0
  197. package/lib/typescript/src/components/business/VersionPill/content.d.ts.map +1 -0
  198. package/lib/typescript/src/components/business/VersionPill/index.d.ts +1 -1
  199. package/lib/typescript/src/components/business/VersionPill/index.d.ts.map +1 -1
  200. package/lib/typescript/src/components/business/VersionPill/styles.d.ts +4 -0
  201. package/lib/typescript/src/components/business/VersionPill/styles.d.ts.map +1 -1
  202. package/lib/typescript/src/components/business/VersionPill/types.d.ts +6 -2
  203. package/lib/typescript/src/components/business/VersionPill/types.d.ts.map +1 -1
  204. package/lib/typescript/src/components/business/index.d.ts +1 -1
  205. package/lib/typescript/src/components/business/index.d.ts.map +1 -1
  206. package/lib/typescript/src/components/business/useSvgId.d.ts +6 -5
  207. package/lib/typescript/src/components/business/useSvgId.d.ts.map +1 -1
  208. package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts +2 -2
  209. package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts.map +1 -1
  210. package/lib/typescript/src/components/ui/Avatar/types.d.ts +6 -2
  211. package/lib/typescript/src/components/ui/Avatar/types.d.ts.map +1 -1
  212. package/lib/typescript/src/components/ui/Button/Button.d.ts +1 -1
  213. package/lib/typescript/src/components/ui/Button/Button.d.ts.map +1 -1
  214. package/lib/typescript/src/components/ui/Button/ButtonBase.d.ts +5 -3
  215. package/lib/typescript/src/components/ui/Button/ButtonBase.d.ts.map +1 -1
  216. package/lib/typescript/src/components/ui/Button/types.d.ts +5 -3
  217. package/lib/typescript/src/components/ui/Button/types.d.ts.map +1 -1
  218. package/lib/typescript/src/components/ui/Carousel/Carousel.d.ts.map +1 -1
  219. package/lib/typescript/src/components/ui/Carousel/behavior.d.ts +25 -0
  220. package/lib/typescript/src/components/ui/Carousel/behavior.d.ts.map +1 -0
  221. package/lib/typescript/src/components/ui/Carousel/styles.d.ts +4 -6
  222. package/lib/typescript/src/components/ui/Carousel/styles.d.ts.map +1 -1
  223. package/lib/typescript/src/components/ui/Carousel/types.d.ts +14 -6
  224. package/lib/typescript/src/components/ui/Carousel/types.d.ts.map +1 -1
  225. package/lib/typescript/src/components/ui/Cell/Cell.d.ts +1 -1
  226. package/lib/typescript/src/components/ui/Cell/Cell.d.ts.map +1 -1
  227. package/lib/typescript/src/components/ui/Cell/Leading.d.ts +2 -3
  228. package/lib/typescript/src/components/ui/Cell/Leading.d.ts.map +1 -1
  229. package/lib/typescript/src/components/ui/Cell/content.d.ts +18 -0
  230. package/lib/typescript/src/components/ui/Cell/content.d.ts.map +1 -0
  231. package/lib/typescript/src/components/ui/Cell/index.d.ts +1 -1
  232. package/lib/typescript/src/components/ui/Cell/index.d.ts.map +1 -1
  233. package/lib/typescript/src/components/ui/Cell/types.d.ts +66 -30
  234. package/lib/typescript/src/components/ui/Cell/types.d.ts.map +1 -1
  235. package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts +1 -1
  236. package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts.map +1 -1
  237. package/lib/typescript/src/components/ui/Checkbox/types.d.ts +12 -3
  238. package/lib/typescript/src/components/ui/Checkbox/types.d.ts.map +1 -1
  239. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts +6 -3
  240. package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts.map +1 -1
  241. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts +10 -4
  242. package/lib/typescript/src/components/ui/Confirm/confirm.d.ts.map +1 -1
  243. package/lib/typescript/src/components/ui/Confirm/labels.d.ts +6 -0
  244. package/lib/typescript/src/components/ui/Confirm/labels.d.ts.map +1 -0
  245. package/lib/typescript/src/components/ui/Confirm/store.d.ts +44 -0
  246. package/lib/typescript/src/components/ui/Confirm/store.d.ts.map +1 -0
  247. package/lib/typescript/src/components/ui/Confirm/styles.d.ts +3 -0
  248. package/lib/typescript/src/components/ui/Confirm/styles.d.ts.map +1 -1
  249. package/lib/typescript/src/components/ui/Confirm/types.d.ts +0 -9
  250. package/lib/typescript/src/components/ui/Confirm/types.d.ts.map +1 -1
  251. package/lib/typescript/src/components/ui/DrawerHeader/DrawerHeader.d.ts.map +1 -1
  252. package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts +7 -1
  253. package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts.map +1 -1
  254. package/lib/typescript/src/components/ui/Grid/Grid.d.ts.map +1 -1
  255. package/lib/typescript/src/components/ui/Grid/accessibility.d.ts +5 -0
  256. package/lib/typescript/src/components/ui/Grid/accessibility.d.ts.map +1 -0
  257. package/lib/typescript/src/components/ui/Grid/types.d.ts +2 -0
  258. package/lib/typescript/src/components/ui/Grid/types.d.ts.map +1 -1
  259. package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts +1 -1
  260. package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts.map +1 -1
  261. package/lib/typescript/src/components/ui/IconButton/types.d.ts +4 -2
  262. package/lib/typescript/src/components/ui/IconButton/types.d.ts.map +1 -1
  263. package/lib/typescript/src/components/ui/Input/Input.d.ts +5 -383
  264. package/lib/typescript/src/components/ui/Input/Input.d.ts.map +1 -1
  265. package/lib/typescript/src/components/ui/Input/index.d.ts +1 -0
  266. package/lib/typescript/src/components/ui/Input/index.d.ts.map +1 -1
  267. package/lib/typescript/src/components/ui/Input/types.d.ts +3 -17
  268. package/lib/typescript/src/components/ui/Input/types.d.ts.map +1 -1
  269. package/lib/typescript/src/components/ui/Logo/Logo.d.ts +2 -2
  270. package/lib/typescript/src/components/ui/Logo/Logo.d.ts.map +1 -1
  271. package/lib/typescript/src/components/ui/Logo/types.d.ts +2 -2
  272. package/lib/typescript/src/components/ui/Logo/types.d.ts.map +1 -1
  273. package/lib/typescript/src/components/ui/NavBar/NavBar.d.ts.map +1 -1
  274. package/lib/typescript/src/components/ui/NavBar/index.d.ts +1 -1
  275. package/lib/typescript/src/components/ui/NavBar/index.d.ts.map +1 -1
  276. package/lib/typescript/src/components/ui/NavBar/isSlot.d.ts +24 -4
  277. package/lib/typescript/src/components/ui/NavBar/isSlot.d.ts.map +1 -1
  278. package/lib/typescript/src/components/ui/NavBar/types.d.ts +8 -8
  279. package/lib/typescript/src/components/ui/NavBar/types.d.ts.map +1 -1
  280. package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts +6 -14
  281. package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts.map +1 -1
  282. package/lib/typescript/src/components/ui/PasswordInput/types.d.ts +4 -14
  283. package/lib/typescript/src/components/ui/PasswordInput/types.d.ts.map +1 -1
  284. package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts +1 -1
  285. package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts.map +1 -1
  286. package/lib/typescript/src/components/ui/Pulse/normalizePulseOptions.d.ts +32 -0
  287. package/lib/typescript/src/components/ui/Pulse/normalizePulseOptions.d.ts.map +1 -0
  288. package/lib/typescript/src/components/ui/Pulse/usePulse.d.ts +10 -5
  289. package/lib/typescript/src/components/ui/Pulse/usePulse.d.ts.map +1 -1
  290. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.d.ts +11 -0
  291. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.d.ts.map +1 -0
  292. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.web.d.ts +18 -0
  293. package/lib/typescript/src/components/ui/Pulse/usePulseDriver.web.d.ts.map +1 -0
  294. package/lib/typescript/src/components/ui/Radio/Radio.d.ts +1 -1
  295. package/lib/typescript/src/components/ui/Radio/Radio.d.ts.map +1 -1
  296. package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts +2 -2
  297. package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts.map +1 -1
  298. package/lib/typescript/src/components/ui/Radio/types.d.ts +14 -3
  299. package/lib/typescript/src/components/ui/Radio/types.d.ts.map +1 -1
  300. package/lib/typescript/src/components/ui/Reveal/Reveal.d.ts.map +1 -1
  301. package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts +2 -8
  302. package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts.map +1 -1
  303. package/lib/typescript/src/components/ui/Reveal/types.d.ts +1 -1
  304. package/lib/typescript/src/components/ui/Reveal/types.d.ts.map +1 -1
  305. package/lib/typescript/src/components/ui/Reveal/webTransition.d.ts +38 -0
  306. package/lib/typescript/src/components/ui/Reveal/webTransition.d.ts.map +1 -0
  307. package/lib/typescript/src/components/ui/Search/Search.d.ts +4 -214
  308. package/lib/typescript/src/components/ui/Search/Search.d.ts.map +1 -1
  309. package/lib/typescript/src/components/ui/Search/types.d.ts +13 -6
  310. package/lib/typescript/src/components/ui/Search/types.d.ts.map +1 -1
  311. package/lib/typescript/src/components/ui/Segmented/Segmented.d.ts.map +1 -1
  312. package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts +3 -3
  313. package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts.map +1 -1
  314. package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts +1 -1
  315. package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts.map +1 -1
  316. package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts +1 -1
  317. package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts.map +1 -1
  318. package/lib/typescript/src/components/ui/Spinner/shared.d.ts +5 -0
  319. package/lib/typescript/src/components/ui/Spinner/shared.d.ts.map +1 -1
  320. package/lib/typescript/src/components/ui/Spinner/types.d.ts +1 -1
  321. package/lib/typescript/src/components/ui/Spinner/types.d.ts.map +1 -1
  322. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts +3 -3
  323. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts.map +1 -1
  324. package/lib/typescript/src/components/ui/Stepper/StepperPressable.d.ts +2 -0
  325. package/lib/typescript/src/components/ui/Stepper/StepperPressable.d.ts.map +1 -0
  326. package/lib/typescript/src/components/ui/Stepper/StepperPressable.web.d.ts +2 -0
  327. package/lib/typescript/src/components/ui/Stepper/StepperPressable.web.d.ts.map +1 -0
  328. package/lib/typescript/src/components/ui/Stepper/accessibility.d.ts +3 -0
  329. package/lib/typescript/src/components/ui/Stepper/accessibility.d.ts.map +1 -0
  330. package/lib/typescript/src/components/ui/Stepper/accessibility.types.d.ts +23 -0
  331. package/lib/typescript/src/components/ui/Stepper/accessibility.types.d.ts.map +1 -0
  332. package/lib/typescript/src/components/ui/Stepper/accessibility.web.d.ts +9 -0
  333. package/lib/typescript/src/components/ui/Stepper/accessibility.web.d.ts.map +1 -0
  334. package/lib/typescript/src/components/ui/Stepper/layout.d.ts +22 -0
  335. package/lib/typescript/src/components/ui/Stepper/layout.d.ts.map +1 -0
  336. package/lib/typescript/src/components/ui/Stepper/normalizeStepper.d.ts +31 -0
  337. package/lib/typescript/src/components/ui/Stepper/normalizeStepper.d.ts.map +1 -0
  338. package/lib/typescript/src/components/ui/Stepper/styles.d.ts +9 -2
  339. package/lib/typescript/src/components/ui/Stepper/styles.d.ts.map +1 -1
  340. package/lib/typescript/src/components/ui/Stepper/types.d.ts +3 -1
  341. package/lib/typescript/src/components/ui/Stepper/types.d.ts.map +1 -1
  342. package/lib/typescript/src/components/ui/Switch/Switch.d.ts.map +1 -1
  343. package/lib/typescript/src/components/ui/Switch/Switch.web.d.ts.map +1 -1
  344. package/lib/typescript/src/components/ui/Switch/styles.d.ts +9 -3
  345. package/lib/typescript/src/components/ui/Switch/styles.d.ts.map +1 -1
  346. package/lib/typescript/src/components/ui/Switch/types.d.ts +2 -2
  347. package/lib/typescript/src/components/ui/Switch/types.d.ts.map +1 -1
  348. package/lib/typescript/src/components/ui/Tag/Tag.d.ts.map +1 -1
  349. package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts +4 -401
  350. package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts.map +1 -1
  351. package/lib/typescript/src/components/ui/TextField/TextFieldSlot.d.ts +13 -0
  352. package/lib/typescript/src/components/ui/TextField/TextFieldSlot.d.ts.map +1 -0
  353. package/lib/typescript/src/components/ui/TextField/normalize.d.ts +51 -0
  354. package/lib/typescript/src/components/ui/TextField/normalize.d.ts.map +1 -0
  355. package/lib/typescript/src/components/ui/TextField/styles.d.ts +30 -0
  356. package/lib/typescript/src/components/ui/TextField/styles.d.ts.map +1 -1
  357. package/lib/typescript/src/components/ui/TextField/types.d.ts +92 -18
  358. package/lib/typescript/src/components/ui/TextField/types.d.ts.map +1 -1
  359. package/lib/typescript/src/components/ui/TextField/useErrorAnnouncement.d.ts +3 -0
  360. package/lib/typescript/src/components/ui/TextField/useErrorAnnouncement.d.ts.map +1 -0
  361. package/lib/typescript/src/components/ui/TextField/useTextFieldValue.d.ts +18 -0
  362. package/lib/typescript/src/components/ui/TextField/useTextFieldValue.d.ts.map +1 -0
  363. package/lib/typescript/src/components/ui/TextField/valueState.d.ts +50 -0
  364. package/lib/typescript/src/components/ui/TextField/valueState.d.ts.map +1 -0
  365. package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts +4 -382
  366. package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts.map +1 -1
  367. package/lib/typescript/src/components/ui/Textarea/index.d.ts +1 -0
  368. package/lib/typescript/src/components/ui/Textarea/index.d.ts.map +1 -1
  369. package/lib/typescript/src/components/ui/Textarea/types.d.ts +3 -14
  370. package/lib/typescript/src/components/ui/Textarea/types.d.ts.map +1 -1
  371. package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts +5 -12
  372. package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts.map +1 -1
  373. package/lib/typescript/src/components/ui/Thumbnail/index.d.ts +1 -1
  374. package/lib/typescript/src/components/ui/Thumbnail/index.d.ts.map +1 -1
  375. package/lib/typescript/src/components/ui/Thumbnail/normalize.d.ts +13 -0
  376. package/lib/typescript/src/components/ui/Thumbnail/normalize.d.ts.map +1 -0
  377. package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts +4 -8
  378. package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts.map +1 -1
  379. package/lib/typescript/src/components/ui/Thumbnail/types.d.ts +21 -13
  380. package/lib/typescript/src/components/ui/Thumbnail/types.d.ts.map +1 -1
  381. package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts +6 -2
  382. package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts.map +1 -1
  383. package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts +6 -3
  384. package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts.map +1 -1
  385. package/lib/typescript/src/components/ui/Toast/store.d.ts +39 -0
  386. package/lib/typescript/src/components/ui/Toast/store.d.ts.map +1 -0
  387. package/lib/typescript/src/components/ui/Toast/toast.d.ts +7 -2
  388. package/lib/typescript/src/components/ui/Toast/toast.d.ts.map +1 -1
  389. package/lib/typescript/src/components/ui/Toast/types.d.ts +5 -3
  390. package/lib/typescript/src/components/ui/Toast/types.d.ts.map +1 -1
  391. package/lib/typescript/src/components/ui/index.d.ts +4 -4
  392. package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
  393. package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts +13 -0
  394. package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts.map +1 -0
  395. package/lib/typescript/src/components/ui/shared/a11y.d.ts +19 -0
  396. package/lib/typescript/src/components/ui/shared/a11y.d.ts.map +1 -0
  397. package/lib/typescript/src/components/ui/shared/accessibilityName.d.ts +3 -0
  398. package/lib/typescript/src/components/ui/shared/accessibilityName.d.ts.map +1 -0
  399. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.d.ts +3 -0
  400. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.d.ts.map +1 -0
  401. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts +4 -0
  402. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts.map +1 -0
  403. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.web.d.ts +3 -0
  404. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.web.d.ts.map +1 -0
  405. package/lib/typescript/src/theme/ThemeProvider.d.ts +2 -3
  406. package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
  407. package/lib/typescript/src/theme/fontScale.d.ts +4 -0
  408. package/lib/typescript/src/theme/fontScale.d.ts.map +1 -0
  409. package/lib/typescript/src/theme/index.d.ts +2 -1
  410. package/lib/typescript/src/theme/index.d.ts.map +1 -1
  411. package/lib/typescript/src/theme/themeContext.d.ts +6 -0
  412. package/lib/typescript/src/theme/themeContext.d.ts.map +1 -0
  413. package/lib/typescript/src/theme/themeDiagnostics.d.ts +6 -0
  414. package/lib/typescript/src/theme/themeDiagnostics.d.ts.map +1 -0
  415. package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts +8 -3
  416. package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts.map +1 -1
  417. package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts +5 -2
  418. package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts.map +1 -1
  419. package/lib/typescript/src/theme/useTheme.d.ts +1 -1
  420. package/lib/typescript/src/theme/useTheme.d.ts.map +1 -1
  421. package/lib/typescript/src/theme/useThemedStyles.d.ts +1 -1
  422. package/lib/typescript/src/theme/useThemedStyles.d.ts.map +1 -1
  423. package/lib/typescript/src/utils/imageSource.d.ts +20 -0
  424. package/lib/typescript/src/utils/imageSource.d.ts.map +1 -0
  425. package/lib/typescript/type-tests/public-api.d.ts +2 -0
  426. package/lib/typescript/type-tests/public-api.d.ts.map +1 -0
  427. package/lib/typescript/website/src/components/iconCatalogCategories.d.ts +11 -0
  428. package/lib/typescript/website/src/components/iconCatalogCategories.d.ts.map +1 -0
  429. package/package.json +30 -14
  430. package/src/components/business/AvatarWithRing/AvatarWithRing.tsx +11 -4
  431. package/src/components/business/AvatarWithRing/styles.ts +11 -9
  432. package/src/components/business/VersionPill/VersionPill.tsx +31 -25
  433. package/src/components/business/VersionPill/content.ts +47 -0
  434. package/src/components/business/VersionPill/index.ts +1 -1
  435. package/src/components/business/VersionPill/styles.ts +4 -0
  436. package/src/components/business/VersionPill/types.ts +7 -2
  437. package/src/components/business/index.ts +1 -1
  438. package/src/components/business/useSvgId.ts +29 -8
  439. package/src/components/ui/Avatar/Avatar.tsx +25 -34
  440. package/src/components/ui/Avatar/types.ts +6 -2
  441. package/src/components/ui/Button/Button.tsx +39 -20
  442. package/src/components/ui/Button/ButtonBase.tsx +21 -12
  443. package/src/components/ui/Button/types.ts +5 -3
  444. package/src/components/ui/Carousel/Carousel.tsx +102 -40
  445. package/src/components/ui/Carousel/behavior.ts +78 -0
  446. package/src/components/ui/Carousel/styles.ts +5 -7
  447. package/src/components/ui/Carousel/types.ts +18 -6
  448. package/src/components/ui/Cell/Cell.tsx +85 -74
  449. package/src/components/ui/Cell/Leading.tsx +14 -14
  450. package/src/components/ui/Cell/content.ts +53 -0
  451. package/src/components/ui/Cell/index.ts +7 -1
  452. package/src/components/ui/Cell/types.ts +64 -30
  453. package/src/components/ui/Checkbox/Checkbox.tsx +35 -8
  454. package/src/components/ui/Checkbox/types.ts +15 -3
  455. package/src/components/ui/Confirm/ConfirmHost.tsx +51 -26
  456. package/src/components/ui/Confirm/confirm.ts +17 -34
  457. package/src/components/ui/Confirm/labels.ts +14 -0
  458. package/src/components/ui/Confirm/store.ts +147 -0
  459. package/src/components/ui/Confirm/styles.ts +4 -0
  460. package/src/components/ui/Confirm/types.ts +2 -10
  461. package/src/components/ui/DrawerHeader/DrawerHeader.tsx +22 -27
  462. package/src/components/ui/DrawerHeader/types.ts +7 -1
  463. package/src/components/ui/Grid/Grid.tsx +44 -12
  464. package/src/components/ui/Grid/accessibility.ts +21 -0
  465. package/src/components/ui/Grid/types.ts +2 -0
  466. package/src/components/ui/IconButton/IconButton.tsx +20 -3
  467. package/src/components/ui/IconButton/types.ts +4 -2
  468. package/src/components/ui/Input/Input.tsx +16 -6
  469. package/src/components/ui/Input/index.ts +5 -0
  470. package/src/components/ui/Input/types.ts +12 -23
  471. package/src/components/ui/Logo/Logo.tsx +27 -4
  472. package/src/components/ui/Logo/types.ts +2 -2
  473. package/src/components/ui/NavBar/NavBar.tsx +27 -19
  474. package/src/components/ui/NavBar/index.ts +1 -1
  475. package/src/components/ui/NavBar/isSlot.ts +372 -5
  476. package/src/components/ui/NavBar/types.ts +9 -8
  477. package/src/components/ui/PasswordInput/PasswordInput.tsx +67 -69
  478. package/src/components/ui/PasswordInput/types.ts +12 -14
  479. package/src/components/ui/Pulse/PulseDot.tsx +5 -4
  480. package/src/components/ui/Pulse/normalizePulseOptions.ts +76 -0
  481. package/src/components/ui/Pulse/usePulse.ts +80 -34
  482. package/src/components/ui/Pulse/usePulseDriver.ts +49 -0
  483. package/src/components/ui/Pulse/usePulseDriver.web.ts +66 -0
  484. package/src/components/ui/Radio/Radio.tsx +44 -15
  485. package/src/components/ui/Radio/RadioGroup.tsx +21 -3
  486. package/src/components/ui/Radio/types.ts +17 -3
  487. package/src/components/ui/Reveal/Reveal.tsx +5 -3
  488. package/src/components/ui/Reveal/Reveal.web.tsx +72 -29
  489. package/src/components/ui/Reveal/types.ts +1 -1
  490. package/src/components/ui/Reveal/webTransition.ts +206 -0
  491. package/src/components/ui/Search/Search.tsx +127 -58
  492. package/src/components/ui/Search/types.ts +30 -9
  493. package/src/components/ui/Segmented/Segmented.tsx +10 -2
  494. package/src/components/ui/Skeleton/Skeleton.tsx +9 -5
  495. package/src/components/ui/Spinner/Spinner.tsx +25 -17
  496. package/src/components/ui/Spinner/Spinner.web.tsx +23 -18
  497. package/src/components/ui/Spinner/shared.ts +7 -0
  498. package/src/components/ui/Spinner/types.ts +1 -1
  499. package/src/components/ui/Stepper/Stepper.tsx +166 -86
  500. package/src/components/ui/Stepper/StepperPressable.tsx +1 -0
  501. package/src/components/ui/Stepper/StepperPressable.web.tsx +1 -0
  502. package/src/components/ui/Stepper/accessibility.ts +32 -0
  503. package/src/components/ui/Stepper/accessibility.types.ts +22 -0
  504. package/src/components/ui/Stepper/accessibility.web.ts +65 -0
  505. package/src/components/ui/Stepper/layout.ts +44 -0
  506. package/src/components/ui/Stepper/normalizeStepper.ts +85 -0
  507. package/src/components/ui/Stepper/styles.ts +9 -2
  508. package/src/components/ui/Stepper/types.ts +3 -1
  509. package/src/components/ui/Switch/Switch.tsx +54 -15
  510. package/src/components/ui/Switch/Switch.web.tsx +57 -19
  511. package/src/components/ui/Switch/styles.ts +11 -4
  512. package/src/components/ui/Switch/types.ts +2 -2
  513. package/src/components/ui/Tag/Tag.tsx +6 -2
  514. package/src/components/ui/TextField/TextFieldBase.tsx +175 -70
  515. package/src/components/ui/TextField/TextFieldSlot.tsx +91 -0
  516. package/src/components/ui/TextField/normalize.ts +280 -0
  517. package/src/components/ui/TextField/styles.ts +31 -0
  518. package/src/components/ui/TextField/types.ts +118 -22
  519. package/src/components/ui/TextField/useErrorAnnouncement.ts +27 -0
  520. package/src/components/ui/TextField/useTextFieldValue.ts +94 -0
  521. package/src/components/ui/TextField/valueState.ts +125 -0
  522. package/src/components/ui/Textarea/Textarea.tsx +11 -4
  523. package/src/components/ui/Textarea/index.ts +5 -0
  524. package/src/components/ui/Textarea/types.ts +14 -22
  525. package/src/components/ui/Thumbnail/Thumbnail.tsx +86 -51
  526. package/src/components/ui/Thumbnail/index.ts +5 -1
  527. package/src/components/ui/Thumbnail/normalize.ts +78 -0
  528. package/src/components/ui/Thumbnail/styles.ts +5 -10
  529. package/src/components/ui/Thumbnail/types.ts +43 -13
  530. package/src/components/ui/Toast/ToastHost.tsx +81 -22
  531. package/src/components/ui/Toast/ToastHost.web.tsx +91 -29
  532. package/src/components/ui/Toast/store.ts +148 -0
  533. package/src/components/ui/Toast/toast.ts +19 -10
  534. package/src/components/ui/Toast/types.ts +7 -3
  535. package/src/components/ui/index.ts +19 -4
  536. package/src/components/ui/shared/ImageAttempt.tsx +30 -0
  537. package/src/components/ui/shared/a11y.ts +18 -0
  538. package/src/components/ui/shared/accessibilityName.ts +6 -0
  539. package/src/components/ui/shared/selectImageAttemptSource.shared.ts +17 -0
  540. package/src/components/ui/shared/selectImageAttemptSource.ts +3 -0
  541. package/src/components/ui/shared/selectImageAttemptSource.web.ts +3 -0
  542. package/src/icons/data.ts +1 -1
  543. package/src/theme/ThemeProvider.tsx +18 -7
  544. package/src/theme/fontScale.ts +15 -0
  545. package/src/theme/index.ts +2 -3
  546. package/src/theme/themeContext.ts +24 -0
  547. package/src/theme/themeDiagnostics.ts +41 -0
  548. package/src/theme/usePrefersReducedMotion.ts +11 -4
  549. package/src/theme/usePrefersReducedMotion.web.ts +5 -2
  550. package/src/theme/useTheme.ts +19 -27
  551. package/src/theme/useThemedStyles.ts +12 -7
  552. package/src/utils/imageSource.ts +303 -0
  553. package/lib/module/components/ui/PasswordInput/styles.js +0 -12
  554. package/lib/module/components/ui/PasswordInput/styles.js.map +0 -1
  555. package/lib/module/components/ui/Pulse/usePulse.web.js +0 -76
  556. package/lib/module/components/ui/Pulse/usePulse.web.js.map +0 -1
  557. package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts +0 -7
  558. package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts.map +0 -1
  559. package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts +0 -21
  560. package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts.map +0 -1
  561. package/src/components/ui/PasswordInput/styles.ts +0 -7
  562. package/src/components/ui/Pulse/usePulse.web.ts +0 -74
@@ -1,38 +1,35 @@
1
- import React from 'react';
1
+ import React, { useEffect, useRef } from 'react';
2
2
  import { Text, View } from 'react-native';
3
3
  import { useColors, useThemedStyles } from '../../../theme';
4
+ import { createLogger } from '../../../utils/logger';
4
5
  import { IconButton } from '../IconButton';
5
- import { isSlot } from './isSlot';
6
+ import { classifyNavBarSlot, type NavBarSlotClassification } from './isSlot';
6
7
  import { makeStyles } from './styles';
7
- import type { NavBarProps, NavBarSlotConfig } from './types';
8
+ import type { NavBarAction, NavBarProps } from './types';
8
9
 
9
- /** NavBarSlotConfig IconButton(variant='ghost' + 外部 tint)。 */
10
- function renderSlot(slot: NavBarSlotConfig, tint: string) {
11
- // [L-50] accessibilityLabel dev 告警 —— 回退读英文 icon 名(如 "menu")体验不佳。
12
- if (!slot.accessibilityLabel && typeof __DEV__ !== 'undefined' && __DEV__) {
13
- console.warn(
14
- `NavBar slot(icon="${slot.icon}")未传 accessibilityLabel,SR 将读出 icon 名,请传人类可读短语。`
15
- );
16
- }
10
+ const log = createLogger('NavBar');
11
+
12
+ /** NavBarAction IconButton(variant='ghost' + 外部 tint)。 */
13
+ function renderSlot(slot: NavBarAction, tint: string) {
17
14
  return (
18
15
  <IconButton
19
16
  icon={slot.icon}
20
17
  onPress={slot.onPress}
21
18
  variant="ghost"
22
19
  color={tint}
23
- accessibilityLabel={slot.accessibilityLabel ?? slot.icon}
20
+ accessibilityLabel={slot.accessibilityLabel}
24
21
  />
25
22
  );
26
23
  }
27
24
 
28
- /** left / right slot:NavBarSlotConfig → IconButton,ReactNode → 原样。 */
25
+ /** left / right slot:NavBarAction → IconButton,已归一化 display node → 原样。 */
29
26
  function resolveSlot(
30
- slot: NavBarProps['left'] | NavBarProps['right'],
27
+ slot: NavBarSlotClassification,
31
28
  tint: string
32
29
  ): React.ReactNode {
33
- if (!slot) return null;
34
- if (isSlot(slot)) return renderSlot(slot, tint);
35
- return slot;
30
+ if (slot.kind === 'action') return renderSlot(slot.action, tint);
31
+ if (slot.kind === 'node') return slot.node;
32
+ return null;
36
33
  }
37
34
 
38
35
  /**
@@ -55,6 +52,17 @@ export function NavBar({
55
52
  const styles = useThemedStyles(makeStyles);
56
53
  const isBrand = variant === 'brand';
57
54
  const isTransparent = variant === 'transparent';
55
+ const leftSlot = classifyNavBarSlot(left);
56
+ const rightSlot = classifyNavBarSlot(right);
57
+ const warnedInvalidSlot = useRef(false);
58
+ const hasInvalidSlot =
59
+ leftSlot.kind === 'invalid' || rightSlot.kind === 'invalid';
60
+ useEffect(() => {
61
+ if (hasInvalidSlot && !warnedInvalidSlot.current) {
62
+ warnedInvalidSlot.current = true;
63
+ log.warn('忽略无效的 NavBar action;请传 NavBarAction 或 ReactNode');
64
+ }
65
+ }, [hasInvalidSlot]);
58
66
  // brand 实底白字;default + transparent 都走深字(transparent 用在浅色
59
67
  // hero 渐变之上,白字看不清)。后续若有"相机 / 地图"等深色浮层场景需要
60
68
  // 白字 transparent navbar,再加 'transparentLight' variant。
@@ -70,7 +78,7 @@ export function NavBar({
70
78
  ]}
71
79
  testID={testID}
72
80
  >
73
- <View style={styles.side}>{resolveSlot(left, tint)}</View>
81
+ <View style={styles.side}>{resolveSlot(leftSlot, tint)}</View>
74
82
  <View style={styles.center}>
75
83
  <Text style={[styles.title, { color: tint }]} numberOfLines={1}>
76
84
  {title}
@@ -82,7 +90,7 @@ export function NavBar({
82
90
  ) : null}
83
91
  </View>
84
92
  <View style={[styles.side, styles.sideRight]}>
85
- {resolveSlot(right, tint)}
93
+ {resolveSlot(rightSlot, tint)}
86
94
  </View>
87
95
  </View>
88
96
  );
@@ -1,2 +1,2 @@
1
1
  export { NavBar } from './NavBar';
2
- export type { NavBarProps, NavBarSlotConfig } from './types';
2
+ export type { NavBarAction, NavBarProps, NavBarSlot } from './types';
@@ -1,9 +1,376 @@
1
- import type { NavBarSlotConfig } from './types';
1
+ import React, { type ReactNode } from 'react';
2
+ import { Text } from 'react-native';
3
+ import { ICONS, type IconName } from '../../../icons';
4
+ import type { NavBarAction } from './types';
5
+
6
+ export type NavBarSlotClassification =
7
+ | { kind: 'empty' }
8
+ | { kind: 'action'; action: NavBarAction }
9
+ | { kind: 'node'; node: ReactNode }
10
+ | { kind: 'invalid' };
11
+
12
+ type NormalizedNode = { kind: 'node'; node: ReactNode } | { kind: 'invalid' };
13
+
14
+ type IteratorFactoryResult =
15
+ | { kind: 'none' }
16
+ | { kind: 'factory'; factory: () => unknown }
17
+ | { kind: 'invalid' };
18
+
19
+ type ThenableResolutionRecord = {
20
+ node: ReactNode;
21
+ dependencies: Set<ThenableResolutionRecord>;
22
+ };
23
+
24
+ const mappedThenables = new WeakMap<object, ThenableResolutionRecord>();
25
+
26
+ function isIconName(value: unknown): value is IconName {
27
+ return (
28
+ typeof value === 'string' &&
29
+ Object.prototype.hasOwnProperty.call(ICONS, value)
30
+ );
31
+ }
32
+
33
+ /**
34
+ * Type guard:action 的 icon 必须真实存在于生成的 registry,且有 handler 与非空名称。
35
+ */
36
+ export function isNavBarAction(v: unknown): v is NavBarAction {
37
+ if (typeof v !== 'object' || v === null) return false;
38
+ const slot = v as Record<string, unknown>;
39
+ return (
40
+ isIconName(slot.icon) &&
41
+ typeof slot.onPress === 'function' &&
42
+ typeof slot.accessibilityLabel === 'string' &&
43
+ slot.accessibilityLabel.trim().length > 0
44
+ );
45
+ }
46
+
47
+ function hasElementShape(value: React.ReactElement): boolean {
48
+ const element = value as unknown as { type: unknown; props: unknown };
49
+ return (
50
+ Object.prototype.hasOwnProperty.call(value, 'type') &&
51
+ Object.prototype.hasOwnProperty.call(value, 'props') &&
52
+ element.type !== null &&
53
+ element.type !== undefined &&
54
+ typeof element.props === 'object' &&
55
+ element.props !== null
56
+ );
57
+ }
58
+
59
+ function isThenable(value: unknown): value is ReactNode {
60
+ if (typeof value !== 'object' || value === null) {
61
+ return false;
62
+ }
63
+ try {
64
+ return typeof (value as { then?: unknown }).then === 'function';
65
+ } catch {
66
+ return false;
67
+ }
68
+ }
69
+
70
+ function normalizeFragment(
71
+ value: React.ReactElement,
72
+ activeIterables: WeakSet<object>,
73
+ path: string,
74
+ owner?: ThenableResolutionRecord
75
+ ): NormalizedNode {
76
+ try {
77
+ const props = value.props as { children?: unknown };
78
+ const normalized = normalizeReactNode(
79
+ props.children,
80
+ activeIterables,
81
+ `${path}.fragment`,
82
+ owner
83
+ );
84
+ if (normalized.kind === 'invalid') return normalized;
85
+ return {
86
+ kind: 'node',
87
+ node: React.cloneElement(value, undefined, normalized.node),
88
+ };
89
+ } catch {
90
+ return { kind: 'invalid' };
91
+ }
92
+ }
93
+
94
+ function recordReaches(
95
+ from: ThenableResolutionRecord,
96
+ target: ThenableResolutionRecord,
97
+ visited = new Set<ThenableResolutionRecord>()
98
+ ): boolean {
99
+ if (from === target) return true;
100
+ if (visited.has(from)) return false;
101
+ visited.add(from);
102
+ for (const dependency of from.dependencies) {
103
+ if (recordReaches(dependency, target, visited)) return true;
104
+ }
105
+ return false;
106
+ }
107
+
108
+ function addThenableDependency(
109
+ owner: ThenableResolutionRecord,
110
+ dependency: ThenableResolutionRecord
111
+ ): boolean {
112
+ // dependency 已能走回 owner 时再加边会闭环;不加边并让当前 resolution 失败关闭。
113
+ if (recordReaches(dependency, owner)) return false;
114
+ owner.dependencies.add(dependency);
115
+ return true;
116
+ }
117
+
118
+ function createThenableRecord(
119
+ value: object,
120
+ path: string
121
+ ): ThenableResolutionRecord {
122
+ let resolveMapped: (node: unknown) => void = () => {};
123
+ let rejectMapped: (reason?: unknown) => void = () => {};
124
+ const mappedPromise = new Promise<unknown>((resolve, reject) => {
125
+ resolveMapped = resolve;
126
+ rejectMapped = reject;
127
+ });
128
+ const mappedNode = mappedPromise as ReactNode;
129
+ const record: ThenableResolutionRecord = {
130
+ node: mappedNode,
131
+ dependencies: new Set(),
132
+ };
133
+ // 先入 cache 再调用用户 then:同步 thenable 可复用同一 record,并由依赖图识别闭环。
134
+ mappedThenables.set(value, record);
135
+
136
+ let claimed = false;
137
+ const resolveOnce = (resolved: unknown) => {
138
+ if (claimed) return;
139
+ claimed = true;
140
+ if (resolved === value || resolved === mappedPromise) {
141
+ resolveMapped(null);
142
+ return;
143
+ }
144
+ try {
145
+ const normalized = normalizeReactNode(
146
+ resolved,
147
+ new WeakSet<object>(),
148
+ `${path}.then`,
149
+ record
150
+ );
151
+ resolveMapped(normalized.kind === 'invalid' ? null : normalized.node);
152
+ } catch {
153
+ resolveMapped(null);
154
+ }
155
+ };
156
+ const rejectOnce = (reason: unknown) => {
157
+ if (claimed) return;
158
+ claimed = true;
159
+ rejectMapped(reason);
160
+ };
161
+
162
+ try {
163
+ const then = (value as { then?: unknown }).then;
164
+ if (typeof then !== 'function') {
165
+ resolveOnce(null);
166
+ return record;
167
+ }
168
+ then.call(value, resolveOnce, rejectOnce);
169
+ } catch (error) {
170
+ rejectOnce(error);
171
+ }
172
+
173
+ return record;
174
+ }
175
+
176
+ function normalizeThenable(
177
+ value: object,
178
+ path: string,
179
+ owner?: ThenableResolutionRecord
180
+ ): NormalizedNode {
181
+ const record =
182
+ mappedThenables.get(value) ?? createThenableRecord(value, path);
183
+ if (owner !== undefined && !addThenableDependency(owner, record)) {
184
+ return { kind: 'invalid' };
185
+ }
186
+ return { kind: 'node', node: record.node };
187
+ }
188
+
189
+ function getIteratorFactory(value: object): IteratorFactoryResult {
190
+ try {
191
+ const iterator = (value as { [Symbol.iterator]?: unknown })[
192
+ Symbol.iterator
193
+ ];
194
+ if (iterator === undefined || iterator === null) return { kind: 'none' };
195
+ if (typeof iterator !== 'function') return { kind: 'none' };
196
+ return { kind: 'factory', factory: iterator as () => unknown };
197
+ } catch {
198
+ return { kind: 'invalid' };
199
+ }
200
+ }
201
+
202
+ function isReactPortal(value: object): value is React.ReactPortal {
203
+ const portal = value as {
204
+ key?: unknown;
205
+ containerInfo?: unknown;
206
+ };
207
+ const hasPortalShape =
208
+ Object.prototype.hasOwnProperty.call(value, 'key') &&
209
+ Object.prototype.hasOwnProperty.call(value, 'children') &&
210
+ Object.prototype.hasOwnProperty.call(value, 'containerInfo') &&
211
+ Object.prototype.hasOwnProperty.call(value, 'implementation') &&
212
+ (portal.key === null || typeof portal.key === 'string') &&
213
+ portal.containerInfo !== null &&
214
+ portal.containerInfo !== undefined;
215
+ if (!hasPortalShape) return false;
216
+ try {
217
+ // React 没有公开 portal guard;只调用公开 Children API,且该分支已排除 iterable/
218
+ // thenable,避免消费 generator 或改变 Promise 语义。
219
+ return React.Children.count(value as ReactNode) === 1;
220
+ } catch {
221
+ return false;
222
+ }
223
+ }
224
+
225
+ function normalizeArray(
226
+ value: unknown[],
227
+ activeIterables: WeakSet<object>,
228
+ path: string,
229
+ owner?: ThenableResolutionRecord
230
+ ): NormalizedNode {
231
+ if (activeIterables.has(value)) return { kind: 'invalid' };
232
+ activeIterables.add(value);
233
+ try {
234
+ const nodes: ReactNode[] = [];
235
+ for (let index = 0; index < value.length; index += 1) {
236
+ const normalized = normalizeReactNode(
237
+ value[index],
238
+ activeIterables,
239
+ `${path}.${index}`,
240
+ owner
241
+ );
242
+ if (normalized.kind === 'invalid') return normalized;
243
+ nodes.push(normalized.node);
244
+ }
245
+ return { kind: 'node', node: nodes };
246
+ } catch {
247
+ return { kind: 'invalid' };
248
+ } finally {
249
+ activeIterables.delete(value);
250
+ }
251
+ }
252
+
253
+ function normalizeIterable(
254
+ value: object,
255
+ factory: () => unknown,
256
+ activeIterables: WeakSet<object>,
257
+ path: string,
258
+ owner?: ThenableResolutionRecord
259
+ ): NormalizedNode {
260
+ if (activeIterables.has(value)) return { kind: 'invalid' };
261
+ activeIterables.add(value);
262
+ let iterator: object | undefined;
263
+ let completed = false;
264
+ try {
265
+ const candidate = factory.call(value);
266
+ if (typeof candidate !== 'object' || candidate === null) {
267
+ return { kind: 'invalid' };
268
+ }
269
+ iterator = candidate;
270
+ const next = (iterator as { next?: unknown }).next;
271
+ if (typeof next !== 'function') return { kind: 'invalid' };
272
+
273
+ const nodes: ReactNode[] = [];
274
+ let index = 0;
275
+ for (;;) {
276
+ const step = next.call(iterator);
277
+ if (typeof step !== 'object' || step === null) {
278
+ return { kind: 'invalid' };
279
+ }
280
+ const result = step as { done?: unknown; value?: unknown };
281
+ // Iterator protocol 的 done 走 ToBoolean,而不是限制为 boolean primitive。
282
+ if (result.done) {
283
+ completed = true;
284
+ return { kind: 'node', node: nodes };
285
+ }
286
+
287
+ const normalized = normalizeReactNode(
288
+ result.value,
289
+ activeIterables,
290
+ `${path}.${index}`,
291
+ owner
292
+ );
293
+ if (normalized.kind === 'invalid') return normalized;
294
+ nodes.push(normalized.node);
295
+ index += 1;
296
+ }
297
+ } catch {
298
+ return { kind: 'invalid' };
299
+ } finally {
300
+ if (!completed && iterator !== undefined) {
301
+ try {
302
+ const close = (iterator as { return?: unknown }).return;
303
+ if (typeof close === 'function') close.call(iterator);
304
+ } catch {
305
+ // 分类已失败;关闭时的异常不能逃逸到 NavBar render。
306
+ }
307
+ }
308
+ activeIterables.delete(value);
309
+ }
310
+ }
311
+
312
+ function normalizeReactNode(
313
+ value: unknown,
314
+ activeIterables: WeakSet<object>,
315
+ path: string,
316
+ owner?: ThenableResolutionRecord
317
+ ): NormalizedNode {
318
+ if (
319
+ typeof value === 'string' ||
320
+ typeof value === 'number' ||
321
+ typeof value === 'bigint'
322
+ ) {
323
+ return {
324
+ kind: 'node',
325
+ node: React.createElement(Text, { key: path }, String(value)),
326
+ };
327
+ }
328
+ if (value === undefined || value === null || typeof value === 'boolean') {
329
+ return { kind: 'node', node: value };
330
+ }
331
+ if (React.isValidElement(value)) {
332
+ if (!hasElementShape(value)) return { kind: 'invalid' };
333
+ return value.type === React.Fragment
334
+ ? normalizeFragment(value, activeIterables, path, owner)
335
+ : { kind: 'node', node: value };
336
+ }
337
+ if (typeof value !== 'object' || value === null) {
338
+ return { kind: 'invalid' };
339
+ }
340
+ if (Array.isArray(value)) {
341
+ return normalizeArray(value, activeIterables, path, owner);
342
+ }
343
+
344
+ const iterator = getIteratorFactory(value);
345
+ if (iterator.kind === 'invalid') return iterator;
346
+ if (iterator.kind === 'factory') {
347
+ return normalizeIterable(
348
+ value,
349
+ iterator.factory,
350
+ activeIterables,
351
+ path,
352
+ owner
353
+ );
354
+ }
355
+ if (isThenable(value)) return normalizeThenable(value, path, owner);
356
+ if (typeof value !== 'object') return { kind: 'invalid' };
357
+ return isReactPortal(value)
358
+ ? { kind: 'node', node: value }
359
+ : { kind: 'invalid' };
360
+ }
2
361
 
3
362
  /**
4
- * Type guard:判断 left/right 是否为 NavBarSlotConfig 对象(含 icon 字段)。
5
- * 不是的话视为 ReactNode 自定义内容。
363
+ * 未类型化边界的单一分类器。React 的公开 API 无法证明 object 不可伪造;这里拒绝
364
+ * 结构不成立的 marker-only element 与普通 plain object,同时保留 React 19 声明的
365
+ * bigint、Iterable、portal、Promise/thenable 等合法 ReactNode。Fragment/Iterable
366
+ * 会递归验证 primitive 叶子;thenable 映射按源对象缓存,避免每次 render 制造新的
367
+ * suspend identity;resolution record 的依赖可达性同时拦截 direct/indirect cycle,
368
+ * 并把 cycle 或非法 resolved value 确定性失败关闭为 null。
6
369
  */
7
- export function isSlot(v: unknown): v is NavBarSlotConfig {
8
- return typeof v === 'object' && v !== null && 'icon' in v;
370
+ export function classifyNavBarSlot(value: unknown): NavBarSlotClassification {
371
+ if (value === undefined || value === null || typeof value === 'boolean') {
372
+ return { kind: 'empty' };
373
+ }
374
+ if (isNavBarAction(value)) return { kind: 'action', action: value };
375
+ return normalizeReactNode(value, new WeakSet<object>(), 'slot');
9
376
  }
@@ -2,23 +2,24 @@ import type { ReactNode } from 'react';
2
2
  import type { StyleProp, ViewStyle } from 'react-native';
3
3
  import type { IconName } from '../Icon';
4
4
 
5
- export type NavBarSlotConfig = {
5
+ export type NavBarAction = {
6
6
  icon: IconName;
7
- onPress?: () => void;
8
- /** 屏幕阅读器读出的功能描述。强烈建议传 —— icon-only 按钮无文字,缺省时 SR 回退
9
- * 读英文 icon 名(如 "menu")且 dev 下告警。请传人类可读短语(如「返回」「更多」)。 */
10
- accessibilityLabel?: string;
7
+ onPress: () => void;
8
+ /** 屏幕阅读器读出的非空功能描述。 */
9
+ accessibilityLabel: string;
11
10
  };
12
11
 
12
+ export type NavBarSlot = NavBarAction | ReactNode;
13
+
13
14
  export type NavBarProps = {
14
15
  /** 主标题 */
15
16
  title: string;
16
17
  /** 副标题(可选,主标题下方一行) */
17
18
  subtitle?: string;
18
- /** 左侧槽位:传 NavBarSlotConfig 自动用 IconButton 渲染 / 传 ReactNode 自定义 */
19
- left?: ReactNode | NavBarSlotConfig;
19
+ /** 左侧槽位:传 NavBarAction 自动用 IconButton 渲染 / 传 ReactNode 自定义 */
20
+ left?: NavBarSlot;
20
21
  /** 右侧槽位:同 left */
21
- right?: ReactNode | NavBarSlotConfig;
22
+ right?: NavBarSlot;
22
23
  /**
23
24
  * 视觉变体,默认 'default':
24
25
  * - `default`:白底 + hairline 底边
@@ -1,81 +1,79 @@
1
- import React, { forwardRef, useState } from 'react';
2
- import { Pressable } from 'react-native-gesture-handler';
3
- import { Icon } from '../Icon';
1
+ import React, { forwardRef, useEffect, useState } from 'react';
4
2
  import { Input } from '../Input';
5
- import { control, fixed, r, useColors } from '../../../theme';
6
- import { childTestID } from '../../../utils/testID';
7
- import { styles } from './styles';
8
- import type { TextInputRef } from '../TextField/TextFieldBase';
3
+ import type { TextFieldHandle, TextFieldSlot } from '../TextField/types';
4
+ import { createLogger } from '../../../utils/logger';
9
5
  import type { PasswordInputProps } from './types';
10
6
 
11
- /**
12
- * 密码 Input —— Input + leading lock + trailing eye 切换明文 / 密文。
13
- *
14
- * [L-32] 增强:
15
- * - forwardRef<TextInput> —— 业务表单 focus() 聚焦
16
- * - inputProps 类型改为 Omit<TextInputProps,'secureTextEntry'>
17
- * - 补 textContentType='password' / autoComplete='current-password' / autoCapitalize='none' 默认值
18
- * - 暴露 error / disabled 透传给底层 Input
19
- *
20
- * showPw 内部 useState,caller 只关心 value/onChangeText。
21
- * a11y:label 已表达"显示/隐藏密码"意图,不再加 accessibilityHint(避免 SR 朗读 over-hint)。
22
- */
23
- export const PasswordInput = forwardRef<TextInputRef, PasswordInputProps>(
24
- function PasswordInput(
25
- {
26
- value,
27
- onChangeText,
28
- placeholder = '请输入密码',
29
- testID,
30
- error,
31
- disabled,
32
- inputProps,
33
- },
34
- ref
35
- ): React.JSX.Element {
36
- const c = useColors();
37
- const [showPw, setShowPw] = useState(false);
7
+ const log = createLogger('PasswordInput');
8
+
9
+ /** 密码输入:只切换 secureTextEntry,不改变调用方持有的受控文本或焦点。 */
10
+ export const PasswordInput = forwardRef<TextFieldHandle, PasswordInputProps>(
11
+ function PasswordInput(props, ref): React.JSX.Element {
12
+ const {
13
+ textContentType: rawTextContentType,
14
+ autoComplete: rawAutoComplete,
15
+ autoCapitalize: rawAutoCapitalize,
16
+ value: rawValue,
17
+ onChangeText: rawOnChangeText,
18
+ disabled: rawDisabled,
19
+ editable: rawEditable,
20
+ placeholder: rawPlaceholder,
21
+ defaultValue: _defaultValue,
22
+ inputProps: _inputProps,
23
+ secureTextEntry: _secureTextEntry,
24
+ leading: _leading,
25
+ trailing: _trailing,
26
+ ...rest
27
+ } = props as PasswordInputProps & Record<string, unknown>;
28
+ const value = typeof rawValue === 'string' ? rawValue : '';
29
+ const onChangeText =
30
+ typeof rawOnChangeText === 'function'
31
+ ? (rawOnChangeText as (next: string) => void)
32
+ : undefined;
33
+ const disabled = rawDisabled === true;
34
+ const editable = rawEditable === false ? false : undefined;
35
+ const placeholder =
36
+ typeof rawPlaceholder === 'string' ? rawPlaceholder : '请输入密码';
37
+ const removedNativeAliasKey = Object.entries({
38
+ defaultValue: _defaultValue,
39
+ inputProps: _inputProps,
40
+ secureTextEntry: _secureTextEntry,
41
+ leading: _leading,
42
+ trailing: _trailing,
43
+ })
44
+ .filter(([, entry]) => entry !== undefined)
45
+ .map(([name]) => name)
46
+ .join(',');
47
+ useEffect(() => {
48
+ if (removedNativeAliasKey.length > 0) {
49
+ log.warn(`已忽略 PasswordInput 自管 props(${removedNativeAliasKey})。`);
50
+ }
51
+ }, [removedNativeAliasKey]);
52
+ const [showPassword, setShowPassword] = useState(false);
53
+ const effectiveEditable = disabled !== true && editable !== false;
54
+ const trailing: TextFieldSlot = {
55
+ kind: 'action',
56
+ icon: showPassword ? 'eye' : 'eye-off',
57
+ onPress: () => setShowPassword((visible) => !visible),
58
+ accessibilityLabel: showPassword ? '隐藏密码' : '显示密码',
59
+ disabled: !effectiveEditable,
60
+ };
38
61
 
39
62
  return (
40
63
  <Input
41
64
  ref={ref}
42
- testID={testID}
65
+ {...(rest as PasswordInputProps)}
43
66
  value={value}
44
- onChangeText={onChangeText}
45
- placeholder={placeholder}
46
- error={error}
67
+ onChangeText={onChangeText as (next: string) => void}
47
68
  disabled={disabled}
48
- // [L-32] 补 textContentType / autoComplete / autoCapitalize 默认值 —— 提升密码自动填充体验
49
- textContentType="password"
50
- autoComplete="current-password"
51
- autoCapitalize="none"
52
- {...inputProps}
53
- // secureTextEntry 在 inputProps spread 之后覆盖,确保组件自管不被 caller 干扰
54
- secureTextEntry={!showPw}
55
- leading={<Icon name="lock" size={r(18)} color={c.iconFaint40} />}
56
- trailing={
57
- <Pressable
58
- testID={childTestID(testID, 'toggle')}
59
- style={styles.eyeBtn}
60
- onPress={() => setShowPw((v) => !v)}
61
- accessibilityRole="button"
62
- accessibilityLabel={showPw ? '隐藏密码' : '显示密码'}
63
- // [M-7] eye icon r(16)≈16pt;Input 高 control.md≈36pt 限制垂直扩展
64
- // vertical 走 (44-control.md)/2≈4;horizontal 走 (44-16)/2=14
65
- hitSlop={{
66
- top: Math.round((fixed.hitTarget - control.md) / 2),
67
- bottom: Math.round((fixed.hitTarget - control.md) / 2),
68
- left: Math.round((fixed.hitTarget - r(16)) / 2),
69
- right: Math.round((fixed.hitTarget - r(16)) / 2),
70
- }}
71
- >
72
- <Icon
73
- name={showPw ? 'eye' : 'eye-off'}
74
- size={r(16)}
75
- color={c.iconFaint40}
76
- />
77
- </Pressable>
78
- }
69
+ editable={editable}
70
+ placeholder={placeholder}
71
+ textContentType={rawTextContentType ?? 'password'}
72
+ autoComplete={rawAutoComplete ?? 'current-password'}
73
+ autoCapitalize={rawAutoCapitalize ?? 'none'}
74
+ secureTextEntry={!showPassword}
75
+ leading={{ kind: 'icon', icon: 'lock', size: 18 }}
76
+ trailing={trailing}
79
77
  />
80
78
  );
81
79
  }