feat: ModalBody migration (extension)#1121
Conversation
📖 Storybook Preview |
📖 Storybook Preview |
georgewrmarshall
left a comment
There was a problem hiding this comment.
ModalBody looks close, but the migration docs need one more pass before this is ready. The implementation preserves the core extension behavior, but the README links to a ModalBody migration entry that does not exist yet, and the padding guidance should be carried over in design-system-react terms rather than left implicit.
|
|
||
| ## Migration Guide | ||
|
|
||
| Migrating from `ui/components/component-library/modal-body` in MetaMask Extension? See the [ModalBody Migration Guide](../../../MIGRATION.md#modalbody-component) for prop mappings, before/after examples, and breaking changes. |
There was a problem hiding this comment.
blocking: This README links to ../../../MIGRATION.md#modalbody-component, but packages/design-system-react/MIGRATION.md does not have a ModalBody section yet. Since this PR is part of the extension migration flow, can we add the ModalBody migration entry before merging so consumers have the actual prop mapping / before-after examples?
|
|
||
| <Canvas of={ModalBodyStories.Children} /> | ||
|
|
||
| ### `className` |
There was a problem hiding this comment.
suggestion: The extension README had a dedicated Padding section for this use case: https://github.com/MetaMask/metamask-extension/blob/main/ui/components/component-library/modal-body/README.mdx#padding. Can we bring that guidance over here, but rewritten for design-system-react / Tailwind conventions so it explains the recommended override pattern in MMDS?
📖 Storybook Preview |
📖 Storybook Preview |
There was a problem hiding this comment.
LGTM! Do you mind holding off merging this until the release is merged, feel free to review #1140
I rechecked the current head against the earlier review round. The missing migration-guide section and the padding/override guidance are both in place now, and the focused ModalBody test suite passes on the PR head. I just have one non-blocking docs follow-up about surfacing the default keyboard-focus behavior in the component README.
|
|
||
| <Controls of={ModalBodyStories.Default} /> | ||
|
|
||
| ## Migration Guide |
There was a problem hiding this comment.
non-blocking: Could we add a short accessibility note here for the default tabIndex={0} behavior? The migration guide explains it, but for net-new ModalBody consumers the README is the main public contract, and the extra focus stop plus the override path (tabIndex={-1}) seems worth calling out there too.
There was a problem hiding this comment.
Added Accessibility header with content 👍
99368df to
eb0202c
Compare
📖 Storybook Preview |
## Release 38.0.0 This release updates the shared, web, native, tokens, and Tailwind packages with new cross-platform input and avatar-group contracts, new modal building blocks for React, a breaking React Native Toast API redesign, and Tailwind CSS v4 support for web consumers. ### 📦 Package Versions - `@metamask/design-system-shared`: **0.16.0** - `@metamask/design-system-react`: **0.21.0** - `@metamask/design-system-react-native`: **0.23.0** - `@metamask/design-system-tailwind-preset`: **0.7.0** - `@metamask/design-tokens`: **8.4.0** ### 🔄 Shared Type Updates (0.16.0) #### Input and AvatarGroup shared contracts ([#1043](#1043), [#1067](#1067)) **What Changed:** - Added shared `Input` contracts for controlled `value`, `isReadOnly`, and `isStateStylesDisabled` - Added shared `AvatarGroup` size, variant, and prop contracts - Added the shared `Merge` icon export ([#1155](#1155)) **Impact:** - React and React Native consumers can build against one aligned input and avatar-group API surface - Cross-platform wrappers can depend on `@metamask/design-system-shared` instead of maintaining platform-specific type assumptions ### 🌐 React Web Updates (0.21.0) #### Added - Added `ModalOverlay`, `ModalBody`, `ModalFocus`, and `ModalFooter` to support Extension modal migrations into `@metamask/design-system-react` ([#1120](#1120), [#1121](#1121), [#1128](#1128), [#1132](#1132)) - Added the `Merge` icon to the React icon set ([#1155](#1155)) #### Changed - Updated `Input` to follow the shared controlled input API and use `isReadOnly` as the public readonly prop name ([#1043](#1043)) - Updated `AvatarGroup` to use shared cross-platform size and variant contracts ([#1067](#1067)) ### 📱 React Native Updates (0.23.0) #### Added - Added the `Merge` icon to the React Native icon set ([#1155](#1155)) #### Changed - **BREAKING:** Redesigned `Toast` to use a single mounted `<Toast />` plus static `Toast.show(...)` and `Toast.hide()` methods for application usage ([#1104](#1104)) - Removed `ToastContext`, `ToastContextWrapper`, and `ToastContextParams` from the public export surface - Renamed `ToastVariants` to `ToastVariant`, changed icon-only close buttons to `ToastCloseButtonVariant.Icon`, and renamed `customBottomOffset` to `bottomOffset` - `Toast.show()` and `Toast.hide()` now throw a descriptive error if called before `<Toast />` mounts - See the [React Native Migration Guide](./packages/design-system-react-native/MIGRATION.md#from-version-0220-to-0230) - Updated `Input` to follow the shared controlled input API and rename `isReadonly` to `isReadOnly` ([#1043](#1043)) - Updated `AvatarGroup` to use shared cross-platform size and variant contracts ([#1067](#1067)) ### 🎨 Tokens and Tailwind Updates #### `@metamask/design-tokens` 8.4.0 - Added `@metamask/design-tokens/tailwind/theme.css` for Tailwind CSS v4 consumers, providing a single import for token variables, theme values, typography, fonts, and shadow utilities ([#1117](#1117)) #### `@metamask/design-system-tailwind-preset` 0.7.0 - Added a `fade-in` animation utility so consumers can use `animate-fade-in` for simple opacity entrance transitions, including the new `ModalOverlay` web migration path ([#1120](#1120)) - Clarified that Tailwind CSS v3 consumers should keep using this preset, while Tailwind CSS v4 consumers should migrate to `@metamask/design-tokens/tailwind/theme.css` ([#1117](#1117)) ###⚠️ Breaking Changes #### Toast API redesign (React Native) **What Changed:** - `Toast` application usage moved from context/service patterns to static `Toast.show(...)` and `Toast.hide()` methods - `ToastContext`, `ToastContextWrapper`, and `ToastContextParams` were removed from the public API - `ToastVariants` was renamed to `ToastVariant` - Icon-only close buttons now use `ToastCloseButtonVariant.Icon` - `customBottomOffset` was renamed to `bottomOffset` **Impact:** - Existing `@metamask/design-system-react-native` consumers using the old Toast context flow need import, root-mount, and call-site updates - Existing app code must ensure `<Toast />` is mounted before invoking `Toast.show()` / `Toast.hide()` See migration guides for complete instructions: - [React Native Migration Guide](./packages/design-system-react-native/MIGRATION.md#from-version-0220-to-0230) ### ✅ Checklist - [x] Changelogs updated with human-readable descriptions - [x] Changelog validation passed (`yarn workspace <package> changelog:validate`) - [x] Version bumps follow semantic versioning - [x] design-system-shared: minor (`0.15.0` → `0.16.0`) - new shared `Input`, `AvatarGroup`, and icon exports - [x] design-system-react: minor (`0.20.0` → `0.21.0`) - new modal components, icon, and shared API alignment - [x] design-system-react-native: minor (`0.22.0` → `0.23.0`) - breaking Toast redesign, icon, and shared API alignment - [x] design-system-tailwind-preset: minor (`0.6.1` → `0.7.0`) - new `fade-in` utility and Tailwind CSS v4 migration guidance - [x] design-tokens: minor (`8.3.0` → `8.4.0`) - Tailwind CSS v4 `theme.css` export - [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** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) - [ ] I've reviewed the [Release Workflow](./.cursor/rules/release-workflow.md) cursor rule - [ ] All tests pass (`yarn build && yarn test && yarn lint`) - [x] Changelog validation passes (`yarn changelog:validate`) ## **Pre-merge reviewer checklist** - [ ] I've reviewed the [Reviewing Release PRs](./docs/reviewing-release-prs.md) guide - [ ] Package versions follow semantic versioning - [ ] Changelog entries are consumer-facing (not commit message regurgitation) - [ ] Breaking changes are documented in MIGRATION.md with examples - [ ] All unreleased changes are accounted for in changelogs
Description
Added
ModalBodyto DSRN.Related issues
Fixes: https://consensyssoftware.atlassian.net/browse/DSYS-307
Manual testing steps
ModalBodycomponent.Screenshots/Recordings
Before
After
Pre-merge author checklist
Pre-merge reviewer checklist
Note
Medium Risk
Adds a new exported component with a default
tabIndex={0}, which can change focus order/keyboard behavior in consuming modals. Otherwise the change is additive and scoped to UI/styling helpers and docs/tests.Overview
Adds a new
ModalBodycomponent to@metamask/design-system-react, exported from the root barrel, that provides the standard modal body layout (px-4+relative max-h-full overflow-y-auto) and forwards refs/HTML div props.ModalBodyis keyboard-focusable by default viatabIndex={0}(overridable) to improve accessibility of scrollable modal content. This PR also adds Storybook stories, unit tests, component docs, and a new section inMIGRATION.mddescribing extension-to-DS prop/behavior differences (notably removal of polymorphic/Box utility-prop surfaces in favor of TailwindclassName).Reviewed by Cursor Bugbot for commit eb0202c. Bugbot is set up for automated code reviews on this repo. Configure here.