react-native-screen-transitions 3.11.2 → 3.11.3

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 (255) hide show
  1. package/lib/commonjs/native-stack/views/NativeStackView.native.js +1 -1
  2. package/lib/commonjs/native-stack/views/NativeStackView.native.js.map +1 -1
  3. package/lib/commonjs/shared/components/boundary/components/boundary-lifecycle.js +36 -0
  4. package/lib/commonjs/shared/components/boundary/components/boundary-lifecycle.js.map +1 -0
  5. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js +1 -13
  6. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js.map +1 -1
  7. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js +9 -2
  8. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -1
  9. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js +3 -2
  10. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  11. package/lib/commonjs/shared/components/boundary/hooks/use-measurer.js +9 -2
  12. package/lib/commonjs/shared/components/boundary/hooks/use-measurer.js.map +1 -1
  13. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/host.js +5 -12
  14. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/host.js.map +1 -1
  15. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +25 -43
  16. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +1 -1
  17. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js +13 -0
  18. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js.map +1 -0
  19. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js +8 -31
  20. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +1 -1
  21. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js +14 -19
  22. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js.map +1 -1
  23. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +8 -0
  24. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +1 -1
  25. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js +19 -47
  26. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js.map +1 -1
  27. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/index.js.map +1 -1
  28. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js +1 -1
  29. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +1 -1
  30. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js +19 -17
  31. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  32. package/lib/commonjs/shared/components/boundary/utils/refresh-signals.js +19 -5
  33. package/lib/commonjs/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  34. package/lib/commonjs/shared/components/screen-container/layers/backdrop.js +11 -7
  35. package/lib/commonjs/shared/components/screen-container/layers/backdrop.js.map +1 -1
  36. package/lib/commonjs/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.js +31 -0
  37. package/lib/commonjs/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.js.map +1 -0
  38. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-completion.js +26 -0
  39. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-completion.js.map +1 -0
  40. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +60 -86
  41. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  42. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js +1 -5
  43. package/lib/commonjs/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js.map +1 -1
  44. package/lib/commonjs/shared/components/screen-lifecycle/index.js +9 -6
  45. package/lib/commonjs/shared/components/screen-lifecycle/index.js.map +1 -1
  46. package/lib/commonjs/shared/hooks/navigation/use-navigation-helpers.js +28 -6
  47. package/lib/commonjs/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
  48. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js +1 -2
  49. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  50. package/lib/commonjs/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js +9 -2
  51. package/lib/commonjs/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js.map +1 -1
  52. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js +4 -5
  53. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js.map +1 -1
  54. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.js +2 -3
  55. package/lib/commonjs/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.js.map +1 -1
  56. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js +4 -5
  57. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js.map +1 -1
  58. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.js +2 -3
  59. package/lib/commonjs/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.js.map +1 -1
  60. package/lib/commonjs/shared/providers/screen/gestures/shared/policy.js +9 -5
  61. package/lib/commonjs/shared/providers/screen/gestures/shared/policy.js.map +1 -1
  62. package/lib/commonjs/shared/providers/stack/blank-stack-state/blank-stack-controller.js +5 -1
  63. package/lib/commonjs/shared/providers/stack/blank-stack-state/blank-stack-controller.js.map +1 -1
  64. package/lib/commonjs/shared/stores/bounds/internals/links.js +1 -1
  65. package/lib/commonjs/shared/stores/bounds/internals/links.js.map +1 -1
  66. package/lib/commonjs/shared/stores/system.store.js +1 -2
  67. package/lib/commonjs/shared/stores/system.store.js.map +1 -1
  68. package/lib/commonjs/shared/utils/animation/animate-to-progress.js +0 -22
  69. package/lib/commonjs/shared/utils/animation/animate-to-progress.js.map +1 -1
  70. package/lib/commonjs/shared/utils/navigation/close-action-replay.js +22 -0
  71. package/lib/commonjs/shared/utils/navigation/close-action-replay.js.map +1 -0
  72. package/lib/module/native-stack/views/NativeStackView.native.js +1 -1
  73. package/lib/module/native-stack/views/NativeStackView.native.js.map +1 -1
  74. package/lib/module/shared/components/boundary/components/boundary-lifecycle.js +32 -0
  75. package/lib/module/shared/components/boundary/components/boundary-lifecycle.js.map +1 -0
  76. package/lib/module/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js +1 -13
  77. package/lib/module/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js.map +1 -1
  78. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js +9 -2
  79. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -1
  80. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js +3 -2
  81. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  82. package/lib/module/shared/components/boundary/hooks/use-measurer.js +9 -2
  83. package/lib/module/shared/components/boundary/hooks/use-measurer.js.map +1 -1
  84. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/host.js +5 -12
  85. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/host.js.map +1 -1
  86. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +27 -45
  87. package/lib/module/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +1 -1
  88. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js +8 -0
  89. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js.map +1 -0
  90. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js +8 -32
  91. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +1 -1
  92. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js +15 -20
  93. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js.map +1 -1
  94. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +8 -0
  95. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +1 -1
  96. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js +20 -48
  97. package/lib/module/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js.map +1 -1
  98. package/lib/module/shared/components/boundary/portal/components/boundary-portal/index.js.map +1 -1
  99. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js +1 -1
  100. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +1 -1
  101. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js +20 -18
  102. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  103. package/lib/module/shared/components/boundary/utils/refresh-signals.js +19 -5
  104. package/lib/module/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  105. package/lib/module/shared/components/screen-container/layers/backdrop.js +12 -8
  106. package/lib/module/shared/components/screen-container/layers/backdrop.js.map +1 -1
  107. package/lib/module/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.js +25 -0
  108. package/lib/module/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.js.map +1 -0
  109. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-completion.js +21 -0
  110. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-completion.js.map +1 -0
  111. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js +60 -85
  112. package/lib/module/shared/components/screen-lifecycle/hooks/use-close-transition-intent.js.map +1 -1
  113. package/lib/module/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js +1 -5
  114. package/lib/module/shared/components/screen-lifecycle/hooks/use-transition-start-controller.js.map +1 -1
  115. package/lib/module/shared/components/screen-lifecycle/index.js +9 -6
  116. package/lib/module/shared/components/screen-lifecycle/index.js.map +1 -1
  117. package/lib/module/shared/hooks/navigation/use-navigation-helpers.js +29 -7
  118. package/lib/module/shared/hooks/navigation/use-navigation-helpers.js.map +1 -1
  119. package/lib/module/shared/providers/helpers/measured-bounds-writes.js +1 -2
  120. package/lib/module/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  121. package/lib/module/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js +9 -2
  122. package/lib/module/shared/providers/screen/gestures/hooks/use-screen-gesture-config.js.map +1 -1
  123. package/lib/module/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js +4 -5
  124. package/lib/module/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.js.map +1 -1
  125. package/lib/module/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.js +2 -3
  126. package/lib/module/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.js.map +1 -1
  127. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js +4 -5
  128. package/lib/module/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.js.map +1 -1
  129. package/lib/module/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.js +2 -3
  130. package/lib/module/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.js.map +1 -1
  131. package/lib/module/shared/providers/screen/gestures/shared/policy.js +9 -5
  132. package/lib/module/shared/providers/screen/gestures/shared/policy.js.map +1 -1
  133. package/lib/module/shared/providers/stack/blank-stack-state/blank-stack-controller.js +5 -1
  134. package/lib/module/shared/providers/stack/blank-stack-state/blank-stack-controller.js.map +1 -1
  135. package/lib/module/shared/stores/bounds/internals/links.js +1 -1
  136. package/lib/module/shared/stores/bounds/internals/links.js.map +1 -1
  137. package/lib/module/shared/stores/system.store.js +1 -2
  138. package/lib/module/shared/stores/system.store.js.map +1 -1
  139. package/lib/module/shared/utils/animation/animate-to-progress.js +0 -22
  140. package/lib/module/shared/utils/animation/animate-to-progress.js.map +1 -1
  141. package/lib/module/shared/utils/navigation/close-action-replay.js +16 -0
  142. package/lib/module/shared/utils/navigation/close-action-replay.js.map +1 -0
  143. package/lib/typescript/native-stack/views/NativeStackView.native.d.ts.map +1 -1
  144. package/lib/typescript/shared/components/boundary/components/boundary-lifecycle.d.ts +18 -0
  145. package/lib/typescript/shared/components/boundary/components/boundary-lifecycle.d.ts.map +1 -0
  146. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.d.ts +1 -2
  147. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.d.ts.map +1 -1
  148. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.d.ts.map +1 -1
  149. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts +3 -2
  150. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts.map +1 -1
  151. package/lib/typescript/shared/components/boundary/hooks/use-measurer.d.ts +3 -2
  152. package/lib/typescript/shared/components/boundary/hooks/use-measurer.d.ts.map +1 -1
  153. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/host.d.ts.map +1 -1
  154. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.d.ts +5 -1
  155. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.d.ts.map +1 -1
  156. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.d.ts +4 -0
  157. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.d.ts.map +1 -0
  158. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts +4 -17
  159. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts.map +1 -1
  160. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.d.ts +3 -1
  161. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.d.ts.map +1 -1
  162. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.d.ts.map +1 -1
  163. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.d.ts +5 -9
  164. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.d.ts.map +1 -1
  165. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts +2 -1
  166. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts.map +1 -1
  167. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts +2 -1
  168. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts.map +1 -1
  169. package/lib/typescript/shared/components/boundary/types.d.ts +6 -0
  170. package/lib/typescript/shared/components/boundary/types.d.ts.map +1 -1
  171. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts +1 -0
  172. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts.map +1 -1
  173. package/lib/typescript/shared/components/screen-container/layers/backdrop.d.ts.map +1 -1
  174. package/lib/typescript/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.d.ts +27 -0
  175. package/lib/typescript/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.d.ts.map +1 -0
  176. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-completion.d.ts +7 -0
  177. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-completion.d.ts.map +1 -0
  178. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts +2 -7
  179. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-close-transition-intent.d.ts.map +1 -1
  180. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-transition-start-controller.d.ts +1 -3
  181. package/lib/typescript/shared/components/screen-lifecycle/hooks/use-transition-start-controller.d.ts.map +1 -1
  182. package/lib/typescript/shared/components/screen-lifecycle/index.d.ts.map +1 -1
  183. package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts +1 -0
  184. package/lib/typescript/shared/hooks/navigation/use-navigation-helpers.d.ts.map +1 -1
  185. package/lib/typescript/shared/providers/screen/gestures/hooks/use-screen-gesture-config.d.ts.map +1 -1
  186. package/lib/typescript/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.d.ts +1 -1
  187. package/lib/typescript/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.d.ts.map +1 -1
  188. package/lib/typescript/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.d.ts.map +1 -1
  189. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.d.ts +1 -1
  190. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.d.ts.map +1 -1
  191. package/lib/typescript/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.d.ts.map +1 -1
  192. package/lib/typescript/shared/providers/screen/gestures/shared/policy.d.ts +2 -1
  193. package/lib/typescript/shared/providers/screen/gestures/shared/policy.d.ts.map +1 -1
  194. package/lib/typescript/shared/providers/screen/gestures/types.d.ts +2 -0
  195. package/lib/typescript/shared/providers/screen/gestures/types.d.ts.map +1 -1
  196. package/lib/typescript/shared/providers/stack/blank-stack-state/blank-stack-controller.d.ts.map +1 -1
  197. package/lib/typescript/shared/stores/system.store.d.ts +1 -2
  198. package/lib/typescript/shared/stores/system.store.d.ts.map +1 -1
  199. package/lib/typescript/shared/utils/animation/animate-to-progress.d.ts +2 -3
  200. package/lib/typescript/shared/utils/animation/animate-to-progress.d.ts.map +1 -1
  201. package/lib/typescript/shared/utils/navigation/close-action-replay.d.ts +4 -0
  202. package/lib/typescript/shared/utils/navigation/close-action-replay.d.ts.map +1 -0
  203. package/package.json +1 -1
  204. package/src/native-stack/views/NativeStackView.native.tsx +3 -1
  205. package/src/shared/components/boundary/components/boundary-lifecycle.tsx +53 -0
  206. package/src/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.ts +0 -14
  207. package/src/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.ts +13 -2
  208. package/src/shared/components/boundary/hooks/use-boundary-measurement.ts +7 -2
  209. package/src/shared/components/boundary/hooks/use-measurer.ts +11 -1
  210. package/src/shared/components/boundary/portal/components/boundary-portal/components/host.tsx +13 -11
  211. package/src/shared/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.tsx +44 -55
  212. package/src/shared/components/boundary/portal/components/boundary-portal/helpers/local-measurement.ts +10 -0
  213. package/src/shared/components/boundary/portal/components/boundary-portal/helpers/offset-style.ts +11 -55
  214. package/src/shared/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.ts +20 -24
  215. package/src/shared/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.ts +11 -0
  216. package/src/shared/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.ts +20 -67
  217. package/src/shared/components/boundary/portal/components/boundary-portal/index.tsx +1 -0
  218. package/src/shared/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.ts +3 -2
  219. package/src/shared/components/boundary/providers/boundary-root.provider.tsx +29 -20
  220. package/src/shared/components/boundary/types.ts +9 -0
  221. package/src/shared/components/boundary/utils/refresh-signals.ts +39 -6
  222. package/src/shared/components/screen-container/layers/backdrop.tsx +11 -7
  223. package/src/shared/components/screen-lifecycle/hooks/helpers/close-interception-rules.ts +64 -0
  224. package/src/shared/components/screen-lifecycle/hooks/use-close-completion.ts +28 -0
  225. package/src/shared/components/screen-lifecycle/hooks/use-close-transition-intent.ts +67 -108
  226. package/src/shared/components/screen-lifecycle/hooks/use-transition-start-controller.ts +0 -12
  227. package/src/shared/components/screen-lifecycle/index.tsx +8 -4
  228. package/src/shared/hooks/navigation/use-navigation-helpers.ts +39 -7
  229. package/src/shared/providers/helpers/measured-bounds-writes.ts +1 -1
  230. package/src/shared/providers/screen/gestures/hooks/use-screen-gesture-config.ts +9 -1
  231. package/src/shared/providers/screen/gestures/pan/behavior/pan-lifecycle.ts +4 -6
  232. package/src/shared/providers/screen/gestures/pan/behavior/use-pan-behavior.ts +1 -3
  233. package/src/shared/providers/screen/gestures/pinch/behavior/pinch-lifecycle.ts +4 -6
  234. package/src/shared/providers/screen/gestures/pinch/behavior/use-pinch-behavior.ts +2 -8
  235. package/src/shared/providers/screen/gestures/shared/policy.ts +17 -6
  236. package/src/shared/providers/screen/gestures/types.ts +2 -0
  237. package/src/shared/providers/stack/blank-stack-state/blank-stack-controller.ts +5 -1
  238. package/src/shared/stores/bounds/internals/links.ts +1 -1
  239. package/src/shared/stores/system.store.ts +1 -2
  240. package/src/shared/utils/animation/animate-to-progress.ts +1 -22
  241. package/src/shared/utils/navigation/close-action-replay.ts +25 -0
  242. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.js +0 -30
  243. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.js.map +0 -1
  244. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.js +0 -47
  245. package/lib/commonjs/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.js.map +0 -1
  246. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.js +0 -25
  247. package/lib/module/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.js.map +0 -1
  248. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.js +0 -40
  249. package/lib/module/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.js.map +0 -1
  250. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.d.ts +0 -9
  251. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.d.ts.map +0 -1
  252. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.d.ts +0 -9
  253. package/lib/typescript/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.d.ts.map +0 -1
  254. package/src/shared/components/boundary/portal/components/boundary-portal/helpers/active-pair.ts +0 -36
  255. package/src/shared/components/boundary/portal/components/boundary-portal/stores/host-bounds.store.ts +0 -45
@@ -1,6 +1,7 @@
1
- /** biome-ignore-all lint/correctness/useHookAtTopLevel: STACK_TYPE is stable per navigator */
2
1
  import { useLayoutEffect, useMemo, useRef } from "react";
2
+ import { useNavigationHelpers } from "../../../hooks/navigation/use-navigation-helpers";
3
3
  import useStableCallback from "../../../hooks/use-stable-callback";
4
+ import { hasTransitionsEnabled } from "../../../providers/screen/animation/helpers/has-transitions-enabled";
4
5
  import {
5
6
  type BaseDescriptor,
6
7
  useDescriptorsStore,
@@ -8,68 +9,34 @@ import {
8
9
  import { useBlankStackStore } from "../../../providers/stack/blank-stack.provider";
9
10
  import { useStackCoreStore } from "../../../providers/stack/core.provider";
10
11
  import { GestureStore } from "../../../stores/gesture.store";
11
- import {
12
- LifecycleTransitionRequestKind,
13
- type SystemStoreActions,
14
- type SystemStoreMap,
15
- } from "../../../stores/system.store";
16
12
  import { StackType } from "../../../types/stack.types";
13
+ import {
14
+ dispatchCloseAction,
15
+ isCloseActionReplay,
16
+ } from "../../../utils/navigation/close-action-replay";
17
+ import {
18
+ doesNavigatorOwnCloseAction,
19
+ shouldInterceptClose,
20
+ } from "./helpers/close-interception-rules";
17
21
  import { resetStoresForScreen } from "./helpers/reset-stores-for-screen";
18
22
 
19
- interface CloseHookParams {
20
- current: BaseDescriptor;
21
- requestLifecycleTransition: SystemStoreActions["requestLifecycleTransition"];
22
- resetStores: () => void;
23
- }
24
-
25
- const useBlankStackClose = ({
26
- current,
27
- requestLifecycleTransition,
28
- resetStores,
29
- }: CloseHookParams) => {
23
+ export function useCloseTransitionIntent(current: BaseDescriptor): {
24
+ completeClose: () => void;
25
+ } {
26
+ const routeKey = current.route.key;
27
+ const { STACK_TYPE: stackType, TRANSITIONS_ALWAYS_ON: transitionsAlwaysOn } =
28
+ useStackCoreStore((store) => store.flags);
30
29
  const handleCloseRoute = useBlankStackStore(
31
30
  (store) => store?.handleCloseRoute,
32
31
  );
33
- const isClosing = useBlankStackStore(
34
- (store) => store?.scenesByKey[current.route.key]?.activity === "closing",
32
+ const isBlankStackClosing = useBlankStackStore(
33
+ (store) => store?.scenesByKey[routeKey]?.activity === "closing",
35
34
  );
36
-
37
- useLayoutEffect(() => {
38
- if (!isClosing) {
39
- return;
40
- }
41
-
42
- requestLifecycleTransition(
43
- LifecycleTransitionRequestKind.BlankStackClose,
44
- 0,
45
- );
46
- }, [isClosing, requestLifecycleTransition]);
47
-
48
- const handleBlankStackCloseEnd = useStableCallback((finished: boolean) => {
49
- if (!finished) return;
50
- if (!handleCloseRoute) {
51
- throw new Error("Blank stack close handler was not found.");
52
- }
53
- handleCloseRoute({ route: current.route });
54
- requestAnimationFrame(() => {
55
- resetStores();
56
- });
57
- });
58
-
59
- return { handleBlankStackCloseEnd };
60
- };
61
-
62
- /**
63
- * Native stack close - listens to beforeRemove navigation event.
64
- */
65
- const useNativeStackClose = ({
66
- current,
67
- requestLifecycleTransition,
68
- resetStores,
69
- }: CloseHookParams) => {
70
- const parentScreenKey = useDescriptorsStore(
71
- (store) => store.derivations.parentScreenKey,
35
+ const ancestorKeys = useDescriptorsStore(
36
+ (store) => store.derivations.ancestorKeys,
72
37
  );
38
+ const parentScreenKey = ancestorKeys[0];
39
+ const { dismissScreen, requestDismiss } = useNavigationHelpers();
73
40
  const pendingActionRef = useRef<any>(null);
74
41
 
75
42
  const nearestAncestorDismissing = useMemo(() => {
@@ -78,38 +45,62 @@ const useNativeStackClose = ({
78
45
  return GestureStore.peekBag(parentScreenKey)?.dismissing ?? null;
79
46
  }, [parentScreenKey]);
80
47
 
81
- const handleNativeCloseEnd = useStableCallback((finished: boolean) => {
82
- if (!finished || !pendingActionRef.current) {
83
- pendingActionRef.current = null;
84
- return;
48
+ useLayoutEffect(() => {
49
+ if (isBlankStackClosing) {
50
+ requestDismiss();
85
51
  }
52
+ }, [isBlankStackClosing, requestDismiss]);
86
53
 
87
- current.navigation.dispatch(pendingActionRef.current);
54
+ const completeClose = useStableCallback(() => {
55
+ const pendingAction = pendingActionRef.current;
88
56
  pendingActionRef.current = null;
89
- requestAnimationFrame(() => {
90
- resetStores();
91
- });
57
+
58
+ if (pendingAction) {
59
+ dispatchCloseAction(pendingAction, (action) => {
60
+ current.navigation.dispatch(action);
61
+ });
62
+ } else if (stackType !== StackType.NATIVE && handleCloseRoute) {
63
+ handleCloseRoute({ route: current.route });
64
+ } else {
65
+ dismissScreen();
66
+ }
67
+
68
+ resetStoresForScreen(routeKey);
92
69
  });
93
70
 
94
- const handleBeforeRemove = useStableCallback((e: any) => {
95
- const options = current.options as { enableTransitions?: boolean };
96
- const isEnabled = options.enableTransitions;
97
- const navigation = current.navigation;
98
- const routeKey = current.route.key;
99
- const state = navigation.getState();
71
+ const handleBeforeRemove = useStableCallback((event: any) => {
72
+ if (isCloseActionReplay(event.data.action)) {
73
+ return;
74
+ }
75
+
76
+ const state = current.navigation.getState();
100
77
  const routeIndex = state.routes.findIndex(
101
78
  (route) => route.key === routeKey,
102
79
  );
103
- const isFirstScreen = routeIndex <= 0;
80
+ const action = event.data.action;
81
+ const ownsAction = doesNavigatorOwnCloseAction({
82
+ state,
83
+ action,
84
+ });
85
+ const shouldIntercept = shouldInterceptClose({
86
+ enabled: hasTransitionsEnabled(current.options, transitionsAlwaysOn),
87
+ ownsAction,
88
+ ancestorDismissing: !!nearestAncestorDismissing?.get(),
89
+ routeIndex,
90
+ focusedIndex: state.index,
91
+ });
92
+
93
+ if (!shouldIntercept) {
94
+ return;
95
+ }
104
96
 
105
- if (!isEnabled || nearestAncestorDismissing?.get() || isFirstScreen) {
106
- resetStores();
97
+ pendingActionRef.current ??= event.data.action;
98
+ if (!requestDismiss()) {
99
+ pendingActionRef.current = null;
107
100
  return;
108
101
  }
109
102
 
110
- e.preventDefault();
111
- pendingActionRef.current = e.data.action;
112
- requestLifecycleTransition(LifecycleTransitionRequestKind.NativeClose, 0);
103
+ event.preventDefault();
113
104
  });
114
105
 
115
106
  // biome-ignore lint/correctness/useExhaustiveDependencies: navigation listener should only rebind when the navigator instance changes
@@ -117,37 +108,5 @@ const useNativeStackClose = ({
117
108
  return current.navigation.addListener?.("beforeRemove", handleBeforeRemove);
118
109
  }, [current.navigation]);
119
110
 
120
- return { handleNativeCloseEnd };
121
- };
122
-
123
- /**
124
- * Handles close transition intent and returns finish callbacks for cleanup.
125
- */
126
- export function useCloseTransitionIntent(
127
- current: BaseDescriptor,
128
- system: SystemStoreMap,
129
- ): {
130
- handleBlankStackCloseEnd?: (finished: boolean) => void;
131
- handleNativeCloseEnd?: (finished: boolean) => void;
132
- } {
133
- const routeKey = current.route.key;
134
- const stackType = useStackCoreStore((store) => store.flags.STACK_TYPE);
135
- const isNativeStack = stackType === StackType.NATIVE;
136
- const { requestLifecycleTransition } = system.actions;
137
-
138
- const resetStores = useStableCallback(() => {
139
- resetStoresForScreen(routeKey);
140
- });
141
-
142
- const closeParams: CloseHookParams = {
143
- current,
144
- requestLifecycleTransition,
145
- resetStores,
146
- };
147
-
148
- if (isNativeStack) {
149
- return useNativeStackClose(closeParams);
150
- }
151
-
152
- return useBlankStackClose(closeParams);
111
+ return { completeClose };
153
112
  }
@@ -12,14 +12,10 @@ export const useTransitionStartController = ({
12
12
  current,
13
13
  animations,
14
14
  system,
15
- onBlankStackCloseFinish,
16
- onNativeCloseFinish,
17
15
  }: {
18
16
  current: BaseDescriptor;
19
17
  animations: AnimationStoreMap;
20
18
  system: SystemStoreMap;
21
- onBlankStackCloseFinish?: (finished: boolean) => void;
22
- onNativeCloseFinish?: (finished: boolean) => void;
23
19
  }) => {
24
20
  const {
25
21
  targetProgress,
@@ -53,13 +49,6 @@ export const useTransitionStartController = ({
53
49
  return;
54
50
  }
55
51
 
56
- const onAnimationFinish =
57
- kind === LifecycleTransitionRequestKind.BlankStackClose
58
- ? onBlankStackCloseFinish
59
- : kind === LifecycleTransitionRequestKind.NativeClose
60
- ? onNativeCloseFinish
61
- : undefined;
62
-
63
52
  animateToProgress({
64
53
  target,
65
54
  spec: transitionSpec,
@@ -69,7 +58,6 @@ export const useTransitionStartController = ({
69
58
  animations,
70
59
  targetProgress,
71
60
  animationProgress,
72
- onAnimationFinish,
73
61
  isDragging,
74
62
  });
75
63
 
@@ -2,6 +2,7 @@ import { useDescriptorsStore } from "../../providers/screen/descriptors";
2
2
  import { AnimationStore } from "../../stores/animation.store";
3
3
  import { SystemStore } from "../../stores/system.store";
4
4
  import { useScreenHistory } from "./hooks/history/use-screen-history";
5
+ import { useCloseCompletion } from "./hooks/use-close-completion";
5
6
  import { useCloseTransitionIntent } from "./hooks/use-close-transition-intent";
6
7
  import { useOpenTransitionIntent } from "./hooks/use-open-transition-intent";
7
8
  import { useTransitionStartController } from "./hooks/use-transition-start-controller";
@@ -21,8 +22,7 @@ export const ScreenLifecycle = ({ children }: Props) => {
21
22
  const animations = AnimationStore.getBag(current.route.key);
22
23
  const system = SystemStore.getBag(current.route.key);
23
24
 
24
- const { handleBlankStackCloseEnd, handleNativeCloseEnd } =
25
- useCloseTransitionIntent(current, system);
25
+ const { completeClose } = useCloseTransitionIntent(current);
26
26
 
27
27
  useOpenTransitionIntent(current, animations, system);
28
28
 
@@ -30,8 +30,12 @@ export const ScreenLifecycle = ({ children }: Props) => {
30
30
  current,
31
31
  animations,
32
32
  system,
33
- onBlankStackCloseFinish: handleBlankStackCloseEnd,
34
- onNativeCloseFinish: handleNativeCloseEnd,
33
+ });
34
+
35
+ useCloseCompletion({
36
+ closing: animations.closing,
37
+ animationProgress: system.animationProgress,
38
+ onComplete: completeClose,
35
39
  });
36
40
 
37
41
  useScreenHistory(current, previous, animations);
@@ -1,16 +1,23 @@
1
- import { StackActions } from "@react-navigation/native";
1
+ import {
2
+ StackActions,
3
+ usePreventRemoveContext,
4
+ } from "@react-navigation/native";
2
5
  import { useCallback } from "react";
3
6
  import { useDescriptorsStore } from "../../providers/screen/descriptors";
7
+ import { AnimationStore } from "../../stores/animation.store";
8
+ import {
9
+ LifecycleTransitionRequestKind,
10
+ SystemStore,
11
+ } from "../../stores/system.store";
12
+ import { dispatchCloseAction } from "../../utils/navigation/close-action-replay";
4
13
  import { useStack } from "./use-stack";
5
14
 
6
15
  export function useNavigationHelpers() {
7
16
  const route = useDescriptorsStore((store) => store.current.route);
8
17
  const navigation = useDescriptorsStore((store) => store.current.navigation);
9
18
  const requestStackDismiss = useStack((stack) => stack.requestDismiss);
10
-
11
- const requestDismiss = useCallback((): boolean => {
12
- return requestStackDismiss?.({ route }) ?? false;
13
- }, [route, requestStackDismiss]);
19
+ const { preventedRoutes } = usePreventRemoveContext();
20
+ const isRemovePrevented = preventedRoutes[route.key]?.preventRemove === true;
14
21
 
15
22
  const dismissScreen = useCallback((): boolean => {
16
23
  const state = navigation.getState();
@@ -20,13 +27,38 @@ export function useNavigationHelpers() {
20
27
  const routeStillPresent = routeIndex !== -1;
21
28
  if (!routeStillPresent || routeIndex === 0) return false;
22
29
 
23
- navigation.dispatch({
30
+ const action = {
24
31
  ...StackActions.pop(),
25
32
  source: route.key,
26
33
  target: state.key,
34
+ };
35
+ dispatchCloseAction(action, (closeAction) => {
36
+ navigation.dispatch(closeAction);
27
37
  });
28
38
  return true;
29
39
  }, [navigation, route.key]);
30
40
 
31
- return { dismissScreen, requestDismiss };
41
+ const requestDismiss = useCallback((): boolean => {
42
+ if (isRemovePrevented) return false;
43
+
44
+ if (requestStackDismiss) {
45
+ if (!requestStackDismiss({ route })) return false;
46
+ } else {
47
+ const state = navigation.getState();
48
+ const routeIndex = state.routes.findIndex(
49
+ (stateRoute) => stateRoute.key === route.key,
50
+ );
51
+ if (routeIndex <= 0) return false;
52
+ }
53
+
54
+ if (!AnimationStore.getValue(route.key, "closing").get()) {
55
+ SystemStore.getBag(route.key).actions.requestLifecycleTransition(
56
+ LifecycleTransitionRequestKind.Close,
57
+ 0,
58
+ );
59
+ }
60
+ return true;
61
+ }, [isRemovePrevented, navigation, route, requestStackDismiss]);
62
+
63
+ return { dismissScreen, isRemovePrevented, requestDismiss };
32
64
  }
@@ -67,7 +67,7 @@ export const applyMeasuredBoundsWrites = (
67
67
  measured,
68
68
  preparedStyles,
69
69
  group,
70
- { handoff, escapeClipping },
70
+ { handoff },
71
71
  );
72
72
  }
73
73
  };
@@ -1,3 +1,4 @@
1
+ import { usePreventRemoveContext } from "@react-navigation/native";
1
2
  import { useMemo } from "react";
2
3
  import { useDescriptorsStore } from "../../descriptors";
3
4
  import { useGestureStore } from "../gestures.provider";
@@ -10,6 +11,12 @@ export function useScreenGestureConfig(): ScreenGestureConfig {
10
11
  const isFirstKey = useDescriptorsStore(
11
12
  (store) => store.derivations.isFirstKey,
12
13
  );
14
+ const currentScreenKey = useDescriptorsStore(
15
+ (store) => store.derivations.currentScreenKey,
16
+ );
17
+ const { preventedRoutes } = usePreventRemoveContext();
18
+ const isRemovePrevented =
19
+ preventedRoutes[currentScreenKey]?.preventRemove === true;
13
20
 
14
21
  return useMemo(
15
22
  () =>
@@ -17,7 +24,8 @@ export function useScreenGestureConfig(): ScreenGestureConfig {
17
24
  options,
18
25
  isFirstKey,
19
26
  gestureContext,
27
+ isRemovePrevented,
20
28
  }),
21
- [isFirstKey, options, gestureContext],
29
+ [isFirstKey, options, gestureContext, isRemovePrevented],
22
30
  );
23
31
  }
@@ -89,7 +89,6 @@ export const trackPanGesture = (
89
89
  export const finalizePanRelease = (
90
90
  release: PanReleaseResult,
91
91
  runtime: PanGestureRuntime,
92
- dismissScreen: ((finished: boolean) => void) | undefined,
93
92
  dimensions: GestureDimensions,
94
93
  rawEvent: PanGestureEvent,
95
94
  requestDismiss?: () => void,
@@ -150,13 +149,8 @@ export const finalizePanRelease = (
150
149
  return;
151
150
  }
152
151
 
153
- if (plan.shouldDismiss && requestDismiss) {
154
- runOnJS(requestDismiss)();
155
- }
156
-
157
152
  animateToProgress({
158
153
  target: plan.target,
159
- onAnimationFinish: plan.shouldDismiss ? dismissScreen : undefined,
160
154
  spec: plan.transitionSpec,
161
155
  emitWillAnimate: false,
162
156
  markEntering: false,
@@ -165,4 +159,8 @@ export const finalizePanRelease = (
165
159
  animations,
166
160
  initialVelocity: plan.progressVelocity,
167
161
  });
162
+
163
+ if (plan.shouldDismiss && requestDismiss) {
164
+ runOnJS(requestDismiss)();
165
+ }
168
166
  };
@@ -31,7 +31,7 @@ export const usePanBehavior = (
31
31
  gestureCompositionOwner: SharedValue<GestureCompositionOwner>,
32
32
  pendingDirection: SharedValue<Direction | null>,
33
33
  ): PanBehavior => {
34
- const { dismissScreen, requestDismiss } = useNavigationHelpers();
34
+ const { requestDismiss } = useNavigationHelpers();
35
35
  const { withSensitivity, resetSensitivity } =
36
36
  usePanGestureSensitivity(screenOptions);
37
37
 
@@ -109,7 +109,6 @@ export const usePanBehavior = (
109
109
  finalizePanRelease(
110
110
  release,
111
111
  latestRuntime,
112
- dismissScreen,
113
112
  dimensions,
114
113
  rawEvent,
115
114
  requestDismiss,
@@ -124,7 +123,6 @@ export const usePanBehavior = (
124
123
  runtime,
125
124
  screenOptions,
126
125
  dimensions,
127
- dismissScreen,
128
126
  requestDismiss,
129
127
  withSensitivity,
130
128
  gestureCompositionOwner,
@@ -61,7 +61,6 @@ export const trackPinchGesture = (
61
61
  export const finalizePinchRelease = (
62
62
  release: PinchReleaseResult,
63
63
  runtime: PinchGestureRuntime,
64
- dismissScreen: ((finished: boolean) => void) | undefined,
65
64
  requestDismiss?: () => void,
66
65
  ) => {
67
66
  "worklet";
@@ -91,10 +90,6 @@ export const finalizePinchRelease = (
91
90
  resetValuesImmediately: release.resetValuesImmediately,
92
91
  });
93
92
 
94
- if (release.shouldDismiss && requestDismiss) {
95
- runOnJS(requestDismiss)();
96
- }
97
-
98
93
  if (!release.shouldDismiss && progressAlreadyAtTarget) {
99
94
  system.targetProgress.set(release.target);
100
95
  return;
@@ -102,7 +97,6 @@ export const finalizePinchRelease = (
102
97
 
103
98
  animateToProgress({
104
99
  target: release.target,
105
- onAnimationFinish: release.shouldDismiss ? dismissScreen : undefined,
106
100
  spec: release.transitionSpec,
107
101
  emitWillAnimate: false,
108
102
  markEntering: false,
@@ -111,4 +105,8 @@ export const finalizePinchRelease = (
111
105
  animationProgress: system.animationProgress,
112
106
  initialVelocity: release.initialVelocity,
113
107
  });
108
+
109
+ if (release.shouldDismiss && requestDismiss) {
110
+ runOnJS(requestDismiss)();
111
+ }
114
112
  };
@@ -26,7 +26,7 @@ export const usePinchBehavior = (
26
26
  screenOptions: ScreenOptionsContextValue,
27
27
  gestureCompositionOwner: SharedValue<GestureCompositionOwner>,
28
28
  ): PinchBehavior => {
29
- const { dismissScreen, requestDismiss } = useNavigationHelpers();
29
+ const { requestDismiss } = useNavigationHelpers();
30
30
  const { withSensitivity, resetSensitivity } =
31
31
  usePinchGestureSensitivity(screenOptions);
32
32
 
@@ -68,18 +68,12 @@ export const usePinchBehavior = (
68
68
  .hasSnapPoints
69
69
  ? resolveSnapPinchRelease(event, latestRuntime)
70
70
  : resolvePinchRelease(event, latestRuntime);
71
- finalizePinchRelease(
72
- release,
73
- latestRuntime,
74
- dismissScreen,
75
- requestDismiss,
76
- );
71
+ finalizePinchRelease(release, latestRuntime, requestDismiss);
77
72
  gestureCompositionOwner.set(null);
78
73
  },
79
74
  [
80
75
  runtime,
81
76
  screenOptions,
82
- dismissScreen,
83
77
  requestDismiss,
84
78
  withSensitivity,
85
79
  gestureCompositionOwner,
@@ -306,15 +306,19 @@ const resolveGestureParticipation = ({
306
306
  options,
307
307
  isFirstKey,
308
308
  gestureContext,
309
+ isRemovePrevented,
309
310
  }: {
310
311
  options: GesturePolicyOptions;
311
312
  isFirstKey: boolean;
312
313
  gestureContext: GestureContextType | null;
314
+ isRemovePrevented: boolean;
313
315
  }): ScreenGestureParticipation => {
314
- const canDismiss = resolveGestureCanDismiss({
315
- isFirstKey,
316
- gestureEnabled: options.gestureEnabled,
317
- });
316
+ const canDismiss =
317
+ !isRemovePrevented &&
318
+ resolveGestureCanDismiss({
319
+ isFirstKey,
320
+ gestureEnabled: options.gestureEnabled,
321
+ });
318
322
  const effectiveSnapPoints = validateSnapPoints({
319
323
  snapPoints: options.snapPoints,
320
324
  canDismiss,
@@ -333,6 +337,7 @@ const resolveGestureParticipation = ({
333
337
 
334
338
  return {
335
339
  isFirstKey,
340
+ isRemovePrevented,
336
341
  canDismiss,
337
342
  canTrackGesture,
338
343
  effectiveSnapPoints,
@@ -345,15 +350,18 @@ export const resolveScreenGestureConfig = ({
345
350
  options,
346
351
  isFirstKey,
347
352
  gestureContext,
353
+ isRemovePrevented = false,
348
354
  }: {
349
355
  options: ScreenTransitionConfig;
350
356
  isFirstKey: boolean;
351
357
  gestureContext: GestureContextType | null;
358
+ isRemovePrevented?: boolean;
352
359
  }): ScreenGestureConfig => {
353
360
  const participation = resolveGestureParticipation({
354
361
  options,
355
362
  isFirstKey,
356
363
  gestureContext,
364
+ isRemovePrevented,
357
365
  });
358
366
  const hasSnapPoints = participation.effectiveSnapPoints.hasSnapPoints;
359
367
 
@@ -365,11 +373,14 @@ export const resolveScreenGestureConfig = ({
365
373
  };
366
374
 
367
375
  function resolveRuntimeCanDismiss(
368
- participation: Pick<ScreenGestureParticipation, "isFirstKey" | "canDismiss">,
376
+ participation: Pick<
377
+ ScreenGestureParticipation,
378
+ "isFirstKey" | "isRemovePrevented" | "canDismiss"
379
+ >,
369
380
  options: GesturePolicyOptions,
370
381
  ) {
371
382
  "worklet";
372
- if (participation.isFirstKey) {
383
+ if (participation.isFirstKey || participation.isRemovePrevented) {
373
384
  return false;
374
385
  }
375
386
 
@@ -85,6 +85,8 @@ export interface GestureContextType {
85
85
  export interface ScreenGestureParticipation {
86
86
  /** Whether this route is the first route in its stack. First routes never track gestures. */
87
87
  isFirstKey: boolean;
88
+ /** Whether React Navigation currently blocks removal of this route. */
89
+ isRemovePrevented: boolean;
88
90
  /** Whether this route can dismiss to progress 0 from a gesture release. */
89
91
  canDismiss: boolean;
90
92
  /** Whether recognizers can activate to expose gesture values to interpolators. */
@@ -5,6 +5,7 @@ import type {
5
5
  BaseStackNavigation,
6
6
  BaseStackRoute,
7
7
  } from "../../../types/stack.types";
8
+ import { dispatchCloseAction } from "../../../utils/navigation/close-action-replay";
8
9
  import { buildBlankStackState } from "./helpers/build-blank-stack-state";
9
10
  import { deriveBlankStackState } from "./helpers/derive-blank-stack-state";
10
11
  import type {
@@ -86,10 +87,13 @@ export const createBlankStackController = <
86
87
  const { state, navigation } = props;
87
88
 
88
89
  if (state.routes.some((candidate) => candidate.key === route.key)) {
89
- navigation.dispatch({
90
+ const action = {
90
91
  ...StackActions.pop(),
91
92
  source: route.key,
92
93
  target: state.key,
94
+ };
95
+ dispatchCloseAction(action, (closeAction) => {
96
+ navigation.dispatch(closeAction);
93
97
  });
94
98
  return;
95
99
  }
@@ -242,7 +242,7 @@ const writeDestination = (
242
242
 
243
243
  writePairLink(state, pairKey, linkKey, link);
244
244
 
245
- if (link.group) {
245
+ if (link.group && !state[pairKey]?.groups?.[link.group]) {
246
246
  writeGroup(state, pairKey, link.group, linkKey);
247
247
  }
248
248
  };
@@ -9,8 +9,7 @@ import { createStore } from "../utils/create-store";
9
9
  export enum LifecycleTransitionRequestKind {
10
10
  None = 0,
11
11
  Open = 1,
12
- BlankStackClose = 2,
13
- NativeClose = 3,
12
+ Close = 2,
14
13
  }
15
14
 
16
15
  type SystemStoreState = {