@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,6 +1,7 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
2
|
import type { ImageStyle, TextStyle, ViewStyle } from 'react-native';
|
|
3
3
|
import type { ColorTokens } from './colors';
|
|
4
|
+
import { normalizeFontScale, scaleFontMetric } from './fontScale';
|
|
4
5
|
import type { ShadowTokens } from './shadow';
|
|
5
6
|
import { useTheme } from './useTheme';
|
|
6
7
|
|
|
@@ -27,12 +28,14 @@ function scaleTextStyle(style: TextStyle, factor: number): TextStyle {
|
|
|
27
28
|
}
|
|
28
29
|
return {
|
|
29
30
|
...style,
|
|
30
|
-
...(typeof fontSize === 'number'
|
|
31
|
+
...(typeof fontSize === 'number'
|
|
32
|
+
? { fontSize: scaleFontMetric(fontSize, factor) }
|
|
33
|
+
: null),
|
|
31
34
|
...(typeof lineHeight === 'number'
|
|
32
|
-
? { lineHeight: lineHeight
|
|
35
|
+
? { lineHeight: scaleFontMetric(lineHeight, factor) }
|
|
33
36
|
: null),
|
|
34
37
|
...(typeof letterSpacing === 'number'
|
|
35
|
-
? { letterSpacing: letterSpacing
|
|
38
|
+
? { letterSpacing: scaleFontMetric(letterSpacing, factor) }
|
|
36
39
|
: null),
|
|
37
40
|
};
|
|
38
41
|
}
|
|
@@ -42,9 +45,10 @@ function scaleTextStyle(style: TextStyle, factor: number): TextStyle {
|
|
|
42
45
|
* 导出仅供单测,不进 barrel。 */
|
|
43
46
|
export function scaleNamedStyles<S extends NamedStyles<S>>(
|
|
44
47
|
styles: S,
|
|
45
|
-
factor:
|
|
48
|
+
factor: unknown
|
|
46
49
|
): S {
|
|
47
|
-
|
|
50
|
+
const fontScale = normalizeFontScale(factor);
|
|
51
|
+
if (fontScale === 1) return styles;
|
|
48
52
|
const out: Record<string, ViewStyle | TextStyle | ImageStyle> = {};
|
|
49
53
|
for (const [key, style] of Object.entries(
|
|
50
54
|
styles as Record<string, ViewStyle | TextStyle | ImageStyle>
|
|
@@ -52,7 +56,7 @@ export function scaleNamedStyles<S extends NamedStyles<S>>(
|
|
|
52
56
|
// ViewStyle / ImageStyle 无字号三属性,按 TextStyle 探测后恒等返回原引用。
|
|
53
57
|
out[key] =
|
|
54
58
|
style && typeof style === 'object'
|
|
55
|
-
? scaleTextStyle(style as TextStyle,
|
|
59
|
+
? scaleTextStyle(style as TextStyle, fontScale)
|
|
56
60
|
: style;
|
|
57
61
|
}
|
|
58
62
|
return out as S;
|
|
@@ -70,7 +74,8 @@ export function scaleNamedStyles<S extends NamedStyles<S>>(
|
|
|
70
74
|
export function useThemedStyles<S extends NamedStyles<S>>(
|
|
71
75
|
maker: StylesMaker<S>
|
|
72
76
|
): S {
|
|
73
|
-
const { colors, shadow, fontScale } = useTheme();
|
|
77
|
+
const { colors, shadow, fontScale: rawFontScale } = useTheme();
|
|
78
|
+
const fontScale = normalizeFontScale(rawFontScale);
|
|
74
79
|
return useMemo(
|
|
75
80
|
() => scaleNamedStyles(maker(colors, shadow), fontScale),
|
|
76
81
|
[colors, shadow, fontScale, maker]
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import type { ImageSourcePropType } from 'react-native';
|
|
2
|
+
|
|
3
|
+
interface SnapshotObject {
|
|
4
|
+
readonly [key: string]: SnapshotValue;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
interface SnapshotArray extends ReadonlyArray<SnapshotValue> {}
|
|
8
|
+
|
|
9
|
+
type SnapshotValue =
|
|
10
|
+
| undefined
|
|
11
|
+
| null
|
|
12
|
+
| string
|
|
13
|
+
| number
|
|
14
|
+
| boolean
|
|
15
|
+
| SnapshotObject
|
|
16
|
+
| SnapshotArray;
|
|
17
|
+
|
|
18
|
+
type SnapshotResult =
|
|
19
|
+
| {
|
|
20
|
+
valid: true;
|
|
21
|
+
snapshot: SnapshotValue;
|
|
22
|
+
canonical: string;
|
|
23
|
+
}
|
|
24
|
+
| {
|
|
25
|
+
valid: false;
|
|
26
|
+
canonical: string;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
type ResolvedImageSource = Readonly<{
|
|
30
|
+
source: ImageSourcePropType;
|
|
31
|
+
key: string;
|
|
32
|
+
}>;
|
|
33
|
+
|
|
34
|
+
const hasOwn = (value: object, key: PropertyKey): boolean =>
|
|
35
|
+
Object.prototype.hasOwnProperty.call(value, key);
|
|
36
|
+
|
|
37
|
+
function valid(snapshot: SnapshotValue, canonical: string): SnapshotResult {
|
|
38
|
+
return { valid: true, snapshot, canonical };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function invalid(kind: string): SnapshotResult {
|
|
42
|
+
return { valid: false, canonical: `invalid:${kind}` };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function visitArray(
|
|
46
|
+
value: object,
|
|
47
|
+
keys: readonly string[],
|
|
48
|
+
seen: WeakSet<object>
|
|
49
|
+
): SnapshotResult {
|
|
50
|
+
if (!keys.includes('length')) return invalid('descriptor');
|
|
51
|
+
|
|
52
|
+
const lengthDescriptor = Reflect.getOwnPropertyDescriptor(value, 'length');
|
|
53
|
+
if (
|
|
54
|
+
lengthDescriptor === undefined ||
|
|
55
|
+
lengthDescriptor.enumerable ||
|
|
56
|
+
!hasOwn(lengthDescriptor, 'value') ||
|
|
57
|
+
typeof lengthDescriptor.value !== 'number' ||
|
|
58
|
+
!Number.isInteger(lengthDescriptor.value) ||
|
|
59
|
+
lengthDescriptor.value < 0
|
|
60
|
+
) {
|
|
61
|
+
return invalid('descriptor');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const length = lengthDescriptor.value;
|
|
65
|
+
if (keys.length !== length + 1) return invalid('descriptor');
|
|
66
|
+
|
|
67
|
+
const keySet = new Set(keys);
|
|
68
|
+
const parts: string[] = [];
|
|
69
|
+
const snapshot: SnapshotValue[] = [];
|
|
70
|
+
let allValid = true;
|
|
71
|
+
|
|
72
|
+
for (let index = 0; index < length; index += 1) {
|
|
73
|
+
const key = String(index);
|
|
74
|
+
if (!keySet.has(key)) return invalid('descriptor');
|
|
75
|
+
|
|
76
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(value, key);
|
|
77
|
+
if (
|
|
78
|
+
descriptor === undefined ||
|
|
79
|
+
!descriptor.enumerable ||
|
|
80
|
+
!hasOwn(descriptor, 'value')
|
|
81
|
+
) {
|
|
82
|
+
return invalid('descriptor');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const item = visit(descriptor.value, seen);
|
|
86
|
+
parts.push(item.canonical);
|
|
87
|
+
if (item.valid) {
|
|
88
|
+
snapshot.push(item.snapshot);
|
|
89
|
+
} else {
|
|
90
|
+
allValid = false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const canonical = `array:[${parts.join(',')}]`;
|
|
95
|
+
return allValid
|
|
96
|
+
? valid(Object.freeze(snapshot), canonical)
|
|
97
|
+
: { valid: false, canonical };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function visitObject(
|
|
101
|
+
value: object,
|
|
102
|
+
keys: readonly string[],
|
|
103
|
+
seen: WeakSet<object>
|
|
104
|
+
): SnapshotResult {
|
|
105
|
+
const snapshot: Record<string, SnapshotValue> = {};
|
|
106
|
+
const parts: string[] = [];
|
|
107
|
+
let allValid = true;
|
|
108
|
+
|
|
109
|
+
for (const key of [...keys].sort()) {
|
|
110
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(value, key);
|
|
111
|
+
if (descriptor === undefined) return invalid('descriptor');
|
|
112
|
+
if (!descriptor.enumerable) return invalid('non-enumerable');
|
|
113
|
+
if (!hasOwn(descriptor, 'value')) return invalid('accessor');
|
|
114
|
+
|
|
115
|
+
const item = visit(descriptor.value, seen);
|
|
116
|
+
parts.push(`${JSON.stringify(key)}:${item.canonical}`);
|
|
117
|
+
if (item.valid) {
|
|
118
|
+
Object.defineProperty(snapshot, key, {
|
|
119
|
+
configurable: false,
|
|
120
|
+
enumerable: true,
|
|
121
|
+
value: item.snapshot,
|
|
122
|
+
writable: false,
|
|
123
|
+
});
|
|
124
|
+
} else {
|
|
125
|
+
allValid = false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const canonical = `object:{${parts.join(',')}}`;
|
|
130
|
+
return allValid
|
|
131
|
+
? valid(Object.freeze(snapshot), canonical)
|
|
132
|
+
: { valid: false, canonical };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* 只从 own data descriptor 读取一次,绝不执行 getter。snapshot 与 canonical
|
|
137
|
+
* key 因而来自同一份值;任何 descriptor / Proxy 异常都失败关闭。
|
|
138
|
+
*/
|
|
139
|
+
function visit(value: unknown, seen: WeakSet<object>): SnapshotResult {
|
|
140
|
+
if (value === undefined) return valid(undefined, 'undefined:');
|
|
141
|
+
if (value === null) return valid(null, 'null:');
|
|
142
|
+
|
|
143
|
+
switch (typeof value) {
|
|
144
|
+
case 'string':
|
|
145
|
+
return valid(value, `string:${JSON.stringify(value)}`);
|
|
146
|
+
case 'number':
|
|
147
|
+
return Number.isFinite(value)
|
|
148
|
+
? valid(value, `number:${value}`)
|
|
149
|
+
: invalid('number');
|
|
150
|
+
case 'boolean':
|
|
151
|
+
return valid(value, `boolean:${String(value)}`);
|
|
152
|
+
case 'function':
|
|
153
|
+
case 'symbol':
|
|
154
|
+
case 'bigint':
|
|
155
|
+
return invalid(typeof value);
|
|
156
|
+
case 'object':
|
|
157
|
+
break;
|
|
158
|
+
case 'undefined':
|
|
159
|
+
return valid(undefined, 'undefined:');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
try {
|
|
163
|
+
if (seen.has(value)) return invalid('cycle');
|
|
164
|
+
|
|
165
|
+
const isArray = Array.isArray(value);
|
|
166
|
+
const ownKeys = Reflect.ownKeys(value);
|
|
167
|
+
const keys: string[] = [];
|
|
168
|
+
for (const key of ownKeys) {
|
|
169
|
+
if (typeof key === 'symbol') return invalid('symbol-key');
|
|
170
|
+
keys.push(key);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
seen.add(value);
|
|
174
|
+
try {
|
|
175
|
+
return isArray
|
|
176
|
+
? visitArray(value, keys, seen)
|
|
177
|
+
: visitObject(value, keys, seen);
|
|
178
|
+
} finally {
|
|
179
|
+
seen.delete(value);
|
|
180
|
+
}
|
|
181
|
+
} catch {
|
|
182
|
+
return invalid('exception');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function snapshotValue(value: unknown): SnapshotResult {
|
|
187
|
+
try {
|
|
188
|
+
return visit(value, new WeakSet<object>());
|
|
189
|
+
} catch {
|
|
190
|
+
return invalid('exception');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export function canonicalSourceValue(value: unknown): string {
|
|
195
|
+
return snapshotValue(value).canonical;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const URI_STRING_FIELDS = ['bundle', 'method', 'body'] as const;
|
|
199
|
+
const CACHE_POLICIES = new Set([
|
|
200
|
+
'default',
|
|
201
|
+
'reload',
|
|
202
|
+
'force-cache',
|
|
203
|
+
'only-if-cached',
|
|
204
|
+
]);
|
|
205
|
+
|
|
206
|
+
function isSnapshotObject(value: SnapshotValue): value is SnapshotObject {
|
|
207
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function isValidHeaders(value: SnapshotValue): boolean {
|
|
211
|
+
if (value === undefined) return true;
|
|
212
|
+
if (!isSnapshotObject(value)) return false;
|
|
213
|
+
return Object.keys(value).every((key) => typeof value[key] === 'string');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function isValidUriSource(value: SnapshotValue): boolean {
|
|
217
|
+
if (!isSnapshotObject(value) || !hasOwn(value, 'uri')) return false;
|
|
218
|
+
|
|
219
|
+
const uri = value.uri;
|
|
220
|
+
if (typeof uri !== 'string' || uri.trim().length === 0) return false;
|
|
221
|
+
|
|
222
|
+
for (const field of URI_STRING_FIELDS) {
|
|
223
|
+
const fieldValue = value[field];
|
|
224
|
+
if (fieldValue !== undefined && typeof fieldValue !== 'string') {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (!isValidHeaders(value.headers)) return false;
|
|
230
|
+
|
|
231
|
+
const cache = value.cache;
|
|
232
|
+
if (cache !== undefined && !CACHE_POLICIES.has(cache as string)) return false;
|
|
233
|
+
|
|
234
|
+
for (const field of ['width', 'height', 'scale'] as const) {
|
|
235
|
+
const fieldValue = value[field];
|
|
236
|
+
if (
|
|
237
|
+
fieldValue !== undefined &&
|
|
238
|
+
(typeof fieldValue !== 'number' || !Number.isFinite(fieldValue))
|
|
239
|
+
) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function asImageSource(
|
|
248
|
+
snapshot: SnapshotValue
|
|
249
|
+
): ImageSourcePropType | undefined {
|
|
250
|
+
if (typeof snapshot === 'number') {
|
|
251
|
+
return Number.isFinite(snapshot) &&
|
|
252
|
+
snapshot > 0 &&
|
|
253
|
+
Number.isInteger(snapshot)
|
|
254
|
+
? snapshot
|
|
255
|
+
: undefined;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (Array.isArray(snapshot)) {
|
|
259
|
+
return snapshot.length > 0 && snapshot.every(isValidUriSource)
|
|
260
|
+
? (snapshot as ImageSourcePropType)
|
|
261
|
+
: undefined;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return isValidUriSource(snapshot)
|
|
265
|
+
? (snapshot as ImageSourcePropType)
|
|
266
|
+
: undefined;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* 组件唯一入口:一次读取完成 runtime validation、deep-frozen plain snapshot
|
|
271
|
+
* 与 semantic key。调用方必须把同一返回值里的 source / key 一起交给 attempt。
|
|
272
|
+
*/
|
|
273
|
+
export function resolveImageSource(
|
|
274
|
+
source: unknown
|
|
275
|
+
): ResolvedImageSource | undefined {
|
|
276
|
+
const result = snapshotValue(source);
|
|
277
|
+
if (!result.valid) return undefined;
|
|
278
|
+
|
|
279
|
+
const snapshot = asImageSource(result.snapshot);
|
|
280
|
+
if (snapshot === undefined) return undefined;
|
|
281
|
+
|
|
282
|
+
return Object.freeze({
|
|
283
|
+
source: snapshot,
|
|
284
|
+
key: `image-source:${result.canonical}`,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export function imageSourceKey(
|
|
289
|
+
source: ImageSourcePropType | undefined
|
|
290
|
+
): string {
|
|
291
|
+
return `image-source:${snapshotValue(source).canonical}`;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* JS 消费者可能绕过类型系统。只有能安全 snapshot 的 asset id、URI object 或
|
|
296
|
+
* URI object 数组能进入 Image;accessor、异常 descriptor 与非法 nested value
|
|
297
|
+
* 一律失败关闭。
|
|
298
|
+
*/
|
|
299
|
+
export function isValidImageSource(
|
|
300
|
+
source: unknown
|
|
301
|
+
): source is ImageSourcePropType {
|
|
302
|
+
return resolveImageSource(source) !== undefined;
|
|
303
|
+
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { StyleSheet } from 'react-native';
|
|
4
|
-
import { space } from "../../../theme/index.js";
|
|
5
|
-
|
|
6
|
-
/** eye Pressable hit area 微间距 4px。 */
|
|
7
|
-
export const styles = StyleSheet.create({
|
|
8
|
-
eyeBtn: {
|
|
9
|
-
paddingHorizontal: space['1']
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["StyleSheet","space","styles","create","eyeBtn","paddingHorizontal"],"sourceRoot":"../../../../../src","sources":["components/ui/PasswordInput/styles.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SAASC,KAAK,QAAQ,yBAAgB;;AAEtC;AACA,OAAO,MAAMC,MAAM,GAAGF,UAAU,CAACG,MAAM,CAAC;EACtCC,MAAM,EAAE;IAAEC,iBAAiB,EAAEJ,KAAK,CAAC,GAAG;EAAE;AAC1C,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { useEffect, useState } from 'react';
|
|
4
|
-
import { usePrefersReducedMotion } from "../../../theme/index.js";
|
|
5
|
-
/**
|
|
6
|
-
* Web 端 usePulse —— RN-Web 上 reanimated 4 + worklets 0.9.x 的 useAnimatedStyle
|
|
7
|
-
* 链路会抛 `Object.keys(undefined)` TypeError(animation frame 每帧打印),pulse 卡死
|
|
8
|
-
* 在初始值。
|
|
9
|
-
*
|
|
10
|
-
* native 端走 usePulse.ts(reanimated worklet) 不动。
|
|
11
|
-
*
|
|
12
|
-
* [M-19] 实现方案 —— CSS transition 降级(零 rAF JS 帧):
|
|
13
|
-
* rnw 0.21 的 animationKeyframes 字段类型侧尚未稳定暴露;
|
|
14
|
-
* 且 <style> 注入在 Spinner.web.tsx 已有安全注释(不拼外部输入)——为保持
|
|
15
|
-
* 一致性,Pulse 侧不再注入第二处 <style> 标签,故采用 CSS transition 降级:
|
|
16
|
-
*
|
|
17
|
-
* - 返回 { opacity, transition } 作为 RN style(RN-Web 把 transition 透传 DOM)
|
|
18
|
-
* - setInterval 每隔 `duration` ms 在 from/to 两档切换 opacity ——
|
|
19
|
-
* setState 频率从原来的 ~60fps 降到 1 次/duration ms(参 ToastHost.web.tsx)
|
|
20
|
-
* - CSS transition 负责两档之间的视觉补间,JS 侧零插值
|
|
21
|
-
* - reduce-motion:静止于 `to`(完全显示),骨架/圆点静态呈现
|
|
22
|
-
*/
|
|
23
|
-
export function usePulse({
|
|
24
|
-
from = 0.6,
|
|
25
|
-
to = 1,
|
|
26
|
-
duration = 700,
|
|
27
|
-
delay = 0
|
|
28
|
-
} = {}) {
|
|
29
|
-
const reduced = usePrefersReducedMotion();
|
|
30
|
-
const [opacity, setOpacity] = useState(from);
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
// reduce-motion:不脉冲,直接停在完全显示(to),骨架/圆点静态呈现。
|
|
33
|
-
if (reduced) {
|
|
34
|
-
setOpacity(to);
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// CSS transition 模式:setInterval 只负责在 from/to 两档翻转(1 次/duration ms),
|
|
39
|
-
// 浏览器 CSS transition 负责补间 —— 与原方案 rAF 每帧 setState 相比
|
|
40
|
-
// setState 频率从 ~60fps 降到 1/(duration/1000) fps,无 JS 插值开销。
|
|
41
|
-
let timer = null;
|
|
42
|
-
let current = from;
|
|
43
|
-
const start = () => {
|
|
44
|
-
timer = setInterval(() => {
|
|
45
|
-
current = current === from ? to : from;
|
|
46
|
-
setOpacity(current);
|
|
47
|
-
}, duration);
|
|
48
|
-
};
|
|
49
|
-
if (delay > 0) {
|
|
50
|
-
const delayTimer = setTimeout(start, delay);
|
|
51
|
-
return () => {
|
|
52
|
-
clearTimeout(delayTimer);
|
|
53
|
-
if (timer != null) clearInterval(timer);
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
start();
|
|
57
|
-
return () => {
|
|
58
|
-
if (timer != null) clearInterval(timer);
|
|
59
|
-
};
|
|
60
|
-
}, [from, to, duration, delay, reduced]);
|
|
61
|
-
if (reduced) {
|
|
62
|
-
return {
|
|
63
|
-
opacity: to
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// RN-Web 把 transition 字段透传到 DOM style,实现 CSS 级平滑过渡。
|
|
68
|
-
// RN style typedef 无 transition 字段,cast any 绕过 TS strict
|
|
69
|
-
// (实际只在 web bundle 命中,DOM div 原样接受该字段)。
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
opacity,
|
|
73
|
-
transition: `opacity ${duration}ms ease-in-out`
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=usePulse.web.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useState","usePrefersReducedMotion","usePulse","from","to","duration","delay","reduced","opacity","setOpacity","timer","current","start","setInterval","delayTimer","setTimeout","clearTimeout","clearInterval","transition"],"sourceRoot":"../../../../../src","sources":["components/ui/Pulse/usePulse.web.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,uBAAuB,QAAQ,yBAAgB;AAGxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,QAAQA,CAAC;EACvBC,IAAI,GAAG,GAAG;EACVC,EAAE,GAAG,CAAC;EACNC,QAAQ,GAAG,GAAG;EACdC,KAAK,GAAG;AACI,CAAC,GAAG,CAAC,CAAC,EAAE;EACpB,MAAMC,OAAO,GAAGN,uBAAuB,CAAC,CAAC;EACzC,MAAM,CAACO,OAAO,EAAEC,UAAU,CAAC,GAAGT,QAAQ,CAACG,IAAI,CAAC;EAE5CJ,SAAS,CAAC,MAAM;IACd;IACA,IAAIQ,OAAO,EAAE;MACXE,UAAU,CAACL,EAAE,CAAC;MACd;IACF;;IAEA;IACA;IACA;IACA,IAAIM,KAA4C,GAAG,IAAI;IACvD,IAAIC,OAAO,GAAGR,IAAI;IAElB,MAAMS,KAAK,GAAGA,CAAA,KAAM;MAClBF,KAAK,GAAGG,WAAW,CAAC,MAAM;QACxBF,OAAO,GAAGA,OAAO,KAAKR,IAAI,GAAGC,EAAE,GAAGD,IAAI;QACtCM,UAAU,CAACE,OAAO,CAAC;MACrB,CAAC,EAAEN,QAAQ,CAAC;IACd,CAAC;IAED,IAAIC,KAAK,GAAG,CAAC,EAAE;MACb,MAAMQ,UAAU,GAAGC,UAAU,CAACH,KAAK,EAAEN,KAAK,CAAC;MAC3C,OAAO,MAAM;QACXU,YAAY,CAACF,UAAU,CAAC;QACxB,IAAIJ,KAAK,IAAI,IAAI,EAAEO,aAAa,CAACP,KAAK,CAAC;MACzC,CAAC;IACH;IACAE,KAAK,CAAC,CAAC;IACP,OAAO,MAAM;MACX,IAAIF,KAAK,IAAI,IAAI,EAAEO,aAAa,CAACP,KAAK,CAAC;IACzC,CAAC;EACH,CAAC,EAAE,CAACP,IAAI,EAAEC,EAAE,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,OAAO,CAAC,CAAC;EAExC,IAAIA,OAAO,EAAE;IACX,OAAO;MAAEC,OAAO,EAAEJ;IAAG,CAAC;EACxB;;EAEA;EACA;EACA;;EAEA,OAAO;IAAEI,OAAO;IAAEU,UAAU,EAAE,WAAWb,QAAQ;EAAiB,CAAC;AACrE","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/PasswordInput/styles.ts"],"names":[],"mappings":"AAGA,sCAAsC;AACtC,eAAO,MAAM,MAAM;;;;EAEjB,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { PulseOptions } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* Web 端 usePulse —— RN-Web 上 reanimated 4 + worklets 0.9.x 的 useAnimatedStyle
|
|
4
|
-
* 链路会抛 `Object.keys(undefined)` TypeError(animation frame 每帧打印),pulse 卡死
|
|
5
|
-
* 在初始值。
|
|
6
|
-
*
|
|
7
|
-
* native 端走 usePulse.ts(reanimated worklet) 不动。
|
|
8
|
-
*
|
|
9
|
-
* [M-19] 实现方案 —— CSS transition 降级(零 rAF JS 帧):
|
|
10
|
-
* rnw 0.21 的 animationKeyframes 字段类型侧尚未稳定暴露;
|
|
11
|
-
* 且 <style> 注入在 Spinner.web.tsx 已有安全注释(不拼外部输入)——为保持
|
|
12
|
-
* 一致性,Pulse 侧不再注入第二处 <style> 标签,故采用 CSS transition 降级:
|
|
13
|
-
*
|
|
14
|
-
* - 返回 { opacity, transition } 作为 RN style(RN-Web 把 transition 透传 DOM)
|
|
15
|
-
* - setInterval 每隔 `duration` ms 在 from/to 两档切换 opacity ——
|
|
16
|
-
* setState 频率从原来的 ~60fps 降到 1 次/duration ms(参 ToastHost.web.tsx)
|
|
17
|
-
* - CSS transition 负责两档之间的视觉补间,JS 侧零插值
|
|
18
|
-
* - reduce-motion:静止于 `to`(完全显示),骨架/圆点静态呈现
|
|
19
|
-
*/
|
|
20
|
-
export declare function usePulse({ from, to, duration, delay, }?: PulseOptions): any;
|
|
21
|
-
//# sourceMappingURL=usePulse.web.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePulse.web.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Pulse/usePulse.web.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAU,EACV,EAAM,EACN,QAAc,EACd,KAAS,GACV,GAAE,YAAiB,OA8CnB"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
2
|
-
import { usePrefersReducedMotion } from '../../../theme';
|
|
3
|
-
import type { PulseOptions } from './types';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Web 端 usePulse —— RN-Web 上 reanimated 4 + worklets 0.9.x 的 useAnimatedStyle
|
|
7
|
-
* 链路会抛 `Object.keys(undefined)` TypeError(animation frame 每帧打印),pulse 卡死
|
|
8
|
-
* 在初始值。
|
|
9
|
-
*
|
|
10
|
-
* native 端走 usePulse.ts(reanimated worklet) 不动。
|
|
11
|
-
*
|
|
12
|
-
* [M-19] 实现方案 —— CSS transition 降级(零 rAF JS 帧):
|
|
13
|
-
* rnw 0.21 的 animationKeyframes 字段类型侧尚未稳定暴露;
|
|
14
|
-
* 且 <style> 注入在 Spinner.web.tsx 已有安全注释(不拼外部输入)——为保持
|
|
15
|
-
* 一致性,Pulse 侧不再注入第二处 <style> 标签,故采用 CSS transition 降级:
|
|
16
|
-
*
|
|
17
|
-
* - 返回 { opacity, transition } 作为 RN style(RN-Web 把 transition 透传 DOM)
|
|
18
|
-
* - setInterval 每隔 `duration` ms 在 from/to 两档切换 opacity ——
|
|
19
|
-
* setState 频率从原来的 ~60fps 降到 1 次/duration ms(参 ToastHost.web.tsx)
|
|
20
|
-
* - CSS transition 负责两档之间的视觉补间,JS 侧零插值
|
|
21
|
-
* - reduce-motion:静止于 `to`(完全显示),骨架/圆点静态呈现
|
|
22
|
-
*/
|
|
23
|
-
export function usePulse({
|
|
24
|
-
from = 0.6,
|
|
25
|
-
to = 1,
|
|
26
|
-
duration = 700,
|
|
27
|
-
delay = 0,
|
|
28
|
-
}: PulseOptions = {}) {
|
|
29
|
-
const reduced = usePrefersReducedMotion();
|
|
30
|
-
const [opacity, setOpacity] = useState(from);
|
|
31
|
-
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
// reduce-motion:不脉冲,直接停在完全显示(to),骨架/圆点静态呈现。
|
|
34
|
-
if (reduced) {
|
|
35
|
-
setOpacity(to);
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// CSS transition 模式:setInterval 只负责在 from/to 两档翻转(1 次/duration ms),
|
|
40
|
-
// 浏览器 CSS transition 负责补间 —— 与原方案 rAF 每帧 setState 相比
|
|
41
|
-
// setState 频率从 ~60fps 降到 1/(duration/1000) fps,无 JS 插值开销。
|
|
42
|
-
let timer: ReturnType<typeof setInterval> | null = null;
|
|
43
|
-
let current = from;
|
|
44
|
-
|
|
45
|
-
const start = () => {
|
|
46
|
-
timer = setInterval(() => {
|
|
47
|
-
current = current === from ? to : from;
|
|
48
|
-
setOpacity(current);
|
|
49
|
-
}, duration);
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
if (delay > 0) {
|
|
53
|
-
const delayTimer = setTimeout(start, delay);
|
|
54
|
-
return () => {
|
|
55
|
-
clearTimeout(delayTimer);
|
|
56
|
-
if (timer != null) clearInterval(timer);
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
start();
|
|
60
|
-
return () => {
|
|
61
|
-
if (timer != null) clearInterval(timer);
|
|
62
|
-
};
|
|
63
|
-
}, [from, to, duration, delay, reduced]);
|
|
64
|
-
|
|
65
|
-
if (reduced) {
|
|
66
|
-
return { opacity: to } as any;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// RN-Web 把 transition 字段透传到 DOM style,实现 CSS 级平滑过渡。
|
|
70
|
-
// RN style typedef 无 transition 字段,cast any 绕过 TS strict
|
|
71
|
-
// (实际只在 web bundle 命中,DOM div 原样接受该字段)。
|
|
72
|
-
|
|
73
|
-
return { opacity, transition: `opacity ${duration}ms ease-in-out` } as any;
|
|
74
|
-
}
|