@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.
- package/README.md +121 -12
- package/lib/module/components/business/AvatarWithRing/AvatarWithRing.js +4 -5
- package/lib/module/components/business/AvatarWithRing/AvatarWithRing.js.map +1 -1
- package/lib/module/components/business/AvatarWithRing/styles.js +10 -9
- package/lib/module/components/business/AvatarWithRing/styles.js.map +1 -1
- package/lib/module/components/business/VersionPill/VersionPill.js +32 -15
- package/lib/module/components/business/VersionPill/VersionPill.js.map +1 -1
- package/lib/module/components/business/VersionPill/content.js +30 -0
- package/lib/module/components/business/VersionPill/content.js.map +1 -0
- package/lib/module/components/business/VersionPill/styles.js +4 -0
- package/lib/module/components/business/VersionPill/styles.js.map +1 -1
- package/lib/module/components/business/useSvgId.js +17 -8
- package/lib/module/components/business/useSvgId.js.map +1 -1
- package/lib/module/components/ui/Avatar/Avatar.js +22 -29
- package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
- package/lib/module/components/ui/Button/Button.js +40 -23
- package/lib/module/components/ui/Button/Button.js.map +1 -1
- package/lib/module/components/ui/Button/ButtonBase.js +13 -13
- package/lib/module/components/ui/Button/ButtonBase.js.map +1 -1
- package/lib/module/components/ui/Carousel/Carousel.js +68 -40
- package/lib/module/components/ui/Carousel/Carousel.js.map +1 -1
- package/lib/module/components/ui/Carousel/behavior.js +60 -0
- package/lib/module/components/ui/Carousel/behavior.js.map +1 -0
- package/lib/module/components/ui/Carousel/styles.js +6 -8
- package/lib/module/components/ui/Carousel/styles.js.map +1 -1
- package/lib/module/components/ui/Cell/Cell.js +76 -65
- package/lib/module/components/ui/Cell/Cell.js.map +1 -1
- package/lib/module/components/ui/Cell/Leading.js +11 -5
- package/lib/module/components/ui/Cell/Leading.js.map +1 -1
- package/lib/module/components/ui/Cell/content.js +34 -0
- package/lib/module/components/ui/Cell/content.js.map +1 -0
- package/lib/module/components/ui/Checkbox/Checkbox.js +25 -8
- package/lib/module/components/ui/Checkbox/Checkbox.js.map +1 -1
- package/lib/module/components/ui/Confirm/ConfirmHost.js +49 -25
- package/lib/module/components/ui/Confirm/ConfirmHost.js.map +1 -1
- package/lib/module/components/ui/Confirm/confirm.js +15 -29
- package/lib/module/components/ui/Confirm/confirm.js.map +1 -1
- package/lib/module/components/ui/Confirm/labels.js +10 -0
- package/lib/module/components/ui/Confirm/labels.js.map +1 -0
- package/lib/module/components/ui/Confirm/store.js +113 -0
- package/lib/module/components/ui/Confirm/store.js.map +1 -0
- package/lib/module/components/ui/Confirm/styles.js +4 -0
- package/lib/module/components/ui/Confirm/styles.js.map +1 -1
- package/lib/module/components/ui/DrawerHeader/DrawerHeader.js +17 -25
- package/lib/module/components/ui/DrawerHeader/DrawerHeader.js.map +1 -1
- package/lib/module/components/ui/Grid/Grid.js +26 -9
- package/lib/module/components/ui/Grid/Grid.js.map +1 -1
- package/lib/module/components/ui/Grid/accessibility.js +13 -0
- package/lib/module/components/ui/Grid/accessibility.js.map +1 -0
- package/lib/module/components/ui/IconButton/IconButton.js +16 -3
- package/lib/module/components/ui/IconButton/IconButton.js.map +1 -1
- package/lib/module/components/ui/Input/Input.js +8 -5
- package/lib/module/components/ui/Input/Input.js.map +1 -1
- package/lib/module/components/ui/Logo/Logo.js +22 -4
- package/lib/module/components/ui/Logo/Logo.js.map +1 -1
- package/lib/module/components/ui/NavBar/NavBar.js +23 -14
- package/lib/module/components/ui/NavBar/NavBar.js.map +1 -1
- package/lib/module/components/ui/NavBar/isSlot.js +297 -4
- package/lib/module/components/ui/NavBar/isSlot.js.map +1 -1
- package/lib/module/components/ui/PasswordInput/PasswordInput.js +61 -66
- package/lib/module/components/ui/PasswordInput/PasswordInput.js.map +1 -1
- package/lib/module/components/ui/Pulse/Pulse.js +1 -1
- package/lib/module/components/ui/Pulse/Pulse.js.map +1 -1
- package/lib/module/components/ui/Pulse/PulseDot.js +5 -7
- package/lib/module/components/ui/Pulse/PulseDot.js.map +1 -1
- package/lib/module/components/ui/Pulse/index.js +1 -1
- package/lib/module/components/ui/Pulse/index.js.map +1 -1
- package/lib/module/components/ui/Pulse/normalizePulseOptions.js +45 -0
- package/lib/module/components/ui/Pulse/normalizePulseOptions.js.map +1 -0
- package/lib/module/components/ui/Pulse/usePulse.js +61 -24
- package/lib/module/components/ui/Pulse/usePulse.js.map +1 -1
- package/lib/module/components/ui/Pulse/usePulseDriver.js +44 -0
- package/lib/module/components/ui/Pulse/usePulseDriver.js.map +1 -0
- package/lib/module/components/ui/Pulse/usePulseDriver.web.js +67 -0
- package/lib/module/components/ui/Pulse/usePulseDriver.web.js.map +1 -0
- package/lib/module/components/ui/Radio/Radio.js +31 -14
- package/lib/module/components/ui/Radio/Radio.js.map +1 -1
- package/lib/module/components/ui/Radio/RadioGroup.js +15 -2
- package/lib/module/components/ui/Radio/RadioGroup.js.map +1 -1
- package/lib/module/components/ui/Reveal/Reveal.js +4 -3
- package/lib/module/components/ui/Reveal/Reveal.js.map +1 -1
- package/lib/module/components/ui/Reveal/Reveal.web.js +55 -32
- package/lib/module/components/ui/Reveal/Reveal.web.js.map +1 -1
- package/lib/module/components/ui/Reveal/webTransition.js +157 -0
- package/lib/module/components/ui/Reveal/webTransition.js.map +1 -0
- package/lib/module/components/ui/Search/Search.js +85 -58
- package/lib/module/components/ui/Search/Search.js.map +1 -1
- package/lib/module/components/ui/Segmented/Segmented.js +4 -2
- package/lib/module/components/ui/Segmented/Segmented.js.map +1 -1
- package/lib/module/components/ui/Skeleton/Skeleton.js +5 -7
- package/lib/module/components/ui/Skeleton/Skeleton.js.map +1 -1
- package/lib/module/components/ui/Spinner/Spinner.js +18 -11
- package/lib/module/components/ui/Spinner/Spinner.js.map +1 -1
- package/lib/module/components/ui/Spinner/Spinner.web.js +18 -14
- package/lib/module/components/ui/Spinner/Spinner.web.js.map +1 -1
- package/lib/module/components/ui/Spinner/shared.js +6 -0
- package/lib/module/components/ui/Spinner/shared.js.map +1 -1
- package/lib/module/components/ui/Stepper/Stepper.js +131 -99
- package/lib/module/components/ui/Stepper/Stepper.js.map +1 -1
- package/lib/module/components/ui/Stepper/StepperPressable.js +4 -0
- package/lib/module/components/ui/Stepper/StepperPressable.js.map +1 -0
- package/lib/module/components/ui/Stepper/StepperPressable.web.js +4 -0
- package/lib/module/components/ui/Stepper/StepperPressable.web.js.map +1 -0
- package/lib/module/components/ui/Stepper/accessibility.js +30 -0
- package/lib/module/components/ui/Stepper/accessibility.js.map +1 -0
- package/lib/module/components/ui/Stepper/accessibility.types.js +4 -0
- package/lib/module/components/ui/Stepper/accessibility.types.js.map +1 -0
- package/lib/module/components/ui/Stepper/accessibility.web.js +57 -0
- package/lib/module/components/ui/Stepper/accessibility.web.js.map +1 -0
- package/lib/module/components/ui/Stepper/layout.js +28 -0
- package/lib/module/components/ui/Stepper/layout.js.map +1 -0
- package/lib/module/components/ui/Stepper/normalizeStepper.js +53 -0
- package/lib/module/components/ui/Stepper/normalizeStepper.js.map +1 -0
- package/lib/module/components/ui/Stepper/styles.js +9 -2
- package/lib/module/components/ui/Stepper/styles.js.map +1 -1
- package/lib/module/components/ui/Switch/Switch.js +45 -19
- package/lib/module/components/ui/Switch/Switch.js.map +1 -1
- package/lib/module/components/ui/Switch/Switch.web.js +47 -20
- package/lib/module/components/ui/Switch/Switch.web.js.map +1 -1
- package/lib/module/components/ui/Switch/styles.js +12 -5
- package/lib/module/components/ui/Switch/styles.js.map +1 -1
- package/lib/module/components/ui/Tag/Tag.js +3 -2
- package/lib/module/components/ui/Tag/Tag.js.map +1 -1
- package/lib/module/components/ui/TextField/TextFieldBase.js +131 -86
- package/lib/module/components/ui/TextField/TextFieldBase.js.map +1 -1
- package/lib/module/components/ui/TextField/TextFieldSlot.js +82 -0
- package/lib/module/components/ui/TextField/TextFieldSlot.js.map +1 -0
- package/lib/module/components/ui/TextField/normalize.js +238 -0
- package/lib/module/components/ui/TextField/normalize.js.map +1 -0
- package/lib/module/components/ui/TextField/styles.js +31 -0
- package/lib/module/components/ui/TextField/styles.js.map +1 -1
- package/lib/module/components/ui/TextField/useErrorAnnouncement.js +27 -0
- package/lib/module/components/ui/TextField/useErrorAnnouncement.js.map +1 -0
- package/lib/module/components/ui/TextField/useTextFieldValue.js +66 -0
- package/lib/module/components/ui/TextField/useTextFieldValue.js.map +1 -0
- package/lib/module/components/ui/TextField/valueState.js +93 -0
- package/lib/module/components/ui/TextField/valueState.js.map +1 -0
- package/lib/module/components/ui/Textarea/Textarea.js +7 -3
- package/lib/module/components/ui/Textarea/Textarea.js.map +1 -1
- package/lib/module/components/ui/Thumbnail/Thumbnail.js +67 -48
- package/lib/module/components/ui/Thumbnail/Thumbnail.js.map +1 -1
- package/lib/module/components/ui/Thumbnail/normalize.js +58 -0
- package/lib/module/components/ui/Thumbnail/normalize.js.map +1 -0
- package/lib/module/components/ui/Thumbnail/styles.js +6 -11
- package/lib/module/components/ui/Thumbnail/styles.js.map +1 -1
- package/lib/module/components/ui/Toast/ToastHost.js +64 -21
- package/lib/module/components/ui/Toast/ToastHost.js.map +1 -1
- package/lib/module/components/ui/Toast/ToastHost.web.js +73 -24
- package/lib/module/components/ui/Toast/ToastHost.web.js.map +1 -1
- package/lib/module/components/ui/Toast/store.js +110 -0
- package/lib/module/components/ui/Toast/store.js.map +1 -0
- package/lib/module/components/ui/Toast/toast.js +17 -7
- package/lib/module/components/ui/Toast/toast.js.map +1 -1
- package/lib/module/components/ui/index.js.map +1 -1
- package/lib/module/components/ui/shared/ImageAttempt.js +28 -0
- package/lib/module/components/ui/shared/ImageAttempt.js.map +1 -0
- package/lib/module/components/ui/shared/a11y.js +21 -0
- package/lib/module/components/ui/shared/a11y.js.map +1 -0
- package/lib/module/components/ui/shared/accessibilityName.js +9 -0
- package/lib/module/components/ui/shared/accessibilityName.js.map +1 -0
- package/lib/module/components/ui/shared/selectImageAttemptSource.js +5 -0
- package/lib/module/components/ui/shared/selectImageAttemptSource.js.map +1 -0
- package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js +13 -0
- package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js.map +1 -0
- package/lib/module/components/ui/shared/selectImageAttemptSource.web.js +5 -0
- package/lib/module/components/ui/shared/selectImageAttemptSource.web.js.map +1 -0
- package/lib/module/icons/data.js +1 -1
- package/lib/module/icons/data.js.map +1 -1
- package/lib/module/theme/ThemeProvider.js +14 -4
- package/lib/module/theme/ThemeProvider.js.map +1 -1
- package/lib/module/theme/fontScale.js +13 -0
- package/lib/module/theme/fontScale.js.map +1 -0
- package/lib/module/theme/index.js +2 -4
- package/lib/module/theme/index.js.map +1 -1
- package/lib/module/theme/themeContext.js +15 -0
- package/lib/module/theme/themeContext.js.map +1 -0
- package/lib/module/theme/themeDiagnostics.js +29 -0
- package/lib/module/theme/themeDiagnostics.js.map +1 -0
- package/lib/module/theme/usePrefersReducedMotion.js +11 -4
- package/lib/module/theme/usePrefersReducedMotion.js.map +1 -1
- package/lib/module/theme/usePrefersReducedMotion.web.js +5 -2
- package/lib/module/theme/usePrefersReducedMotion.web.js.map +1 -1
- package/lib/module/theme/useTheme.js +12 -25
- package/lib/module/theme/useTheme.js.map +1 -1
- package/lib/module/theme/useThemedStyles.js +9 -6
- package/lib/module/theme/useThemedStyles.js.map +1 -1
- package/lib/module/utils/imageSource.js +198 -0
- package/lib/module/utils/imageSource.js.map +1 -0
- package/lib/typescript/manual-tests/runtime-api/RuntimeApiScreen.d.ts +12 -0
- package/lib/typescript/manual-tests/runtime-api/RuntimeApiScreen.d.ts.map +1 -0
- package/lib/typescript/src/components/business/AvatarWithRing/AvatarWithRing.d.ts.map +1 -1
- package/lib/typescript/src/components/business/AvatarWithRing/styles.d.ts +8 -7
- package/lib/typescript/src/components/business/AvatarWithRing/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/business/VersionPill/VersionPill.d.ts +1 -1
- package/lib/typescript/src/components/business/VersionPill/VersionPill.d.ts.map +1 -1
- package/lib/typescript/src/components/business/VersionPill/content.d.ts +19 -0
- package/lib/typescript/src/components/business/VersionPill/content.d.ts.map +1 -0
- package/lib/typescript/src/components/business/VersionPill/index.d.ts +1 -1
- package/lib/typescript/src/components/business/VersionPill/index.d.ts.map +1 -1
- package/lib/typescript/src/components/business/VersionPill/styles.d.ts +4 -0
- package/lib/typescript/src/components/business/VersionPill/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/business/VersionPill/types.d.ts +6 -2
- package/lib/typescript/src/components/business/VersionPill/types.d.ts.map +1 -1
- package/lib/typescript/src/components/business/index.d.ts +1 -1
- package/lib/typescript/src/components/business/index.d.ts.map +1 -1
- package/lib/typescript/src/components/business/useSvgId.d.ts +6 -5
- package/lib/typescript/src/components/business/useSvgId.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts +2 -2
- package/lib/typescript/src/components/ui/Avatar/Avatar.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Avatar/types.d.ts +6 -2
- package/lib/typescript/src/components/ui/Avatar/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Button/Button.d.ts +1 -1
- package/lib/typescript/src/components/ui/Button/Button.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Button/ButtonBase.d.ts +5 -3
- package/lib/typescript/src/components/ui/Button/ButtonBase.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Button/types.d.ts +5 -3
- package/lib/typescript/src/components/ui/Button/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Carousel/Carousel.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Carousel/behavior.d.ts +25 -0
- package/lib/typescript/src/components/ui/Carousel/behavior.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Carousel/styles.d.ts +4 -6
- package/lib/typescript/src/components/ui/Carousel/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Carousel/types.d.ts +14 -6
- package/lib/typescript/src/components/ui/Carousel/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Cell/Cell.d.ts +1 -1
- package/lib/typescript/src/components/ui/Cell/Cell.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Cell/Leading.d.ts +2 -3
- package/lib/typescript/src/components/ui/Cell/Leading.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Cell/content.d.ts +18 -0
- package/lib/typescript/src/components/ui/Cell/content.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Cell/index.d.ts +1 -1
- package/lib/typescript/src/components/ui/Cell/index.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Cell/types.d.ts +66 -30
- package/lib/typescript/src/components/ui/Cell/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts +1 -1
- package/lib/typescript/src/components/ui/Checkbox/Checkbox.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Checkbox/types.d.ts +12 -3
- package/lib/typescript/src/components/ui/Checkbox/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts +6 -3
- package/lib/typescript/src/components/ui/Confirm/ConfirmHost.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Confirm/confirm.d.ts +10 -4
- package/lib/typescript/src/components/ui/Confirm/confirm.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Confirm/labels.d.ts +6 -0
- package/lib/typescript/src/components/ui/Confirm/labels.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Confirm/store.d.ts +44 -0
- package/lib/typescript/src/components/ui/Confirm/store.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Confirm/styles.d.ts +3 -0
- package/lib/typescript/src/components/ui/Confirm/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Confirm/types.d.ts +0 -9
- package/lib/typescript/src/components/ui/Confirm/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/DrawerHeader/DrawerHeader.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts +7 -1
- package/lib/typescript/src/components/ui/DrawerHeader/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Grid/Grid.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Grid/accessibility.d.ts +5 -0
- package/lib/typescript/src/components/ui/Grid/accessibility.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Grid/types.d.ts +2 -0
- package/lib/typescript/src/components/ui/Grid/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts +1 -1
- package/lib/typescript/src/components/ui/IconButton/IconButton.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/IconButton/types.d.ts +4 -2
- package/lib/typescript/src/components/ui/IconButton/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Input/Input.d.ts +5 -383
- package/lib/typescript/src/components/ui/Input/Input.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Input/index.d.ts +1 -0
- package/lib/typescript/src/components/ui/Input/index.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Input/types.d.ts +3 -17
- package/lib/typescript/src/components/ui/Input/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Logo/Logo.d.ts +2 -2
- package/lib/typescript/src/components/ui/Logo/Logo.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Logo/types.d.ts +2 -2
- package/lib/typescript/src/components/ui/Logo/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/NavBar/NavBar.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/NavBar/index.d.ts +1 -1
- package/lib/typescript/src/components/ui/NavBar/index.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/NavBar/isSlot.d.ts +24 -4
- package/lib/typescript/src/components/ui/NavBar/isSlot.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/NavBar/types.d.ts +8 -8
- package/lib/typescript/src/components/ui/NavBar/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts +6 -14
- package/lib/typescript/src/components/ui/PasswordInput/PasswordInput.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/PasswordInput/types.d.ts +4 -14
- package/lib/typescript/src/components/ui/PasswordInput/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts +1 -1
- package/lib/typescript/src/components/ui/Pulse/PulseDot.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Pulse/normalizePulseOptions.d.ts +32 -0
- package/lib/typescript/src/components/ui/Pulse/normalizePulseOptions.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Pulse/usePulse.d.ts +10 -5
- package/lib/typescript/src/components/ui/Pulse/usePulse.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Pulse/usePulseDriver.d.ts +11 -0
- package/lib/typescript/src/components/ui/Pulse/usePulseDriver.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Pulse/usePulseDriver.web.d.ts +18 -0
- package/lib/typescript/src/components/ui/Pulse/usePulseDriver.web.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Radio/Radio.d.ts +1 -1
- package/lib/typescript/src/components/ui/Radio/Radio.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts +2 -2
- package/lib/typescript/src/components/ui/Radio/RadioGroup.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Radio/types.d.ts +14 -3
- package/lib/typescript/src/components/ui/Radio/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Reveal/Reveal.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts +2 -8
- package/lib/typescript/src/components/ui/Reveal/Reveal.web.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Reveal/types.d.ts +1 -1
- package/lib/typescript/src/components/ui/Reveal/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Reveal/webTransition.d.ts +38 -0
- package/lib/typescript/src/components/ui/Reveal/webTransition.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Search/Search.d.ts +4 -214
- package/lib/typescript/src/components/ui/Search/Search.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Search/types.d.ts +13 -6
- package/lib/typescript/src/components/ui/Search/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Segmented/Segmented.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts +3 -3
- package/lib/typescript/src/components/ui/Skeleton/Skeleton.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts +1 -1
- package/lib/typescript/src/components/ui/Spinner/Spinner.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts +1 -1
- package/lib/typescript/src/components/ui/Spinner/Spinner.web.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Spinner/shared.d.ts +5 -0
- package/lib/typescript/src/components/ui/Spinner/shared.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Spinner/types.d.ts +1 -1
- package/lib/typescript/src/components/ui/Spinner/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts +3 -3
- package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Stepper/StepperPressable.d.ts +2 -0
- package/lib/typescript/src/components/ui/Stepper/StepperPressable.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/StepperPressable.web.d.ts +2 -0
- package/lib/typescript/src/components/ui/Stepper/StepperPressable.web.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/accessibility.d.ts +3 -0
- package/lib/typescript/src/components/ui/Stepper/accessibility.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/accessibility.types.d.ts +23 -0
- package/lib/typescript/src/components/ui/Stepper/accessibility.types.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/accessibility.web.d.ts +9 -0
- package/lib/typescript/src/components/ui/Stepper/accessibility.web.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/layout.d.ts +22 -0
- package/lib/typescript/src/components/ui/Stepper/layout.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/normalizeStepper.d.ts +31 -0
- package/lib/typescript/src/components/ui/Stepper/normalizeStepper.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/styles.d.ts +9 -2
- package/lib/typescript/src/components/ui/Stepper/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Stepper/types.d.ts +3 -1
- package/lib/typescript/src/components/ui/Stepper/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Switch/Switch.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Switch/Switch.web.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Switch/styles.d.ts +9 -3
- package/lib/typescript/src/components/ui/Switch/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Switch/types.d.ts +2 -2
- package/lib/typescript/src/components/ui/Switch/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Tag/Tag.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts +4 -401
- package/lib/typescript/src/components/ui/TextField/TextFieldBase.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/TextField/TextFieldSlot.d.ts +13 -0
- package/lib/typescript/src/components/ui/TextField/TextFieldSlot.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/TextField/normalize.d.ts +51 -0
- package/lib/typescript/src/components/ui/TextField/normalize.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/TextField/styles.d.ts +30 -0
- package/lib/typescript/src/components/ui/TextField/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/TextField/types.d.ts +92 -18
- package/lib/typescript/src/components/ui/TextField/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/TextField/useErrorAnnouncement.d.ts +3 -0
- package/lib/typescript/src/components/ui/TextField/useErrorAnnouncement.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/TextField/useTextFieldValue.d.ts +18 -0
- package/lib/typescript/src/components/ui/TextField/useTextFieldValue.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/TextField/valueState.d.ts +50 -0
- package/lib/typescript/src/components/ui/TextField/valueState.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts +4 -382
- package/lib/typescript/src/components/ui/Textarea/Textarea.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Textarea/index.d.ts +1 -0
- package/lib/typescript/src/components/ui/Textarea/index.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Textarea/types.d.ts +3 -14
- package/lib/typescript/src/components/ui/Textarea/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts +5 -12
- package/lib/typescript/src/components/ui/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Thumbnail/index.d.ts +1 -1
- package/lib/typescript/src/components/ui/Thumbnail/index.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Thumbnail/normalize.d.ts +13 -0
- package/lib/typescript/src/components/ui/Thumbnail/normalize.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts +4 -8
- package/lib/typescript/src/components/ui/Thumbnail/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Thumbnail/types.d.ts +21 -13
- package/lib/typescript/src/components/ui/Thumbnail/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts +6 -2
- package/lib/typescript/src/components/ui/Toast/ToastHost.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts +6 -3
- package/lib/typescript/src/components/ui/Toast/ToastHost.web.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Toast/store.d.ts +39 -0
- package/lib/typescript/src/components/ui/Toast/store.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Toast/toast.d.ts +7 -2
- package/lib/typescript/src/components/ui/Toast/toast.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Toast/types.d.ts +5 -3
- package/lib/typescript/src/components/ui/Toast/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/index.d.ts +4 -4
- package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts +13 -0
- package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/shared/a11y.d.ts +19 -0
- package/lib/typescript/src/components/ui/shared/a11y.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/shared/accessibilityName.d.ts +3 -0
- package/lib/typescript/src/components/ui/shared/accessibilityName.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.d.ts +3 -0
- package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts +4 -0
- package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.web.d.ts +3 -0
- package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.web.d.ts.map +1 -0
- package/lib/typescript/src/theme/ThemeProvider.d.ts +2 -3
- package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
- package/lib/typescript/src/theme/fontScale.d.ts +4 -0
- package/lib/typescript/src/theme/fontScale.d.ts.map +1 -0
- package/lib/typescript/src/theme/index.d.ts +2 -1
- package/lib/typescript/src/theme/index.d.ts.map +1 -1
- package/lib/typescript/src/theme/themeContext.d.ts +6 -0
- package/lib/typescript/src/theme/themeContext.d.ts.map +1 -0
- package/lib/typescript/src/theme/themeDiagnostics.d.ts +6 -0
- package/lib/typescript/src/theme/themeDiagnostics.d.ts.map +1 -0
- package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts +8 -3
- package/lib/typescript/src/theme/usePrefersReducedMotion.d.ts.map +1 -1
- package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts +5 -2
- package/lib/typescript/src/theme/usePrefersReducedMotion.web.d.ts.map +1 -1
- package/lib/typescript/src/theme/useTheme.d.ts +1 -1
- package/lib/typescript/src/theme/useTheme.d.ts.map +1 -1
- package/lib/typescript/src/theme/useThemedStyles.d.ts +1 -1
- package/lib/typescript/src/theme/useThemedStyles.d.ts.map +1 -1
- package/lib/typescript/src/utils/imageSource.d.ts +20 -0
- package/lib/typescript/src/utils/imageSource.d.ts.map +1 -0
- package/lib/typescript/type-tests/public-api.d.ts +2 -0
- package/lib/typescript/type-tests/public-api.d.ts.map +1 -0
- package/lib/typescript/website/src/components/iconCatalogCategories.d.ts +11 -0
- package/lib/typescript/website/src/components/iconCatalogCategories.d.ts.map +1 -0
- package/package.json +30 -14
- package/src/components/business/AvatarWithRing/AvatarWithRing.tsx +11 -4
- package/src/components/business/AvatarWithRing/styles.ts +11 -9
- package/src/components/business/VersionPill/VersionPill.tsx +31 -25
- package/src/components/business/VersionPill/content.ts +47 -0
- package/src/components/business/VersionPill/index.ts +1 -1
- package/src/components/business/VersionPill/styles.ts +4 -0
- package/src/components/business/VersionPill/types.ts +7 -2
- package/src/components/business/index.ts +1 -1
- package/src/components/business/useSvgId.ts +29 -8
- package/src/components/ui/Avatar/Avatar.tsx +25 -34
- package/src/components/ui/Avatar/types.ts +6 -2
- package/src/components/ui/Button/Button.tsx +39 -20
- package/src/components/ui/Button/ButtonBase.tsx +21 -12
- package/src/components/ui/Button/types.ts +5 -3
- package/src/components/ui/Carousel/Carousel.tsx +102 -40
- package/src/components/ui/Carousel/behavior.ts +78 -0
- package/src/components/ui/Carousel/styles.ts +5 -7
- package/src/components/ui/Carousel/types.ts +18 -6
- package/src/components/ui/Cell/Cell.tsx +85 -74
- package/src/components/ui/Cell/Leading.tsx +14 -14
- package/src/components/ui/Cell/content.ts +53 -0
- package/src/components/ui/Cell/index.ts +7 -1
- package/src/components/ui/Cell/types.ts +64 -30
- package/src/components/ui/Checkbox/Checkbox.tsx +35 -8
- package/src/components/ui/Checkbox/types.ts +15 -3
- package/src/components/ui/Confirm/ConfirmHost.tsx +51 -26
- package/src/components/ui/Confirm/confirm.ts +17 -34
- package/src/components/ui/Confirm/labels.ts +14 -0
- package/src/components/ui/Confirm/store.ts +147 -0
- package/src/components/ui/Confirm/styles.ts +4 -0
- package/src/components/ui/Confirm/types.ts +2 -10
- package/src/components/ui/DrawerHeader/DrawerHeader.tsx +22 -27
- package/src/components/ui/DrawerHeader/types.ts +7 -1
- package/src/components/ui/Grid/Grid.tsx +44 -12
- package/src/components/ui/Grid/accessibility.ts +21 -0
- package/src/components/ui/Grid/types.ts +2 -0
- package/src/components/ui/IconButton/IconButton.tsx +20 -3
- package/src/components/ui/IconButton/types.ts +4 -2
- package/src/components/ui/Input/Input.tsx +16 -6
- package/src/components/ui/Input/index.ts +5 -0
- package/src/components/ui/Input/types.ts +12 -23
- package/src/components/ui/Logo/Logo.tsx +27 -4
- package/src/components/ui/Logo/types.ts +2 -2
- package/src/components/ui/NavBar/NavBar.tsx +27 -19
- package/src/components/ui/NavBar/index.ts +1 -1
- package/src/components/ui/NavBar/isSlot.ts +372 -5
- package/src/components/ui/NavBar/types.ts +9 -8
- package/src/components/ui/PasswordInput/PasswordInput.tsx +67 -69
- package/src/components/ui/PasswordInput/types.ts +12 -14
- package/src/components/ui/Pulse/PulseDot.tsx +5 -4
- package/src/components/ui/Pulse/normalizePulseOptions.ts +76 -0
- package/src/components/ui/Pulse/usePulse.ts +80 -34
- package/src/components/ui/Pulse/usePulseDriver.ts +49 -0
- package/src/components/ui/Pulse/usePulseDriver.web.ts +66 -0
- package/src/components/ui/Radio/Radio.tsx +44 -15
- package/src/components/ui/Radio/RadioGroup.tsx +21 -3
- package/src/components/ui/Radio/types.ts +17 -3
- package/src/components/ui/Reveal/Reveal.tsx +5 -3
- package/src/components/ui/Reveal/Reveal.web.tsx +72 -29
- package/src/components/ui/Reveal/types.ts +1 -1
- package/src/components/ui/Reveal/webTransition.ts +206 -0
- package/src/components/ui/Search/Search.tsx +127 -58
- package/src/components/ui/Search/types.ts +30 -9
- package/src/components/ui/Segmented/Segmented.tsx +10 -2
- package/src/components/ui/Skeleton/Skeleton.tsx +9 -5
- package/src/components/ui/Spinner/Spinner.tsx +25 -17
- package/src/components/ui/Spinner/Spinner.web.tsx +23 -18
- package/src/components/ui/Spinner/shared.ts +7 -0
- package/src/components/ui/Spinner/types.ts +1 -1
- package/src/components/ui/Stepper/Stepper.tsx +166 -86
- package/src/components/ui/Stepper/StepperPressable.tsx +1 -0
- package/src/components/ui/Stepper/StepperPressable.web.tsx +1 -0
- package/src/components/ui/Stepper/accessibility.ts +32 -0
- package/src/components/ui/Stepper/accessibility.types.ts +22 -0
- package/src/components/ui/Stepper/accessibility.web.ts +65 -0
- package/src/components/ui/Stepper/layout.ts +44 -0
- package/src/components/ui/Stepper/normalizeStepper.ts +85 -0
- package/src/components/ui/Stepper/styles.ts +9 -2
- package/src/components/ui/Stepper/types.ts +3 -1
- package/src/components/ui/Switch/Switch.tsx +54 -15
- package/src/components/ui/Switch/Switch.web.tsx +57 -19
- package/src/components/ui/Switch/styles.ts +11 -4
- package/src/components/ui/Switch/types.ts +2 -2
- package/src/components/ui/Tag/Tag.tsx +6 -2
- package/src/components/ui/TextField/TextFieldBase.tsx +175 -70
- package/src/components/ui/TextField/TextFieldSlot.tsx +91 -0
- package/src/components/ui/TextField/normalize.ts +280 -0
- package/src/components/ui/TextField/styles.ts +31 -0
- package/src/components/ui/TextField/types.ts +118 -22
- package/src/components/ui/TextField/useErrorAnnouncement.ts +27 -0
- package/src/components/ui/TextField/useTextFieldValue.ts +94 -0
- package/src/components/ui/TextField/valueState.ts +125 -0
- package/src/components/ui/Textarea/Textarea.tsx +11 -4
- package/src/components/ui/Textarea/index.ts +5 -0
- package/src/components/ui/Textarea/types.ts +14 -22
- package/src/components/ui/Thumbnail/Thumbnail.tsx +86 -51
- package/src/components/ui/Thumbnail/index.ts +5 -1
- package/src/components/ui/Thumbnail/normalize.ts +78 -0
- package/src/components/ui/Thumbnail/styles.ts +5 -10
- package/src/components/ui/Thumbnail/types.ts +43 -13
- package/src/components/ui/Toast/ToastHost.tsx +81 -22
- package/src/components/ui/Toast/ToastHost.web.tsx +91 -29
- package/src/components/ui/Toast/store.ts +148 -0
- package/src/components/ui/Toast/toast.ts +19 -10
- package/src/components/ui/Toast/types.ts +7 -3
- package/src/components/ui/index.ts +19 -4
- package/src/components/ui/shared/ImageAttempt.tsx +30 -0
- package/src/components/ui/shared/a11y.ts +18 -0
- package/src/components/ui/shared/accessibilityName.ts +6 -0
- package/src/components/ui/shared/selectImageAttemptSource.shared.ts +17 -0
- package/src/components/ui/shared/selectImageAttemptSource.ts +3 -0
- package/src/components/ui/shared/selectImageAttemptSource.web.ts +3 -0
- package/src/icons/data.ts +1 -1
- package/src/theme/ThemeProvider.tsx +18 -7
- package/src/theme/fontScale.ts +15 -0
- package/src/theme/index.ts +2 -3
- package/src/theme/themeContext.ts +24 -0
- package/src/theme/themeDiagnostics.ts +41 -0
- package/src/theme/usePrefersReducedMotion.ts +11 -4
- package/src/theme/usePrefersReducedMotion.web.ts +5 -2
- package/src/theme/useTheme.ts +19 -27
- package/src/theme/useThemedStyles.ts +12 -7
- package/src/utils/imageSource.ts +303 -0
- package/lib/module/components/ui/PasswordInput/styles.js +0 -12
- package/lib/module/components/ui/PasswordInput/styles.js.map +0 -1
- package/lib/module/components/ui/Pulse/usePulse.web.js +0 -76
- package/lib/module/components/ui/Pulse/usePulse.web.js.map +0 -1
- package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts +0 -7
- package/lib/typescript/src/components/ui/PasswordInput/styles.d.ts.map +0 -1
- package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts +0 -21
- package/lib/typescript/src/components/ui/Pulse/usePulse.web.d.ts.map +0 -1
- package/src/components/ui/PasswordInput/styles.ts +0 -7
- package/src/components/ui/Pulse/usePulse.web.ts +0 -74
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { InputProps } from '../Input';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/** 密码必须受控,且所有可用 TextInput 选项都以顶层 props 提供。 */
|
|
4
|
+
export type PasswordInputProps = Omit<
|
|
5
|
+
InputProps,
|
|
6
|
+
| 'value'
|
|
7
|
+
| 'defaultValue'
|
|
8
|
+
| 'onChangeText'
|
|
9
|
+
| 'secureTextEntry'
|
|
10
|
+
| 'leading'
|
|
11
|
+
| 'trailing'
|
|
12
|
+
> & {
|
|
4
13
|
value: string;
|
|
5
|
-
onChangeText: (
|
|
6
|
-
/** 默认 "请输入密码" */
|
|
7
|
-
placeholder?: string;
|
|
8
|
-
testID?: string;
|
|
9
|
-
/** 错误信息 —— 传入时 Input 进入 error 态并在下方显示 */
|
|
10
|
-
error?: string;
|
|
11
|
-
/** 整体禁用:等价于 editable=false + 视觉变灰 */
|
|
12
|
-
disabled?: boolean;
|
|
13
|
-
/** 透传给底层 Input 的其他 RN TextInput 属性(maxLength / autoFocus 等)。
|
|
14
|
-
* ⚠ 不要传 secureTextEntry,组件自管;传了会被组件内部覆盖。
|
|
15
|
-
* [L-32] 类型显式 Omit<TextInputProps,'secureTextEntry'> 封堵传入歧义 */
|
|
16
|
-
inputProps?: Omit<TextInputProps, 'secureTextEntry'>;
|
|
14
|
+
onChangeText: (value: string) => void;
|
|
17
15
|
};
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import Animated from 'react-native-reanimated';
|
|
3
3
|
import { r, useColors } from '../../../theme';
|
|
4
|
-
import {
|
|
4
|
+
import { DOT_DEFAULTS, usePulseWithDefaults } from './usePulse';
|
|
5
5
|
import type { PulseDotProps } from './types';
|
|
6
6
|
|
|
7
7
|
export function PulseDot({
|
|
8
8
|
size = r(6),
|
|
9
9
|
color,
|
|
10
|
-
from = 0.5,
|
|
11
10
|
style,
|
|
12
11
|
testID,
|
|
13
12
|
...opts
|
|
14
13
|
}: PulseDotProps = {}): React.JSX.Element {
|
|
15
14
|
const c = useColors();
|
|
16
15
|
const fill = color ?? c.primary;
|
|
17
|
-
// [L-93]
|
|
18
|
-
|
|
16
|
+
// [L-93] 圆点的 from 默认 0.5(比 <Pulse> 的 0.6 更淡)。默认值交给共享的
|
|
17
|
+
// DOT_DEFAULTS,不再在解构里写 `from = 0.5` —— 那样 from 会先被默认值填满,
|
|
18
|
+
// 归一化层再也分不清「调用方没传」和「调用方传了 0.5」。
|
|
19
|
+
const animatedStyle = usePulseWithDefaults(opts, DOT_DEFAULTS, 'PulseDot');
|
|
19
20
|
return (
|
|
20
21
|
<Animated.View
|
|
21
22
|
style={[
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { PulseOptions } from './types';
|
|
2
|
+
|
|
3
|
+
export type { PulseOptions };
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Pulse 参数的**唯一**归一化入口 —— 公共 hook 先跑完这里,平台 driver 只消费产物。
|
|
7
|
+
*
|
|
8
|
+
* 为什么要单独一层:此前 native / web 两份 `usePulse` 各自读原始 props 并各自解释
|
|
9
|
+
* 默认值,web 侧甚至把未校验的 `duration` 直接喂给 `setInterval`(0 或 2^31 会退化成
|
|
10
|
+
* 「每帧触发」)。归一化收口后,两端拿到的一定是同一组已验证数值。
|
|
11
|
+
*
|
|
12
|
+
* 纪律:**不做 clamp、不做取整**。非法值一律整体回退到 defaults 并记一条诊断 ——
|
|
13
|
+
* 悄悄把 `duration: 0` 夹成 `1` 会让调用方永远发现不了自己传错了。
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export type PulseDefaults = {
|
|
17
|
+
duration: number;
|
|
18
|
+
delay: number;
|
|
19
|
+
from: number;
|
|
20
|
+
to: number;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type PulseDiagnostic = {
|
|
24
|
+
field: keyof PulseDefaults;
|
|
25
|
+
received: unknown;
|
|
26
|
+
fallback: number;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type NormalizedPulseOptions = PulseDefaults & {
|
|
30
|
+
/** 两端相等 —— 没有可播的动画,driver 直接停在 `to`。 */
|
|
31
|
+
isStatic: boolean;
|
|
32
|
+
diagnostics: readonly PulseDiagnostic[];
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// setTimeout / setInterval 内部用 int32 存时长,>= 2^31 会溢出成 0 变「每帧触发」。
|
|
36
|
+
const MAX_TIMER = 2 ** 31;
|
|
37
|
+
|
|
38
|
+
export function normalizePulseOptions(
|
|
39
|
+
input: PulseOptions = {},
|
|
40
|
+
defaults: PulseDefaults
|
|
41
|
+
): NormalizedPulseOptions {
|
|
42
|
+
const diagnostics: PulseDiagnostic[] = [];
|
|
43
|
+
const pick = (
|
|
44
|
+
field: keyof PulseDefaults,
|
|
45
|
+
valid: (value: number) => boolean
|
|
46
|
+
): number => {
|
|
47
|
+
const received = input[field];
|
|
48
|
+
if (received === undefined) return defaults[field];
|
|
49
|
+
if (typeof received === 'number' && valid(received)) return received;
|
|
50
|
+
diagnostics.push({ field, received, fallback: defaults[field] });
|
|
51
|
+
return defaults[field];
|
|
52
|
+
};
|
|
53
|
+
const duration = pick(
|
|
54
|
+
'duration',
|
|
55
|
+
(value) => Number.isFinite(value) && value >= 1 && value < MAX_TIMER
|
|
56
|
+
);
|
|
57
|
+
const delay = pick(
|
|
58
|
+
'delay',
|
|
59
|
+
(value) => Number.isFinite(value) && value >= 0 && value < MAX_TIMER
|
|
60
|
+
);
|
|
61
|
+
const from = pick(
|
|
62
|
+
'from',
|
|
63
|
+
(value) => Number.isFinite(value) && value >= 0 && value <= 1
|
|
64
|
+
);
|
|
65
|
+
const to = pick(
|
|
66
|
+
'to',
|
|
67
|
+
(value) => Number.isFinite(value) && value >= 0 && value <= 1
|
|
68
|
+
);
|
|
69
|
+
return { duration, delay, from, to, isStatic: from === to, diagnostics };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** driver 是否应当启动循环。静态或系统开启减弱动效时都不启动。 */
|
|
73
|
+
export const shouldAnimatePulse = (
|
|
74
|
+
options: NormalizedPulseOptions,
|
|
75
|
+
reducedMotion: boolean
|
|
76
|
+
): boolean => !reducedMotion && !options.isStatic;
|
|
@@ -1,41 +1,87 @@
|
|
|
1
|
-
import { useEffect } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
withDelay,
|
|
7
|
-
withRepeat,
|
|
8
|
-
withSequence,
|
|
9
|
-
withTiming,
|
|
10
|
-
} from 'react-native-reanimated';
|
|
1
|
+
import { useEffect, useMemo } from 'react';
|
|
2
|
+
import { createLogger } from '../../../utils/logger';
|
|
3
|
+
import { normalizePulseOptions } from './normalizePulseOptions';
|
|
4
|
+
import type { PulseDefaults } from './normalizePulseOptions';
|
|
5
|
+
import { usePulseDriver } from './usePulseDriver';
|
|
11
6
|
import type { PulseOptions } from './types';
|
|
12
7
|
|
|
13
8
|
/**
|
|
14
|
-
* 在两个 opacity
|
|
15
|
-
*
|
|
9
|
+
* 在两个 opacity 值之间无限循环,返回可直接拼到 Animated.View 上的 style。
|
|
10
|
+
*
|
|
11
|
+
* 这是**唯一**的公共实现:参数校验、默认值与 dev 诊断全在这里完成,平台差异只下沉到
|
|
12
|
+
* `usePulseDriver(.web).ts`。此前 native / web 各有一份 `usePulse`,两边各自读原始
|
|
13
|
+
* props、各自解释默认值,web 侧还把未校验的 duration 直接喂给 `setInterval`。
|
|
16
14
|
*/
|
|
17
|
-
export function usePulse({
|
|
18
|
-
from = 0.6,
|
|
19
|
-
to = 1,
|
|
20
|
-
duration = 700,
|
|
21
|
-
delay = 0,
|
|
22
|
-
}: PulseOptions = {}) {
|
|
23
|
-
const op = useSharedValue(from);
|
|
24
15
|
|
|
16
|
+
const BASE_DEFAULTS: PulseDefaults = {
|
|
17
|
+
duration: 700,
|
|
18
|
+
delay: 0,
|
|
19
|
+
from: 0.6,
|
|
20
|
+
to: 1,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/** PulseDot / Skeleton 的默认值 —— 只有 from 更低,圆点 / 骨架淡到 0.5。 */
|
|
24
|
+
export const DOT_DEFAULTS: PulseDefaults = {
|
|
25
|
+
duration: 700,
|
|
26
|
+
delay: 0,
|
|
27
|
+
from: 0.5,
|
|
28
|
+
to: 1,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// logger 在模块加载时一次性建好 —— render 期创建每次都会产生新对象。
|
|
32
|
+
const pulseLog = createLogger('Pulse');
|
|
33
|
+
const pulseDotLog = createLogger('PulseDot');
|
|
34
|
+
const skeletonLog = createLogger('Skeleton');
|
|
35
|
+
|
|
36
|
+
/** 诊断告警的固定 scope 集合。 */
|
|
37
|
+
export type PulseScope = 'Pulse' | 'PulseDot' | 'Skeleton';
|
|
38
|
+
|
|
39
|
+
function loggerForScope(scope: PulseScope) {
|
|
40
|
+
switch (scope) {
|
|
41
|
+
case 'Pulse':
|
|
42
|
+
return pulseLog;
|
|
43
|
+
case 'PulseDot':
|
|
44
|
+
return pulseDotLog;
|
|
45
|
+
case 'Skeleton':
|
|
46
|
+
return skeletonLog;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** 内部:让 PulseDot / Skeleton 复用同一条归一化 + 诊断 + driver 链路。 */
|
|
51
|
+
export function usePulseWithDefaults(
|
|
52
|
+
options: PulseOptions | undefined,
|
|
53
|
+
defaults: PulseDefaults,
|
|
54
|
+
scope: PulseScope
|
|
55
|
+
) {
|
|
56
|
+
// 依赖列表**故意**拆到 primitive:options / defaults 对象每次 render 都可能是新引用
|
|
57
|
+
// (调用方常写内联字面量),直接依赖对象会让 memo 恒失效、并连带每帧重启 driver 的 effect。
|
|
58
|
+
// 这八个 primitive 就是归一化的全部输入,拆开后覆盖完整、无遗漏。
|
|
59
|
+
const normalized = useMemo(
|
|
60
|
+
() => normalizePulseOptions(options, defaults),
|
|
61
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
62
|
+
[
|
|
63
|
+
options?.duration,
|
|
64
|
+
options?.delay,
|
|
65
|
+
options?.from,
|
|
66
|
+
options?.to,
|
|
67
|
+
defaults.duration,
|
|
68
|
+
defaults.delay,
|
|
69
|
+
defaults.from,
|
|
70
|
+
defaults.to,
|
|
71
|
+
]
|
|
72
|
+
);
|
|
25
73
|
useEffect(() => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return useAnimatedStyle(() => ({ opacity: op.value }));
|
|
74
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
75
|
+
for (const item of normalized.diagnostics) {
|
|
76
|
+
loggerForScope(scope).warn(
|
|
77
|
+
`${item.field}=${String(item.received)} 无效,已回退为 ${item.fallback}`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}, [normalized.diagnostics, scope]);
|
|
82
|
+
return usePulseDriver(normalized);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function usePulse(options: PulseOptions = {}) {
|
|
86
|
+
return usePulseWithDefaults(options, BASE_DEFAULTS, 'Pulse');
|
|
41
87
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
cancelAnimation,
|
|
4
|
+
useAnimatedStyle,
|
|
5
|
+
useSharedValue,
|
|
6
|
+
withDelay,
|
|
7
|
+
withRepeat,
|
|
8
|
+
withSequence,
|
|
9
|
+
withTiming,
|
|
10
|
+
} from 'react-native-reanimated';
|
|
11
|
+
import { usePrefersReducedMotion } from '../../../theme';
|
|
12
|
+
import { shouldAnimatePulse } from './normalizePulseOptions';
|
|
13
|
+
import type { NormalizedPulseOptions } from './normalizePulseOptions';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* native Pulse driver —— reanimated 4 worklet,整个动画在 UI 线程跑、不占 JS 桥。
|
|
17
|
+
*
|
|
18
|
+
* **只接受归一化产物**:duration / delay / from / to 都已验证过,这里不再读原始 props,
|
|
19
|
+
* 也不再解释默认值。平台差异只到这一层为止。
|
|
20
|
+
*/
|
|
21
|
+
export function usePulseDriver(options: NormalizedPulseOptions) {
|
|
22
|
+
const reduced = usePrefersReducedMotion();
|
|
23
|
+
const animate = shouldAnimatePulse(options, reduced);
|
|
24
|
+
const { from, to, duration, delay } = options;
|
|
25
|
+
const op = useSharedValue(animate ? from : to);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!animate) {
|
|
29
|
+
// 静态 / 减弱动效:停在完全显示的一端(to),骨架与圆点静态呈现。
|
|
30
|
+
cancelAnimation(op);
|
|
31
|
+
op.value = to;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// from 变化时把 baseline 拉到新值,再启动循环;否则首帧会闪一下旧 baseline。
|
|
35
|
+
op.value = from;
|
|
36
|
+
const cycle = withRepeat(
|
|
37
|
+
withSequence(
|
|
38
|
+
withTiming(to, { duration }),
|
|
39
|
+
withTiming(from, { duration })
|
|
40
|
+
),
|
|
41
|
+
-1,
|
|
42
|
+
false
|
|
43
|
+
);
|
|
44
|
+
op.value = delay > 0 ? withDelay(delay, cycle) : cycle;
|
|
45
|
+
return () => cancelAnimation(op);
|
|
46
|
+
}, [op, animate, from, to, duration, delay]);
|
|
47
|
+
|
|
48
|
+
return useAnimatedStyle(() => ({ opacity: op.value }));
|
|
49
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import type { ImageStyle, TextStyle, ViewStyle } from 'react-native';
|
|
3
|
+
import { usePrefersReducedMotion } from '../../../theme';
|
|
4
|
+
import { shouldAnimatePulse } from './normalizePulseOptions';
|
|
5
|
+
import type { NormalizedPulseOptions } from './normalizePulseOptions';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Web Pulse driver —— RN-Web 上 reanimated 的 `useAnimatedStyle` 链路会在
|
|
9
|
+
* `_updatePropsJS` 里对 undefined 取 `Object.keys` 而抛 TypeError,pulse 卡死在初始值。
|
|
10
|
+
* 故 web 走 **CSS transition 降级**(零 rAF JS 帧):
|
|
11
|
+
*
|
|
12
|
+
* - `setInterval` 每隔 `duration` ms 只在 from / to 两档翻转 opacity
|
|
13
|
+
* —— setState 频率从 ~60fps 降到 1 次/duration ms(参 ToastHost.web.tsx)
|
|
14
|
+
* - 补间交给浏览器 CSS transition,JS 侧零插值
|
|
15
|
+
*
|
|
16
|
+
* **只接受归一化产物**:duration 已被验证在 `[1, 2^31)`,不会出现 `setInterval(0)`
|
|
17
|
+
* 那种「每帧触发」的退化。web 端**不跑 worklet** —— 别在文档里宣称它跑。
|
|
18
|
+
*/
|
|
19
|
+
export function usePulseDriver(options: NormalizedPulseOptions) {
|
|
20
|
+
const reduced = usePrefersReducedMotion();
|
|
21
|
+
const animate = shouldAnimatePulse(options, reduced);
|
|
22
|
+
const { from, to, duration, delay } = options;
|
|
23
|
+
const [opacity, setOpacity] = useState(animate ? from : to);
|
|
24
|
+
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (!animate) {
|
|
27
|
+
// 静态 / 减弱动效:停在完全显示的一端(to),与 native driver 语义一致。
|
|
28
|
+
setOpacity(to);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
setOpacity(from);
|
|
33
|
+
let timer: ReturnType<typeof setInterval> | null = null;
|
|
34
|
+
let delayTimer: ReturnType<typeof setTimeout> | null = null;
|
|
35
|
+
let current = from;
|
|
36
|
+
|
|
37
|
+
const start = () => {
|
|
38
|
+
timer = setInterval(() => {
|
|
39
|
+
current = current === from ? to : from;
|
|
40
|
+
setOpacity(current);
|
|
41
|
+
}, duration);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
if (delay > 0) {
|
|
45
|
+
delayTimer = setTimeout(start, delay);
|
|
46
|
+
} else {
|
|
47
|
+
start();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 两个 timer 都要清:delay 期间卸载时 interval 还没建立,反之亦然。
|
|
51
|
+
return () => {
|
|
52
|
+
if (delayTimer != null) clearTimeout(delayTimer);
|
|
53
|
+
if (timer != null) clearInterval(timer);
|
|
54
|
+
};
|
|
55
|
+
}, [animate, from, to, duration, delay]);
|
|
56
|
+
|
|
57
|
+
// RN-Web 把 transition 字段透传到 DOM style,实现 CSS 级平滑过渡。
|
|
58
|
+
// RN 的 style typedef 没有 transition 字段,故用交叉类型补一个窄声明 ——
|
|
59
|
+
// 比整块 `as any` 精确:仍然保留 opacity 的类型检查。
|
|
60
|
+
return {
|
|
61
|
+
opacity,
|
|
62
|
+
...(animate
|
|
63
|
+
? { transition: `opacity ${duration}ms ease-in-out` }
|
|
64
|
+
: undefined),
|
|
65
|
+
} as (ViewStyle | TextStyle | ImageStyle) & { transition?: string };
|
|
66
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useContext } from 'react';
|
|
1
|
+
import React, { useContext, useEffect } from 'react';
|
|
2
2
|
import { Text, View } from 'react-native';
|
|
3
3
|
import { Pressable } from 'react-native-gesture-handler';
|
|
4
4
|
import {
|
|
@@ -11,6 +11,8 @@ import {
|
|
|
11
11
|
} from '../../../theme';
|
|
12
12
|
import { createLogger } from '../../../utils/logger';
|
|
13
13
|
import { childTestID } from '../../../utils/testID';
|
|
14
|
+
import { A11Y_HIDDEN_PROPS } from '../shared/a11y';
|
|
15
|
+
import { normalizeNonBlankText } from '../shared/accessibilityName';
|
|
14
16
|
import { RadioContext } from './RadioContext';
|
|
15
17
|
import { RadioGroup } from './RadioGroup';
|
|
16
18
|
import { makeStyles } from './styles';
|
|
@@ -27,22 +29,39 @@ const _warnedCtx = new Set<string>();
|
|
|
27
29
|
export function Radio({
|
|
28
30
|
value,
|
|
29
31
|
label,
|
|
32
|
+
accessibilityLabel,
|
|
30
33
|
disabled,
|
|
31
34
|
testID,
|
|
32
35
|
}: RadioProps): React.JSX.Element {
|
|
33
36
|
const c = useColors();
|
|
34
37
|
const styles = useThemedStyles(makeStyles);
|
|
35
38
|
const ctx = useContext(RadioContext);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
const accessibleName =
|
|
40
|
+
normalizeNonBlankText(accessibilityLabel) ?? normalizeNonBlankText(label);
|
|
41
|
+
const hasMissingName = accessibleName === undefined;
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (!ctx) {
|
|
45
|
+
const warnKey = `no-ctx:${String(value)}`;
|
|
46
|
+
if (!_warnedCtx.has(warnKey)) {
|
|
47
|
+
_warnedCtx.add(warnKey);
|
|
48
|
+
log.warn('<Radio> must be used inside <Radio.Group>');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}, [ctx, value]);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
if (hasMissingName) {
|
|
54
|
+
log.warn(
|
|
55
|
+
'Radio 需要非空的 accessibilityLabel 或可见 label,当前 action 已禁用。'
|
|
56
|
+
);
|
|
42
57
|
}
|
|
58
|
+
}, [hasMissingName]);
|
|
59
|
+
|
|
60
|
+
if (!ctx) {
|
|
43
61
|
return <View />;
|
|
44
62
|
}
|
|
45
63
|
const checked = ctx.value === value;
|
|
64
|
+
const isDisabled = disabled === true || hasMissingName;
|
|
46
65
|
// [L-92] 改用 childTestID:收口 parent+id 拼接逻辑,保持空串 override 回落拼接语义
|
|
47
66
|
const resolvedTestID = childTestID(ctx.groupTestID, value, testID);
|
|
48
67
|
|
|
@@ -55,22 +74,32 @@ export function Radio({
|
|
|
55
74
|
|
|
56
75
|
return (
|
|
57
76
|
<Pressable
|
|
58
|
-
|
|
59
|
-
|
|
77
|
+
accessible={!hasMissingName}
|
|
78
|
+
onPress={isDisabled ? undefined : () => ctx.onChange(value)}
|
|
79
|
+
disabled={isDisabled}
|
|
60
80
|
hitSlop={hitSlopV}
|
|
61
|
-
accessibilityRole=
|
|
62
|
-
accessibilityState={
|
|
63
|
-
|
|
81
|
+
accessibilityRole={hasMissingName ? undefined : 'radio'}
|
|
82
|
+
accessibilityState={
|
|
83
|
+
hasMissingName ? undefined : { checked, disabled: isDisabled }
|
|
84
|
+
}
|
|
85
|
+
accessibilityLabel={accessibleName}
|
|
64
86
|
testID={resolvedTestID}
|
|
65
87
|
style={({ pressed }) => [
|
|
66
88
|
styles.row,
|
|
67
|
-
{ opacity:
|
|
89
|
+
{ opacity: isDisabled ? 0.5 : pressed ? pressedOpacity : 1 },
|
|
68
90
|
]}
|
|
69
91
|
>
|
|
70
|
-
<View
|
|
92
|
+
<View
|
|
93
|
+
{...A11Y_HIDDEN_PROPS}
|
|
94
|
+
style={[styles.circle, checked && { borderColor: c.primary }]}
|
|
95
|
+
>
|
|
71
96
|
{checked ? <View style={styles.dot} /> : null}
|
|
72
97
|
</View>
|
|
73
|
-
{label ?
|
|
98
|
+
{label ? (
|
|
99
|
+
<Text {...A11Y_HIDDEN_PROPS} style={styles.label}>
|
|
100
|
+
{label}
|
|
101
|
+
</Text>
|
|
102
|
+
) : null}
|
|
74
103
|
</Pressable>
|
|
75
104
|
);
|
|
76
105
|
}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
1
|
+
import React, { useEffect, useMemo } from 'react';
|
|
2
2
|
import { View } from 'react-native';
|
|
3
3
|
import { useThemedStyles } from '../../../theme';
|
|
4
|
+
import { createLogger } from '../../../utils/logger';
|
|
5
|
+
import { normalizeNonBlankText } from '../shared/accessibilityName';
|
|
4
6
|
import { RadioContext } from './RadioContext';
|
|
5
7
|
import { makeStyles } from './styles';
|
|
6
8
|
import type { GroupProps } from './types';
|
|
7
9
|
|
|
10
|
+
const log = createLogger('Radio.Group');
|
|
11
|
+
|
|
8
12
|
/**
|
|
9
13
|
* Radio 组 —— 单选。把若干 `<Radio>` 作为 children 放进来。
|
|
10
14
|
*
|
|
11
|
-
* <Radio.Group value={tier} onChange={setTier}>
|
|
15
|
+
* <Radio.Group value={tier} onChange={setTier} accessibilityLabel="客户等级">
|
|
12
16
|
* <Radio value="vip" label="VIP 客户" />
|
|
13
17
|
* <Radio value="normal" label="普通客户" />
|
|
14
18
|
* </Radio.Group>
|
|
@@ -16,20 +20,34 @@ import type { GroupProps } from './types';
|
|
|
16
20
|
export function RadioGroup({
|
|
17
21
|
value,
|
|
18
22
|
onChange,
|
|
23
|
+
accessibilityLabel,
|
|
19
24
|
children,
|
|
20
25
|
testID,
|
|
21
26
|
}: GroupProps): React.JSX.Element {
|
|
22
27
|
const styles = useThemedStyles(makeStyles);
|
|
28
|
+
const accessibleName = normalizeNonBlankText(accessibilityLabel);
|
|
29
|
+
const hasBlankLabel = accessibleName === undefined;
|
|
23
30
|
// [L-80b] useMemo 稳定 context value —— 避免每次渲染都产生新对象引用,
|
|
24
31
|
// 防止所有 Radio 子项因 context 变化而不必要 re-render。
|
|
25
32
|
const ctx = useMemo(
|
|
26
33
|
() => ({ value, onChange, groupTestID: testID }),
|
|
27
34
|
[value, onChange, testID]
|
|
28
35
|
);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (hasBlankLabel) {
|
|
38
|
+
log.warn('Radio.Group accessibilityLabel 不能为空白。');
|
|
39
|
+
}
|
|
40
|
+
}, [hasBlankLabel]);
|
|
41
|
+
|
|
29
42
|
return (
|
|
30
43
|
<RadioContext.Provider value={ctx}>
|
|
31
44
|
{/* [L-34] accessibilityRole="radiogroup" —— SR 宣读"单选按钮组" */}
|
|
32
|
-
<View
|
|
45
|
+
<View
|
|
46
|
+
style={styles.group}
|
|
47
|
+
testID={testID}
|
|
48
|
+
accessibilityRole="radiogroup"
|
|
49
|
+
accessibilityLabel={accessibleName}
|
|
50
|
+
>
|
|
33
51
|
{children}
|
|
34
52
|
</View>
|
|
35
53
|
</RadioContext.Provider>
|
|
@@ -3,6 +3,18 @@ import type { ReactNode } from 'react';
|
|
|
3
3
|
/** Radio 选项值类型 */
|
|
4
4
|
export type Value = string | number;
|
|
5
5
|
|
|
6
|
+
type AccessibleName =
|
|
7
|
+
| {
|
|
8
|
+
/** 可见旁标同时提供 accessible name;可显式覆盖读屏文案 */
|
|
9
|
+
label: string;
|
|
10
|
+
accessibilityLabel?: string;
|
|
11
|
+
}
|
|
12
|
+
| {
|
|
13
|
+
/** 无可见旁标时必须显式提供 accessible name */
|
|
14
|
+
label?: never;
|
|
15
|
+
accessibilityLabel: string;
|
|
16
|
+
};
|
|
17
|
+
|
|
6
18
|
export type GroupContext = {
|
|
7
19
|
/** 当前选中值 */
|
|
8
20
|
value: Value;
|
|
@@ -17,17 +29,17 @@ export type GroupProps = {
|
|
|
17
29
|
value: Value;
|
|
18
30
|
/** 选中变化回调 */
|
|
19
31
|
onChange: (value: Value) => void;
|
|
32
|
+
/** 单选组自身的读屏名称 */
|
|
33
|
+
accessibilityLabel: string;
|
|
20
34
|
/** 若干个 Radio 子项 */
|
|
21
35
|
children: ReactNode;
|
|
22
36
|
/** E2E / 测试定位 */
|
|
23
37
|
testID?: string;
|
|
24
38
|
};
|
|
25
39
|
|
|
26
|
-
|
|
40
|
+
type RadioBehaviorProps = {
|
|
27
41
|
/** 此项的值 */
|
|
28
42
|
value: Value;
|
|
29
|
-
/** 此项右侧文字 */
|
|
30
|
-
label?: string;
|
|
31
43
|
/** 禁用 */
|
|
32
44
|
disabled?: boolean;
|
|
33
45
|
/**
|
|
@@ -36,3 +48,5 @@ export type RadioProps = {
|
|
|
36
48
|
*/
|
|
37
49
|
testID?: string;
|
|
38
50
|
};
|
|
51
|
+
|
|
52
|
+
export type RadioProps = RadioBehaviorProps & AccessibleName;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
|
|
3
|
-
import { motion } from '../../../theme';
|
|
3
|
+
import { motion, usePrefersReducedMotion } from '../../../theme';
|
|
4
4
|
import type { RevealProps } from './types';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -16,10 +16,12 @@ export function Reveal({
|
|
|
16
16
|
duration = motion.base,
|
|
17
17
|
testID,
|
|
18
18
|
}: RevealProps): React.JSX.Element {
|
|
19
|
+
const reduced = usePrefersReducedMotion();
|
|
20
|
+
|
|
19
21
|
return (
|
|
20
22
|
<Animated.View
|
|
21
|
-
entering={FadeIn.duration(duration)}
|
|
22
|
-
exiting={FadeOut.duration(duration)}
|
|
23
|
+
entering={reduced ? undefined : FadeIn.duration(duration)}
|
|
24
|
+
exiting={reduced ? undefined : FadeOut.duration(duration)}
|
|
23
25
|
style={style}
|
|
24
26
|
testID={testID}
|
|
25
27
|
>
|