Skip to content

[pull] main from MetaMask:main#382

Merged
pull[bot] merged 6 commits into
Reality2byte:mainfrom
MetaMask:main
Dec 4, 2025
Merged

[pull] main from MetaMask:main#382
pull[bot] merged 6 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Dec 4, 2025

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

kevinbluer and others added 6 commits December 4, 2025 17:48
…ting MAX (#23572)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

- Resolves a sporadic re-render issue on the market details chart when a
user selects `MAX`
- Sets the default selected timeframe to `1M` 

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:
[PRED-34](https://consensyssoftware.atlassian.net/browse/PRED-341)

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

<img width="420" alt="image"
src="https://github.com/user-attachments/assets/0fb58841-bb0d-4af2-9554-f867f13f0fbe"
/>

## **Pre-merge author checklist**

- [x] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [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
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.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]
> Stabilizes MAX timeframe chart updates with a one-shot adaptive
fidelity flow and switches default timeframe to 1M, with tests covering
fidelity scenarios and empty histories.
> 
> - **UI (PredictMarketDetails)**:
>   - Default `selectedTimeframe` set to `ONE_MONTH`.
> - MAX interval fidelity made one-shot and stable using `useRef` locks
(`maxFidelityLockedRef`, `prevTimeframeRef`):
> - Reset fidelity when leaving `MAX`; wait for fetch completion; ignore
immediate switch-to-MAX; compute range from primary history only.
> - Renames `maxIntervalRangeMs` to `primaryMaxIntervalRangeMs` and
refines range calculation.
> - **Tests (PredictMarketDetails.test.tsx)**:
>   - Add coverage for MAX fidelity behavior:
> - Requests higher fidelity for short spans; keeps default for long
spans; handles empty histories gracefully.
> - Utilize rerender and mocked `usePredictPriceHistory` to assert
interval/fidelity calls.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f3d8fbb. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ledged` (#23682)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

The PR adds an additional check to the `assertUserOptedIn` function
passed to the `ProfileMetricsController` to ensure that profile metrics
are only collected after the user has acknowledged the PNA25 notice.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] 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](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.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.
## **Description**

This PR fixes sentence case violations in lines 1-1000 of the
`locales/languages/en.json` file as part of ongoing content papercut
improvements. The changes convert Title Case strings to Sentence case
following standard capitalization conventions.

**What is the reason for the change?**
Content consistency and adherence to proper sentence case formatting
across the app.

**What is the improvement/solution?**
Updated 31 locale keys from Title Case to Sentence case, and updated all
affected test files to match the new casing.

## **Changelog**

CHANGELOG entry: Fixed sentence case violations in English locale
strings lines 1-1000

## **Related issues**

Fixes: Part of content papercut improvements batch 1

## **Manual testing steps**

```gherkin
Feature: Locale string display

  Scenario: user views UI elements with updated locale strings
    Given the app is running with the updated locale file
    
    When user navigates to various screens (Settings, Onboarding, Perps, Deposit, etc.)
    Then all text labels should display in proper sentence case format
    And no Title Case violations should appear in the affected strings
```

## **Screenshots/Recordings**

N/A - This is a content-only change with no visual differences beyond
text casing

### **Before**

Text displayed in Title Case (e.g., "Alert Details", "Try Again", "Your
Accounts")

### **After**

Text displayed in Sentence case (e.g., "Alert details", "Try again",
"Your accounts")

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [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
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.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.

---

## **Technical Details**

### Changes Made:
- **Locale file**: Updated 31 keys in `locales/languages/en.json` (lines
1-1000)
- **Test files**: Updated 16 test files with hardcoded string assertions
- **Snapshots**: Regenerated 8 snapshot files to match new casing

### Affected Areas:
- Onboarding flows
- Settings screens
- Alert modals
- Perps/trading interfaces  
- Deposit/payment flows
- Rewards banners
- Send/recipient selection

### Validation:
- All affected unit tests pass
- No old Title Case strings remain in updated test files
- Changes are purely cosmetic (text casing only)

🤖 Generated with [Claude Code](https://claude.com/claude-code)


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Standardizes sentence case across `locales/languages/en.json` and
updates impacted tests/snapshots to match.
> 
> - **i18n**:
> - Convert numerous strings in `locales/languages/en.json` to sentence
case (e.g., `"Try again"`, `"Additional verification"`, `"Error
details"`, `"Your accounts"`, `"Sample feature"`, `"Postal/zip code"`).
> - **Tests/Snapshots (casing updates only)**:
>   - Predict: `usePredictToasts.test.ts`.
> - Ramp Deposit: `AdditionalVerification`, `BuildQuote`,
`EnterAddress`, `ErrorDetailsModal`, `PaymentMethodSelectorModal`,
`UnsupportedRegionModal`, `SdkErrorAlert` (and snapshots).
>   - Rewards: `RewardsErrorBanner.test.tsx`.
>   - Settings: `Views/Settings/DeveloperOptions` snapshot.
> - Confirmations: `alert-modal.test.tsx`,
`useAddressTrustSignalAlerts.test.ts`, `SendFlow/AddressList` and
`SendTo` snapshots.
> - SampleFeature: `SampleFeatureDevSettingsEntryPoint.test.tsx`,
`SamplePetNames` and `SampleFeature` snapshots.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
deae158. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR aligns Aggregator screens with the current design system
components and styles as part of **Unified Buy Phase 1**
([#23636](#23636)).

The Ramp components were originally created before the design system
existed. These refinements reduce visual noise and inconsistencies,
making the experience feel more modern, trustworthy, and consistent with
the rest of the app.

### Changes:
- **Inputs**: Removed borders and applied muted background (borderless
input style)
- **Primary CTA**: Updated buttons to design system `Button` component
(Primary variant)
- **Quotes list**: Updated quote cards to borderless boxes with muted
background
- **Account & region selectors**: Updated to muted background style to
match new inputs
- **Keypad**: Set keypad container background to `background.section`
- **Quick amounts**: Set background to `background.section`, migrated to
`Button` (Secondary variant)
- **Icons**: Replaced FontAwesome/Entypo icons with component-library
`Icon` (ArrowDown)
- **Skeleton components**: Updated background color to
`background.hover`

**Note**: Visual-only changes; no behavioral changes expected.

## **Changelog**

CHANGELOG entry: Refined Buy/Sell UI inputs and buttons to match design
system

## **Related issues**

Fixes: #23636

## **Manual testing steps**

```gherkin
Feature: Buy UI Design System Alignment

  Scenario: User views the Build Quote screen
    Given the user is on the Buy flow
    When user navigates to the Build Quote screen
    Then the inputs should have muted backgrounds without borders
    And the "Get quotes" button should use the Primary button style
    And the keypad container should have a section background
    And the quick amount buttons should use Secondary button style

  Scenario: User views the Quotes list
    Given the user has entered an amount to buy
    When user views the list of quotes
    Then the quote cards should have muted backgrounds without borders
    And the "Continue with [provider]" buttons should show loading spinner when pressed

  Scenario: User views Order Details
    Given the user has completed an order
    When user views the order details screen
    Then the action buttons should use the Primary button style

  Scenario: User toggles between light and dark theme
    Given the user is on any Ramp screen
    When user switches between light and dark theme
    Then all components should render correctly in both themes
```

## **Screenshots/Recordings**












### **Before**

#### Light Theme


https://github.com/user-attachments/assets/f99f11cb-c21d-48be-afb8-4e2e2870d155


#### Dark Theme


https://github.com/user-attachments/assets/832268cd-5330-48fb-9877-a57d5686e5db


### **After**

#### Light Theme


https://github.com/user-attachments/assets/be3400df-07d7-4db9-b1c9-df4d246e4480


#### Dark Theme


https://github.com/user-attachments/assets/5f5450f8-cb12-4dee-8957-ce52e26098ce




## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [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
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.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]
> <sup>[Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) is
generating a summary for commit
7c91a75. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…23692)

## **Description**

This PR fixes a security issue where deep link modals were being
bypassed incorrectly. Previously, links from certain sources (including
external sources like `ORIGIN_DEEPLINK`) would bypass all modals
regardless of whether they were signed or unsigned. This created a
security risk where malicious external links could bypass user consent
modals.

**What changed:**
- Updated modal bypass logic to only skip modals for **signed (PRIVATE)
links** from trusted in-app sources (`ORIGIN_CAROUSEL`,
`ORIGIN_NOTIFICATION`, `ORIGIN_QR_CODE`, `ORIGIN_IN_APP_BROWSER`)
- Removed `ORIGIN_DEEPLINK` from the bypass list since it represents
external links (from Slack, email, etc.) that should always show modals
- Unsigned (PUBLIC) links now always show the "Proceed with caution"
modal, even from in-app sources
- External sources (`ORIGIN_DEEPLINK`) always show modals regardless of
signature status

**Why:**
- Security: External links should never bypass user consent modals
- User experience: Signed links from trusted in-app sources can bypass
the "Redirecting you to MetaMask" modal for seamless UX
- Consistency: Unsigned links always require user confirmation

**Technical details:**
- The bypass check now requires BOTH conditions: source is in
`inAppLinkSources` AND `linkType === PRIVATE`
- `linkType()` is computed once and reused to avoid duplicate
computation
- Updated tests to reflect the new behavior with proper coverage for all
source/link type combinations

## **Changelog**

CHANGELOG entry: Fixed security issue where external deep links could
bypass user consent modals. Signed links from in-app sources (carousel,
notifications, QR scanner) now bypass the redirect modal, while external
links always show appropriate warnings.

## **Related issues**

Fixes: #23559

## **Manual testing steps**

```gherkin
Feature: Deep link modal bypass behavior

  Scenario: Signed link from carousel bypasses modal
    Given user is viewing a carousel banner with a signed deep link
    When user taps the carousel banner link
    Then the link should open directly without showing "Redirecting you to MetaMask" modal

  Scenario: Unsigned link from carousel shows warning modal
    Given user is viewing a carousel banner with an unsigned deep link
    When user taps the carousel banner link
    Then the "Proceed with caution" modal should be displayed

  Scenario: External link always shows modal
    Given user receives a deep link from an external source (email, Slack, etc.)
    When user taps the external link
    Then the appropriate modal should be displayed:
      - "Redirecting you to MetaMask" for signed links
      - "Proceed with caution" for unsigned links

  Scenario: Signed link from notification bypasses modal
    Given user receives a notification with a signed deep link
    When user taps the notification
    Then the link should open directly without showing modal

  Scenario: QR code scan with signed link bypasses modal
    Given user scans a QR code containing a signed deep link
    When the QR code is processed
    Then the link should open directly without showing modal
```

## **Screenshots/Recordings**

<!-- No UI changes - this is a security fix affecting modal display
logic -->

### **Before**

Previously, all links from whitelisted sources (including external
`ORIGIN_DEEPLINK`) would bypass modals, creating a security
vulnerability.

### **After**

- Signed links from trusted in-app sources bypass modals ✅
- Unsigned links always show warnings ✅  
- External links always show modals ✅

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable (updated existing tests and
added new test cases)
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable (updated comments)
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.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]
> Restricts modal bypass to PRIVATE links from in-app sources and
ensures external sources always display the appropriate modal, with
tests updated accordingly.
> 
> - **Deep link interstitial logic (`handleUniversalLink.ts`)**:
> - Compute `linkType` once (`linkInstanceType`) and use it for
decisions.
> - Rename `interstitialWhitelistSources` to `inAppLinkSources` and
remove `ORIGIN_DEEPLINK` (external).
> - Only bypass redirect modal when `source ∈ inAppLinkSources` AND
`linkType === PRIVATE`.
> - External sources (e.g., `ORIGIN_DEEPLINK`) always show a modal
(PRIVATE → redirect, PUBLIC → caution).
>   - Existing `interstitialWhitelistUrls` behavior preserved.
> - **Tests (`__tests__/handleUniversalLink.test.ts`)**:
> - Update/expand cases: in-app signed links skip modal; in-app unsigned
show PUBLIC modal.
>   - Add external-source cases: always show modal (PRIVATE/PUBLIC).
> - Rename describe blocks to reflect in-app vs external sources; keep
whitelist URL skip behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
96f0778. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…21236)

## **Description**

This PR updates the Activity/Transactions page UI to align with the
latest design system standards and improve consistency across the app.

**What is the reason for the change?**
The Activity page's filter buttons (used in Transfers and Perps tabs)
were using outdated styling and inconsistent component patterns. The
buttons didn't follow the current design system guidelines and used a
mix of StyleSheet-based styling and old component-library components.

**What is the improvement/solution?**
- Migrated Activity page to use MetaMask Design System React Native
(MMDS) components (`Box`, `Text`) instead of component-library
equivalents
- Updated all filter buttons (All/Purchased/Sold in Transfers tab, and
Trades/Orders/Funding in Perps tab) to use consistent styling:
  - Height: 40px (previously 32px)
  - Horizontal padding: 16px
  - Border radius: 12px (previously 20px)
  - Gap between buttons: 12px (previously 8px)
  - Text: Body MD variant with Medium font weight
- Selected state: `bg-icon-default` background with `text-icon-inverse`
text
- Unselected state: `bg-background-muted` background with `text-default`
text
- Replaced `TouchableOpacity` with `Pressable` for better interaction
handling
- Converted styling to use Tailwind CSS via `useTailwind()` hook instead
of StyleSheet
- Improved accessibility with proper pressed states

## **Changelog**

CHANGELOG entry: Updated Activity page filter buttons to use design
system components with consistent styling

## **Related issues**

Fixes: 

## **Manual testing steps**

```gherkin
Feature: Updated Activity page filter buttons

  Scenario: user views and interacts with Transfers filter buttons
    Given user is on the Activity tab
    When user taps on the "Transfers" tab
    Then user should see "All", "Purchased", and "Sold" filter buttons
    And filter buttons should have 40px height with rounded corners
    And the "All" button should be selected by default with dark background
    When user taps on "Purchased" button
    Then "Purchased" button should become selected with dark background
    And "All" button should become unselected with light background

  Scenario: user views and interacts with Perps filter buttons
    Given user is on the Activity tab
    And Perps feature is enabled
    When user taps on the "Perps" tab
    Then user should see "Trades", "Orders", and "Funding" filter buttons
    And filter buttons should have 40px height with rounded corners
    And the "Trades" button should be selected by default
    When user taps on "Orders" button
    Then "Orders" button should become selected with dark background
    And transactions list should update to show orders

  Scenario: user views button pressed state
    Given user is on any Activity tab with filter buttons
    When user presses and holds a filter button
    Then button should show a pressed state with reduced opacity
    When user releases the button
    Then button should return to its normal state
```

## **Screenshots/Recordings**

### **Before**


https://github.com/user-attachments/assets/ad772865-a079-40dd-a3bf-d9f5776c443e

### **After**


https://github.com/user-attachments/assets/87fb66ab-9611-4142-b568-a6d551e897a3


https://github.com/user-attachments/assets/0b110dae-1adc-47cf-92f3-865a7e8d1f37

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [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
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.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]
> Replaces Activity/Transactions UI with design-system Header/Tabs,
standardizes filter/tab styling and behavior, adds dynamic tab
management, and updates related styles, tests, and e2e selectors.
> 
> - **ActivityView (major)**:
> - Replace legacy header/tab system with `HeaderBase` and `TabsList`;
use `Box` and Tailwind utilities.
> - Add dynamic tab ordering/visibility (Transactions, Orders, Perps,
Predict) with feature flags; expose `goToTabIndex`.
>   - Move network filter button into Transactions tab and align styles.
> - **Tabs**:
> - Update `TabsList` to use `React.Children.toArray` + filter valid
elements; improve key/label extraction; add swipe navigation; expose
testIDs.
> - **Perps Transactions**:
> - Switch to design-system `Text` variants; Tailwind spacing for filter
bar; tweak paddings and section header; minor empty-state padding.
> - **Transactions/Multichain/Unified views**:
> - Normalize empty/loading containers (full-width, `paddingVertical:
40`, bg); simplify styles creation in Multichain view.
> - `TransactionElement`: restructure `ListItem` layout; wrap
import-time row in `View`; small style cleanups.
> - **Tests**:
> - Overhaul ActivityView tests to mock new `TabsList`, validate tab
presence/order and navigation; snapshot updates.
> - Update e2e selectors/page objects (add `activity-view-tabs` IDs;
swipe tabs bar; select tab by label).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5246c91. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@pull pull Bot locked and limited conversation to collaborators Dec 4, 2025
@pull pull Bot added the ⤵️ pull label Dec 4, 2025
@pull pull Bot merged commit 11db647 into Reality2byte:main Dec 4, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants