feat: implement efficient modal stacking and automatic z-index management#740
Merged
RUKAYAT-CODER merged 1 commit intoJun 29, 2026
Merged
Conversation
|
@Agbasimere Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits. You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀 |
Contributor
|
Thank you for contributing to the project |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #364
Description
This PR implements proper dialog/modal stacking with automatic z-index management. It resolves modal layering issues (especially prominent on React Native Web) and coordinate multiple modals opened simultaneously.
Fixes #364
Key Changes
1. Stacking Manager & Hook
ModalStackManager(singleton): Maintains a global order of active modals.10000with a step size of10(10000,10010,10020, etc.).useModalStack(id, visible)Hook: Handles visibility-based registration and supplies reactivezIndexandisTopvariables.2. ModalPortal Integration
ModalPortalWrapper: Subscribes to the stack manager's z-index updates.ModalPortalHost: Automatically wraps all portalled components insideModalPortalWrapperto ensure correct layering styles.3. AccessibleModal Stack Enforcement
idprop for explicit identification.visible && isTopparameter passed touseFocusTrap). This prevents multiple focus traps from conflicts.isTop).zIndexstyle to the modal backdrop overlay.4. Documentation
docs/modal-portal-pattern.md.Verification Results
Automated Tests
Created a new test suite in
src/__tests__/components/ModalStackManager.test.tsxcontaining 8 tests covering stack management, auto-assigned z-index sequences, top-most modal checks, duplicate resolution, and reactive hook updates.Ran the test suite successfully (all 16 tests passed):