@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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unif/react-native-design",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "Unif 设计系统:theme + icons + utils + components",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -44,6 +44,11 @@
|
|
|
44
44
|
"typecheck": "tsc",
|
|
45
45
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
46
46
|
"test": "jest --passWithNoTests",
|
|
47
|
+
"check:config": "node scripts/check-config.js",
|
|
48
|
+
"check:icons": "node scripts/check-icons-generated.js",
|
|
49
|
+
"check:runtime-peers": "node scripts/check-runtime-peers.js",
|
|
50
|
+
"create:runtime-harness": "node scripts/create-runtime-api-harness.js",
|
|
51
|
+
"runtime:image-fixture": "node scripts/runtime-image-fixture.js",
|
|
47
52
|
"release": "release-it --only-version"
|
|
48
53
|
},
|
|
49
54
|
"keywords": [
|
|
@@ -65,14 +70,18 @@
|
|
|
65
70
|
"registry": "https://registry.npmjs.org/"
|
|
66
71
|
},
|
|
67
72
|
"devDependencies": {
|
|
73
|
+
"@babel/core": "^7.29.7",
|
|
68
74
|
"@commitlint/config-conventional": "^21.0.1",
|
|
69
75
|
"@eslint/compat": "^2.0.3",
|
|
70
76
|
"@eslint/eslintrc": "^3.3.5",
|
|
71
|
-
"@eslint/js": "^
|
|
77
|
+
"@eslint/js": "^9.39.4",
|
|
72
78
|
"@jest/globals": "^30.0.0",
|
|
73
|
-
"@react-native/
|
|
74
|
-
"@react-native/
|
|
75
|
-
"@react-native/
|
|
79
|
+
"@react-native-community/cli": "20.1.0",
|
|
80
|
+
"@react-native-community/template": "0.86.2",
|
|
81
|
+
"@react-native/babel-preset": "0.86.2",
|
|
82
|
+
"@react-native/eslint-config": "0.86.2",
|
|
83
|
+
"@react-native/jest-preset": "0.86.2",
|
|
84
|
+
"@react-native/metro-config": "0.86.2",
|
|
76
85
|
"@release-it/conventional-changelog": "^11.0.0",
|
|
77
86
|
"@sbaiahmed1/react-native-blur": "^4.6.2",
|
|
78
87
|
"@types/react": "^19.2.0",
|
|
@@ -80,34 +89,39 @@
|
|
|
80
89
|
"del-cli": "^7.0.0",
|
|
81
90
|
"eslint": "^9.39.4",
|
|
82
91
|
"eslint-config-prettier": "^10.1.8",
|
|
83
|
-
"eslint-plugin-ft-flow": "^3.0.11",
|
|
84
92
|
"eslint-plugin-prettier": "^5.5.5",
|
|
85
93
|
"jest": "^30.3.0",
|
|
94
|
+
"jest-environment-node": "30.4.1",
|
|
86
95
|
"lefthook": "^2.1.4",
|
|
87
96
|
"prettier": "^3.8.1",
|
|
88
97
|
"react": "19.2.3",
|
|
89
|
-
"react-native": "0.
|
|
98
|
+
"react-native": "0.86.2",
|
|
90
99
|
"react-native-builder-bob": "^0.41.0",
|
|
91
|
-
"react-native-gesture-handler": "^3.
|
|
92
|
-
"react-native-reanimated": "
|
|
93
|
-
"react-native-reanimated-carousel": "^5.0.0
|
|
100
|
+
"react-native-gesture-handler": "^3.1.0",
|
|
101
|
+
"react-native-reanimated": "~4.5.3",
|
|
102
|
+
"react-native-reanimated-carousel": "^5.0.0",
|
|
94
103
|
"react-native-safe-area-context": "^5.7.0",
|
|
95
104
|
"react-native-svg": "^15.15.5",
|
|
96
|
-
"react-native-worklets": "0.
|
|
105
|
+
"react-native-worklets": "^0.11.3",
|
|
97
106
|
"release-it": "^20.0.1",
|
|
107
|
+
"semver": "^7.8.5",
|
|
108
|
+
"smol-toml": "^1.7.1",
|
|
98
109
|
"turbo": "^2.8.21",
|
|
99
110
|
"typescript": "^6.0.2"
|
|
100
111
|
},
|
|
101
112
|
"peerDependencies": {
|
|
102
113
|
"@sbaiahmed1/react-native-blur": ">=4",
|
|
103
|
-
"react": "
|
|
104
|
-
"react-native": "
|
|
105
|
-
"react-native-gesture-handler": ">=
|
|
106
|
-
"react-native-reanimated": ">=4",
|
|
107
|
-
"react-native-reanimated-carousel": ">=5.0.0
|
|
114
|
+
"react": ">=19.2.3 <20.0.0",
|
|
115
|
+
"react-native": ">=0.86.0 <0.87.0",
|
|
116
|
+
"react-native-gesture-handler": ">=3.0.0 <4.0.0",
|
|
117
|
+
"react-native-reanimated": ">=4.5.2 <4.6.0",
|
|
118
|
+
"react-native-reanimated-carousel": ">=5.0.0 <6.0.0",
|
|
108
119
|
"react-native-safe-area-context": ">=5",
|
|
109
120
|
"react-native-svg": ">=15",
|
|
110
|
-
"react-native-worklets": ">=0.
|
|
121
|
+
"react-native-worklets": ">=0.11.0 <0.12.0"
|
|
122
|
+
},
|
|
123
|
+
"engines": {
|
|
124
|
+
"node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
|
|
111
125
|
},
|
|
112
126
|
"workspaces": [
|
|
113
127
|
"example",
|
|
@@ -6,7 +6,7 @@ import Svg, {
|
|
|
6
6
|
Rect,
|
|
7
7
|
Stop,
|
|
8
8
|
} from 'react-native-svg';
|
|
9
|
-
import { avatarGradient, useTheme } from '../../../theme';
|
|
9
|
+
import { avatarGradient, useFontScale, useTheme } from '../../../theme';
|
|
10
10
|
import { useSvgId } from '../useSvgId';
|
|
11
11
|
import { makeAvatarStyles } from './styles';
|
|
12
12
|
import type { AvatarWithRingProps } from './types';
|
|
@@ -26,11 +26,18 @@ export function AvatarWithRing({
|
|
|
26
26
|
testID,
|
|
27
27
|
}: AvatarWithRingProps): React.JSX.Element {
|
|
28
28
|
const { colors: c, shadow } = useTheme();
|
|
29
|
+
const fontScale = useFontScale();
|
|
29
30
|
const id = useSvgId('av');
|
|
30
31
|
const { inner, styles } = useMemo(
|
|
31
32
|
() =>
|
|
32
|
-
makeAvatarStyles(
|
|
33
|
-
|
|
33
|
+
makeAvatarStyles(
|
|
34
|
+
size,
|
|
35
|
+
ringColor ?? c.avatarRing,
|
|
36
|
+
shadow.brandAvatar,
|
|
37
|
+
c,
|
|
38
|
+
fontScale
|
|
39
|
+
),
|
|
40
|
+
[size, ringColor, c, shadow.brandAvatar, fontScale]
|
|
34
41
|
);
|
|
35
42
|
return (
|
|
36
43
|
<View style={[styles.shell, style]} testID={testID}>
|
|
@@ -60,7 +67,7 @@ export function AvatarWithRing({
|
|
|
60
67
|
fill={`url(#${id})`}
|
|
61
68
|
/>
|
|
62
69
|
</Svg>
|
|
63
|
-
<Text style={
|
|
70
|
+
<Text style={styles.label}>{label}</Text>
|
|
64
71
|
</View>
|
|
65
72
|
</View>
|
|
66
73
|
);
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { StyleSheet, type ViewStyle } from 'react-native';
|
|
2
|
-
import { fw, r, type ColorTokens } from '../../../theme';
|
|
2
|
+
import { fw, r, scaleFontMetric, type ColorTokens } from '../../../theme';
|
|
3
3
|
import { createLogger } from '../../../utils/logger';
|
|
4
4
|
|
|
5
5
|
const log = createLogger('AvatarWithRing');
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* 头像样式工厂 —— **非标 maker 签名**:`(size, ringColor, shadowStyle, c
|
|
8
|
+
* 头像样式工厂 —— **非标 maker 签名**:`(size, ringColor, shadowStyle, c,
|
|
9
|
+
* fontScale)` 5 参,
|
|
9
10
|
* 而非项目通用 `(c: ColorTokens, s: ShadowTokens) => StyleSheet` 2 参。
|
|
10
11
|
*
|
|
11
12
|
* **为何破例**:`size` / `ringColor` 是 **props 派生**(每次调用值不同,如 ring 宽度
|
|
12
13
|
* = `size * 0.0625`、label 字号 = `size * 0.40`、inner 直径 = `size - ringWidth*2`),
|
|
13
|
-
* 标准 `useThemedStyles(maker)` 按 `[colors, shadow]` memo
|
|
14
|
-
*
|
|
15
|
-
* shadow.brandAvatar])` 精确缓存,signature 因此带上
|
|
16
|
-
*
|
|
14
|
+
* 标准 `useThemedStyles(maker)` 按 `[colors, shadow, fontScale, maker]` memo,且假设 maker
|
|
15
|
+
* 是模块顶层常量,无法承接 props 变化。改走调用点自带 `useMemo([size, ringColor, c,
|
|
16
|
+
* shadow.brandAvatar, fontScale])` 精确缓存,signature 因此带上
|
|
17
|
+
* size/ringColor/shadow/fontScale 四个运行期入参,c 仍传入用于 label 文字色。
|
|
17
18
|
*
|
|
18
19
|
* **不用 borderWidth + borderColor 实现 ring**:RN new arch (Fabric) 在
|
|
19
20
|
* iOS 上对 `borderColor: rgba alpha + borderRadius: width/2`(完全圆)的组合
|
|
@@ -27,7 +28,8 @@ export const makeAvatarStyles = (
|
|
|
27
28
|
size: number,
|
|
28
29
|
ringColor: string,
|
|
29
30
|
shadowStyle: ViewStyle,
|
|
30
|
-
c: ColorTokens
|
|
31
|
+
c: ColorTokens,
|
|
32
|
+
fontScale: number
|
|
31
33
|
) => {
|
|
32
34
|
// 防御非法 size:NaN / 负数 / 0 会导致 inner 为负传入 SVG。
|
|
33
35
|
// 最小合理值 = ringWidth*2 + 1(至少 1pt 圆心可见)。
|
|
@@ -68,10 +70,10 @@ export const makeAvatarStyles = (
|
|
|
68
70
|
justifyContent: 'center',
|
|
69
71
|
},
|
|
70
72
|
label: {
|
|
71
|
-
fontSize: r(Math.round(safeSize * 0.4)),
|
|
73
|
+
fontSize: scaleFontMetric(r(Math.round(safeSize * 0.4)), fontScale),
|
|
72
74
|
fontWeight: fw.bold,
|
|
73
75
|
color: c.onPrimary,
|
|
74
|
-
letterSpacing: -0.5,
|
|
76
|
+
letterSpacing: scaleFontMetric(-0.5, fontScale),
|
|
75
77
|
textAlign: 'center',
|
|
76
78
|
},
|
|
77
79
|
});
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
2
|
import { Text, View } from 'react-native';
|
|
3
3
|
import { useColors, useThemedStyles } from '../../../theme';
|
|
4
|
+
import { createLogger } from '../../../utils/logger';
|
|
5
|
+
import { A11Y_HIDDEN_PROPS } from '../../ui/shared/a11y';
|
|
6
|
+
import { buildVersionPillLabel, resolveVersionStatus } from './content';
|
|
4
7
|
import { makeVersionPillStyles } from './styles';
|
|
5
8
|
import type { VersionPillProps } from './types';
|
|
6
9
|
|
|
10
|
+
const log = createLogger('VersionPill');
|
|
11
|
+
|
|
7
12
|
/** 版本徽章胶囊 —— success dot + 版本 + 分点 + build mono。 */
|
|
8
13
|
export function VersionPill({
|
|
9
14
|
version,
|
|
10
15
|
build,
|
|
11
|
-
|
|
16
|
+
status,
|
|
12
17
|
versionPrefix = '版本 ',
|
|
13
18
|
buildPrefix = 'build ',
|
|
14
19
|
style,
|
|
@@ -16,13 +21,24 @@ export function VersionPill({
|
|
|
16
21
|
}: VersionPillProps): React.JSX.Element {
|
|
17
22
|
const c = useColors();
|
|
18
23
|
const styles = useThemedStyles(makeVersionPillStyles);
|
|
19
|
-
const
|
|
24
|
+
const resolvedStatus = resolveVersionStatus(status, c);
|
|
25
|
+
const statusDiagnosticKey = resolvedStatus.diagnostics.join(',');
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (statusDiagnosticKey.length > 0) {
|
|
29
|
+
log.warn('VersionPill status.label 不能为空白,已回退为“状态未知”。');
|
|
30
|
+
}
|
|
31
|
+
}, [statusDiagnosticKey]);
|
|
20
32
|
// build 的「省略」契约:undefined / null / "" 均视为空;字符串 "0" 不省略。
|
|
21
33
|
const hasBuild = build != null && build !== '';
|
|
22
|
-
//
|
|
23
|
-
const a11yLabel =
|
|
24
|
-
|
|
25
|
-
|
|
34
|
+
// 可见状态补齐颜色之外的语义;外层仍负责把全部片段合并成单一读屏名称。
|
|
35
|
+
const a11yLabel = buildVersionPillLabel({
|
|
36
|
+
version,
|
|
37
|
+
build,
|
|
38
|
+
statusLabel: resolvedStatus.label,
|
|
39
|
+
versionPrefix,
|
|
40
|
+
buildPrefix,
|
|
41
|
+
});
|
|
26
42
|
return (
|
|
27
43
|
<View
|
|
28
44
|
accessible
|
|
@@ -32,33 +48,23 @@ export function VersionPill({
|
|
|
32
48
|
>
|
|
33
49
|
{/* 状态点仅颜色通道,屏幕阅读器由外层容器统一朗读,此处隐藏 */}
|
|
34
50
|
<View
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
importantForAccessibility="no"
|
|
51
|
+
{...A11Y_HIDDEN_PROPS}
|
|
52
|
+
style={[styles.dot, { backgroundColor: resolvedStatus.color }]}
|
|
38
53
|
/>
|
|
39
|
-
<Text
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
>
|
|
54
|
+
<Text {...A11Y_HIDDEN_PROPS} style={styles.status}>
|
|
55
|
+
{resolvedStatus.label}
|
|
56
|
+
</Text>
|
|
57
|
+
<Text {...A11Y_HIDDEN_PROPS} style={styles.version}>
|
|
44
58
|
{versionPrefix}
|
|
45
59
|
{version}
|
|
46
60
|
</Text>
|
|
47
61
|
{hasBuild ? (
|
|
48
62
|
<>
|
|
49
63
|
{/* 分隔符「·」无语义,隐藏于无障碍树 */}
|
|
50
|
-
<Text
|
|
51
|
-
style={styles.sep}
|
|
52
|
-
accessibilityElementsHidden
|
|
53
|
-
importantForAccessibility="no"
|
|
54
|
-
>
|
|
64
|
+
<Text {...A11Y_HIDDEN_PROPS} style={styles.sep}>
|
|
55
65
|
·
|
|
56
66
|
</Text>
|
|
57
|
-
<Text
|
|
58
|
-
style={styles.build}
|
|
59
|
-
accessibilityElementsHidden
|
|
60
|
-
importantForAccessibility="no"
|
|
61
|
-
>
|
|
67
|
+
<Text {...A11Y_HIDDEN_PROPS} style={styles.build}>
|
|
62
68
|
{buildPrefix}
|
|
63
69
|
{build}
|
|
64
70
|
</Text>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ColorTokens } from '../../../theme';
|
|
2
|
+
import { normalizeNonBlankText } from '../../ui/shared/accessibilityName';
|
|
3
|
+
import type { VersionStatus } from './types';
|
|
4
|
+
|
|
5
|
+
type VersionStatusColors = Pick<ColorTokens, 'foregroundMuted' | 'success'>;
|
|
6
|
+
|
|
7
|
+
type ResolvedVersionStatus = {
|
|
8
|
+
label: string;
|
|
9
|
+
color: string;
|
|
10
|
+
diagnostics: readonly string[];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function resolveVersionStatus(
|
|
14
|
+
status: VersionStatus | undefined,
|
|
15
|
+
colors: VersionStatusColors
|
|
16
|
+
): ResolvedVersionStatus {
|
|
17
|
+
if (status == null) {
|
|
18
|
+
return { label: '正常', color: colors.success, diagnostics: [] };
|
|
19
|
+
}
|
|
20
|
+
const label = normalizeNonBlankText(status.label);
|
|
21
|
+
return {
|
|
22
|
+
label: label ?? '状态未知',
|
|
23
|
+
color: status.color ?? colors.foregroundMuted,
|
|
24
|
+
diagnostics: label === undefined ? ['status.label'] : [],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type VersionPillLabelContent = {
|
|
29
|
+
version: string;
|
|
30
|
+
build: string | null | undefined;
|
|
31
|
+
statusLabel: string;
|
|
32
|
+
versionPrefix: string;
|
|
33
|
+
buildPrefix: string;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export function buildVersionPillLabel({
|
|
37
|
+
version,
|
|
38
|
+
build,
|
|
39
|
+
statusLabel,
|
|
40
|
+
versionPrefix,
|
|
41
|
+
buildPrefix,
|
|
42
|
+
}: VersionPillLabelContent): string {
|
|
43
|
+
const versionLabel = `${versionPrefix}${version}`;
|
|
44
|
+
const buildLabel =
|
|
45
|
+
build != null && build !== '' ? `,${buildPrefix}${build}` : '';
|
|
46
|
+
return `${versionLabel}${buildLabel},${statusLabel}`;
|
|
47
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { VersionPill } from './VersionPill';
|
|
2
|
-
export type { VersionPillProps } from './types';
|
|
2
|
+
export type { VersionPillProps, VersionStatus } from './types';
|
|
@@ -28,6 +28,10 @@ export const makeVersionPillStyles = (c: ColorTokens) =>
|
|
|
28
28
|
height: r(5),
|
|
29
29
|
borderRadius: radius.pill,
|
|
30
30
|
},
|
|
31
|
+
status: {
|
|
32
|
+
fontSize: type.microPlus,
|
|
33
|
+
color: c.foregroundMuted,
|
|
34
|
+
},
|
|
31
35
|
version: {
|
|
32
36
|
fontSize: type.microPlus,
|
|
33
37
|
color: c.foregroundMuted,
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import type { StyleProp, ViewStyle } from 'react-native';
|
|
2
2
|
|
|
3
|
+
export type VersionStatus = {
|
|
4
|
+
label: string;
|
|
5
|
+
color?: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
3
8
|
export type VersionPillProps = {
|
|
4
9
|
/** 版本号,如 "2.8.0"。 */
|
|
5
10
|
version: string;
|
|
6
11
|
/** 可选 build 号;值为 null/undefined/"" 时省略分点与 build 字。 */
|
|
7
12
|
build?: string;
|
|
8
|
-
/**
|
|
9
|
-
|
|
13
|
+
/** 可见状态;缺省为 success 色的“正常”。 */
|
|
14
|
+
status?: VersionStatus;
|
|
10
15
|
/**
|
|
11
16
|
* 版本号前缀文案,默认 "版本 "。
|
|
12
17
|
* 消费者可传 "v" / "Version " 等覆盖(含末尾空格)。
|
|
@@ -24,4 +24,4 @@ export { AvatarWithRing } from './AvatarWithRing';
|
|
|
24
24
|
export type { AvatarWithRingProps } from './AvatarWithRing';
|
|
25
25
|
|
|
26
26
|
export { VersionPill } from './VersionPill';
|
|
27
|
-
export type { VersionPillProps } from './VersionPill';
|
|
27
|
+
export type { VersionPillProps, VersionStatus } from './VersionPill';
|
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
import { useId } from 'react';
|
|
2
2
|
|
|
3
|
+
export function sanitizeSvgIdPart(value: string): string {
|
|
4
|
+
return value
|
|
5
|
+
.replace(/[^A-Za-z0-9_.-]+/gu, '-')
|
|
6
|
+
.replace(/^[.-]+|[.-]+$/gu, '');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function buildSvgId(
|
|
10
|
+
prefix: string,
|
|
11
|
+
override: string | undefined,
|
|
12
|
+
reactId: string
|
|
13
|
+
): string {
|
|
14
|
+
const cleanOverride =
|
|
15
|
+
override === undefined ? '' : sanitizeSvgIdPart(override);
|
|
16
|
+
const cleanPrefix = sanitizeSvgIdPart(prefix);
|
|
17
|
+
const cleanReactId = sanitizeSvgIdPart(reactId);
|
|
18
|
+
const automatic =
|
|
19
|
+
[cleanPrefix, cleanReactId].filter(Boolean).join('-') ||
|
|
20
|
+
['svg-id', cleanReactId].filter(Boolean).join('-') ||
|
|
21
|
+
'svg-id';
|
|
22
|
+
const candidate = cleanOverride || automatic;
|
|
23
|
+
return /^[A-Za-z_]/u.test(candidate) ? candidate : `svg-id-${candidate}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
3
26
|
/**
|
|
4
|
-
* SVG 渐变 id 生成 hook —— 消毒 React
|
|
27
|
+
* SVG 渐变 id 生成 hook —— 消毒 prefix、override 与 React useId。
|
|
5
28
|
*
|
|
6
|
-
* Why:
|
|
7
|
-
*
|
|
8
|
-
* 会导致 SVG 引用失败。sanitize 后拼上 prefix 保证唯一且合法。
|
|
29
|
+
* Why:useId() 的字符串格式由 renderer 决定,caller 传入的 prefix 与 override
|
|
30
|
+
* 也可能包含空白或标点;统一消毒并保证合法首字符后,SVG 引用才能跨平台稳定。
|
|
9
31
|
*
|
|
10
32
|
* @param prefix 短前缀,区分同屏多 gradient(如 "gw" / "rh" / "av")。
|
|
11
|
-
* @param override 可选:外部传入的 gradientId
|
|
33
|
+
* @param override 可选:外部传入的 gradientId;消毒后非空时优先使用。
|
|
12
34
|
*/
|
|
13
35
|
export function useSvgId(prefix: string, override?: string): string {
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
return `${prefix}-${autoId.replace(/[^a-zA-Z0-9_-]/g, '')}`;
|
|
36
|
+
const reactId = useId();
|
|
37
|
+
return buildSvgId(prefix, override, reactId);
|
|
17
38
|
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import {
|
|
3
|
-
import { useColors } from '../../../theme';
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text, View } from 'react-native';
|
|
3
|
+
import { scaleFontMetric, useColors, useFontScale } from '../../../theme';
|
|
4
|
+
import { resolveImageSource } from '../../../utils/imageSource';
|
|
5
|
+
import { ImageAttempt } from '../shared/ImageAttempt';
|
|
4
6
|
import { paletteFor, sizingFor, styles } from './styles';
|
|
5
7
|
import type { AvatarProps } from './types';
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* 圆形头像 —— 5 档尺寸 × 4 种配色 × 可选图片 source。
|
|
9
11
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
+
* 合法 source 由 keyed ImageAttempt 独立持有失败状态;非法 source 或加载失败
|
|
13
|
+
* 时渲染 label + variant 背景色。
|
|
12
14
|
*/
|
|
13
15
|
export function Avatar({
|
|
14
16
|
label,
|
|
@@ -19,26 +21,19 @@ export function Avatar({
|
|
|
19
21
|
testID,
|
|
20
22
|
}: AvatarProps): React.JSX.Element {
|
|
21
23
|
const c = useColors();
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
// [M-20] React 18+ 已移除 unmount 后 setState 的 warning,mountedRef 守卫为死码,删除。
|
|
25
|
-
// [L-44] source 变化时重置 imageFailed,否则换图 URL 后仍展示 fallback 文字。
|
|
26
|
-
// source 可能是对象形态({ uri }),按 uri 字段做细粒度比较。
|
|
27
|
-
const uri =
|
|
28
|
-
source != null && typeof source === 'object' && 'uri' in source
|
|
29
|
-
? (source as { uri?: string }).uri
|
|
30
|
-
: null;
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
setImageFailed(false);
|
|
33
|
-
}, [uri, source]);
|
|
34
|
-
|
|
35
|
-
const handleImageError = () => {
|
|
36
|
-
setImageFailed(true);
|
|
37
|
-
};
|
|
24
|
+
const fontScale = useFontScale();
|
|
38
25
|
const dims = sizingFor(size);
|
|
39
26
|
const palette = paletteFor(variant, c);
|
|
40
|
-
|
|
41
|
-
const
|
|
27
|
+
const labelFontSize = scaleFontMetric(dims.fs, fontScale);
|
|
28
|
+
const resolvedSource = resolveImageSource(source);
|
|
29
|
+
const fallback = (
|
|
30
|
+
<Text
|
|
31
|
+
style={[styles.label, { fontSize: labelFontSize, color: palette.fg }]}
|
|
32
|
+
numberOfLines={1}
|
|
33
|
+
>
|
|
34
|
+
{label}
|
|
35
|
+
</Text>
|
|
36
|
+
);
|
|
42
37
|
|
|
43
38
|
return (
|
|
44
39
|
<View
|
|
@@ -56,20 +51,16 @@ export function Avatar({
|
|
|
56
51
|
accessibilityLabel={label}
|
|
57
52
|
testID={testID}
|
|
58
53
|
>
|
|
59
|
-
{
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
54
|
+
{resolvedSource === undefined ? (
|
|
55
|
+
fallback
|
|
56
|
+
) : (
|
|
57
|
+
<ImageAttempt
|
|
58
|
+
key={resolvedSource.key}
|
|
59
|
+
source={resolvedSource.source}
|
|
60
|
+
fallback={fallback}
|
|
63
61
|
style={styles.image}
|
|
64
62
|
resizeMode="cover"
|
|
65
63
|
/>
|
|
66
|
-
) : (
|
|
67
|
-
<Text
|
|
68
|
-
style={[styles.label, { fontSize: dims.fs, color: palette.fg }]}
|
|
69
|
-
numberOfLines={1}
|
|
70
|
-
>
|
|
71
|
-
{label}
|
|
72
|
-
</Text>
|
|
73
64
|
)}
|
|
74
65
|
</View>
|
|
75
66
|
);
|
|
@@ -23,8 +23,12 @@ export type AvatarProps = {
|
|
|
23
23
|
/** 配色变体,默认 'neutral' */
|
|
24
24
|
variant?: AvatarVariant;
|
|
25
25
|
/**
|
|
26
|
-
* 真实头像图片(URL `{ uri: '...' }
|
|
27
|
-
*
|
|
26
|
+
* 真实头像图片(URL `{ uri: '...' }`、URI source 数组或 `require(...)`)。
|
|
27
|
+
* 运行时先校验并生成 immutable semantic snapshot;非法 source 直接 fallback。
|
|
28
|
+
* Web 对 URI source 数组明确使用首个 candidate,native 保留完整数组。
|
|
29
|
+
* class / custom prototype 只读取 own enumerable data,继承属性与 accessor 无效。
|
|
30
|
+
* 等价 source 沿用同一 keyed attempt,真实字段变化才重试;失败 state 不跨
|
|
31
|
+
* attempt 共享。
|
|
28
32
|
*/
|
|
29
33
|
source?: ImageSourcePropType;
|
|
30
34
|
/** 容器附加样式(margin / position 等布局微调)。 */
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
2
|
import { Text } from 'react-native';
|
|
3
|
-
import { useThemedStyles } from '../../../theme';
|
|
3
|
+
import { scaleFontMetric, useFontScale, useThemedStyles } from '../../../theme';
|
|
4
|
+
import { createLogger } from '../../../utils/logger';
|
|
4
5
|
import { Icon } from '../Icon';
|
|
6
|
+
import { normalizeNonBlankText } from '../shared/accessibilityName';
|
|
5
7
|
import { ButtonBase } from './ButtonBase';
|
|
6
8
|
import { makeStyles } from './styles';
|
|
7
9
|
import type { ButtonProps } from './types';
|
|
8
10
|
|
|
11
|
+
const log = createLogger('Button');
|
|
12
|
+
|
|
9
13
|
/**
|
|
10
14
|
* 7 variant × 3 size 文本按钮。
|
|
11
15
|
* 内部组合 ButtonBase + content(label + 可选 leftIcon / rightIcon),
|
|
@@ -26,37 +30,52 @@ export function Button({
|
|
|
26
30
|
style,
|
|
27
31
|
testID,
|
|
28
32
|
accessibilityHint,
|
|
33
|
+
accessibilityState,
|
|
29
34
|
}: ButtonProps): React.JSX.Element {
|
|
30
35
|
const styles = useThemedStyles(makeStyles);
|
|
36
|
+
const fontScale = useFontScale();
|
|
37
|
+
const accessibleName = normalizeNonBlankText(label);
|
|
38
|
+
const hasBlankLabel = accessibleName === undefined;
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (hasBlankLabel) {
|
|
42
|
+
log.warn('Button label 不能为空白,当前 action 已禁用。');
|
|
43
|
+
}
|
|
44
|
+
}, [hasBlankLabel]);
|
|
45
|
+
|
|
31
46
|
return (
|
|
32
47
|
<ButtonBase
|
|
33
48
|
onPress={onPress}
|
|
34
49
|
size={size}
|
|
35
50
|
variant={variant}
|
|
36
51
|
block={block}
|
|
37
|
-
disabled={disabled}
|
|
52
|
+
disabled={disabled === true || hasBlankLabel}
|
|
38
53
|
loading={loading}
|
|
39
|
-
accessibilityLabel={
|
|
54
|
+
accessibilityLabel={accessibleName}
|
|
40
55
|
accessibilityHint={accessibilityHint}
|
|
56
|
+
accessibilityState={accessibilityState}
|
|
41
57
|
style={style}
|
|
42
58
|
testID={testID}
|
|
43
59
|
>
|
|
44
|
-
{({ sizing, palette }) =>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
{({ sizing, palette }) => {
|
|
61
|
+
const textSize = scaleFontMetric(sizing.fs, fontScale);
|
|
62
|
+
return (
|
|
63
|
+
<>
|
|
64
|
+
{leftIcon ? (
|
|
65
|
+
<Icon name={leftIcon} size={sizing.fs + 2} color={palette.fg} />
|
|
66
|
+
) : null}
|
|
67
|
+
<Text
|
|
68
|
+
style={[styles.label, { color: palette.fg, fontSize: textSize }]}
|
|
69
|
+
numberOfLines={1}
|
|
70
|
+
>
|
|
71
|
+
{label}
|
|
72
|
+
</Text>
|
|
73
|
+
{rightIcon ? (
|
|
74
|
+
<Icon name={rightIcon} size={sizing.fs + 2} color={palette.fg} />
|
|
75
|
+
) : null}
|
|
76
|
+
</>
|
|
77
|
+
);
|
|
78
|
+
}}
|
|
60
79
|
</ButtonBase>
|
|
61
80
|
);
|
|
62
81
|
}
|