What's Changed
First beta of the 4.25.0 release.
This version is a major step towards stabilization of the Tabs API.
It brings both, many API changes in yet-unstable Tabs API and internal refactors
allowing us to bring you more stable & reliable experience.
The Tabs API we publish in this version is a "stable candidate".
We'll release a couple more of 4.25.0 versions and "stable candidate API" in stable
4.25.0 version. Once we receive final round of feedback we plan to stabilize the
Tabs API in 4.26.0.
✅ Improvements
- feat(Tabs): remove
freezeContents&placeholderprops by @kkafar in #3673 - feat(Android, Tabs): Add support for selectedIcon on Android by @t0maboro in #3633
- chore: define min. required
react-nativeversion inpeerDependenciesby @kkafar in #3691 - feat: add
ScrollViewMarkerexperimental component by @kkafar in #3674 - feat(Android, Tabs): State-driven appearance on Android by @t0maboro in #3714
- feat(iOS, Tabs): handle
colorScheme(dark mode) by @kligarski in #3716 - feat(Tabs, Android): handle
colorScheme(dark mode) by @kligarski in #3723 - feat(Tabs): add native RTL support for bottom tabs on iOS & Android by @ahmedawaad1804 in #3613
- feat(Android): configure
RNSLogutility by @sgaczol in #3718 - chore(Android): disable default RNSLog activation in debug mode by @sgaczol in #3730
- feat(iOS, Stack v4): Use new invalidation callback on Fabric by @t0maboro in #3728
- feat(JS) -
RNSLogutility by @sgaczol in #3733 - feat(iOS): configure
RNSLogutility by @sgaczol in #3727 - refactor(Tabs): Split JS components and specs internally by @t0maboro in #3722
- feat(iOS, Tabs): Migrate tabs to new invalidate callback on Fabric by @t0maboro in #3729
- refactor(Tabs): Rename
tabKeytoscreenKeyby @t0maboro in #3750 - refactor(JS, Tabs): Cleanup API following design doc by @t0maboro in #3748
- feat(Android, Tabs): add prop to configure whether tab bar respects IME insets by @kligarski in #3740
- chore(JS):
RNSLogremove from public API by @sgaczol in #3744 - fix(iOS, Modal): Filter-out obsolete state updates from JS by @t0maboro in #3760
- refactor(Tabs, Android): Split
TabsHostintoTabsHostandTabsContainerby @kkafar in #3766 - fix(iOS, StackV5): Fix default props type by @t0maboro in #3800
- feat(Android, Tabs): partially implement RFC-1028 for Tabs on Android by @kkafar in #3776
- feat(iOS, Tabs): partially implement RFC-1028 for Tabs on iOS by @kkafar in #3781
- chore: make all exports from v5 component modules explicit by @kkafar in #3808
- feat(iOS, Tabs): Add proper support for
moreNavigationControlleron iOS by @kkafar in #3785 - refactor(tabs): rename
onTabChangeevent toonTabSelectedby @kkafar in #3789 - fix(iOS, Tabs): fix diverging behavior of JS updates requesting
moreNavigationControlleron various Apple platforms by @kkafar in #3813 - feat(Tabs): update operation model, add
TabSelectionRejectedEventand support rejecting stale state updates by @kkafar in #3794 - fix(Android, Tabs): fix issue with badges being assigned to wrong menu items by @kkafar in #3799
- chore: Bump RN to 0.85.0-rc.7 by @t0maboro in #3822
- feat(Tabs): add preventNativeSelection support by @kkafar in #3838
- feat(Android, Stack v5): add basic support for header by @kligarski in #3753
- chore(Tabs): remove isFocused prop from TabsScreen codegen spec by @kkafar in #3863
- refactor(Tabs, iOS): decouple moreNavigationController from navigation state by @kkafar in #3875
- feat(iOS, Stack v4): allow background color customization by @sgaczol in #3833
- chore: bump RN to 0.85.0 by @sgaczol in #3865
- feat(Android, Stack v4): Add prop for manual opt-out from applying inset to header by @t0maboro in #3835
- feat(iOS, Stack v5): Align Stack implementation with RFC 753 by @kmichalikk in #3774
- refactor(Tabs): remove controlledBottomTabs / controlNavigationStateInJS option by @kkafar in #3888
- chore(Tabs): add usesStableTabsApi compatibility flag by @kkafar in #3889
- refactor(iOS, Tabs): Migrate scrollEdgeEffects from TabsScreen to ScrollViewMarker by @t0maboro in #3895
- chore(types): enable
exactOptionalPropertyTypessupport by @YevheniiKotyrlo in #3719 - feat(Android, Stack v5): handle header configuration and custom subviews by @kligarski in #3796
- feat(Android, Stack v5): add back button to header with customization by @kligarski in #3883
🐞 Bug fixes
- fix(Examples): Fix default icon provider by @t0maboro in #3742
- fix(iOS, Stack v4): Fix
usePreventRemovecallback not called when tapping formSheet backdrop by @t0maboro in #3771 - fix(iOS, Stack v4): hide back button when root screen is replaced with
popanimation by @kligarski in #3770 - fix(iOS): forward scrollEdgeEffects to inner screen in modals (#3816) by @maxencehenneron in #3825
- fix(Android, Stack v4): Add heuristic for applying inset only on top-level header by @t0maboro in #3793
- fix(android): Fix Activity memory leak in ScreenDummyLayoutHelper due to unreleased view references and missing lifecycle cleanup by @l2hyunwoo in #3638
- fix(Android, Stack v4): Clear supportActionBar on fragment removal to prevent ScreenStackFragment leak by @t0maboro in #3867
- fix(Tabs, iOS): reconcile navigation state on implicit UIKit selection changes by @kkafar in #3877
- fix(ios): guard +load with #ifdef RCT_DYNAMIC_FRAMEWORKS by @DavidDuarte22 in #3828
- fix: use path-based menuId to prevent collisions in nested submenus by @chrism in #3762
- fix(Android, Stack): dispatch lifecycle events when parent is not a ScreenFragment by @collectioneur in #3854
- fix(iOS, Stack v4): Fix reattaching screens which have preventNativeDismiss set by @t0maboro in #3886
- fix(iOS, Tabs): prevent double event on more tab navigation by @kkafar in #3906
🔢 Misc
- chore: rename
TabsAccessorytoTabsBottomAccessoryby @kligarski in #3712 - chore(Android, Tabs): move tabs files to separate packages by @kligarski in #3661
- chore(CI): remove workflows related to the legacy architecture by @kkafar in #3686
- chore(deps): bump tar from 7.5.7 to 7.5.9 in /FabricExample by @dependabot[bot] in #3687
- chore(deps): bump basic-ftp from 5.0.5 to 5.2.0 by @dependabot[bot] in #3688
- chore(readme): update supported RN versions in readme (drop legacy arch) by @kkafar in #3692
- chore: Update lockfiles after 4.24 release by @t0maboro in #3699
- chore: Update workflows after labels sync by @t0maboro in #3701
- docs: add banner rotator by @p-malecki in #3696
- docs: add analytics to banner by @p-malecki in #3703
- chore: Move iOS runners to macos-26-xlarge instances by @kmichalikk in #3671
- chore(deps): bump fast-xml-parser from 4.5.0 to 4.5.4 in /TVOSExample by @dependabot[bot] in #3705
- chore(deps): bump fast-xml-parser from 4.5.1 to 4.5.4 in /Example by @dependabot[bot] in #3706
- chore(deps): bump fast-xml-parser from 4.5.2 to 4.5.4 by @dependabot[bot] in #3707
- chore(deps): bump minimatch from 3.1.2 to 3.1.5 in /FabricExample by @dependabot[bot] in #3693
- chore: Remove Paper Example by @kmichalikk in #3710
- chore: Update TVOSExample to RN 0.84 by @kmichalikk in #3713
- refactor(Android): logNotAvailable refactor on Android by @sgaczol in #3697
- chore(iOS, Split): align naming for native components by @sgaczol in #3695
- chore(deps): bump fast-xml-parser from 4.5.2 to 4.5.4 in /FabricExample by @dependabot[bot] in #3715
- chore(deps): bump minimatch from 3.1.2 to 3.1.5 in /TVOSExample by @dependabot[bot] in #3717
- chore: Simplify single test import in App.tsx by @kmichalikk in #3678
- fix(examples): Convert object to array for props.scenarioGroup and props.scenario by @t0maboro in #3720
- chore(deps): aggregate dependabot updates by @kkafar in #3737
- chore(deps): bump tar from 7.5.9 to 7.5.11 in /FabricExample by @dependabot[bot] in #3738
- chore(Android): Remove android/src/paper directory and related code by @kmichalikk in #3743
- chore(JS, Tabs): Refactor file structure for components in Tabs by @t0maboro in #3745
- chore: Remove Paper related code & annotation from Tabs by @kmichalikk in #3746
- chore: format SplitView conversions by @kligarski in #3749
- chore(JS, Tabs): Remove dead code around
onLifecycleStateChangeevent by @t0maboro in #3752 - chore(Android): Remove BottomSheet-related Paper-specific code by @kmichalikk in #3751
- chore(deps): bump tar from 7.5.10 to 7.5.11 by @dependabot[bot] in #3754
- fix(Examples): Fix TestBottomTabsOrientation by @t0maboro in #3757
- refactor(example): rename leftover symbols mentioning "bottom tabs" by @kkafar in #3756
- test(e2e, Fabric): add e2e tests for issue/PR examples 748..758, remove Test713 by @kligarski in #2932
- docs: remove paradise banner by @p-malecki in #3787
- refactor(example): align TabsContainer structure with StackContainer by @kkafar in #3759
- refactor(example): align TabsContainer with StackContainer & retire TabsConfigProvider by @kkafar in #3764
- refactor(example): remove TabsConfigProvider/TabsAutoconfig infrastructure by @kkafar in #3765
- chore(readme): fix link to example usage in FullWindowOverlay section by @retyui in #3779
- chore(Android, Stack): remove legacy architecture related code by @sgaczol in #3775
- chore(Android, SafeArea): remove legacy architecture related code by @sgaczol in #3778
- chore: review suggestions for #3759 by @kkafar in #3790
- chore(deps): aggregate dependabot updates by @kkafar in #3810
- chore: exclude AI agent config files from repo by @kkafar in #3820
- fix(Example): fix Test3492 after changes to TabsContainer by @kligarski in #3823
- chore: remove local changelog requirement from PR template by @kligarski in #3829
- fix(example): correct TabsHostConfig type to exclude navState by @kkafar in #3830
- refactor(example): use path aliases for imports in example apps by @kkafar in #3821
- refactor(tabs): extract TabsContainerItem and memoize tab screens by @kkafar in #3827
- chore(Android): remove legacy architecture related code by @sgaczol in #3836
- chore(iOS, SafeArea): legacy architecture related code removal by @sgaczol in #3837
- chore(iOS, Stack): remove legacy architecture related code by @sgaczol in #3788
- chore(tests): Tab-bar-hidden test refactor with new manual scenario by @LKuchno in #3840
- refactor(tests): reorganizing test-tabs-color-scheme and adding scenario by @LKuchno in #3844
- refactor(tests): test-tabs-tab-bar-hidden scenario update by @LKuchno in #3846
- chore(deps): Aggregate dependabot updates by @kkafar in #3853
- chore(test): new test-tabs-minimize-behavior-ios with scenario by @LKuchno in #3852
- refactor(tests): reorganizing test-tabs-layout-direction plus scenario by @LKuchno in #3845
- refactor(tests): test-tabs-color-scheme test rename to test-tabs-tab-bar-color-scheme by @LKuchno in #3857
- chore(test): new test-tabs-controller-mode-ios with scenario by @LKuchno in #3848
- refactor(test): defining testID for ScenarioButton an assign scenario key property value to it by @LKuchno in #3866
- refactor(Tabs, iOS): extract RNSTabBarControllerDelegate into a formal protocol by @kkafar in #3876
- fix(CI): fix nightly releases by bumping node version by @kligarski in #3878
- chore(TVOSExample): bump RN to 0.85.0 by @sgaczol in #3882
- refactor(test): Changed indentation spaces and updated the style using StyleSheet by @LKuchno in #3887
- chore(test): E2E test for tabBarHidden and function to select SFT screens in e2e by @LKuchno in #3879
- chore(deps): aggregate dependabot updates by @kkafar in #3890
- feat(Example): add ThemeProvider for testing by @sgaczol in #3864
- chore(test): add scenario template in dedicated directory by @LKuchno in #3891
- fix(Example): fix Colors imports by @sgaczol in #3892
- chore: Run formatters by @t0maboro in #3893
- ci: add publish workflow using npm-package-publish action by @kkafar in #3898
- refactor(test): tabBarHidden scenario refactored, e2e test title updated by @LKuchno in #3900
- refactor(test): Existing test scenario updates - unify with scenario template by @LKuchno in #3902
- fix(Example): prevent unwanted full reload by @sgaczol in #3894
- chore(CI): disable dry-run enforcement for nightly workflow by @kkafar in #3903
- chore(tests): allow forcing tab-select action when already selected by @kkafar in #3907
- chore(CI): remove old nightly publish workflow by @kkafar in #3913
- chore(CI): move dry-run input to top of publish workflow by @kkafar in #3915
- chore(release): bump version to 4.25.0-beta.1 by @kkafar in #3916
New Contributors
- @sgaczol made their first contribution in #3697
- @ahmedawaad1804 made their first contribution in #3613
- @LKuchno made their first contribution in #3840
- @l2hyunwoo made their first contribution in #3638
- @DavidDuarte22 made their first contribution in #3828
- @chrism made their first contribution in #3762
- @collectioneur made their first contribution in #3854
- @YevheniiKotyrlo made their first contribution in #3719
Full Changelog: 4.24.0...4.25.0-beta.1