@onekeyfe/react-native-native-overlay 3.0.162-alpha.272 → 6.7.0-8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/android/src/main/java/com/onekey/nativeoverlay/NativeOverlayHost.kt +13 -10
  2. package/android/src/test/java/com/onekey/nativeoverlay/NativeOverlayBackTest.kt +157 -0
  3. package/docs/SPEC.md +121 -26
  4. package/ios/NativeOverlayContainerView.swift +20 -7
  5. package/ios/NativeOverlaySheetController.swift +35 -1
  6. package/lib/module/OverlayStore.js +13 -1
  7. package/lib/module/OverlayStore.js.map +1 -1
  8. package/lib/module/OverlayView.web.js +104 -25
  9. package/lib/module/OverlayView.web.js.map +1 -1
  10. package/lib/module/useOverlayController.js +11 -3
  11. package/lib/module/useOverlayController.js.map +1 -1
  12. package/lib/module/web/animateTransition.js +20 -12
  13. package/lib/module/web/animateTransition.js.map +1 -1
  14. package/lib/module/web/overlayLayers.js +16 -0
  15. package/lib/module/web/overlayLayers.js.map +1 -1
  16. package/lib/module/web/useKeyboardShift.js +1 -1
  17. package/lib/module/web/useKeyboardShift.js.map +1 -1
  18. package/lib/module/web/useSheetDrag.js +22 -2
  19. package/lib/module/web/useSheetDrag.js.map +1 -1
  20. package/lib/typescript/src/OverlayStore.d.ts +2 -0
  21. package/lib/typescript/src/OverlayStore.d.ts.map +1 -1
  22. package/lib/typescript/src/OverlayView.web.d.ts.map +1 -1
  23. package/lib/typescript/src/useOverlayController.d.ts.map +1 -1
  24. package/lib/typescript/src/web/animateTransition.d.ts +2 -2
  25. package/lib/typescript/src/web/animateTransition.d.ts.map +1 -1
  26. package/lib/typescript/src/web/overlayLayers.d.ts +1 -0
  27. package/lib/typescript/src/web/overlayLayers.d.ts.map +1 -1
  28. package/lib/typescript/src/web/useSheetDrag.d.ts.map +1 -1
  29. package/package.json +1 -1
  30. package/src/OverlayStore.ts +13 -1
  31. package/src/OverlayView.web.tsx +193 -56
  32. package/src/useOverlayController.ts +11 -4
  33. package/src/web/animateTransition.ts +30 -11
  34. package/src/web/overlayLayers.ts +20 -0
  35. package/src/web/useKeyboardShift.ts +1 -1
  36. package/src/web/useSheetDrag.ts +23 -2
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","KEYBOARD_MARGIN","computeKeyboardShift","keyboardTop","contentTop","contentBottom","isSheet","safeTop","undefined","needed","room","Math","max","min","layoutExtent","content","root","firstElementChild","children","Array","from","filter","child","HTMLElement","length","top","map","c","offsetTop","bottom","offsetHeight","useKeyboardShift","layerRef","sheetRef","contentRef","enabled","shiftRef","viewport","globalThis","visualViewport","layer","current","update","keyboardBottom","height","covered","innerHeight","origin","parentElement","getBoundingClientRect","sheet","extent","shift","abs","style","transform","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["web/useKeyboardShift.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","KEYBOARD_MARGIN","computeKeyboardShift","keyboardTop","contentTop","contentBottom","isSheet","safeTop","undefined","needed","room","Math","max","min","layoutExtent","content","root","firstElementChild","children","Array","from","filter","child","HTMLElement","length","top","map","c","offsetTop","bottom","offsetHeight","useKeyboardShift","layerRef","sheetRef","contentRef","enabled","shiftRef","viewport","globalThis","visualViewport","layer","current","update","keyboardBottom","height","covered","innerHeight","origin","parentElement","getBoundingClientRect","sheet","extent","shift","abs","style","transform","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["web/useKeyboardShift.ts"],"mappings":"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","ignoreList":[]}
@@ -111,15 +111,35 @@ export function useSheetDrag({
111
111
  once: true
112
112
  });
113
113
  };
114
+ const onPointerCancel = event => {
115
+ if (!tracking || event.pointerId !== pointerId) {
116
+ return;
117
+ }
118
+ tracking = false;
119
+ dragging = false;
120
+ velocity = 0;
121
+ if (sheet.hasPointerCapture?.(pointerId)) {
122
+ sheet.releasePointerCapture(pointerId);
123
+ }
124
+ pointerId = -1;
125
+ sheet.style.transform = '';
126
+ sheet.style.transition = '';
127
+ if (backdropRef.current) {
128
+ backdropRef.current.style.opacity = '1';
129
+ }
130
+ };
114
131
  sheet.addEventListener('pointerdown', onPointerDown);
115
132
  sheet.addEventListener('pointermove', onPointerMove);
116
133
  sheet.addEventListener('pointerup', onPointerUp);
117
- sheet.addEventListener('pointercancel', onPointerUp);
134
+ sheet.addEventListener('pointercancel', onPointerCancel);
118
135
  return () => {
136
+ if (sheet.hasPointerCapture?.(pointerId)) {
137
+ sheet.releasePointerCapture(pointerId);
138
+ }
119
139
  sheet.removeEventListener('pointerdown', onPointerDown);
120
140
  sheet.removeEventListener('pointermove', onPointerMove);
121
141
  sheet.removeEventListener('pointerup', onPointerUp);
122
- sheet.removeEventListener('pointercancel', onPointerUp);
142
+ sheet.removeEventListener('pointercancel', onPointerCancel);
123
143
  };
124
144
  }, [sheetRef, backdropRef, enabled]);
125
145
  }
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","DRAG_START_THRESHOLD","DISMISS_DISTANCE_RATIO","DISMISS_VELOCITY","UPWARD_RESISTANCE","SETTLE_TRANSITION","scrolledAncestorWithin","target","sheet","node","HTMLElement","scrollTop","scrollHeight","clientHeight","parentElement","undefined","useSheetDrag","sheetRef","backdropRef","enabled","onDismissByPan","onDismissRef","current","startY","lastY","lastTime","velocity","tracking","dragging","pointerId","setOffset","offset","style","transform","backdrop","opacity","String","Math","max","offsetHeight","onPointerDown","event","button","clientY","timeStamp","onPointerMove","dy","setPointerCapture","transition","dt","onPointerUp","height","addEventListener","clickEvent","stopPropagation","preventDefault","capture","once","removeEventListener"],"sourceRoot":"../../../src","sources":["web/useSheetDrag.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","DRAG_START_THRESHOLD","DISMISS_DISTANCE_RATIO","DISMISS_VELOCITY","UPWARD_RESISTANCE","SETTLE_TRANSITION","scrolledAncestorWithin","target","sheet","node","HTMLElement","scrollTop","scrollHeight","clientHeight","parentElement","undefined","useSheetDrag","sheetRef","backdropRef","enabled","onDismissByPan","onDismissRef","current","startY","lastY","lastTime","velocity","tracking","dragging","pointerId","setOffset","offset","style","transform","backdrop","opacity","String","Math","max","offsetHeight","onPointerDown","event","button","clientY","timeStamp","onPointerMove","dy","setPointerCapture","transition","dt","onPointerUp","height","addEventListener","clickEvent","stopPropagation","preventDefault","capture","once","onPointerCancel","hasPointerCapture","releasePointerCapture","removeEventListener"],"sourceRoot":"../../../src","sources":["web/useSheetDrag.ts"],"mappings":"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","ignoreList":[]}
@@ -32,6 +32,8 @@ export declare class OverlayStore {
32
32
  request(request: IOverlayRequest, handlers?: IOverlayEntryHandlers): IOverlayEntry;
33
33
  /** Starts closing an entry; the native side calls `finalize` after its exit animation. */
34
34
  dismiss(id: string, reason?: IOverlayDismissReason): void;
35
+ /** Reverses an unfinished close without creating a new presentation cycle. */
36
+ reopen(id: string): void;
35
37
  /** Removes a closing (or active) entry once its exit animation finished. */
36
38
  finalize(id: string): void;
37
39
  dismissAll(filter?: {
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayStore.d.ts","sourceRoot":"","sources":["../../../src/OverlayStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,qBAAqB;IACpC,yFAAyF;IACzF,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAyBD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,GAAG,CAAK;IAEhB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAE1D,OAAO,CAAC,MAAM,CAAuB;IAErC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IAErE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG1B;IAEJ,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAE7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD,OAAO,CAAC,QAAQ,CAGd;gBAEU,OAAO,GAAE,oBAAyB;IAK9C,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAK9C;IAEF,WAAW,QAAO,gBAAgB,CAAkB;IAEpD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI/C,OAAO,CACL,OAAO,EAAE,eAAe,EACxB,QAAQ,GAAE,qBAA0B,GACnC,aAAa;IAiDhB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,qBAAsC,GAAG,IAAI;IAMzE,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAY1B,UAAU,CACR,MAAM,GAAE;QACN,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/B,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,qBAAqB,CAAC;KAC3B,GACL,IAAI;IAqBP,qFAAqF;IACrF,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAqBxD,0DAA0D;IAC1D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAalC;;;;OAIG;IACH,WAAW,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,sBAAsB;IAqB5D,6EAA6E;IAC7E,2EAA2E;IAC3E,iBAAiB,IAAI,aAAa,GAAG,SAAS;IAI9C,cAAc,IAAI,aAAa,GAAG,SAAS;IAgB3C,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,IAAI;CASb;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,gBAAgB,GACzB,aAAa,GAAG,SAAS,CAc3B;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
1
+ {"version":3,"file":"OverlayStore.d.ts","sourceRoot":"","sources":["../../../src/OverlayStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,qBAAqB;IACpC,yFAAyF;IACzF,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAyBD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,GAAG,CAAK;IAEhB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAE1D,OAAO,CAAC,MAAM,CAAuB;IAErC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IAErE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG1B;IAEJ,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAE7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD,OAAO,CAAC,QAAQ,CAGd;gBAEU,OAAO,GAAE,oBAAyB;IAK9C,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAK9C;IAEF,WAAW,QAAO,gBAAgB,CAAkB;IAEpD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI/C,OAAO,CACL,OAAO,EAAE,eAAe,EACxB,QAAQ,GAAE,qBAA0B,GACnC,aAAa;IAiDhB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,qBAAsC,GAAG,IAAI;IAMzE,8EAA8E;IAC9E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASxB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAY1B,UAAU,CACR,MAAM,GAAE;QACN,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/B,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,qBAAqB,CAAC;KAC3B,GACL,IAAI;IAqBP,qFAAqF;IACrF,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAqBxD,0DAA0D;IAC1D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAalC;;;;OAIG;IACH,WAAW,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,sBAAsB;IAqB5D,6EAA6E;IAC7E,2EAA2E;IAC3E,iBAAiB,IAAI,aAAa,GAAG,SAAS;IAI9C,cAAc,IAAI,aAAa,GAAG,SAAS;IAgB3C,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,IAAI;CASb;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,gBAAgB,GACzB,aAAa,GAAG,SAAS,CAc3B;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayView.web.d.ts","sourceRoot":"","sources":["../../../src/OverlayView.web.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAGV,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AA4Q5B,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,sCAiEnD"}
1
+ {"version":3,"file":"OverlayView.web.d.ts","sourceRoot":"","sources":["../../../src/OverlayView.web.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAGV,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAkY5B,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,sCA2EnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"useOverlayController.d.ts","sourceRoot":"","sources":["../../../src/useOverlayController.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,KAAK,EACV,4BAA4B,EAC5B,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,qEAAqE;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,yBAAyB,CAAC;IACrC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,oBAAoB,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,IAAI,CAAC;CACtE;AAQD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CA+IpB"}
1
+ {"version":3,"file":"useOverlayController.d.ts","sourceRoot":"","sources":["../../../src/useOverlayController.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,KAAK,EACV,4BAA4B,EAC5B,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,qEAAqE;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,yBAAyB,CAAC;IACrC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,oBAAoB,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,IAAI,CAAC;CACtE;AAQD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CAsJpB"}
@@ -13,6 +13,6 @@ export declare function measureContentExtent(container: HTMLElement): IContentEx
13
13
  * slide distance and scale origin come from the children of `contentRoot`,
14
14
  * because the content wrapper itself always fills the window.
15
15
  */
16
- export declare function animateTransition(element: HTMLElement, contentRoot: HTMLElement, transition: IResolvedOverlayTransition, direction: 'in' | 'out'): Animation | undefined;
17
- export declare function animateBackdrop(element: HTMLElement, motion: IOverlayMotion, direction: 'in' | 'out'): Animation;
16
+ export declare function animateTransition(element: HTMLElement, contentRoot: HTMLElement, transition: IResolvedOverlayTransition, direction: 'in' | 'out', interruptedFrames?: ReadonlyMap<HTMLElement, Keyframe>): Animation | undefined;
17
+ export declare function animateBackdrop(element: HTMLElement, motion: IOverlayMotion, direction: 'in' | 'out', interruptedFrames?: ReadonlyMap<HTMLElement, Keyframe>): Animation;
18
18
  //# sourceMappingURL=animateTransition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"animateTransition.d.ts","sourceRoot":"","sources":["../../../../src/web/animateTransition.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,WAAW,GAAG,cAAc,CAkB3E;AA8DD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,0BAA0B,EACtC,SAAS,EAAE,IAAI,GAAG,KAAK,GACtB,SAAS,GAAG,SAAS,CAqBvB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,IAAI,GAAG,KAAK,GACtB,SAAS,CAMX"}
1
+ {"version":3,"file":"animateTransition.d.ts","sourceRoot":"","sources":["../../../../src/web/animateTransition.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,WAAW,GAAG,cAAc,CAkB3E;AA8DD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,0BAA0B,EACtC,SAAS,EAAE,IAAI,GAAG,KAAK,EACvB,iBAAiB,CAAC,EAAE,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,GACrD,SAAS,GAAG,SAAS,CAqCvB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,IAAI,GAAG,KAAK,EACvB,iBAAiB,CAAC,EAAE,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,GACrD,SAAS,CAOX"}
@@ -8,5 +8,6 @@ export declare function registerOverlayDismissRequester(id: string, requester: (
8
8
  /** Re-run after entry DOM nodes mount, since the store emits before commit. */
9
9
  export declare function scheduleOverlayInertSync(): void;
10
10
  export declare function registerOverlayPageHost(hostKey: string, element: HTMLDivElement): () => void;
11
+ export declare function subscribeOverlayPageHost(hostKey: string | undefined, listener: () => void): () => void;
11
12
  export declare function getOverlayPageHost(hostKey: string | undefined): HTMLDivElement | undefined;
12
13
  //# sourceMappingURL=overlayLayers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlayLayers.d.ts","sourceRoot":"","sources":["../../../../src/web/overlayLayers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,UAAU,CAAC;AAG7D,eAAO,MAAM,eAAe,8BAA8B,CAAC;AA8E3D,0EAA0E;AAC1E,wBAAgB,gBAAgB,SAsC/B;AA2BD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAQxE;AAED,wBAAgB,+BAA+B,CAC7C,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,IAAI,GACxD,MAAM,IAAI,CAOZ;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,SAEvC;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,MAAM,IAAI,CAQZ;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,cAAc,GAAG,SAAS,CAE5B"}
1
+ {"version":3,"file":"overlayLayers.d.ts","sourceRoot":"","sources":["../../../../src/web/overlayLayers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,UAAU,CAAC;AAG7D,eAAO,MAAM,eAAe,8BAA8B,CAAC;AA+E3D,0EAA0E;AAC1E,wBAAgB,gBAAgB,SAsC/B;AA2BD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAQxE;AAED,wBAAgB,+BAA+B,CAC7C,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,IAAI,GACxD,MAAM,IAAI,CAOZ;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,SAEvC;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,MAAM,IAAI,CAUZ;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,MAAM,IAAI,GACnB,MAAM,IAAI,CAYZ;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,cAAc,GAAG,SAAS,CAE5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSheetDrag.d.ts","sourceRoot":"","sources":["../../../../src/web/useSheetDrag.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBvC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EACX,OAAO,EACP,cAAc,GACf,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC3C,WAAW,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B,QAwGA"}
1
+ {"version":3,"file":"useSheetDrag.d.ts","sourceRoot":"","sources":["../../../../src/web/useSheetDrag.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBvC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EACX,OAAO,EACP,cAAc,GACf,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC3C,WAAW,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B,QA6HA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/react-native-native-overlay",
3
- "version": "3.0.162-alpha.272",
3
+ "version": "6.7.0-8",
4
4
  "description": "Native and Web overlay hosts with ordered levels, page scope and Fabric measurement",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -148,6 +148,16 @@ export class OverlayStore {
148
148
  }
149
149
  }
150
150
 
151
+ /** Reverses an unfinished close without creating a new presentation cycle. */
152
+ reopen(id: string): void {
153
+ const entry = this.shown.get(id);
154
+ if (!entry || entry.phase !== 'closing') return;
155
+ this.clearClosingTimer(id);
156
+ entry.phase = 'active';
157
+ entry.dismissReason = undefined;
158
+ this.emit();
159
+ }
160
+
151
161
  /** Removes a closing (or active) entry once its exit animation finished. */
152
162
  finalize(id: string): void {
153
163
  const entry = this.shown.get(id);
@@ -280,7 +290,9 @@ export class OverlayStore {
280
290
  if (queuedIndex !== -1) {
281
291
  this.queued = this.queued.filter((e) => e.id !== id);
282
292
  // Queued entries never rendered, so they leave without an exit animation.
283
- queueMicrotask(() => this.notifyRemoved(id, reason));
293
+ const handlers = this.handlers.get(id);
294
+ this.handlers.delete(id);
295
+ queueMicrotask(() => handlers?.onRemoved?.(reason));
284
296
  return true;
285
297
  }
286
298
  const entry = this.shown.get(id);
@@ -1,5 +1,12 @@
1
- import { useEffect, useId, useLayoutEffect, useRef } from 'react';
2
- import type { ReactNode, SyntheticEvent } from 'react';
1
+ import {
2
+ useCallback,
3
+ useEffect,
4
+ useId,
5
+ useLayoutEffect,
6
+ useRef,
7
+ useSyncExternalStore,
8
+ } from 'react';
9
+ import type { KeyboardEvent, ReactNode, SyntheticEvent } from 'react';
3
10
 
4
11
  import { createPortal } from 'react-dom';
5
12
  import { StyleSheet, View } from 'react-native';
@@ -7,6 +14,7 @@ import { StyleSheet, View } from 'react-native';
7
14
  import { OverlayLevelProvider } from './OverlayLevelContext';
8
15
  import { OVERLAY_LEVEL_ORDER, isBlockingLevel } from './OverlayLevels';
9
16
  import { OVERLAY_OWNER_ATTRIBUTE } from './OverlayPageHost.web';
17
+ import { overlayStore } from './OverlayStore';
10
18
  import { useOverlayController } from './useOverlayController';
11
19
  import { animateBackdrop, animateTransition } from './web/animateTransition';
12
20
  import {
@@ -15,6 +23,7 @@ import {
15
23
  getOverlayPageHost,
16
24
  registerOverlayDismissRequester,
17
25
  scheduleOverlayInertSync,
26
+ subscribeOverlayPageHost,
18
27
  } from './web/overlayLayers';
19
28
  import { useKeyboardShift } from './web/useKeyboardShift';
20
29
  import { useSheetDrag } from './web/useSheetDrag';
@@ -94,10 +103,22 @@ function WebOverlayEntry({
94
103
  const keyboardLayerRef = useRef<HTMLDivElement>(null);
95
104
  const backdropRef = useRef<HTMLDivElement>(null);
96
105
  const directionRef = useRef<'in' | 'out' | undefined>(undefined);
106
+ const runningAnimationsRef = useRef<Animation[]>([]);
97
107
  const restoreFocusRef = useRef<HTMLElement | null>(null);
98
108
  const callbacksRef = useRef({ onPresented, onDismissed });
99
109
  callbacksRef.current = { onPresented, onDismissed };
100
110
 
111
+ useLayoutEffect(() => {
112
+ if (!isSheet && sheetRef.current) {
113
+ // The host now survives a presentation switch; clear any in-flight pan.
114
+ sheetRef.current.style.removeProperty('transform');
115
+ sheetRef.current.style.removeProperty('transition');
116
+ if (backdropRef.current) {
117
+ backdropRef.current.style.opacity = '1';
118
+ }
119
+ }
120
+ }, [isSheet]);
121
+
101
122
  useLayoutEffect(() => {
102
123
  const content = contentRef.current;
103
124
  if (!content) {
@@ -110,32 +131,61 @@ function WebOverlayEntry({
110
131
  const neverEntered = directionRef.current === undefined;
111
132
  directionRef.current = direction;
112
133
  scheduleOverlayInertSync();
134
+ const interruptedFrames = new Map<HTMLElement, Keyframe>();
135
+ for (const running of runningAnimationsRef.current) {
136
+ const target = (running.effect as KeyframeEffect | null)?.target;
137
+ if (running.playState === 'running' && target instanceof HTMLElement) {
138
+ const style = getComputedStyle(target);
139
+ interruptedFrames.set(target, {
140
+ opacity: style.opacity,
141
+ transform: style.transform,
142
+ });
143
+ }
144
+ running.cancel();
145
+ }
146
+ runningAnimationsRef.current = [];
113
147
  if (direction === 'out' && (neverEntered || pannedAwayRef.current)) {
148
+ restoreFocusRef.current?.focus?.({ preventScroll: true });
149
+ restoreFocusRef.current = null;
114
150
  callbacksRef.current.onDismissed();
115
151
  return;
116
152
  }
117
- if (direction === 'in' && blocking) {
118
- restoreFocusRef.current = document.activeElement as HTMLElement | null;
119
- entryRef.current?.focus({ preventScroll: true });
153
+ if (direction === 'in') {
154
+ pannedAwayRef.current = false;
155
+ sheetRef.current?.style.removeProperty('transform');
156
+ sheetRef.current?.style.removeProperty('transition');
157
+ if (backdropRef.current) {
158
+ backdropRef.current.style.opacity = '1';
159
+ }
160
+ if (blocking) {
161
+ restoreFocusRef.current = document.activeElement as HTMLElement | null;
162
+ entryRef.current?.focus({ preventScroll: true });
163
+ }
120
164
  }
121
- content.getAnimations().forEach((running) => running.cancel());
122
- backdropRef.current?.getAnimations().forEach((running) => running.cancel());
123
165
  // A sheet is measured as a whole; other presentations by the children
124
166
  // of the full-window React root.
125
167
  const contentRoot = isSheet
126
168
  ? content
127
- : (content.firstElementChild as HTMLElement | null) ?? content;
169
+ : (sheetRef.current?.firstElementChild as HTMLElement | null) ?? content;
128
170
  const transition = direction === 'in' ? animation.enter : animation.exit;
129
171
  const running = [
130
- animateTransition(content, contentRoot, transition, direction),
172
+ animateTransition(
173
+ content,
174
+ contentRoot,
175
+ transition,
176
+ direction,
177
+ interruptedFrames
178
+ ),
131
179
  backdropRef.current
132
180
  ? animateBackdrop(
133
181
  backdropRef.current,
134
182
  animation.backdrop.motion,
135
- direction
183
+ direction,
184
+ interruptedFrames
136
185
  )
137
186
  : undefined,
138
187
  ].filter((item): item is Animation => !!item);
188
+ runningAnimationsRef.current = running;
139
189
  void Promise.all(running.map((item) => item.finished))
140
190
  .then(() => {
141
191
  if (directionRef.current !== direction) {
@@ -192,6 +242,72 @@ function WebOverlayEntry({
192
242
  const showBackdrop = !!backdropColor || blocking;
193
243
  const cornerRadius = sheet?.cornerRadius ?? DEFAULT_SHEET_CORNER_RADIUS;
194
244
 
245
+ const onKeyDownCapture = (event: KeyboardEvent<HTMLDivElement>) => {
246
+ const root = entryRef.current;
247
+ if (
248
+ event.key !== 'Tab' ||
249
+ event.defaultPrevented ||
250
+ event.nativeEvent.isComposing ||
251
+ !root ||
252
+ !presented ||
253
+ parked ||
254
+ overlayStore.getBlockingTop()?.id !== entryId
255
+ ) {
256
+ return;
257
+ }
258
+ const tabbable = Array.from(
259
+ root.querySelectorAll<HTMLElement>(
260
+ 'a[href], area[href], button, input:not([type="hidden"]), select, textarea, iframe, object, embed, [tabindex], [contenteditable]:not([contenteditable="false"])'
261
+ )
262
+ )
263
+ .filter((node) => {
264
+ if (
265
+ (node.tabIndex < 0 &&
266
+ (node.hasAttribute('tabindex') ||
267
+ !node.hasAttribute('contenteditable'))) ||
268
+ node.matches(':disabled')
269
+ ) {
270
+ return false;
271
+ }
272
+ for (
273
+ let ancestor: HTMLElement | null = node;
274
+ ancestor;
275
+ ancestor = ancestor.parentElement
276
+ ) {
277
+ const style = getComputedStyle(ancestor);
278
+ if (
279
+ ancestor.inert ||
280
+ ancestor.hasAttribute('inert') ||
281
+ ancestor.hidden ||
282
+ ancestor.getAttribute('aria-hidden') === 'true' ||
283
+ style.display === 'none' ||
284
+ style.visibility === 'hidden'
285
+ ) {
286
+ return false;
287
+ }
288
+ }
289
+ return true;
290
+ })
291
+ .sort((a, b) => {
292
+ const aOrder = a.tabIndex > 0 ? a.tabIndex : Infinity;
293
+ const bOrder = b.tabIndex > 0 ? b.tabIndex : Infinity;
294
+ return aOrder === bOrder ? 0 : aOrder - bOrder;
295
+ });
296
+ const active = document.activeElement;
297
+ const first = tabbable[0];
298
+ const last = tabbable[tabbable.length - 1];
299
+ if (
300
+ !first ||
301
+ active === root ||
302
+ !root.contains(active) ||
303
+ active === (event.shiftKey ? first : last)
304
+ ) {
305
+ event.preventDefault();
306
+ (event.shiftKey ? last : first)?.focus({ preventScroll: true });
307
+ if (!first) root.focus({ preventScroll: true });
308
+ }
309
+ };
310
+
195
311
  return (
196
312
  <div
197
313
  ref={entryRef}
@@ -214,6 +330,7 @@ function WebOverlayEntry({
214
330
  visibility: parked ? 'hidden' : undefined,
215
331
  }}
216
332
  {...ISOLATED_EVENT_HANDLERS}
333
+ onKeyDownCapture={onKeyDownCapture}
217
334
  >
218
335
  {showBackdrop ? (
219
336
  <div
@@ -224,7 +341,7 @@ function WebOverlayEntry({
224
341
  inset: 0,
225
342
  opacity: 0,
226
343
  background: backdropColor ?? 'transparent',
227
- pointerEvents: blocking ? 'auto' : 'none',
344
+ pointerEvents: blocking || dismissOnBackdropPress ? 'auto' : 'none',
228
345
  }}
229
346
  />
230
347
  ) : null}
@@ -244,48 +361,58 @@ function WebOverlayEntry({
244
361
  ref={contentRef}
245
362
  style={{ position: 'absolute', inset: 0, pointerEvents: 'none' }}
246
363
  >
247
- {sheet ? (
248
- <div
249
- ref={sheetRef}
250
- style={{
251
- position: 'absolute',
252
- left: 0,
253
- right: 0,
254
- bottom: 0,
255
- height: sheet.height,
256
- maxHeight: sheet.maxHeight ?? DEFAULT_SHEET_MAX_HEIGHT,
257
- display: 'flex',
258
- flexDirection: 'column',
259
- overflow: 'hidden',
260
- pointerEvents: 'auto',
261
- touchAction: 'pan-y',
262
- background: sheet.backgroundColor
263
- ? String(sheet.backgroundColor)
264
- : undefined,
265
- borderTopLeftRadius: cornerRadius,
266
- borderTopRightRadius: cornerRadius,
267
- }}
364
+ {/* Keep both hosts and the content slot stable across presentations. */}
365
+ <div
366
+ ref={sheetRef}
367
+ style={
368
+ sheet
369
+ ? {
370
+ position: 'absolute',
371
+ left: 0,
372
+ right: 0,
373
+ bottom: 0,
374
+ height: sheet.height,
375
+ maxHeight: sheet.maxHeight ?? DEFAULT_SHEET_MAX_HEIGHT,
376
+ display: 'flex',
377
+ flexDirection: 'column',
378
+ overflow: 'hidden',
379
+ pointerEvents: 'auto',
380
+ touchAction: 'pan-y',
381
+ background: sheet.backgroundColor
382
+ ? String(sheet.backgroundColor)
383
+ : undefined,
384
+ borderTopLeftRadius: cornerRadius,
385
+ borderTopRightRadius: cornerRadius,
386
+ }
387
+ : {
388
+ position: 'absolute',
389
+ inset: 0,
390
+ display: 'flex',
391
+ flexDirection: 'column',
392
+ pointerEvents: 'none',
393
+ }
394
+ }
395
+ >
396
+ {sheet?.showHandle ? (
397
+ <div
398
+ style={{
399
+ alignSelf: 'center',
400
+ width: 36,
401
+ height: 5,
402
+ marginTop: 8,
403
+ borderRadius: 2.5,
404
+ background: 'rgba(0, 0, 0, 0.2)',
405
+ flexShrink: 0,
406
+ }}
407
+ />
408
+ ) : null}
409
+ <View
410
+ pointerEvents={sheet ? undefined : 'box-none'}
411
+ style={sheet ? { flexShrink: 1 } : StyleSheet.absoluteFill}
268
412
  >
269
- {sheet.showHandle ? (
270
- <div
271
- style={{
272
- alignSelf: 'center',
273
- width: 36,
274
- height: 5,
275
- marginTop: 8,
276
- borderRadius: 2.5,
277
- background: 'rgba(0, 0, 0, 0.2)',
278
- flexShrink: 0,
279
- }}
280
- />
281
- ) : null}
282
- <View style={{ flexShrink: 1 }}>{children}</View>
283
- </div>
284
- ) : (
285
- <View pointerEvents="box-none" style={StyleSheet.absoluteFill}>
286
413
  {children}
287
414
  </View>
288
- )}
415
+ </div>
289
416
  </div>
290
417
  </div>
291
418
  </div>
@@ -320,12 +447,22 @@ export function OverlayView(props: IOverlayViewProps) {
320
447
  // Closed with `keepContentMounted`: the same entry stays in the layer,
321
448
  // hidden and inert, so the content keeps its state and can be measured.
322
449
  const parked = !mounted || !entry;
450
+ const subscribePageHost = useCallback(
451
+ (listener: () => void) => subscribeOverlayPageHost(hostKey, listener),
452
+ [hostKey]
453
+ );
454
+ const getPageHost = useCallback(() => getOverlayPageHost(hostKey), [hostKey]);
455
+ const pageHost = useSyncExternalStore(
456
+ subscribePageHost,
457
+ getPageHost,
458
+ () => undefined
459
+ );
323
460
  if (parked && !keepContentMounted) {
324
461
  return null;
325
462
  }
326
-
327
- const pageHost =
328
- !parked && scope === 'page' ? getOverlayPageHost(hostKey) : undefined;
463
+ if (scope === 'page' && !pageHost) {
464
+ return null;
465
+ }
329
466
  return createPortal(
330
467
  <WebOverlayEntry
331
468
  key="entry"
@@ -346,15 +483,15 @@ export function OverlayView(props: IOverlayViewProps) {
346
483
  sheet={presentation === 'sheet' ? sheet ?? {} : undefined}
347
484
  // Inside a page host all levels share one stacking context.
348
485
  zIndex={
349
- pageHost
486
+ scope === 'page'
350
487
  ? OVERLAY_LEVEL_ORDER[level] * 1000 + (entry?.seq ?? 0)
351
488
  : entry?.seq ?? 0
352
489
  }
353
- ownerKey={pageHost ? ownerKey : undefined}
490
+ ownerKey={scope === 'page' ? ownerKey : undefined}
354
491
  testID={testID}
355
492
  >
356
493
  <OverlayLevelProvider value={level}>{children}</OverlayLevelProvider>
357
494
  </WebOverlayEntry>,
358
- pageHost ?? getOverlayLayerRoot(level)
495
+ scope === 'page' ? pageHost! : getOverlayLayerRoot(level)
359
496
  );
360
497
  }
@@ -69,9 +69,7 @@ export function useOverlayController(
69
69
  const pageScope = useOverlayPageScope();
70
70
  const hostKey = props.hostKey ?? pageScope.hostKey;
71
71
  const ownerKey = props.ownerKey ?? pageScope.ownerKey;
72
- // Without a host or owner there is nowhere to anchor a page overlay.
73
- const scope =
74
- props.scope === 'page' && hostKey && ownerKey ? 'page' : 'global';
72
+ const scope = props.scope ?? 'global';
75
73
  const baseId = useId();
76
74
  const cycleRef = useRef(0);
77
75
  const [entryId, setEntryId] = useState<string | undefined>();
@@ -79,6 +77,7 @@ export function useOverlayController(
79
77
  // still true, so the effect below does not immediately reopen it.
80
78
  const closedByStoreRef = useRef(false);
81
79
  const propsRef = useLatest(props);
80
+ const previousVisibleRef = useRef(visible);
82
81
 
83
82
  const snapshot = useSyncExternalStore(
84
83
  overlayStore.subscribe,
@@ -95,6 +94,9 @@ export function useOverlayController(
95
94
  );
96
95
 
97
96
  useEffect(() => {
97
+ const reopening = visible && !previousVisibleRef.current;
98
+ previousVisibleRef.current = visible;
99
+ if (reopening && entryId) overlayStore.reopen(entryId);
98
100
  if (!visible) {
99
101
  closedByStoreRef.current = false;
100
102
  if (entryId) {
@@ -105,6 +107,11 @@ export function useOverlayController(
105
107
  if (entryId || closedByStoreRef.current) {
106
108
  return;
107
109
  }
110
+ // Page context can become ready after the caller first opens the overlay.
111
+ // Keep the request in its page boundary instead of presenting globally.
112
+ if (scope === 'page' && (!hostKey || !ownerKey)) {
113
+ return;
114
+ }
108
115
  cycleRef.current += 1;
109
116
  const id = `overlay-view${baseId}${cycleRef.current}`;
110
117
  overlayStore.request(
@@ -134,7 +141,7 @@ export function useOverlayController(
134
141
  setEntryId(id);
135
142
  // Level / strategy changes apply to the next open cycle only.
136
143
  // eslint-disable-next-line react-hooks/exhaustive-deps
137
- }, [visible, entryId]);
144
+ }, [visible, entryId, scope, hostKey, ownerKey]);
138
145
 
139
146
  useEffect(
140
147
  () => () => {