feat(react-native): add panGestureHandlerProps to BottomSheet#1016
Conversation
📖 Storybook Preview |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Spread order allows overriding critical internal gesture props
- Reordered the PanGestureHandler JSX to spread consumer props before internal enabled and onGestureEvent so internal behavior cannot be overridden.
Or push these changes by commenting:
@cursor push 3c6e6890cf
Preview (3c6e6890cf)
diff --git a/packages/design-system-react-native/src/components/BottomSheetDialog/BottomSheetDialog.tsx b/packages/design-system-react-native/src/components/BottomSheetDialog/BottomSheetDialog.tsx
--- a/packages/design-system-react-native/src/components/BottomSheetDialog/BottomSheetDialog.tsx
+++ b/packages/design-system-react-native/src/components/BottomSheetDialog/BottomSheetDialog.tsx
@@ -282,9 +282,9 @@ const BottomSheetDialog = forwardRef<
{...props}
>
<PanGestureHandler
+ {...panGestureHandlerProps}
enabled={isInteractable}
onGestureEvent={gestureHandler}
- {...panGestureHandlerProps}
>
<Animated.View
onLayout={updateSheetHeight}
@@ -282,9 +282,9 @@ const BottomSheetDialog = forwardRef<
{...props}
>
<PanGestureHandler
+ {...panGestureHandlerProps}
enabled={isInteractable}
onGestureEvent={gestureHandler}
- {...panGestureHandlerProps}
>
<Animated.View
onLayout={updateSheetHeight}You can send follow-ups to this agent here.
📖 Storybook Preview |
📖 Storybook Preview |
📖 Storybook Preview |
📖 Storybook Preview |
📖 Storybook Preview |
f7c0efe to
4249d78
Compare
📖 Storybook Preview |
|
|
||
| jest.mock('react-native-gesture-handler', () => ({ | ||
| PanGestureHandler: ({ children }: { children: React.ReactNode }) => children, | ||
| PanGestureHandler: ({ |
There was a problem hiding this comment.
Mocking PanGestureHandler as a View and capturing spread props lets this test suite verify real prop precedence behavior, not just rendering. That is why we store the last props in panGestureHandlerPropsRef before returning children.
| expect(getByTestId('pan-gesture-handler')).toBeDefined(); | ||
| }); | ||
|
|
||
| it('does not allow panGestureHandlerProps to override internal gesture props', () => { |
There was a problem hiding this comment.
This test intentionally bypasses the type restriction to prove runtime safety: internal enabled and onGestureEvent must stay authoritative even if a consumer force-casts conflicting values. Keeping this check prevents regressions if prop spread order changes.
| shouldNavigateBack={false} | ||
| onClose={goBack} | ||
| panGestureHandlerProps={{ | ||
| simultaneousHandlers: |
There was a problem hiding this comment.
simultaneousHandlers is scoped to Android because nested gesture arbitration differs there; wiring the ScrollView ref here keeps drag-to-dismiss and list scrolling from competing. This story demonstrates the intended integration point for consumers.
| decorators: [ | ||
| (Story) => ( | ||
| <Box twClassName="w-full h-full relative bg-background-alternative justify-center items-center"> | ||
| <Text>Content behind overlay</Text> | ||
| <Story /> | ||
| </Box> | ||
| ), | ||
| ], |
|
Looks good 👍 |
## Release 29.0.0 This release includes new React Native header and layout primitives, BottomSheet API updates, shared type migrations, and documentation/runtime dependency alignment across core design-system packages. ### 📦 Package Versions - @metamask/design-system-shared: 0.7.0 - @metamask/design-system-react: 0.14.0 - @metamask/design-system-react-native: 0.14.0 ### 🔄 Shared Type Updates (0.7.0) #### Added - Added shared types used by new React Native header components, including HeaderRoot contracts consumed by @metamask/design-system-react-native (#1029). - Added shared BoxHorizontal and BoxVertical utility component contracts for cross-platform layout primitives (#1003). #### Changed - Migrated AvatarBase type exports from enum-based definitions to shared const-object + string-union types, aligned with ADR-0003/ADR-0004 (#1005). - Updated @metamask/utils dependency to ^11.11.0 (#1033). ### 🌐 React Web Updates (0.14.0) #### Changed - BREAKING: Updated AvatarBase exports to consume shared const-object + string-union types rather than local enums (#1005). - No migration required for typical usage; continue importing from @metamask/design-system-react as before. - Runtime values remain stable while type definitions follow ADR-0003/ADR-0004. - Updated @metamask/utils peer dependency to ^11.11.0 (#1033). - Expanded BannerBase migration documentation to improve upgrade guidance for recent releases (#1011). ### 📱 React Native Updates (0.14.0) #### Added - Added HeaderRoot as a new root primitive for React Native header composition (#1029). - Added HeaderStandard for standardized title + action header layouts in mobile screens (#1028, #1030). - Added TextFieldSearch for search-style text input flows on mobile (#1027). - Added BoxHorizontal and BoxVertical utility components for directional layout composition (#1003). #### Changed - BREAKING: Replaced BottomSheet shouldNavigateBack with an optional goBack callback for explicit navigation handling in host apps (#1024). - Remove shouldNavigateBack usage and pass goBack when sheet close should navigate back. - See migration guide: packages/design-system-react-native/MIGRATION.md#from-version-0130-to-0140. - Added panGestureHandlerProps support to BottomSheet for gesture-handler customization (#1016). - Migrated React Native package exports from default exports to named exports for consistent import ergonomics (#1032). - BREAKING: Updated AvatarBase exports to use shared const-object + string-union types instead of local enums (#1005). - No migration required for typical usage; continue importing from @metamask/design-system-react-native as before. - Runtime values remain stable while type definitions follow ADR-0003/ADR-0004. - Updated @metamask/utils peer dependency to ^11.11.0 (#1033). - Expanded BannerBase migration documentation to improve upgrade guidance for consumers (#1011). #### Fixed - Updated BottomSheetHeader action button size to md for consistent sizing and visual alignment (#1012). ###⚠️ Breaking Changes - BottomSheet (React Native): replaced shouldNavigateBack with optional goBack callback (#1024). - Migration required where shouldNavigateBack was used; see packages/design-system-react-native/MIGRATION.md#from-version-0130-to-0140. - AvatarBase export type migration (React + React Native): moved from local enums to shared const-object + string-union types (#1005). - Marked breaking for type contract changes, but no migration is expected for typical consumer imports/usage. ### ✅ Checklist - [x] Changelogs updated with human-readable descriptions - [x] Changelog validation passed (yarn changelog:validate) - [x] Version bumps follow semantic versioning - [x] design-system-shared: minor (0.6.0 to 0.7.0) - shared types and dependency alignment - [x] design-system-react: minor (0.13.0 to 0.14.0) - shared type migration and docs/dependency updates - [x] design-system-react-native: minor (0.13.0 to 0.14.0) - new components and API enhancements - [x] Breaking changes documented with migration guidance - [x] Migration guides updated with before/after examples (if breaking changes) - [x] PR references included in changelog entries ## **Pre-merge author checklist** - [x] I have followed MetaMask Contributor Docs - [x] I have reviewed the Release Workflow cursor rule - [ ] All tests pass (yarn build && yarn test && yarn lint) - [x] Changelog validation passes (yarn changelog:validate) ## **Pre-merge reviewer checklist** - [x] I have reviewed the Reviewing Release PRs guide - [x] Package versions follow semantic versioning - [x] Changelog entries are consumer-facing (not commit message regurgitation) - [x] Breaking changes are documented in MIGRATION.md with examples - [x] All unreleased changes are accounted for in changelogs <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/bugbot) is generating a summary for commit 87c05a5. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Adds a `panGestureHandlerProps` prop object to the React Native `BottomSheet` API and forwards it to the child `PanGestureHandler` in `BottomSheetDialog`. This aligns with the mobile review suggestion to expose the full `PanGestureHandler` prop surface (instead of only specific gesture props), enabling cases like `simultaneousHandlers`/`waitFor` coordination with nested scroll or gesture views. Also includes: - Type updates for `BottomSheetDialogProps` - Prop threading through `BottomSheet` -> `BottomSheetDialog` - Tests for passthrough behavior in both components - README updates for both components ## **Related issues** Fixes: N/A ## **Manual testing steps** 1. Run `NODE_OPTIONS=--experimental-vm-modules yarn exec jest --config jest.config.js --watchman=false --collectCoverage=false --runTestsByPath src/components/BottomSheetDialog/BottomSheetDialog.test.tsx src/components/BottomSheet/BottomSheet.test.tsx` from `packages/design-system-react-native`. 2. Verify the new test `passes props to PanGestureHandler via panGestureHandlerProps` passes. 3. Verify `BottomSheet` forwards `panGestureHandlerProps` to `BottomSheetDialog` in tests. 4. Build package: `yarn workspace @metamask/design-system-react-native build`. ## **Screenshots/Recordings** Not applicable (API/types/tests/docs update only). ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Medium risk because it changes how gesture handler props are composed and threaded into `PanGestureHandler`, which can affect swipe/scroll interactions across platforms. Coverage is improved with new tests and the prop explicitly prevents overriding `enabled`/`onGestureEvent`. > > **Overview** > **Adds a new `panGestureHandlerProps` API** on `BottomSheet` and `BottomSheetDialog`, threading it through to the underlying `PanGestureHandler` to support gesture coordination (e.g., `simultaneousHandlers`/`waitFor`) while keeping `enabled` and `onGestureEvent` controlled internally. > > **Updates quality and docs** by adding unit tests that assert prop passthrough and non-overridable internal gesture behavior, extending READMEs with the new prop, and enhancing Storybook with a scrollable list example (plus `SafeAreaProvider` wrapping) to demonstrate nested scrolling behavior. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit aef587c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## Release 29.0.0 This release includes new React Native header and layout primitives, BottomSheet API updates, shared type migrations, and documentation/runtime dependency alignment across core design-system packages. ### 📦 Package Versions - @metamask/design-system-shared: 0.7.0 - @metamask/design-system-react: 0.14.0 - @metamask/design-system-react-native: 0.14.0 ### 🔄 Shared Type Updates (0.7.0) #### Added - Added shared types used by new React Native header components, including HeaderRoot contracts consumed by @metamask/design-system-react-native (#1029). - Added shared BoxHorizontal and BoxVertical utility component contracts for cross-platform layout primitives (#1003). #### Changed - Migrated AvatarBase type exports from enum-based definitions to shared const-object + string-union types, aligned with ADR-0003/ADR-0004 (#1005). - Updated @metamask/utils dependency to ^11.11.0 (#1033). ### 🌐 React Web Updates (0.14.0) #### Changed - BREAKING: Updated AvatarBase exports to consume shared const-object + string-union types rather than local enums (#1005). - No migration required for typical usage; continue importing from @metamask/design-system-react as before. - Runtime values remain stable while type definitions follow ADR-0003/ADR-0004. - Updated @metamask/utils peer dependency to ^11.11.0 (#1033). - Expanded BannerBase migration documentation to improve upgrade guidance for recent releases (#1011). ### 📱 React Native Updates (0.14.0) #### Added - Added HeaderRoot as a new root primitive for React Native header composition (#1029). - Added HeaderStandard for standardized title + action header layouts in mobile screens (#1028, #1030). - Added TextFieldSearch for search-style text input flows on mobile (#1027). - Added BoxHorizontal and BoxVertical utility components for directional layout composition (#1003). #### Changed - BREAKING: Replaced BottomSheet shouldNavigateBack with an optional goBack callback for explicit navigation handling in host apps (#1024). - Remove shouldNavigateBack usage and pass goBack when sheet close should navigate back. - See migration guide: packages/design-system-react-native/MIGRATION.md#from-version-0130-to-0140. - Added panGestureHandlerProps support to BottomSheet for gesture-handler customization (#1016). - Migrated React Native package exports from default exports to named exports for consistent import ergonomics (#1032). - BREAKING: Updated AvatarBase exports to use shared const-object + string-union types instead of local enums (#1005). - No migration required for typical usage; continue importing from @metamask/design-system-react-native as before. - Runtime values remain stable while type definitions follow ADR-0003/ADR-0004. - Updated @metamask/utils peer dependency to ^11.11.0 (#1033). - Expanded BannerBase migration documentation to improve upgrade guidance for consumers (#1011). #### Fixed - Updated BottomSheetHeader action button size to md for consistent sizing and visual alignment (#1012). ###⚠️ Breaking Changes - BottomSheet (React Native): replaced shouldNavigateBack with optional goBack callback (#1024). - Migration required where shouldNavigateBack was used; see packages/design-system-react-native/MIGRATION.md#from-version-0130-to-0140. - AvatarBase export type migration (React + React Native): moved from local enums to shared const-object + string-union types (#1005). - Marked breaking for type contract changes, but no migration is expected for typical consumer imports/usage. ### ✅ Checklist - [x] Changelogs updated with human-readable descriptions - [x] Changelog validation passed (yarn changelog:validate) - [x] Version bumps follow semantic versioning - [x] design-system-shared: minor (0.6.0 to 0.7.0) - shared types and dependency alignment - [x] design-system-react: minor (0.13.0 to 0.14.0) - shared type migration and docs/dependency updates - [x] design-system-react-native: minor (0.13.0 to 0.14.0) - new components and API enhancements - [x] Breaking changes documented with migration guidance - [x] Migration guides updated with before/after examples (if breaking changes) - [x] PR references included in changelog entries ## **Pre-merge author checklist** - [x] I have followed MetaMask Contributor Docs - [x] I have reviewed the Release Workflow cursor rule - [ ] All tests pass (yarn build && yarn test && yarn lint) - [x] Changelog validation passes (yarn changelog:validate) ## **Pre-merge reviewer checklist** - [x] I have reviewed the Reviewing Release PRs guide - [x] Package versions follow semantic versioning - [x] Changelog entries are consumer-facing (not commit message regurgitation) - [x] Breaking changes are documented in MIGRATION.md with examples - [x] All unreleased changes are accounted for in changelogs <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/bugbot) is generating a summary for commit 87c05a5. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Adds a `panGestureHandlerProps` prop object to the React Native `BottomSheet` API and forwards it to the child `PanGestureHandler` in `BottomSheetDialog`. This aligns with the mobile review suggestion to expose the full `PanGestureHandler` prop surface (instead of only specific gesture props), enabling cases like `simultaneousHandlers`/`waitFor` coordination with nested scroll or gesture views. Also includes: - Type updates for `BottomSheetDialogProps` - Prop threading through `BottomSheet` -> `BottomSheetDialog` - Tests for passthrough behavior in both components - README updates for both components ## **Related issues** Fixes: N/A ## **Manual testing steps** 1. Run `NODE_OPTIONS=--experimental-vm-modules yarn exec jest --config jest.config.js --watchman=false --collectCoverage=false --runTestsByPath src/components/BottomSheetDialog/BottomSheetDialog.test.tsx src/components/BottomSheet/BottomSheet.test.tsx` from `packages/design-system-react-native`. 2. Verify the new test `passes props to PanGestureHandler via panGestureHandlerProps` passes. 3. Verify `BottomSheet` forwards `panGestureHandlerProps` to `BottomSheetDialog` in tests. 4. Build package: `yarn workspace @metamask/design-system-react-native build`. ## **Screenshots/Recordings** Not applicable (API/types/tests/docs update only). ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Medium risk because it changes how gesture handler props are composed and threaded into `PanGestureHandler`, which can affect swipe/scroll interactions across platforms. Coverage is improved with new tests and the prop explicitly prevents overriding `enabled`/`onGestureEvent`. > > **Overview** > **Adds a new `panGestureHandlerProps` API** on `BottomSheet` and `BottomSheetDialog`, threading it through to the underlying `PanGestureHandler` to support gesture coordination (e.g., `simultaneousHandlers`/`waitFor`) while keeping `enabled` and `onGestureEvent` controlled internally. > > **Updates quality and docs** by adding unit tests that assert prop passthrough and non-overridable internal gesture behavior, extending READMEs with the new prop, and enhancing Storybook with a scrollable list example (plus `SafeAreaProvider` wrapping) to demonstrate nested scrolling behavior. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit aef587c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## Release 29.0.0 This release includes new React Native header and layout primitives, BottomSheet API updates, shared type migrations, and documentation/runtime dependency alignment across core design-system packages. ### 📦 Package Versions - @metamask/design-system-shared: 0.7.0 - @metamask/design-system-react: 0.14.0 - @metamask/design-system-react-native: 0.14.0 ### 🔄 Shared Type Updates (0.7.0) #### Added - Added shared types used by new React Native header components, including HeaderRoot contracts consumed by @metamask/design-system-react-native (#1029). - Added shared BoxHorizontal and BoxVertical utility component contracts for cross-platform layout primitives (#1003). #### Changed - Migrated AvatarBase type exports from enum-based definitions to shared const-object + string-union types, aligned with ADR-0003/ADR-0004 (#1005). - Updated @metamask/utils dependency to ^11.11.0 (#1033). ### 🌐 React Web Updates (0.14.0) #### Changed - BREAKING: Updated AvatarBase exports to consume shared const-object + string-union types rather than local enums (#1005). - No migration required for typical usage; continue importing from @metamask/design-system-react as before. - Runtime values remain stable while type definitions follow ADR-0003/ADR-0004. - Updated @metamask/utils peer dependency to ^11.11.0 (#1033). - Expanded BannerBase migration documentation to improve upgrade guidance for recent releases (#1011). ### 📱 React Native Updates (0.14.0) #### Added - Added HeaderRoot as a new root primitive for React Native header composition (#1029). - Added HeaderStandard for standardized title + action header layouts in mobile screens (#1028, #1030). - Added TextFieldSearch for search-style text input flows on mobile (#1027). - Added BoxHorizontal and BoxVertical utility components for directional layout composition (#1003). #### Changed - BREAKING: Replaced BottomSheet shouldNavigateBack with an optional goBack callback for explicit navigation handling in host apps (#1024). - Remove shouldNavigateBack usage and pass goBack when sheet close should navigate back. - See migration guide: packages/design-system-react-native/MIGRATION.md#from-version-0130-to-0140. - Added panGestureHandlerProps support to BottomSheet for gesture-handler customization (#1016). - Migrated React Native package exports from default exports to named exports for consistent import ergonomics (#1032). - BREAKING: Updated AvatarBase exports to use shared const-object + string-union types instead of local enums (#1005). - No migration required for typical usage; continue importing from @metamask/design-system-react-native as before. - Runtime values remain stable while type definitions follow ADR-0003/ADR-0004. - Updated @metamask/utils peer dependency to ^11.11.0 (#1033). - Expanded BannerBase migration documentation to improve upgrade guidance for consumers (#1011). #### Fixed - Updated BottomSheetHeader action button size to md for consistent sizing and visual alignment (#1012). ###⚠️ Breaking Changes - BottomSheet (React Native): replaced shouldNavigateBack with optional goBack callback (#1024). - Migration required where shouldNavigateBack was used; see packages/design-system-react-native/MIGRATION.md#from-version-0130-to-0140. - AvatarBase export type migration (React + React Native): moved from local enums to shared const-object + string-union types (#1005). - Marked breaking for type contract changes, but no migration is expected for typical consumer imports/usage. ### ✅ Checklist - [x] Changelogs updated with human-readable descriptions - [x] Changelog validation passed (yarn changelog:validate) - [x] Version bumps follow semantic versioning - [x] design-system-shared: minor (0.6.0 to 0.7.0) - shared types and dependency alignment - [x] design-system-react: minor (0.13.0 to 0.14.0) - shared type migration and docs/dependency updates - [x] design-system-react-native: minor (0.13.0 to 0.14.0) - new components and API enhancements - [x] Breaking changes documented with migration guidance - [x] Migration guides updated with before/after examples (if breaking changes) - [x] PR references included in changelog entries ## **Pre-merge author checklist** - [x] I have followed MetaMask Contributor Docs - [x] I have reviewed the Release Workflow cursor rule - [ ] All tests pass (yarn build && yarn test && yarn lint) - [x] Changelog validation passes (yarn changelog:validate) ## **Pre-merge reviewer checklist** - [x] I have reviewed the Reviewing Release PRs guide - [x] Package versions follow semantic versioning - [x] Changelog entries are consumer-facing (not commit message regurgitation) - [x] Breaking changes are documented in MIGRATION.md with examples - [x] All unreleased changes are accounted for in changelogs <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/bugbot) is generating a summary for commit 87c05a5. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## Release 29.0.0 This release includes new React Native header and layout primitives, BottomSheet API updates, shared type migrations, and documentation/runtime dependency alignment across core design-system packages. ### 📦 Package Versions - @metamask/design-system-shared: 0.7.0 - @metamask/design-system-react: 0.14.0 - @metamask/design-system-react-native: 0.14.0 ### 🔄 Shared Type Updates (0.7.0) #### Added - Added shared types used by new React Native header components, including HeaderRoot contracts consumed by @metamask/design-system-react-native (#1029). - Added shared BoxHorizontal and BoxVertical utility component contracts for cross-platform layout primitives (#1003). #### Changed - Migrated AvatarBase type exports from enum-based definitions to shared const-object + string-union types, aligned with ADR-0003/ADR-0004 (#1005). - Updated @metamask/utils dependency to ^11.11.0 (#1033). ### 🌐 React Web Updates (0.14.0) #### Changed - BREAKING: Updated AvatarBase exports to consume shared const-object + string-union types rather than local enums (#1005). - No migration required for typical usage; continue importing from @metamask/design-system-react as before. - Runtime values remain stable while type definitions follow ADR-0003/ADR-0004. - Updated @metamask/utils peer dependency to ^11.11.0 (#1033). - Expanded BannerBase migration documentation to improve upgrade guidance for recent releases (#1011). ### 📱 React Native Updates (0.14.0) #### Added - Added HeaderRoot as a new root primitive for React Native header composition (#1029). - Added HeaderStandard for standardized title + action header layouts in mobile screens (#1028, #1030). - Added TextFieldSearch for search-style text input flows on mobile (#1027). - Added BoxHorizontal and BoxVertical utility components for directional layout composition (#1003). #### Changed - BREAKING: Replaced BottomSheet shouldNavigateBack with an optional goBack callback for explicit navigation handling in host apps (#1024). - Remove shouldNavigateBack usage and pass goBack when sheet close should navigate back. - See migration guide: packages/design-system-react-native/MIGRATION.md#from-version-0130-to-0140. - Added panGestureHandlerProps support to BottomSheet for gesture-handler customization (#1016). - Migrated React Native package exports from default exports to named exports for consistent import ergonomics (#1032). - BREAKING: Updated AvatarBase exports to use shared const-object + string-union types instead of local enums (#1005). - No migration required for typical usage; continue importing from @metamask/design-system-react-native as before. - Runtime values remain stable while type definitions follow ADR-0003/ADR-0004. - Updated @metamask/utils peer dependency to ^11.11.0 (#1033). - Expanded BannerBase migration documentation to improve upgrade guidance for consumers (#1011). #### Fixed - Updated BottomSheetHeader action button size to md for consistent sizing and visual alignment (#1012). ###⚠️ Breaking Changes - BottomSheet (React Native): replaced shouldNavigateBack with optional goBack callback (#1024). - Migration required where shouldNavigateBack was used; see packages/design-system-react-native/MIGRATION.md#from-version-0130-to-0140. - AvatarBase export type migration (React + React Native): moved from local enums to shared const-object + string-union types (#1005). - Marked breaking for type contract changes, but no migration is expected for typical consumer imports/usage. ### ✅ Checklist - [x] Changelogs updated with human-readable descriptions - [x] Changelog validation passed (yarn changelog:validate) - [x] Version bumps follow semantic versioning - [x] design-system-shared: minor (0.6.0 to 0.7.0) - shared types and dependency alignment - [x] design-system-react: minor (0.13.0 to 0.14.0) - shared type migration and docs/dependency updates - [x] design-system-react-native: minor (0.13.0 to 0.14.0) - new components and API enhancements - [x] Breaking changes documented with migration guidance - [x] Migration guides updated with before/after examples (if breaking changes) - [x] PR references included in changelog entries ## **Pre-merge author checklist** - [x] I have followed MetaMask Contributor Docs - [x] I have reviewed the Release Workflow cursor rule - [ ] All tests pass (yarn build && yarn test && yarn lint) - [x] Changelog validation passes (yarn changelog:validate) ## **Pre-merge reviewer checklist** - [x] I have reviewed the Reviewing Release PRs guide - [x] Package versions follow semantic versioning - [x] Changelog entries are consumer-facing (not commit message regurgitation) - [x] Breaking changes are documented in MIGRATION.md with examples - [x] All unreleased changes are accounted for in changelogs <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/bugbot) is generating a summary for commit 87c05a5. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->




Description
Adds a
panGestureHandlerPropsprop object to the React NativeBottomSheetAPI and forwards it to the childPanGestureHandlerinBottomSheetDialog.This aligns with the mobile review suggestion to expose the full
PanGestureHandlerprop surface (instead of only specific gesture props), enabling cases likesimultaneousHandlers/waitForcoordination with nested scroll or gesture views.This implements the same fix approach as MetaMask Mobile PR #27891.
Also includes:
BottomSheetDialogPropsBottomSheet->BottomSheetDialogRelated issues
Fixes: N/A
Manual testing steps
NODE_OPTIONS=--experimental-vm-modules yarn exec jest --config jest.config.js --watchman=false --collectCoverage=false --runTestsByPath src/components/BottomSheetDialog/BottomSheetDialog.test.tsx src/components/BottomSheet/BottomSheet.test.tsxfrompackages/design-system-react-native.passes props to PanGestureHandler via panGestureHandlerPropspasses.BottomSheetforwardspanGestureHandlerPropstoBottomSheetDialogin tests.yarn workspace @metamask/design-system-react-native build.Screenshots/Recordings
Not applicable (API/types/tests/docs update only).
Before
N/A
After
Comparing new stories with updated panGestureHandlerProps in android and ios
after720.mov
All BottomSheet stories working as expected after decorator removal
after720.mov
New story with scrolling list also works in dark mode
Pre-merge author checklist
Pre-merge reviewer checklist
Note
Low Risk
Low risk API surface expansion that threads optional gesture-handler props through the BottomSheet stack; primary risk is unintended gesture behavior if consumers pass incompatible handler options.
Overview
Adds an optional
panGestureHandlerPropspassthrough fromBottomSheettoBottomSheetDialog, which then spreads these options onto its internalPanGestureHandlerwhile preventing overrides of internally-managedenabledandonGestureEvent.Updates types and documentation for both components, and extends test coverage to assert prop forwarding and the non-overridable gesture settings. Storybook gains a new scrollable list story demonstrating
simultaneousHandlerscoordination (Android-specific).Written by Cursor Bugbot for commit 4249d78. This will update automatically on new commits. Configure here.