Skip to content

refactor(bridge): migrate the slippage settings modal to MMDS - #47683

Open
georgewrmarshall wants to merge 5 commits into
cursor/bridge-switch-tokens-mmds-d1f4from
cursor/bridge-settings-modal-mmds-9438
Open

georgewrmarshall wants to merge 5 commits into
cursor/bridge-switch-tokens-mmds-d1f4from
cursor/bridge-settings-modal-mmds-9438

Conversation

@georgewrmarshall

@georgewrmarshall georgewrmarshall commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Description

Part of the MMDS migration epic: https://consensyssoftware.atlassian.net/browse/TMCU-1741

Stack: #47558 is merged. This PR is stacked on #47597, which is stacked on #47596. It does not belong in #47596: the slippage modal is a separate surface (legacy Modal, Button, Text, and TextField), not the input-group migration.

ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx now uses @metamask/design-system-react for the dialog, option buttons, label, custom field, and submit button. Layout that was bridge Row/Column plus design-system spacing enums is an MMDS Box with Tailwind (flex, gap-3, px-4, pb-4).

  • Option buttons: selected is ButtonVariant.Primary (bg-icon-default). Unselected is ButtonVariant.Secondary with hover:!bg-default-hover, so hover stays the previous default-hover fill instead of MMDS hover:bg-muted-hover.
  • Custom field: MMDS TextField (rounded-xl, muted border, 40px Md height) with w-24 bg-default. bg-default keeps the legacy field fill; MMDS otherwise uses bg-muted. The % suffix is an MMDS Text end accessory. Paste and decimal-key filtering stay on inputProps.
  • Submit is ModalFooter primaryButtonProps (ButtonSize.Lg, full width of the footer row). isDisabled replaces disabled.
  • Close control keeps data-testid="bridge__tx-settings-modal-close-button" and passes ariaLabel={t('close')}, which MMDS ModalHeader requires.

Left on purpose: the slippage info icon is still the bridge Tooltip (../layout), which renders a legacy Popover. It keeps style={{ zIndex: 1051 }} so the popover sits above the modal. There is no MMDS tooltip, and Tailwind in this repo has no z-1051 step.

Changelog

CHANGELOG entry: null

Related issues

https://consensyssoftware.atlassian.net/browse/TMCU-1741

Manual testing steps

  1. Open Swap/Bridge and open transaction settings.
  2. On an EVM pair, confirm 0.5%, 2%, and Custom. On a Solana or RWA pair, confirm Auto is also shown and selected when slippage is unset.
  3. Hover an unselected option and confirm the fill lightens. Select an option and confirm it uses the dark primary fill.
  4. Choose Custom, type 1.5, blur, and submit. Reopen and confirm Custom shows 1.5%.
  5. Type a value above 100 and confirm it caps at 100% and shows the high-slippage warning. Type a value below 0.5 and confirm the low-slippage warning.
  6. Hover the info icon and confirm the tooltip appears above the dialog.

Screenshots/Recordings

Bridge transaction settings modal, DAI → mUSD (getBridgeFixtures + enableFiatToggle), captured at 2x in the side panel (360×768) and the popup (400×600). Modal opened via data-testid="bridge__header-settings-button".

Before

Legacy Modal / Button / Text / TextField on #47597 head 138b2aecf6.

After

MMDS modal chrome, option buttons, custom slippage field, and submit on #47683 head ffb986d045.

Screen Before After
Modal open default (light, side panel) before-modal-open-default-light-sidepanel360 after-modal-open-default-light-sidepanel360
Modal open default (dark, side panel) before-modal-open-default-dark-sidepanel360 after-modal-open-default-dark-sidepanel360
Modal open default (light, popup) before-modal-open-default-light-popup400 after-modal-open-default-light-popup400
Modal open default (dark, popup) before-modal-open-default-dark-popup400 after-modal-open-default-dark-popup400
Option hover (light, side panel) before-modal-option-hover-light-sidepanel360 after-modal-option-hover-light-sidepanel360
Option hover (dark, side panel) before-modal-option-hover-dark-sidepanel360 after-modal-option-hover-dark-sidepanel360
Selected 2% (light, side panel) before-modal-selected-2pct-light-sidepanel360 after-modal-selected-2pct-light-sidepanel360
Selected 2% (dark, side panel) before-modal-selected-2pct-dark-sidepanel360 after-modal-selected-2pct-dark-sidepanel360
Custom 1.5 (light, side panel) before-modal-custom-1.5-light-sidepanel360 after-modal-custom-1.5-light-sidepanel360
Custom 1.5 (dark, side panel) before-modal-custom-1.5-dark-sidepanel360 after-modal-custom-1.5-dark-sidepanel360
Custom empty (light, side panel) before-modal-custom-empty-light-sidepanel360 after-modal-custom-empty-light-sidepanel360
Custom high (light, side panel) before-modal-custom-high-light-sidepanel360 after-modal-custom-high-light-sidepanel360
Close visible (light, side panel) before-modal-close-visible-light-sidepanel360 after-modal-close-visible-light-sidepanel360
Submit enabled (light, side panel) before-modal-submit-enabled-light-sidepanel360 after-modal-submit-enabled-light-sidepanel360

Pre-merge author checklist

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.
Open in Web Open in Cursor 

Note

Low Risk
UI refactor on a swap settings surface with existing test coverage; slippage dispatch logic is unchanged aside from presentation and a11y attributes.

Reviewed by Cursor Bugbot for commit 592a453. Bugbot is set up for automated code reviews on this repo. Configure here.

@metamask-ci

metamask-ci Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

✨ Files requiring CODEOWNER review ✨

🔄 @MetaMask/swaps-engineers (3 files, +195 -170)
  • 📁 ui/
    • 📁 pages/
      • 📁 bridge/
        • 📁 prepare/
          • 📁 __snapshots__/
            • 📄 bridge-transaction-settings-modal.test.tsx.snap +120 -97
            • 📄 bridge-transaction-settings-modal.test.tsx +15 -8
            • 📄 bridge-transaction-settings-modal.tsx +60 -65

@metamask-ci metamask-ci Bot added the team-design-system All issues relating to design system in Extension label Nov 5, 2026

@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.

Stale Bugbot comment from a previous run.

@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.

Stale Bugbot comment from a previous run.

@cursor

cursor Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: TextField lost muted border
    • Restored the muted border by adding border-muted to the custom slippage TextField className so it overrides MMDS border-default.

Create PR

Or push these changes by commenting:

@cursor push 1f747521cc
Preview (1f747521cc)
diff --git a/ui/pages/bridge/prepare/__snapshots__/bridge-transaction-settings-modal.test.tsx.snap b/ui/pages/bridge/prepare/__snapshots__/bridge-transaction-settings-modal.test.tsx.snap
--- a/ui/pages/bridge/prepare/__snapshots__/bridge-transaction-settings-modal.test.tsx.snap
+++ b/ui/pages/bridge/prepare/__snapshots__/bridge-transaction-settings-modal.test.tsx.snap
@@ -109,7 +109,7 @@
               %
             </button>
             <div
-              class="inline-flex items-center rounded-xl border transition-colors h-10 pl-0 pr-4 border-default w-24 bg-default"
+              class="inline-flex items-center rounded-xl border transition-colors h-10 pl-0 pr-4 w-24 border-muted bg-default"
             >
               <input
                 class="w-full rounded text-default outline-none transition-colors border-transparent placeholder:text-alternative text-s-body-md leading-s-body-md tracking-s-body-md md:text-l-body-md md:leading-l-body-md md:tracking-l-body-md font-regular m-0 h-full min-w-0 flex-1 border-0 bg-transparent p-0 pl-4 pr-2 truncate"

diff --git a/ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx b/ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx
--- a/ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx
+++ b/ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx
@@ -217,7 +217,7 @@
             {showCustomInput && (
               <TextField
                 size={TextFieldSize.Md}
-                className="w-24 bg-default"
+                className="w-24 border-muted bg-default"
                 type={TextFieldType.Text}
                 value={inputValue}
                 autoFocus={true}

You can send follow-ups to the cloud agent here.

@metamask-ci

metamask-ci Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor
Builds ready [ffb986d]
⚡ Performance Benchmarks (Total: 🟢 7 pass · 🟡 2 warn · 🔴 4 fail)

Baseline (latest main): f693520 | Date: 11/3/2026 | Pipeline: 42118560302 | Baseline logs

Metricschrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🔴 load_new_account(p95) [CI log]🔴 load_new_account(p95) [CI log]
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]

Regressions (🔴 4 failures)

Interaction Benchmarks · Samples: 5 🔴 2
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🔴 [CI log]
🔴 load_new_account
🔴 [CI log]
🔴 load_new_account
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ loadNewAccount/load_new_account: +182%
  • ↑ loadNewAccount/total: +182%
  • ↓ loadNewAccount/inp: -40%
  • ↓ loadNewAccount/fcp: -20%
  • ↑ loadNewAccount/lcp: +684%
  • ↑ loadNewAccount/cls: +630%
  • ↑ confirmTx/longTaskMaxDuration: +16%
  • ↓ confirmTx/inp: -37%
  • ↓ confirmTx/fcp: -16%
  • ↑ confirmTx/lcp: +744%
  • ↓ confirmTx/cls: -14%
  • ↑ bridgeUserActions/bridge_load_page: +37%
  • ↓ bridgeUserActions/longTaskTotalDuration: -23%
  • ↓ bridgeUserActions/longTaskMaxDuration: -28%
  • ↓ bridgeUserActions/tbt: -44%
  • ↓ bridgeUserActions/inp: -26%
  • ↓ bridgeUserActions/fcp: -18%
  • ↑ bridgeUserActions/lcp: +711%
  • ↑ bridgeUserActions/cls: +636%
  • ↑ loadNewAccount/load_new_account: +182%
  • ↑ loadNewAccount/total: +182%
  • ↓ loadNewAccount/inp: -25%
  • ↑ loadNewAccount/fcp: +21%
  • ↑ loadNewAccount/lcp: +1336%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↓ confirmTx/inp: -13%
  • ↑ confirmTx/fcp: +26%
  • ↑ confirmTx/lcp: +1370%
  • ↑ bridgeUserActions/bridge_load_page: +290%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +163%
  • ↑ bridgeUserActions/bridge_search_token: +25%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +53%
  • ↑ bridgeUserActions/inp: +69%
  • ↑ bridgeUserActions/fcp: +23%
  • ↑ bridgeUserActions/lcp: +1340%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 loadNewAccount/FCP: p75 2.1s
  • 🟡 loadNewAccount/LCP: p75 2.5s
  • 🟡 confirmTx/FCP: p75 2.2s
  • 🟡 confirmTx/LCP: p75 2.5s
  • 🟡 bridgeUserActions/FCP: p75 2.1s
  • 🟡 bridgeUserActions/LCP: p75 2.5s
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ startupStandardHome/uiStartup: +19%
  • ↑ startupStandardHome/load: +40%
  • ↑ startupStandardHome/domContentLoaded: +40%
  • ↓ startupStandardHome/firstPaint: -43%
  • ↓ startupStandardHome/backgroundConnect: -24%
  • ↓ startupStandardHome/firstReactRender: -98%
  • ↓ startupStandardHome/initialActions: -64%
  • ↑ startupStandardHome/loadScripts: +39%
  • ↑ startupStandardHome/setupStore: +49%
  • ↑ startupStandardHome/longTaskTotalDuration: +33%
  • ↑ startupStandardHome/longTaskMaxDuration: +55%
  • ↑ startupStandardHome/tbt: +44%
  • ↓ startupStandardHome/inp: -30%
  • ↑ startupStandardHome/fcp: +32%
  • ↑ startupStandardHome/lcp: +493%
  • ↓ startupStandardHome/cls: -72%
  • ↓ startupStandardHome/uiStartup: -37%
  • ↓ startupStandardHome/load: -33%
  • ↓ startupStandardHome/domContentLoaded: -34%
  • ↓ startupStandardHome/domInteractive: -56%
  • ↓ startupStandardHome/backgroundConnect: -30%
  • ↓ startupStandardHome/firstReactRender: -99%
  • ↓ startupStandardHome/initialActions: -50%
  • ↓ startupStandardHome/loadScripts: -33%
  • ↑ startupStandardHome/setupStore: +51%
  • ↓ startupStandardHome/fcp: -48%
  • ↓ startupStandardHome/lcp: -31%
User Journey Benchmarks · Samples: 5 · mock API 🔴 2
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]
🔴 total

📈 Results compared to the previous 5 runs on main

  • ↑ onboardingImportWallet/srpButtonToSrpForm: +11%
  • ↑ onboardingImportWallet/confirmSrpToPwForm: +21%
  • ↑ onboardingImportWallet/pwFormToMetricsScreen: +27%
  • ↑ onboardingImportWallet/metricsToWalletReadyScreen: +19%
  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -92%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -74%
  • ↓ onboardingImportWallet/longTaskCount: -100%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -100%
  • ↓ onboardingImportWallet/longTaskMaxDuration: -100%
  • ↓ onboardingImportWallet/tbt: -100%
  • ↓ onboardingImportWallet/total: -85%
  • ↓ onboardingNewWallet/createWalletToSocialScreen: -12%
  • ↓ onboardingNewWallet/srpButtonToPwForm: -31%
  • ↓ onboardingNewWallet/createPwToRecoveryScreen: -19%
  • ↓ onboardingNewWallet/skipBackupToMetricsScreen: -11%
  • ↓ onboardingNewWallet/agreeButtonToOnboardingSuccess: -50%
  • ↓ onboardingNewWallet/doneButtonToAssetList: -75%
  • ↓ onboardingNewWallet/longTaskCount: -100%
  • ↓ onboardingNewWallet/longTaskTotalDuration: -100%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -100%
  • ↓ onboardingNewWallet/tbt: -100%
  • ↓ onboardingNewWallet/total: -72%
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ dappPageLoad/pageLoadTime: -67%
  • ↓ dappPageLoad/domContentLoaded: -33%
  • ↓ dappPageLoad/firstPaint: -52%
  • ↓ dappPageLoad/firstContentfulPaint: -52%
Bundle Size Diffs
Status Bundle Total Diff Change
✅ background 15.26 MiB +130 Bytes 0.00%
✅ ui 19.4 MiB +138 Bytes 0.00%
✅ common 0 Bytes 0 Bytes 0.00%
✅ other 4.44 MiB 0 Bytes 0.00%
✅ content scripts 3.23 MiB 0 Bytes 0.00%
✅ unzipped 79.73 MiB -990 Bytes 0.00%
✅ zip 23.85 MiB -100 Bytes 0.00%

Copy link
Copy Markdown

Accessibility (draft)

I know this is still a draft, so no rush. Just flagging for when you wrap up.

The custom slippage field in bridge-transaction-settings-modal.tsx doesn't have an accessible name once it opens — there's nearby "Max slippage" copy, but nothing tied to the input itself (no Label/htmlFor, and no aria-label on the TextField around line 218). Screen reader users only get a bare percentage box. Wiring a persistent label (e.g. the max-slippage string via Label + htmlFor, or aria-label on the field) would fix it (WCAG 1.3.1, 3.3.2, 4.1.2).

An AI accessibility agent posted this. If this is wrong, reply here.

Replace the legacy Modal, Button, Text and TextField in the bridge
transaction settings modal with @metamask/design-system-react. Layout
moves to MMDS Box and Tailwind. The slippage tooltip stays the bridge
Tooltip, which still needs z-index 1051 above the modal.

Co-authored-by: George Marshall <georgewrmarshall@users.noreply.github.com>
@georgewrmarshall georgewrmarshall self-assigned this Nov 6, 2026
@georgewrmarshall
georgewrmarshall force-pushed the cursor/bridge-settings-modal-mmds-9438 branch from ffb986d to a3167b7 Compare November 6, 2026 19:48
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

The custom slippage input had no accessible name once opened. Set aria-label to the existing "Slippage tolerance" string on the native input and cover it in the modal test and snapshot. Also drop the stale bg-default class from the snapshot left over from the background color removal. Add a TODO pointing to metamask-design-system#1667 for removing the data-testid cast once the design system accepts data-* in inputProps.

Co-authored-by: Cursor <cursoragent@cursor.com>
SonarCloud flags the global isNaN calls in the slippage settings modal. Both values are already numbers, so Number.isNaN keeps the same result.

Co-authored-by: Cursor <cursoragent@cursor.com>
@metamask-ci

metamask-ci Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor
Builds ready [3e4d897]
⚡ Performance Benchmarks (Total: 🟢 6 pass · 🟡 5 warn · 🔴 2 fail)

Baseline (latest main): f693520 | Date: 11/3/2026 | Pipeline: 42291652422 | Baseline logs

Metricschrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🔴 load_new_account(p95) [CI log]🔴 load_new_account(p95) [CI log]

Regressions (🔴 2 failures)

Interaction Benchmarks · Samples: 5 🔴 2
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🔴 [CI log]
🔴 load_new_account
🔴 [CI log]
🔴 load_new_account
confirmTx
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ loadNewAccount/load_new_account: +183%
  • ↑ loadNewAccount/total: +183%
  • ↓ loadNewAccount/inp: -25%
  • ↑ loadNewAccount/lcp: +947%
  • ↑ loadNewAccount/cls: +597%
  • ↑ confirmTx/longTaskCount: +33%
  • ↑ confirmTx/longTaskTotalDuration: +66%
  • ↑ confirmTx/longTaskMaxDuration: +59%
  • ↑ confirmTx/tbt: +90%
  • ↓ confirmTx/inp: -13%
  • ↑ confirmTx/lcp: +996%
  • ↓ confirmTx/cls: -14%
  • ↑ bridgeUserActions/bridge_load_page: +99%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +50%
  • ↑ bridgeUserActions/longTaskCount: +36%
  • ↑ bridgeUserActions/longTaskTotalDuration: +84%
  • ↑ bridgeUserActions/longTaskMaxDuration: +25%
  • ↑ bridgeUserActions/tbt: +159%
  • ↑ bridgeUserActions/total: +21%
  • ↑ bridgeUserActions/inp: +10%
  • ↑ bridgeUserActions/lcp: +945%
  • ↑ bridgeUserActions/cls: +646%
  • ↑ loadNewAccount/load_new_account: +183%
  • ↑ loadNewAccount/total: +183%
  • ↓ loadNewAccount/fcp: -34%
  • ↑ loadNewAccount/lcp: +1240%
  • ↑ confirmTx/confirm_tx: +10%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +10%
  • ↓ confirmTx/inp: -13%
  • ↓ confirmTx/fcp: -35%
  • ↑ confirmTx/lcp: +1291%
  • ↑ bridgeUserActions/bridge_load_page: +244%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +244%
  • ↑ bridgeUserActions/bridge_search_token: +25%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +80%
  • ↑ bridgeUserActions/inp: +54%
  • ↑ bridgeUserActions/fcp: +15%
  • ↑ bridgeUserActions/lcp: +1261%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 loadNewAccount/FCP: p75 1.8s
  • 🟡 confirmTx/FCP: p75 1.9s
  • 🟡 bridgeUserActions/FCP: p75 1.8s
  • 🟡 bridgeUserActions/FCP: p75 2.0s
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ startupStandardHome/uiStartup: +95%
  • ↑ startupStandardHome/load: +130%
  • ↑ startupStandardHome/domContentLoaded: +132%
  • ↑ startupStandardHome/domInteractive: +32%
  • ↓ startupStandardHome/firstPaint: -55%
  • ↓ startupStandardHome/firstReactRender: -98%
  • ↓ startupStandardHome/initialActions: -29%
  • ↑ startupStandardHome/loadScripts: +130%
  • ↑ startupStandardHome/setupStore: +134%
  • ↑ startupStandardHome/longTaskCount: +79%
  • ↑ startupStandardHome/longTaskTotalDuration: +129%
  • ↑ startupStandardHome/longTaskMaxDuration: +142%
  • ↑ startupStandardHome/tbt: +153%
  • ↓ startupStandardHome/fcp: -49%
  • ↑ startupStandardHome/lcp: +129%
  • ↓ startupStandardHome/cls: -72%
  • ↓ startupStandardHome/domInteractive: -21%
  • ↓ startupStandardHome/firstReactRender: -98%
  • ↓ startupStandardHome/initialActions: -50%
User Journey Benchmarks · Samples: 5 · mock API
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🟡 total
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🟡 total

📈 Results compared to the previous 5 runs on main

  • ↑ onboardingImportWallet/metricsToWalletReadyScreen: +21%
  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -92%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -74%
  • ↓ onboardingImportWallet/longTaskCount: -100%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -100%
  • ↓ onboardingImportWallet/longTaskMaxDuration: -100%
  • ↓ onboardingImportWallet/tbt: -100%
  • ↓ onboardingImportWallet/total: -85%
  • ↑ onboardingNewWallet/createPwToRecoveryScreen: +28%
  • ↑ onboardingNewWallet/skipBackupToMetricsScreen: +11%
  • ↓ onboardingNewWallet/doneButtonToAssetList: -70%
  • ↓ onboardingNewWallet/longTaskCount: -100%
  • ↓ onboardingNewWallet/longTaskTotalDuration: -100%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -100%
  • ↓ onboardingNewWallet/tbt: -100%
  • ↓ onboardingNewWallet/total: -65%
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ dappPageLoad/pageLoadTime: -50%
  • ↓ dappPageLoad/firstPaint: -33%
  • ↓ dappPageLoad/firstContentfulPaint: -33%
Bundle Size Diffs
Status Bundle Total Diff Change
✅ background 15.26 MiB +130 Bytes 0.00%
✅ ui 19.42 MiB +279 Bytes 0.00%
✅ common 0 Bytes 0 Bytes 0.00%
✅ other 4.46 MiB 0 Bytes 0.00%
✅ content scripts 3.23 MiB 0 Bytes 0.00%
✅ unzipped 79.76 MiB -849 Bytes 0.00%
✅ zip 23.86 MiB -48 Bytes 0.00%

@sonarqubecloud

sonarqubecloud Bot commented Nov 6, 2026

Copy link
Copy Markdown

…ridge-settings-modal-mmds-9438

Co-authored-by: George Marshall <georgewrmarshall@users.noreply.github.com>
@cursor
cursor Bot deployed to pr-comment November 10, 2026 01:16 Active

@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 using default effort and found 1 potential issue.

There are 2 total unresolved issues (including 1 from previous review).

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Option labels skip Button text styles
    • Changed hardcoded slippage labels to template strings so MMDS Button wraps them in body-md Text like Auto and Custom.

Create PR

Or push these changes by commenting:

@cursor push 0c2d4c1cf6
Preview (0c2d4c1cf6)
diff --git a/ui/pages/bridge/prepare/__snapshots__/bridge-transaction-settings-modal.test.tsx.snap b/ui/pages/bridge/prepare/__snapshots__/bridge-transaction-settings-modal.test.tsx.snap
--- a/ui/pages/bridge/prepare/__snapshots__/bridge-transaction-settings-modal.test.tsx.snap
+++ b/ui/pages/bridge/prepare/__snapshots__/bridge-transaction-settings-modal.test.tsx.snap
@@ -98,15 +98,21 @@
               class="inline-flex items-center justify-center rounded-full px-4 font-medium overflow-hidden relative h-10 transition-all duration-100 ease-linear active:scale-[0.97] active:ease-[cubic-bezier(0.3,0.8,0.3,1)] bg-muted text-default hover:bg-muted-hover active:bg-muted-pressed focus-visible:ring-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-default hover:!bg-default-hover"
               role="button"
             >
-              0.5
-              %
+              <span
+                class="text-inherit text-s-body-md leading-s-body-md tracking-s-body-md md:text-l-body-md md:leading-l-body-md md:tracking-l-body-md font-medium font-default"
+              >
+                0.5%
+              </span>
             </button>
             <button
               class="inline-flex items-center justify-center rounded-full px-4 font-medium overflow-hidden relative h-10 transition-all duration-100 ease-linear active:scale-[0.97] active:ease-[cubic-bezier(0.3,0.8,0.3,1)] bg-muted text-default hover:bg-muted-hover active:bg-muted-pressed focus-visible:ring-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-default hover:!bg-default-hover"
               role="button"
             >
-              2
-              %
+              <span
+                class="text-inherit text-s-body-md leading-s-body-md tracking-s-body-md md:text-l-body-md md:leading-l-body-md md:tracking-l-body-md font-medium font-default"
+              >
+                2%
+              </span>
             </button>
             <div
               class="inline-flex items-center rounded-xl border bg-muted transition-colors h-10 pl-0 pr-4 border-default w-24"
@@ -248,15 +254,21 @@
               class="inline-flex items-center justify-center rounded-full px-4 font-medium overflow-hidden relative h-10 transition-all duration-100 ease-linear active:scale-[0.97] active:ease-[cubic-bezier(0.3,0.8,0.3,1)] bg-muted text-default hover:bg-muted-hover active:bg-muted-pressed focus-visible:ring-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-default hover:!bg-default-hover"
               role="button"
             >
-              0.5
-              %
+              <span
+                class="text-inherit text-s-body-md leading-s-body-md tracking-s-body-md md:text-l-body-md md:leading-l-body-md md:tracking-l-body-md font-medium font-default"
+              >
+                0.5%
+              </span>
             </button>
             <button
               class="inline-flex items-center justify-center rounded-full px-4 font-medium overflow-hidden relative h-10 transition-all duration-100 ease-linear active:scale-[0.97] active:ease-[cubic-bezier(0.3,0.8,0.3,1)] bg-muted text-default hover:bg-muted-hover active:bg-muted-pressed focus-visible:ring-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-default hover:!bg-default-hover"
               role="button"
             >
-              2
-              %
+              <span
+                class="text-inherit text-s-body-md leading-s-body-md tracking-s-body-md md:text-l-body-md md:leading-l-body-md md:tracking-l-body-md font-medium font-default"
+              >
+                2%
+              </span>
             </button>
             <button
               class="inline-flex items-center justify-center rounded-full px-4 font-medium overflow-hidden relative h-10 transition-all duration-100 ease-linear active:scale-[0.97] active:ease-[cubic-bezier(0.3,0.8,0.3,1)] bg-muted text-default hover:bg-muted-hover active:bg-muted-pressed focus-visible:ring-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-default hover:!bg-default-hover"

diff --git a/ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx b/ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx
--- a/ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx
+++ b/ui/pages/bridge/prepare/bridge-transaction-settings-modal.tsx
@@ -197,7 +197,7 @@
                     selectSlippageOption(hardcodedSlippage);
                   }}
                 >
-                  {hardcodedSlippage}%
+                  {`${hardcodedSlippage}%`}
                 </Button>
               );
             })}

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 592a453. Configure here.

onClick={(e: React.MouseEvent<HTMLAnchorElement>) => {
e.preventDefault();
e.stopPropagation();
onClick={() => {

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.

Option labels skip Button text styles

Medium Severity

The 0.5% and 2% option labels are a number child plus a % text node, so MMDS Button does not wrap them in its Text span. Auto and Custom stay single strings and keep text-s-body-md / md:text-l-body-md. Those preset labels therefore lose design-system size, leading, and tracking, so they can render differently from the other options.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 592a453. Configure here.

@cursor
cursor Bot deployed to pr-comment November 10, 2026 01:30 Active
@metamask-ci

metamask-ci Bot commented Nov 10, 2026

Copy link
Copy Markdown
Contributor
Builds ready [592a453]
⚡ Performance Benchmarks (Total: 🟢 7 pass · 🟡 2 warn · 🔴 4 fail)

Baseline (latest main): f693520 | Date: 11/3/2026 | Pipeline: 42734651600 | Baseline logs

Metricschrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🔴 load_new_account(p95) [CI log]🔴 load_new_account(p95) [CI log]
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]

Regressions (🔴 4 failures)

Interaction Benchmarks · Samples: 5 🔴 2
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🔴 [CI log]
🔴 load_new_account
🔴 [CI log]
🔴 load_new_account
confirmTx
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ loadNewAccount/load_new_account: +183%
  • ↑ loadNewAccount/total: +183%
  • ↓ loadNewAccount/inp: -18%
  • ↑ loadNewAccount/fcp: +14%
  • ↑ loadNewAccount/lcp: +1020%
  • ↑ loadNewAccount/cls: +297%
  • ↑ confirmTx/longTaskCount: +67%
  • ↑ confirmTx/longTaskTotalDuration: +70%
  • ↑ confirmTx/longTaskMaxDuration: +58%
  • ↑ confirmTx/tbt: +82%
  • ↓ confirmTx/inp: -13%
  • ↑ confirmTx/lcp: +980%
  • ↑ bridgeUserActions/bridge_load_page: +118%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +21%
  • ↑ bridgeUserActions/longTaskMaxDuration: +52%
  • ↑ bridgeUserActions/tbt: +103%
  • ↑ bridgeUserActions/total: +17%
  • ↑ bridgeUserActions/lcp: +966%
  • ↑ bridgeUserActions/cls: +577%
  • ↑ loadNewAccount/load_new_account: +182%
  • ↑ loadNewAccount/total: +182%
  • ↓ loadNewAccount/inp: -25%
  • ↓ loadNewAccount/fcp: -53%
  • ↑ loadNewAccount/lcp: +1690%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↓ confirmTx/inp: -21%
  • ↓ confirmTx/fcp: -39%
  • ↑ confirmTx/lcp: +1240%
  • ↑ bridgeUserActions/bridge_load_page: +180%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +112%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +41%
  • ↑ bridgeUserActions/inp: +54%
  • ↓ bridgeUserActions/fcp: -34%
  • ↑ bridgeUserActions/lcp: +1258%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 loadNewAccount/FCP: p75 2.0s
  • 🟡 confirmTx/FCP: p75 1.8s
  • 🟡 bridgeUserActions/FCP: p75 1.9s
  • 🟡 loadNewAccount/LCP: p75 3.2s
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ startupStandardHome/uiStartup: +12%
  • ↑ startupStandardHome/load: +32%
  • ↑ startupStandardHome/domContentLoaded: +32%
  • ↓ startupStandardHome/domInteractive: -15%
  • ↓ startupStandardHome/firstPaint: -53%
  • ↓ startupStandardHome/backgroundConnect: -31%
  • ↓ startupStandardHome/firstReactRender: -98%
  • ↓ startupStandardHome/initialActions: -64%
  • ↑ startupStandardHome/loadScripts: +31%
  • ↑ startupStandardHome/setupStore: +36%
  • ↑ startupStandardHome/longTaskTotalDuration: +26%
  • ↑ startupStandardHome/longTaskMaxDuration: +48%
  • ↑ startupStandardHome/tbt: +34%
  • ↓ startupStandardHome/inp: -37%
  • ↑ startupStandardHome/fcp: +25%
  • ↑ startupStandardHome/lcp: +463%
  • ↓ startupStandardHome/cls: -72%
  • ↓ startupStandardHome/uiStartup: -23%
  • ↓ startupStandardHome/load: -17%
  • ↓ startupStandardHome/domContentLoaded: -19%
  • ↓ startupStandardHome/domInteractive: -31%
  • ↓ startupStandardHome/firstReactRender: -99%
  • ↓ startupStandardHome/initialActions: -50%
  • ↓ startupStandardHome/loadScripts: -17%
  • ↓ startupStandardHome/setupStore: -19%
  • ↓ startupStandardHome/fcp: -25%
  • ↓ startupStandardHome/lcp: -15%
User Journey Benchmarks · Samples: 5 · mock API 🔴 2
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]
🔴 total

📈 Results compared to the previous 5 runs on main

  • ↑ onboardingImportWallet/srpButtonToSrpForm: +10%
  • ↑ onboardingImportWallet/confirmSrpToPwForm: +23%
  • ↑ onboardingImportWallet/pwFormToMetricsScreen: +30%
  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -91%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -74%
  • ↓ onboardingImportWallet/longTaskCount: -82%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -95%
  • ↓ onboardingImportWallet/longTaskMaxDuration: -91%
  • ↓ onboardingImportWallet/tbt: -100%
  • ↓ onboardingImportWallet/total: -85%
  • ↑ onboardingNewWallet/srpButtonToPwForm: +26%
  • ↑ onboardingNewWallet/createPwToRecoveryScreen: +39%
  • ↑ onboardingNewWallet/skipBackupToMetricsScreen: +29%
  • ↑ onboardingNewWallet/agreeButtonToOnboardingSuccess: +11%
  • ↓ onboardingNewWallet/doneButtonToAssetList: -70%
  • ↓ onboardingNewWallet/longTaskCount: -23%
  • ↓ onboardingNewWallet/longTaskTotalDuration: -40%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -21%
  • ↓ onboardingNewWallet/tbt: -72%
  • ↓ onboardingNewWallet/total: -66%
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ dappPageLoad/pageLoadTime: -60%
  • ↓ dappPageLoad/domContentLoaded: -18%
  • ↓ dappPageLoad/firstPaint: -42%
  • ↓ dappPageLoad/firstContentfulPaint: -42%
Bundle Size Diffs
Status Bundle Total Diff Change
✅ background 15.24 MiB +115 Bytes 0.00%
✅ ui 19.44 MiB +614 Bytes 0.00%
✅ common 0 Bytes 0 Bytes 0.00%
✅ other 4.46 MiB 0 Bytes 0.00%
✅ content scripts 3.23 MiB 0 Bytes 0.00%
✅ unzipped 79.88 MiB -388 Bytes 0.00%
✅ zip 23.96 MiB +95 Bytes 0.00%

This branch was successfully deployed

1 active deployment
pr-comment — 592a453a Deployed Nov 10, 2026 by cursor[bot] via Publish prerelease / Publish prerelease #173684
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size-M team-design-system All issues relating to design system in Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants