@unif/react-native-design 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -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 +89 -65
- 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 +9 -14
- 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 +3 -3
- 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/index.d.ts +1 -1
- package/lib/typescript/src/components/ui/Carousel/index.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Carousel/styles.d.ts +7 -12
- package/lib/typescript/src/components/ui/Carousel/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Carousel/types.d.ts +28 -17
- 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 +5 -5
- 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 +31 -17
- 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 +125 -71
- package/src/components/ui/Carousel/behavior.ts +78 -0
- package/src/components/ui/Carousel/index.ts +1 -1
- package/src/components/ui/Carousel/styles.ts +8 -13
- package/src/components/ui/Carousel/types.ts +35 -17
- 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 +20 -5
- 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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ImageSourcePropType } from 'react-native';
|
|
2
|
+
import { isValidImageSource } from '../../../utils/imageSource';
|
|
3
|
+
|
|
4
|
+
export function selectNativeImageAttemptSource(
|
|
5
|
+
source: unknown
|
|
6
|
+
): ImageSourcePropType | undefined {
|
|
7
|
+
return isValidImageSource(source) ? source : undefined;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function selectWebImageAttemptSource(
|
|
11
|
+
source: unknown
|
|
12
|
+
): ImageSourcePropType | undefined {
|
|
13
|
+
if (!isValidImageSource(source)) return undefined;
|
|
14
|
+
|
|
15
|
+
// RNW 0.21 不解析 native 的 candidate 数组;Web 明确使用第一候选项。
|
|
16
|
+
return Array.isArray(source) ? source[0] : source;
|
|
17
|
+
}
|
package/src/icons/data.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useEffect, useMemo } from 'react';
|
|
2
2
|
import { useColorScheme } from 'react-native';
|
|
3
3
|
import { lightColors, darkColors, type ColorTokens } from './colors';
|
|
4
|
+
import { normalizeFontScale } from './fontScale';
|
|
4
5
|
import { lightShadow, darkShadow, type ShadowTokens } from './shadow';
|
|
6
|
+
import { ThemeContext } from './themeContext';
|
|
7
|
+
import { createInvalidFontScaleDiagnostic } from './themeDiagnostics';
|
|
8
|
+
import { createLogger } from '../utils/logger';
|
|
5
9
|
|
|
6
10
|
export type ColorScheme = 'light' | 'dark';
|
|
7
11
|
|
|
@@ -10,21 +14,23 @@ export type ThemeContextValue = {
|
|
|
10
14
|
colors: ColorTokens;
|
|
11
15
|
shadow: ShadowTokens;
|
|
12
16
|
/** 应用级字号缩放倍数(app 内字体大小档)。useThemedStyles 出口对
|
|
13
|
-
* fontSize / lineHeight / letterSpacing
|
|
17
|
+
* fontSize / lineHeight / letterSpacing 生效;非法值回退 1。 */
|
|
14
18
|
fontScale: number;
|
|
15
19
|
};
|
|
16
20
|
|
|
17
|
-
export const ThemeContext = createContext<ThemeContextValue | null>(null);
|
|
18
|
-
|
|
19
21
|
type ThemeProviderProps = {
|
|
20
22
|
children: React.ReactNode;
|
|
21
23
|
/** 强制使用某个 scheme(覆盖 useColorScheme)。用于测试或 settingsStore 接入。 */
|
|
22
24
|
forceScheme?: ColorScheme;
|
|
23
25
|
/** 应用级字号缩放倍数,默认 1(不缩放)。接入方自持档位状态(persist
|
|
24
|
-
* store 等)
|
|
26
|
+
* store 等)并传入;仅接受有限正数,不设上限。 */
|
|
25
27
|
fontScale?: number;
|
|
26
28
|
};
|
|
27
29
|
|
|
30
|
+
const isDev = typeof __DEV__ !== 'undefined' && __DEV__;
|
|
31
|
+
const log = createLogger('ThemeProvider');
|
|
32
|
+
const reportInvalidFontScale = createInvalidFontScaleDiagnostic(log.warn);
|
|
33
|
+
|
|
28
34
|
export function ThemeProvider({
|
|
29
35
|
children,
|
|
30
36
|
forceScheme,
|
|
@@ -33,6 +39,11 @@ export function ThemeProvider({
|
|
|
33
39
|
const sysScheme = useColorScheme();
|
|
34
40
|
const scheme: ColorScheme =
|
|
35
41
|
forceScheme ?? (sysScheme === 'dark' ? 'dark' : 'light');
|
|
42
|
+
const normalizedFontScale = normalizeFontScale(fontScale);
|
|
43
|
+
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
reportInvalidFontScale(fontScale, normalizedFontScale, isDev);
|
|
46
|
+
}, [fontScale, normalizedFontScale]);
|
|
36
47
|
|
|
37
48
|
// useMemo 必须依赖 scheme,不要依赖 light/dark 对象本身 —— 这是 useThemedStyles
|
|
38
49
|
// 缓存生效的前提(每次渲染拿到稳定 colors / shadow 引用)。
|
|
@@ -41,9 +52,9 @@ export function ThemeProvider({
|
|
|
41
52
|
scheme,
|
|
42
53
|
colors: scheme === 'dark' ? darkColors : lightColors,
|
|
43
54
|
shadow: scheme === 'dark' ? darkShadow : lightShadow,
|
|
44
|
-
fontScale,
|
|
55
|
+
fontScale: normalizedFontScale,
|
|
45
56
|
}),
|
|
46
|
-
[scheme,
|
|
57
|
+
[scheme, normalizedFontScale]
|
|
47
58
|
);
|
|
48
59
|
|
|
49
60
|
return (
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useTheme } from './useTheme';
|
|
2
|
+
|
|
3
|
+
export function normalizeFontScale(value: unknown): number {
|
|
4
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0
|
|
5
|
+
? value
|
|
6
|
+
: 1;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function scaleFontMetric(value: number, fontScale: number): number {
|
|
10
|
+
return value * normalizeFontScale(fontScale);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function useFontScale(): number {
|
|
14
|
+
return normalizeFontScale(useTheme().fontScale);
|
|
15
|
+
}
|
package/src/theme/index.ts
CHANGED
|
@@ -11,12 +11,11 @@ export { warmOrangePalette } from './palettes';
|
|
|
11
11
|
export { lightShadow, darkShadow } from './shadow';
|
|
12
12
|
export type { ShadowTokens } from './shadow';
|
|
13
13
|
|
|
14
|
-
export { ThemeProvider
|
|
14
|
+
export { ThemeProvider } from './ThemeProvider';
|
|
15
15
|
export type { ColorScheme, ThemeContextValue } from './ThemeProvider';
|
|
16
|
-
// ThemeContext 为内部用途导出:若需子树强制主题,优先用 <ThemeProvider forceScheme> 嵌套。
|
|
17
|
-
// 直接自挂 Provider 须保证 value 引用稳定(每渲染新对象会打穿 useThemedStyles 缓存)。
|
|
18
16
|
|
|
19
17
|
export { useTheme, useColors, useShadow } from './useTheme';
|
|
18
|
+
export { normalizeFontScale, scaleFontMetric, useFontScale } from './fontScale';
|
|
20
19
|
export { useThemedStyles } from './useThemedStyles';
|
|
21
20
|
export type { StylesMaker } from './useThemedStyles';
|
|
22
21
|
export { usePrefersReducedMotion } from './usePrefersReducedMotion';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
import { lightColors } from './colors';
|
|
3
|
+
import { lightShadow } from './shadow';
|
|
4
|
+
import type { ThemeContextValue } from './ThemeProvider';
|
|
5
|
+
|
|
6
|
+
export const FALLBACK_THEME: ThemeContextValue = {
|
|
7
|
+
scheme: 'light',
|
|
8
|
+
colors: lightColors,
|
|
9
|
+
shadow: lightShadow,
|
|
10
|
+
fontScale: 1,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const ThemeContext = createContext<ThemeContextValue | undefined>(
|
|
14
|
+
undefined
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
export const resolveThemeContext = (
|
|
18
|
+
value: ThemeContextValue | undefined
|
|
19
|
+
): ThemeContextValue => value ?? FALLBACK_THEME;
|
|
20
|
+
|
|
21
|
+
export const shouldWarnMissingThemeProvider = (
|
|
22
|
+
value: ThemeContextValue | undefined,
|
|
23
|
+
isDev: boolean
|
|
24
|
+
): boolean => value === undefined && isDev;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
type DiagnosticWarn = (message: string) => void;
|
|
2
|
+
type DiagnosticFormatter = (value: unknown) => string;
|
|
3
|
+
|
|
4
|
+
const formatDiagnosticValue: DiagnosticFormatter = (value) => {
|
|
5
|
+
try {
|
|
6
|
+
return String(value);
|
|
7
|
+
} catch {
|
|
8
|
+
return '<无法序列化>';
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export function createInvalidFontScaleDiagnostic(
|
|
13
|
+
warn: DiagnosticWarn,
|
|
14
|
+
formatValue: DiagnosticFormatter = formatDiagnosticValue
|
|
15
|
+
): (value: unknown, normalizedFontScale: number, isDev: boolean) => void {
|
|
16
|
+
const warnedValues = new Set<string>();
|
|
17
|
+
|
|
18
|
+
return (value, normalizedFontScale, isDev) => {
|
|
19
|
+
if (!isDev || normalizedFontScale === value) return;
|
|
20
|
+
|
|
21
|
+
const formattedValue = formatValue(value);
|
|
22
|
+
const warningKey = `${typeof value}:${formattedValue}`;
|
|
23
|
+
if (warnedValues.has(warningKey)) return;
|
|
24
|
+
|
|
25
|
+
warnedValues.add(warningKey);
|
|
26
|
+
warn(`fontScale=${formattedValue} 无效,已回退为 1`);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function createMissingThemeProviderDiagnostic(
|
|
31
|
+
warn: DiagnosticWarn
|
|
32
|
+
): (shouldWarn: boolean) => void {
|
|
33
|
+
let warned = false;
|
|
34
|
+
|
|
35
|
+
return (shouldWarn) => {
|
|
36
|
+
if (!shouldWarn || warned) return;
|
|
37
|
+
|
|
38
|
+
warned = true;
|
|
39
|
+
warn('缺少 ThemeProvider,已使用稳定 light fallback');
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
import { useReducedMotion } from 'react-native-reanimated';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
|
-
*
|
|
4
|
+
* native:读取 iOS / Android 系统「减弱动态效果」设置。
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* 为什么必须真读系统值 —— Reanimated 的 `ReduceMotion.System` 只覆盖它自己驱动的
|
|
7
|
+
* `withTiming` / `withSpring` 等动画;组件自己用 `setInterval`、RAF、Modal 转场或
|
|
8
|
+
* autoplay 做的动效完全不在它管辖内。本 hook 曾恒返回 `false`,导致 native 端
|
|
9
|
+
* Pulse、Carousel autoplay 等路径在系统开启减弱动效后仍继续动。
|
|
10
|
+
*
|
|
11
|
+
* 消费方(Pulse、Switch、Carousel、Reveal……)必须显式分支到这个 hook,不能假设
|
|
12
|
+
* 动画引擎已替自己处理了该偏好。
|
|
6
13
|
*/
|
|
7
14
|
export function usePrefersReducedMotion(): boolean {
|
|
8
|
-
return
|
|
15
|
+
return useReducedMotion();
|
|
9
16
|
}
|
|
@@ -7,8 +7,11 @@ const QUERY = '(prefers-reduced-motion: reduce)';
|
|
|
7
7
|
const win: any = globalThis as any;
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* web
|
|
11
|
-
*
|
|
10
|
+
* web:监听系统「减弱动态效果」开关(`matchMedia`),返回当前是否开启;开关变化时自动更新。
|
|
11
|
+
*
|
|
12
|
+
* native 兄弟实现读 Reanimated 的系统信号(`useReducedMotion()`),两端语义一致 ——
|
|
13
|
+
* 都返回真实的系统偏好。Reanimated 只自动处理它自己驱动的动画,timer / RAF / CSS
|
|
14
|
+
* transition / autoplay 一律要由消费方显式分支到本 hook。
|
|
12
15
|
*/
|
|
13
16
|
export function usePrefersReducedMotion(): boolean {
|
|
14
17
|
const [reduced, setReduced] = useState<boolean>(() =>
|
package/src/theme/useTheme.ts
CHANGED
|
@@ -1,33 +1,25 @@
|
|
|
1
|
-
import { useContext } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { useContext, useEffect } from 'react';
|
|
2
|
+
import type { ThemeContextValue } from './ThemeProvider';
|
|
3
|
+
import {
|
|
4
|
+
resolveThemeContext,
|
|
5
|
+
shouldWarnMissingThemeProvider,
|
|
6
|
+
ThemeContext,
|
|
7
|
+
} from './themeContext';
|
|
8
|
+
import { createMissingThemeProviderDiagnostic } from './themeDiagnostics';
|
|
9
|
+
import { createLogger } from '../utils/logger';
|
|
5
10
|
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
shadow: lightShadow,
|
|
10
|
-
fontScale: 1,
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
// 静默回退而非 throw:FALLBACK 是模块级稳定引用,useThemedStyles 缓存契约不受影响。
|
|
14
|
-
// 缺点:漏包 ThemeProvider 时整 app 永远 light、暗色失效且零信号——
|
|
15
|
-
// 因此在 dev 下一次性告警提示接入方补 Provider。
|
|
16
|
-
// 用 typeof __DEV__ 守卫:裸 __DEV__ 在非 Metro 打包器(Webpack/Next.js)下会 ReferenceError,
|
|
17
|
-
// logger.ts:12 已有同等先例。
|
|
18
|
-
let _warnedMissingProvider = false;
|
|
11
|
+
const isDev = typeof __DEV__ !== 'undefined' && __DEV__;
|
|
12
|
+
const log = createLogger('useTheme');
|
|
13
|
+
const reportMissingProvider = createMissingThemeProviderDiagnostic(log.warn);
|
|
19
14
|
|
|
20
15
|
export function useTheme(): ThemeContextValue {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return ctx ?? FALLBACK;
|
|
16
|
+
const context = useContext(ThemeContext);
|
|
17
|
+
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
reportMissingProvider(shouldWarnMissingThemeProvider(context, isDev));
|
|
20
|
+
}, [context]);
|
|
21
|
+
|
|
22
|
+
return resolveThemeContext(context);
|
|
31
23
|
}
|
|
32
24
|
|
|
33
25
|
export function useColors() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
2
|
import type { ImageStyle, TextStyle, ViewStyle } from 'react-native';
|
|
3
3
|
import type { ColorTokens } from './colors';
|
|
4
|
+
import { normalizeFontScale, scaleFontMetric } from './fontScale';
|
|
4
5
|
import type { ShadowTokens } from './shadow';
|
|
5
6
|
import { useTheme } from './useTheme';
|
|
6
7
|
|
|
@@ -27,12 +28,14 @@ function scaleTextStyle(style: TextStyle, factor: number): TextStyle {
|
|
|
27
28
|
}
|
|
28
29
|
return {
|
|
29
30
|
...style,
|
|
30
|
-
...(typeof fontSize === 'number'
|
|
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":[]}
|