Skip to content

feat(react-native): add panGestureHandlerProps to BottomSheet#1016

Merged
georgewrmarshall merged 6 commits into
mainfrom
bottomsheet-pangesturehandler
Apr 1, 2026
Merged

feat(react-native): add panGestureHandlerProps to BottomSheet#1016
georgewrmarshall merged 6 commits into
mainfrom
bottomsheet-pangesturehandler

Conversation

@georgewrmarshall

@georgewrmarshall georgewrmarshall commented Mar 30, 2026

Copy link
Copy Markdown
Contributor

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.

This implements the same fix approach as MetaMask Mobile PR #27891.

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

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

Screenshot 2026-03-31 at 5 02 28 PM

Pre-merge author checklist

  • I've followed MetaMask Contributor Docs
  • I've completed the PR template to the best of my ability
  • I’ve included tests if applicable
  • I’ve documented my code using JSDoc format if applicable
  • I’ve applied the right labels on the PR (see labeling guidelines). 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.

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 panGestureHandlerProps passthrough from BottomSheet to BottomSheetDialog, which then spreads these options onto its internal PanGestureHandler while preventing overrides of internally-managed enabled and onGestureEvent.

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 simultaneousHandlers coordination (Android-specific).

Written by Cursor Bugbot for commit 4249d78. This will update automatically on new commits. Configure here.

@github-actions

Copy link
Copy Markdown
Contributor

📖 Storybook Preview

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

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.

Create PR

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.

@georgewrmarshall georgewrmarshall self-assigned this Mar 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📖 Storybook Preview

@georgewrmarshall georgewrmarshall marked this pull request as ready for review March 30, 2026 19:48
@georgewrmarshall georgewrmarshall requested a review from a team as a code owner March 30, 2026 19:48
@github-actions

Copy link
Copy Markdown
Contributor

📖 Storybook Preview

@github-actions

Copy link
Copy Markdown
Contributor

📖 Storybook Preview

@github-actions

Copy link
Copy Markdown
Contributor

📖 Storybook Preview

@georgewrmarshall georgewrmarshall enabled auto-merge (squash) March 31, 2026 23:37
@github-actions

github-actions Bot commented Apr 1, 2026

Copy link
Copy Markdown
Contributor

📖 Storybook Preview

@georgewrmarshall georgewrmarshall force-pushed the bottomsheet-pangesturehandler branch from f7c0efe to 4249d78 Compare April 1, 2026 00:07
@github-actions

github-actions Bot commented Apr 1, 2026

Copy link
Copy Markdown
Contributor

📖 Storybook Preview


jest.mock('react-native-gesture-handler', () => ({
PanGestureHandler: ({ children }: { children: React.ReactNode }) => children,
PanGestureHandler: ({

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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', () => {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines -27 to -34
decorators: [
(Story) => (
<Box twClassName="w-full h-full relative bg-background-alternative justify-center items-center">
<Text>Content behind overlay</Text>
<Story />
</Box>
),
],

@georgewrmarshall georgewrmarshall Apr 1, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was rendering the new story really high. The stories seem to render better without the decorator. See scree recording in PR description

Before / After

ImageImage

@georgewrmarshall georgewrmarshall merged commit 0780d13 into main Apr 1, 2026
44 checks passed
@georgewrmarshall georgewrmarshall deleted the bottomsheet-pangesturehandler branch April 1, 2026 01:24
@kirillzyusko

Copy link
Copy Markdown
Collaborator

Looks good 👍

@georgewrmarshall georgewrmarshall mentioned this pull request Apr 6, 2026
18 tasks
georgewrmarshall added a commit that referenced this pull request Apr 6, 2026
## 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 -->
georgewrmarshall added a commit that referenced this pull request Apr 6, 2026
## **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 -->
georgewrmarshall added a commit that referenced this pull request Apr 6, 2026
## 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 -->
georgewrmarshall added a commit that referenced this pull request Apr 27, 2026
## **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 -->
georgewrmarshall added a commit that referenced this pull request Apr 27, 2026
## 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 -->
cursor Bot pushed a commit that referenced this pull request Apr 28, 2026
## 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 -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants