react-native-screen-transitions 3.9.0-alpha.2 → 3.9.0-alpha.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 (421) hide show
  1. package/lib/commonjs/shared/components/boundary/components/boundary-target.js +14 -9
  2. package/lib/commonjs/shared/components/boundary/components/boundary-target.js.map +1 -1
  3. package/lib/commonjs/shared/components/boundary/create-boundary-component.js +66 -28
  4. package/lib/commonjs/shared/components/boundary/create-boundary-component.js.map +1 -1
  5. package/lib/commonjs/shared/components/boundary/hooks/{use-boundary-presence.js → lifecycles/use-boundary-presence.js} +8 -4
  6. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-boundary-presence.js.map +1 -0
  7. package/lib/commonjs/shared/components/boundary/hooks/{use-initial-destination-measurement.js → lifecycles/use-initial-destination-measurement.js} +27 -10
  8. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js.map +1 -0
  9. package/lib/commonjs/shared/components/boundary/hooks/{use-initial-source-measurement.js → lifecycles/use-initial-source-measurement.js} +5 -7
  10. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-initial-source-measurement.js.map +1 -0
  11. package/lib/commonjs/shared/components/boundary/hooks/{use-refresh-boundary.js → lifecycles/use-refresh-boundary.js} +4 -4
  12. package/lib/commonjs/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -0
  13. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js +14 -35
  14. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  15. package/lib/commonjs/shared/components/boundary/hooks/use-measurer.js +5 -6
  16. package/lib/commonjs/shared/components/boundary/hooks/use-measurer.js.map +1 -1
  17. package/lib/commonjs/shared/components/boundary/index.js +26 -29
  18. package/lib/commonjs/shared/components/boundary/index.js.map +1 -1
  19. package/lib/commonjs/shared/components/boundary/portal/components/boundary-local-portal-host.js +58 -0
  20. package/lib/commonjs/shared/components/boundary/portal/components/boundary-local-portal-host.js.map +1 -0
  21. package/lib/commonjs/shared/components/boundary/portal/components/host.js +20 -4
  22. package/lib/commonjs/shared/components/boundary/portal/components/host.js.map +1 -1
  23. package/lib/commonjs/shared/components/boundary/portal/components/portal-boundary-host.js +53 -32
  24. package/lib/commonjs/shared/components/boundary/portal/components/portal-boundary-host.js.map +1 -1
  25. package/lib/commonjs/shared/components/boundary/portal/components/portal.js +206 -96
  26. package/lib/commonjs/shared/components/boundary/portal/components/portal.js.map +1 -1
  27. package/lib/commonjs/shared/components/boundary/portal/hooks/use-host-measurement.js +14 -2
  28. package/lib/commonjs/shared/components/boundary/portal/hooks/use-host-measurement.js.map +1 -1
  29. package/lib/commonjs/shared/components/boundary/portal/stores/host-registry.store.js +5 -44
  30. package/lib/commonjs/shared/components/boundary/portal/stores/host-registry.store.js.map +1 -1
  31. package/lib/commonjs/shared/components/boundary/portal/stores/portal-boundary-host.store.js +37 -5
  32. package/lib/commonjs/shared/components/boundary/portal/stores/portal-boundary-host.store.js.map +1 -1
  33. package/lib/commonjs/shared/components/boundary/portal/teleport.js +15 -2
  34. package/lib/commonjs/shared/components/boundary/portal/teleport.js.map +1 -1
  35. package/lib/commonjs/shared/components/boundary/portal/utils/has-local-slot.js +18 -0
  36. package/lib/commonjs/shared/components/boundary/portal/utils/has-local-slot.js.map +1 -0
  37. package/lib/commonjs/shared/components/boundary/portal/utils/naming.js +10 -3
  38. package/lib/commonjs/shared/components/boundary/portal/utils/naming.js.map +1 -1
  39. package/lib/commonjs/shared/components/boundary/portal/utils/offset-style.js +28 -49
  40. package/lib/commonjs/shared/components/boundary/portal/utils/offset-style.js.map +1 -1
  41. package/lib/commonjs/shared/components/boundary/portal/utils/ownership.js +254 -0
  42. package/lib/commonjs/shared/components/boundary/portal/utils/ownership.js.map +1 -0
  43. package/lib/commonjs/shared/components/boundary/portal/utils/resolve-portal.js +38 -0
  44. package/lib/commonjs/shared/components/boundary/portal/utils/resolve-portal.js.map +1 -0
  45. package/lib/commonjs/shared/components/boundary/portal/utils/shallow-equal.js +29 -0
  46. package/lib/commonjs/shared/components/boundary/portal/utils/shallow-equal.js.map +1 -0
  47. package/lib/commonjs/shared/components/boundary/portal/utils/teleport-control.js +10 -1
  48. package/lib/commonjs/shared/components/boundary/portal/utils/teleport-control.js.map +1 -1
  49. package/lib/commonjs/shared/components/boundary/portal/utils/visible-host.js +25 -0
  50. package/lib/commonjs/shared/components/boundary/portal/utils/visible-host.js.map +1 -0
  51. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js +6 -7
  52. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  53. package/lib/commonjs/shared/components/boundary/utils/destination-signals.js +1 -22
  54. package/lib/commonjs/shared/components/boundary/utils/destination-signals.js.map +1 -1
  55. package/lib/commonjs/shared/components/boundary/utils/refresh-signals.js +0 -21
  56. package/lib/commonjs/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  57. package/lib/commonjs/shared/components/boundary/utils/source-signals.js +4 -9
  58. package/lib/commonjs/shared/components/boundary/utils/source-signals.js.map +1 -1
  59. package/lib/commonjs/shared/index.js.map +1 -1
  60. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js +6 -3
  61. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  62. package/lib/commonjs/shared/providers/screen/animation/helpers/derivations.js +1 -0
  63. package/lib/commonjs/shared/providers/screen/animation/helpers/derivations.js.map +1 -1
  64. package/lib/commonjs/shared/providers/screen/animation/helpers/pipeline.js +1 -0
  65. package/lib/commonjs/shared/providers/screen/animation/helpers/pipeline.js.map +1 -1
  66. package/lib/commonjs/shared/providers/screen/styles/helpers/compose-slot-style.js +95 -0
  67. package/lib/commonjs/shared/providers/screen/styles/helpers/compose-slot-style.js.map +1 -0
  68. package/lib/commonjs/shared/providers/screen/styles/helpers/normalize-slots.js +30 -9
  69. package/lib/commonjs/shared/providers/screen/styles/helpers/normalize-slots.js.map +1 -1
  70. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js +9 -3
  71. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js.map +1 -1
  72. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.js +2 -0
  73. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.js.map +1 -1
  74. package/lib/commonjs/shared/providers/screen/styles/hooks/slot-resolvers.js +96 -0
  75. package/lib/commonjs/shared/providers/screen/styles/hooks/slot-resolvers.js.map +1 -0
  76. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +16 -3
  77. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  78. package/lib/commonjs/shared/providers/screen/styles/index.js +16 -3
  79. package/lib/commonjs/shared/providers/screen/styles/index.js.map +1 -1
  80. package/lib/commonjs/shared/providers/screen/styles/slot.provider.js +22 -51
  81. package/lib/commonjs/shared/providers/screen/styles/slot.provider.js.map +1 -1
  82. package/lib/commonjs/shared/providers/screen/styles/stores/slot-references.store.js +53 -0
  83. package/lib/commonjs/shared/providers/screen/styles/stores/slot-references.store.js.map +1 -0
  84. package/lib/commonjs/shared/stores/bounds/helpers/link-pairs.helpers.js +22 -2
  85. package/lib/commonjs/shared/stores/bounds/helpers/link-pairs.helpers.js.map +1 -1
  86. package/lib/commonjs/shared/stores/bounds/internals/entries.js +11 -4
  87. package/lib/commonjs/shared/stores/bounds/internals/entries.js.map +1 -1
  88. package/lib/commonjs/shared/stores/bounds/internals/links.js +134 -51
  89. package/lib/commonjs/shared/stores/bounds/internals/links.js.map +1 -1
  90. package/lib/commonjs/shared/stores/bounds/internals/resolver.js +1 -3
  91. package/lib/commonjs/shared/stores/bounds/internals/resolver.js.map +1 -1
  92. package/lib/commonjs/shared/stores/system.store.js +5 -0
  93. package/lib/commonjs/shared/stores/system.store.js.map +1 -1
  94. package/lib/commonjs/shared/utils/bounds/helpers/styles/compute.js +10 -69
  95. package/lib/commonjs/shared/utils/bounds/helpers/styles/compute.js.map +1 -1
  96. package/lib/commonjs/shared/utils/bounds/helpers/styles/local-transform.js +59 -0
  97. package/lib/commonjs/shared/utils/bounds/helpers/styles/local-transform.js.map +1 -0
  98. package/lib/module/shared/components/boundary/components/boundary-target.js +12 -7
  99. package/lib/module/shared/components/boundary/components/boundary-target.js.map +1 -1
  100. package/lib/module/shared/components/boundary/create-boundary-component.js +67 -29
  101. package/lib/module/shared/components/boundary/create-boundary-component.js.map +1 -1
  102. package/lib/module/shared/components/boundary/hooks/{use-boundary-presence.js → lifecycles/use-boundary-presence.js} +8 -4
  103. package/lib/module/shared/components/boundary/hooks/lifecycles/use-boundary-presence.js.map +1 -0
  104. package/lib/module/shared/components/boundary/hooks/{use-initial-destination-measurement.js → lifecycles/use-initial-destination-measurement.js} +27 -10
  105. package/lib/module/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js.map +1 -0
  106. package/lib/module/shared/components/boundary/hooks/{use-initial-source-measurement.js → lifecycles/use-initial-source-measurement.js} +5 -7
  107. package/lib/module/shared/components/boundary/hooks/lifecycles/use-initial-source-measurement.js.map +1 -0
  108. package/lib/module/shared/components/boundary/hooks/{use-refresh-boundary.js → lifecycles/use-refresh-boundary.js} +4 -4
  109. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -0
  110. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js +15 -36
  111. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -1
  112. package/lib/module/shared/components/boundary/hooks/use-measurer.js +5 -6
  113. package/lib/module/shared/components/boundary/hooks/use-measurer.js.map +1 -1
  114. package/lib/module/shared/components/boundary/index.js +26 -29
  115. package/lib/module/shared/components/boundary/index.js.map +1 -1
  116. package/lib/module/shared/components/boundary/portal/components/boundary-local-portal-host.js +53 -0
  117. package/lib/module/shared/components/boundary/portal/components/boundary-local-portal-host.js.map +1 -0
  118. package/lib/module/shared/components/boundary/portal/components/host.js +21 -5
  119. package/lib/module/shared/components/boundary/portal/components/host.js.map +1 -1
  120. package/lib/module/shared/components/boundary/portal/components/portal-boundary-host.js +53 -32
  121. package/lib/module/shared/components/boundary/portal/components/portal-boundary-host.js.map +1 -1
  122. package/lib/module/shared/components/boundary/portal/components/portal.js +212 -102
  123. package/lib/module/shared/components/boundary/portal/components/portal.js.map +1 -1
  124. package/lib/module/shared/components/boundary/portal/hooks/use-host-measurement.js +15 -3
  125. package/lib/module/shared/components/boundary/portal/hooks/use-host-measurement.js.map +1 -1
  126. package/lib/module/shared/components/boundary/portal/stores/host-registry.store.js +4 -41
  127. package/lib/module/shared/components/boundary/portal/stores/host-registry.store.js.map +1 -1
  128. package/lib/module/shared/components/boundary/portal/stores/portal-boundary-host.store.js +35 -4
  129. package/lib/module/shared/components/boundary/portal/stores/portal-boundary-host.store.js.map +1 -1
  130. package/lib/module/shared/components/boundary/portal/teleport.js +16 -2
  131. package/lib/module/shared/components/boundary/portal/teleport.js.map +1 -1
  132. package/lib/module/shared/components/boundary/portal/utils/has-local-slot.js +13 -0
  133. package/lib/module/shared/components/boundary/portal/utils/has-local-slot.js.map +1 -0
  134. package/lib/module/shared/components/boundary/portal/utils/naming.js +8 -2
  135. package/lib/module/shared/components/boundary/portal/utils/naming.js.map +1 -1
  136. package/lib/module/shared/components/boundary/portal/utils/offset-style.js +29 -49
  137. package/lib/module/shared/components/boundary/portal/utils/offset-style.js.map +1 -1
  138. package/lib/module/shared/components/boundary/portal/utils/ownership.js +246 -0
  139. package/lib/module/shared/components/boundary/portal/utils/ownership.js.map +1 -0
  140. package/lib/module/shared/components/boundary/portal/utils/resolve-portal.js +33 -0
  141. package/lib/module/shared/components/boundary/portal/utils/resolve-portal.js.map +1 -0
  142. package/lib/module/shared/components/boundary/portal/utils/shallow-equal.js +24 -0
  143. package/lib/module/shared/components/boundary/portal/utils/shallow-equal.js.map +1 -0
  144. package/lib/module/shared/components/boundary/portal/utils/teleport-control.js +8 -0
  145. package/lib/module/shared/components/boundary/portal/utils/teleport-control.js.map +1 -1
  146. package/lib/module/shared/components/boundary/portal/utils/visible-host.js +20 -0
  147. package/lib/module/shared/components/boundary/portal/utils/visible-host.js.map +1 -0
  148. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js +6 -7
  149. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js.map +1 -1
  150. package/lib/module/shared/components/boundary/utils/destination-signals.js +2 -23
  151. package/lib/module/shared/components/boundary/utils/destination-signals.js.map +1 -1
  152. package/lib/module/shared/components/boundary/utils/refresh-signals.js +0 -21
  153. package/lib/module/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  154. package/lib/module/shared/components/boundary/utils/source-signals.js +4 -9
  155. package/lib/module/shared/components/boundary/utils/source-signals.js.map +1 -1
  156. package/lib/module/shared/index.js.map +1 -1
  157. package/lib/module/shared/providers/helpers/measured-bounds-writes.js +6 -3
  158. package/lib/module/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  159. package/lib/module/shared/providers/screen/animation/helpers/derivations.js +1 -0
  160. package/lib/module/shared/providers/screen/animation/helpers/derivations.js.map +1 -1
  161. package/lib/module/shared/providers/screen/animation/helpers/pipeline.js +1 -0
  162. package/lib/module/shared/providers/screen/animation/helpers/pipeline.js.map +1 -1
  163. package/lib/module/shared/providers/screen/styles/helpers/compose-slot-style.js +89 -0
  164. package/lib/module/shared/providers/screen/styles/helpers/compose-slot-style.js.map +1 -0
  165. package/lib/module/shared/providers/screen/styles/helpers/normalize-slots.js +30 -9
  166. package/lib/module/shared/providers/screen/styles/helpers/normalize-slots.js.map +1 -1
  167. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js +9 -3
  168. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js.map +1 -1
  169. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.js +2 -0
  170. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.js.map +1 -1
  171. package/lib/module/shared/providers/screen/styles/hooks/slot-resolvers.js +87 -0
  172. package/lib/module/shared/providers/screen/styles/hooks/slot-resolvers.js.map +1 -0
  173. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +16 -3
  174. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  175. package/lib/module/shared/providers/screen/styles/index.js +2 -1
  176. package/lib/module/shared/providers/screen/styles/index.js.map +1 -1
  177. package/lib/module/shared/providers/screen/styles/slot.provider.js +22 -47
  178. package/lib/module/shared/providers/screen/styles/slot.provider.js.map +1 -1
  179. package/lib/module/shared/providers/screen/styles/stores/slot-references.store.js +47 -0
  180. package/lib/module/shared/providers/screen/styles/stores/slot-references.store.js.map +1 -0
  181. package/lib/module/shared/stores/bounds/helpers/link-pairs.helpers.js +19 -1
  182. package/lib/module/shared/stores/bounds/helpers/link-pairs.helpers.js.map +1 -1
  183. package/lib/module/shared/stores/bounds/internals/entries.js +11 -4
  184. package/lib/module/shared/stores/bounds/internals/entries.js.map +1 -1
  185. package/lib/module/shared/stores/bounds/internals/links.js +135 -53
  186. package/lib/module/shared/stores/bounds/internals/links.js.map +1 -1
  187. package/lib/module/shared/stores/bounds/internals/resolver.js +1 -3
  188. package/lib/module/shared/stores/bounds/internals/resolver.js.map +1 -1
  189. package/lib/module/shared/stores/system.store.js +5 -0
  190. package/lib/module/shared/stores/system.store.js.map +1 -1
  191. package/lib/module/shared/types/animation.types.js.map +1 -1
  192. package/lib/module/shared/utils/bounds/helpers/styles/compute.js +10 -69
  193. package/lib/module/shared/utils/bounds/helpers/styles/compute.js.map +1 -1
  194. package/lib/module/shared/utils/bounds/helpers/styles/local-transform.js +52 -0
  195. package/lib/module/shared/utils/bounds/helpers/styles/local-transform.js.map +1 -0
  196. package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts +1 -2
  197. package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts.map +1 -1
  198. package/lib/typescript/component-stack/components/component-screen.d.ts +1 -1
  199. package/lib/typescript/component-stack/components/component-screen.d.ts.map +1 -1
  200. package/lib/typescript/component-stack/navigators/create-component-stack-navigator.d.ts +1 -2
  201. package/lib/typescript/component-stack/navigators/create-component-stack-navigator.d.ts.map +1 -1
  202. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +1 -1
  203. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts.map +1 -1
  204. package/lib/typescript/native-stack/views/NativeStackView.d.ts +1 -2
  205. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  206. package/lib/typescript/native-stack/views/useHeaderConfigProps.d.ts +2 -2
  207. package/lib/typescript/shared/adapters/with-screen-transitions/context.d.ts +1 -1
  208. package/lib/typescript/shared/adapters/with-screen-transitions/context.d.ts.map +1 -1
  209. package/lib/typescript/shared/adapters/with-screen-transitions/stack-layout.d.ts +1 -1
  210. package/lib/typescript/shared/adapters/with-screen-transitions/stack-layout.d.ts.map +1 -1
  211. package/lib/typescript/shared/components/activity/variants/activity-container.d.ts +1 -1
  212. package/lib/typescript/shared/components/activity/variants/activity-container.d.ts.map +1 -1
  213. package/lib/typescript/shared/components/activity/variants/activity-screen.d.ts +1 -1
  214. package/lib/typescript/shared/components/activity/variants/activity-screen.d.ts.map +1 -1
  215. package/lib/typescript/shared/components/boundary/components/boundary-target.d.ts +1 -1
  216. package/lib/typescript/shared/components/boundary/components/boundary-target.d.ts.map +1 -1
  217. package/lib/typescript/shared/components/boundary/create-boundary-component.d.ts +0 -1
  218. package/lib/typescript/shared/components/boundary/create-boundary-component.d.ts.map +1 -1
  219. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-boundary-presence.d.ts +11 -0
  220. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-boundary-presence.d.ts.map +1 -0
  221. package/lib/typescript/shared/components/boundary/hooks/{use-initial-destination-measurement.d.ts → lifecycles/use-initial-destination-measurement.d.ts} +2 -2
  222. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.d.ts.map +1 -0
  223. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-source-measurement.d.ts +8 -0
  224. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-source-measurement.d.ts.map +1 -0
  225. package/lib/typescript/shared/components/boundary/hooks/{use-refresh-boundary.d.ts → lifecycles/use-refresh-boundary.d.ts} +2 -2
  226. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.d.ts.map +1 -0
  227. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts +5 -9
  228. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts.map +1 -1
  229. package/lib/typescript/shared/components/boundary/hooks/use-measurer.d.ts +4 -3
  230. package/lib/typescript/shared/components/boundary/hooks/use-measurer.d.ts.map +1 -1
  231. package/lib/typescript/shared/components/boundary/index.d.ts +35 -24
  232. package/lib/typescript/shared/components/boundary/index.d.ts.map +1 -1
  233. package/lib/typescript/shared/components/boundary/portal/components/boundary-local-portal-host.d.ts +8 -0
  234. package/lib/typescript/shared/components/boundary/portal/components/boundary-local-portal-host.d.ts.map +1 -0
  235. package/lib/typescript/shared/components/boundary/portal/components/host.d.ts +2 -2
  236. package/lib/typescript/shared/components/boundary/portal/components/host.d.ts.map +1 -1
  237. package/lib/typescript/shared/components/boundary/portal/components/portal-boundary-host.d.ts +2 -2
  238. package/lib/typescript/shared/components/boundary/portal/components/portal-boundary-host.d.ts.map +1 -1
  239. package/lib/typescript/shared/components/boundary/portal/components/portal-provider.d.ts +1 -1
  240. package/lib/typescript/shared/components/boundary/portal/components/portal-provider.d.ts.map +1 -1
  241. package/lib/typescript/shared/components/boundary/portal/components/portal.d.ts +4 -3
  242. package/lib/typescript/shared/components/boundary/portal/components/portal.d.ts.map +1 -1
  243. package/lib/typescript/shared/components/boundary/portal/hooks/use-host-measurement.d.ts.map +1 -1
  244. package/lib/typescript/shared/components/boundary/portal/stores/host-registry.store.d.ts +0 -7
  245. package/lib/typescript/shared/components/boundary/portal/stores/host-registry.store.d.ts.map +1 -1
  246. package/lib/typescript/shared/components/boundary/portal/stores/portal-boundary-host.store.d.ts +16 -1
  247. package/lib/typescript/shared/components/boundary/portal/stores/portal-boundary-host.store.d.ts.map +1 -1
  248. package/lib/typescript/shared/components/boundary/portal/teleport.d.ts +1 -1
  249. package/lib/typescript/shared/components/boundary/portal/teleport.d.ts.map +1 -1
  250. package/lib/typescript/shared/components/boundary/portal/utils/has-local-slot.d.ts +3 -0
  251. package/lib/typescript/shared/components/boundary/portal/utils/has-local-slot.d.ts.map +1 -0
  252. package/lib/typescript/shared/components/boundary/portal/utils/naming.d.ts +2 -1
  253. package/lib/typescript/shared/components/boundary/portal/utils/naming.d.ts.map +1 -1
  254. package/lib/typescript/shared/components/boundary/portal/utils/offset-style.d.ts +16 -32
  255. package/lib/typescript/shared/components/boundary/portal/utils/offset-style.d.ts.map +1 -1
  256. package/lib/typescript/shared/components/boundary/portal/utils/ownership.d.ts +35 -0
  257. package/lib/typescript/shared/components/boundary/portal/utils/ownership.d.ts.map +1 -0
  258. package/lib/typescript/shared/components/boundary/portal/utils/resolve-portal.d.ts +12 -0
  259. package/lib/typescript/shared/components/boundary/portal/utils/resolve-portal.d.ts.map +1 -0
  260. package/lib/typescript/shared/components/boundary/portal/utils/shallow-equal.d.ts +8 -0
  261. package/lib/typescript/shared/components/boundary/portal/utils/shallow-equal.d.ts.map +1 -0
  262. package/lib/typescript/shared/components/boundary/portal/utils/teleport-control.d.ts +4 -0
  263. package/lib/typescript/shared/components/boundary/portal/utils/teleport-control.d.ts.map +1 -1
  264. package/lib/typescript/shared/components/boundary/portal/utils/visible-host.d.ts +8 -0
  265. package/lib/typescript/shared/components/boundary/portal/utils/visible-host.d.ts.map +1 -0
  266. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts +7 -12
  267. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts.map +1 -1
  268. package/lib/typescript/shared/components/boundary/types.d.ts +9 -36
  269. package/lib/typescript/shared/components/boundary/types.d.ts.map +1 -1
  270. package/lib/typescript/shared/components/boundary/utils/destination-signals.d.ts.map +1 -1
  271. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts.map +1 -1
  272. package/lib/typescript/shared/components/boundary/utils/source-signals.d.ts +0 -1
  273. package/lib/typescript/shared/components/boundary/utils/source-signals.d.ts.map +1 -1
  274. package/lib/typescript/shared/components/create-transition-aware-component.d.ts +6 -5
  275. package/lib/typescript/shared/components/create-transition-aware-component.d.ts.map +1 -1
  276. package/lib/typescript/shared/components/masked-view.d.ts +1 -1
  277. package/lib/typescript/shared/components/masked-view.d.ts.map +1 -1
  278. package/lib/typescript/shared/components/overlay/variations/float-overlay.d.ts +1 -1
  279. package/lib/typescript/shared/components/overlay/variations/float-overlay.d.ts.map +1 -1
  280. package/lib/typescript/shared/components/overlay/variations/overlay-host.d.ts +1 -1
  281. package/lib/typescript/shared/components/overlay/variations/overlay-host.d.ts.map +1 -1
  282. package/lib/typescript/shared/components/scene-view.d.ts +1 -1
  283. package/lib/typescript/shared/components/scene-view.d.ts.map +1 -1
  284. package/lib/typescript/shared/components/screen-container/index.d.ts +1 -1
  285. package/lib/typescript/shared/components/screen-container/index.d.ts.map +1 -1
  286. package/lib/typescript/shared/components/screen-container/layers/backdrop.d.ts +1 -1
  287. package/lib/typescript/shared/components/screen-container/layers/backdrop.d.ts.map +1 -1
  288. package/lib/typescript/shared/components/screen-container/layers/content.d.ts +1 -1
  289. package/lib/typescript/shared/components/screen-container/layers/content.d.ts.map +1 -1
  290. package/lib/typescript/shared/components/screen-container/layers/maybe-masked-navigation-container.d.ts +1 -1
  291. package/lib/typescript/shared/components/screen-container/layers/maybe-masked-navigation-container.d.ts.map +1 -1
  292. package/lib/typescript/shared/components/screen-container/layers/surface-container.d.ts +1 -1
  293. package/lib/typescript/shared/components/screen-container/layers/surface-container.d.ts.map +1 -1
  294. package/lib/typescript/shared/hooks/navigation/use-stack.d.ts +1 -1
  295. package/lib/typescript/shared/hooks/navigation/use-stack.d.ts.map +1 -1
  296. package/lib/typescript/shared/index.d.ts +711 -667
  297. package/lib/typescript/shared/index.d.ts.map +1 -1
  298. package/lib/typescript/shared/providers/helpers/measured-bounds-writes.d.ts +3 -3
  299. package/lib/typescript/shared/providers/helpers/measured-bounds-writes.d.ts.map +1 -1
  300. package/lib/typescript/shared/providers/screen/animation/helpers/derivations.d.ts +1 -0
  301. package/lib/typescript/shared/providers/screen/animation/helpers/derivations.d.ts.map +1 -1
  302. package/lib/typescript/shared/providers/screen/animation/helpers/pipeline.d.ts.map +1 -1
  303. package/lib/typescript/shared/providers/screen/descriptors/descriptors.provider.d.ts +1 -1
  304. package/lib/typescript/shared/providers/screen/descriptors/descriptors.provider.d.ts.map +1 -1
  305. package/lib/typescript/shared/providers/screen/screen-composer.d.ts +1 -1
  306. package/lib/typescript/shared/providers/screen/screen-composer.d.ts.map +1 -1
  307. package/lib/typescript/shared/providers/screen/styles/components/floating-overlay-layer.d.ts +1 -1
  308. package/lib/typescript/shared/providers/screen/styles/components/floating-overlay-layer.d.ts.map +1 -1
  309. package/lib/typescript/shared/providers/screen/styles/helpers/compose-slot-style.d.ts +4 -0
  310. package/lib/typescript/shared/providers/screen/styles/helpers/compose-slot-style.d.ts.map +1 -0
  311. package/lib/typescript/shared/providers/screen/styles/helpers/normalize-slots.d.ts.map +1 -1
  312. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/index.d.ts.map +1 -1
  313. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.d.ts +2 -1
  314. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.d.ts.map +1 -1
  315. package/lib/typescript/shared/providers/screen/styles/hooks/slot-resolvers.d.ts +11 -0
  316. package/lib/typescript/shared/providers/screen/styles/hooks/slot-resolvers.d.ts.map +1 -0
  317. package/lib/typescript/shared/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts +4 -1
  318. package/lib/typescript/shared/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts.map +1 -1
  319. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts +2 -2
  320. package/lib/typescript/shared/providers/screen/styles/index.d.ts +2 -1
  321. package/lib/typescript/shared/providers/screen/styles/index.d.ts.map +1 -1
  322. package/lib/typescript/shared/providers/screen/styles/slot.provider.d.ts +5 -10
  323. package/lib/typescript/shared/providers/screen/styles/slot.provider.d.ts.map +1 -1
  324. package/lib/typescript/shared/providers/screen/styles/stores/slot-references.store.d.ts +6 -0
  325. package/lib/typescript/shared/providers/screen/styles/stores/slot-references.store.d.ts.map +1 -0
  326. package/lib/typescript/shared/stores/bounds/helpers/link-pairs.helpers.d.ts +2 -0
  327. package/lib/typescript/shared/stores/bounds/helpers/link-pairs.helpers.d.ts.map +1 -1
  328. package/lib/typescript/shared/stores/bounds/internals/entries.d.ts.map +1 -1
  329. package/lib/typescript/shared/stores/bounds/internals/links.d.ts +4 -3
  330. package/lib/typescript/shared/stores/bounds/internals/links.d.ts.map +1 -1
  331. package/lib/typescript/shared/stores/bounds/internals/resolver.d.ts.map +1 -1
  332. package/lib/typescript/shared/stores/bounds/types.d.ts +9 -20
  333. package/lib/typescript/shared/stores/bounds/types.d.ts.map +1 -1
  334. package/lib/typescript/shared/stores/system.store.d.ts +1 -0
  335. package/lib/typescript/shared/stores/system.store.d.ts.map +1 -1
  336. package/lib/typescript/shared/types/animation.types.d.ts +7 -1
  337. package/lib/typescript/shared/types/animation.types.d.ts.map +1 -1
  338. package/lib/typescript/shared/utils/bounds/helpers/styles/compute.d.ts.map +1 -1
  339. package/lib/typescript/shared/utils/bounds/helpers/styles/local-transform.d.ts +6 -0
  340. package/lib/typescript/shared/utils/bounds/helpers/styles/local-transform.d.ts.map +1 -0
  341. package/package.json +1 -1
  342. package/src/shared/components/boundary/components/boundary-target.tsx +21 -7
  343. package/src/shared/components/boundary/create-boundary-component.tsx +92 -28
  344. package/src/shared/components/boundary/hooks/{use-boundary-presence.ts → lifecycles/use-boundary-presence.ts} +16 -5
  345. package/src/shared/components/boundary/hooks/{use-initial-destination-measurement.ts → lifecycles/use-initial-destination-measurement.ts} +40 -13
  346. package/src/shared/components/boundary/hooks/{use-initial-source-measurement.ts → lifecycles/use-initial-source-measurement.ts} +7 -9
  347. package/src/shared/components/boundary/hooks/{use-refresh-boundary.ts → lifecycles/use-refresh-boundary.ts} +6 -6
  348. package/src/shared/components/boundary/hooks/use-boundary-measurement.ts +15 -45
  349. package/src/shared/components/boundary/hooks/use-measurer.ts +9 -14
  350. package/src/shared/components/boundary/index.tsx +55 -29
  351. package/src/shared/components/boundary/portal/components/boundary-local-portal-host.tsx +66 -0
  352. package/src/shared/components/boundary/portal/components/host.tsx +20 -5
  353. package/src/shared/components/boundary/portal/components/portal-boundary-host.tsx +67 -52
  354. package/src/shared/components/boundary/portal/components/portal.tsx +280 -119
  355. package/src/shared/components/boundary/portal/hooks/use-host-measurement.ts +23 -2
  356. package/src/shared/components/boundary/portal/stores/host-registry.store.ts +4 -51
  357. package/src/shared/components/boundary/portal/stores/portal-boundary-host.store.ts +59 -6
  358. package/src/shared/components/boundary/portal/teleport.ts +28 -3
  359. package/src/shared/components/boundary/portal/utils/has-local-slot.ts +16 -0
  360. package/src/shared/components/boundary/portal/utils/naming.ts +11 -1
  361. package/src/shared/components/boundary/portal/utils/offset-style.ts +37 -139
  362. package/src/shared/components/boundary/portal/utils/ownership.ts +371 -0
  363. package/src/shared/components/boundary/portal/utils/resolve-portal.ts +50 -0
  364. package/src/shared/components/boundary/portal/utils/shallow-equal.ts +25 -0
  365. package/src/shared/components/boundary/portal/utils/teleport-control.ts +12 -0
  366. package/src/shared/components/boundary/portal/utils/visible-host.ts +24 -0
  367. package/src/shared/components/boundary/providers/boundary-root.provider.tsx +9 -18
  368. package/src/shared/components/boundary/types.ts +9 -39
  369. package/src/shared/components/boundary/utils/destination-signals.ts +1 -32
  370. package/src/shared/components/boundary/utils/refresh-signals.ts +0 -41
  371. package/src/shared/components/boundary/utils/source-signals.ts +5 -17
  372. package/src/shared/index.ts +0 -5
  373. package/src/shared/providers/helpers/measured-bounds-writes.ts +6 -11
  374. package/src/shared/providers/screen/animation/helpers/derivations.ts +3 -0
  375. package/src/shared/providers/screen/animation/helpers/pipeline.ts +1 -0
  376. package/src/shared/providers/screen/styles/helpers/compose-slot-style.ts +129 -0
  377. package/src/shared/providers/screen/styles/helpers/normalize-slots.ts +45 -8
  378. package/src/shared/providers/screen/styles/helpers/resolve-slot-styles/index.ts +14 -2
  379. package/src/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.ts +3 -0
  380. package/src/shared/providers/screen/styles/hooks/slot-resolvers.tsx +111 -0
  381. package/src/shared/providers/screen/styles/hooks/use-interpolated-style-maps.tsx +21 -3
  382. package/src/shared/providers/screen/styles/index.tsx +8 -3
  383. package/src/shared/providers/screen/styles/slot.provider.tsx +36 -54
  384. package/src/shared/providers/screen/styles/stores/slot-references.store.ts +71 -0
  385. package/src/shared/stores/bounds/helpers/link-pairs.helpers.ts +24 -1
  386. package/src/shared/stores/bounds/internals/entries.ts +13 -5
  387. package/src/shared/stores/bounds/internals/links.ts +167 -85
  388. package/src/shared/stores/bounds/internals/resolver.ts +0 -2
  389. package/src/shared/stores/bounds/types.ts +10 -22
  390. package/src/shared/stores/system.store.ts +6 -0
  391. package/src/shared/types/animation.types.ts +8 -1
  392. package/src/shared/utils/bounds/helpers/styles/compute.ts +22 -124
  393. package/src/shared/utils/bounds/helpers/styles/local-transform.ts +86 -0
  394. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-presence.js.map +0 -1
  395. package/lib/commonjs/shared/components/boundary/hooks/use-initial-destination-measurement.js.map +0 -1
  396. package/lib/commonjs/shared/components/boundary/hooks/use-initial-source-measurement.js.map +0 -1
  397. package/lib/commonjs/shared/components/boundary/hooks/use-refresh-boundary.js.map +0 -1
  398. package/lib/commonjs/shared/components/boundary/portal/resolve-portal.js +0 -36
  399. package/lib/commonjs/shared/components/boundary/portal/resolve-portal.js.map +0 -1
  400. package/lib/commonjs/shared/components/boundary/portal/utils/attachment.js +0 -40
  401. package/lib/commonjs/shared/components/boundary/portal/utils/attachment.js.map +0 -1
  402. package/lib/module/shared/components/boundary/hooks/use-boundary-presence.js.map +0 -1
  403. package/lib/module/shared/components/boundary/hooks/use-initial-destination-measurement.js.map +0 -1
  404. package/lib/module/shared/components/boundary/hooks/use-initial-source-measurement.js.map +0 -1
  405. package/lib/module/shared/components/boundary/hooks/use-refresh-boundary.js.map +0 -1
  406. package/lib/module/shared/components/boundary/portal/resolve-portal.js +0 -31
  407. package/lib/module/shared/components/boundary/portal/resolve-portal.js.map +0 -1
  408. package/lib/module/shared/components/boundary/portal/utils/attachment.js +0 -35
  409. package/lib/module/shared/components/boundary/portal/utils/attachment.js.map +0 -1
  410. package/lib/typescript/shared/components/boundary/hooks/use-boundary-presence.d.ts +0 -9
  411. package/lib/typescript/shared/components/boundary/hooks/use-boundary-presence.d.ts.map +0 -1
  412. package/lib/typescript/shared/components/boundary/hooks/use-initial-destination-measurement.d.ts.map +0 -1
  413. package/lib/typescript/shared/components/boundary/hooks/use-initial-source-measurement.d.ts +0 -9
  414. package/lib/typescript/shared/components/boundary/hooks/use-initial-source-measurement.d.ts.map +0 -1
  415. package/lib/typescript/shared/components/boundary/hooks/use-refresh-boundary.d.ts.map +0 -1
  416. package/lib/typescript/shared/components/boundary/portal/resolve-portal.d.ts +0 -14
  417. package/lib/typescript/shared/components/boundary/portal/resolve-portal.d.ts.map +0 -1
  418. package/lib/typescript/shared/components/boundary/portal/utils/attachment.d.ts +0 -21
  419. package/lib/typescript/shared/components/boundary/portal/utils/attachment.d.ts.map +0 -1
  420. package/src/shared/components/boundary/portal/resolve-portal.ts +0 -40
  421. package/src/shared/components/boundary/portal/utils/attachment.ts +0 -48
@@ -1,22 +1,22 @@
1
- import { type ReactNode, useContext } from "react";
1
+ import { type ReactNode, useContext, useLayoutEffect, useMemo } from "react";
2
2
  import { StyleSheet } from "react-native";
3
- import Animated, {
4
- type SharedValue,
5
- useAnimatedProps,
6
- useAnimatedStyle,
7
- } from "react-native-reanimated";
8
- import {
9
- type NAVIGATION_MASK_CONTAINER_STYLE_ID,
10
- type NAVIGATION_MASK_ELEMENT_STYLE_ID,
11
- NO_PROPS,
12
- NO_STYLES,
3
+ import Animated, { type SharedValue } from "react-native-reanimated";
4
+ import type {
5
+ NAVIGATION_MASK_CONTAINER_STYLE_ID,
6
+ NAVIGATION_MASK_ELEMENT_STYLE_ID,
13
7
  } from "../../../constants";
14
8
  import type { NormalizedTransitionInterpolatedStyle } from "../../../types/animation.types";
15
9
  import createProvider from "../../../utils/create-provider";
10
+ import { useDescriptorsStore } from "../descriptors";
16
11
  import { FloatingOverlayLayer } from "./components/floating-overlay-layer";
12
+ import type { LocalStyleLayers } from "./helpers/resolve-slot-styles";
17
13
  import { useInterpolatedStylesMap } from "./hooks/use-interpolated-style-maps";
18
14
  import { useMaybeBlockVisibility } from "./hooks/use-maybe-block-visibility";
19
15
  import { useResolvedStylesMap } from "./hooks/use-resolved-slot-style-map";
16
+ import {
17
+ registerScreenSlots,
18
+ unregisterScreenSlots,
19
+ } from "./stores/slot-references.store";
20
20
 
21
21
  type Props = {
22
22
  children: ReactNode;
@@ -30,7 +30,9 @@ export type ScreenSlotName =
30
30
  | typeof NAVIGATION_MASK_CONTAINER_STYLE_ID
31
31
  | typeof NAVIGATION_MASK_ELEMENT_STYLE_ID;
32
32
 
33
- type ScreenSlotContextValue = {
33
+ export type ScreenSlotContextValue = {
34
+ localStylesMaps: SharedValue<LocalStyleLayers>;
35
+ nextInterpolatorReady: SharedValue<number>;
34
36
  slotsMap: SharedValue<NormalizedTransitionInterpolatedStyle>;
35
37
  };
36
38
 
@@ -42,20 +44,37 @@ export const {
42
44
  guarded: true,
43
45
  })<Props, ScreenSlotContextValue>(({ children, isFloatingOverlay }) => {
44
46
  const parentContext = useContext(ScreenSlotContext);
47
+ const currentScreenKey = useDescriptorsStore(
48
+ (s) => s.derivations.currentScreenKey,
49
+ );
45
50
 
46
- const rawStylesMaps = useInterpolatedStylesMap();
51
+ const { localStylesMaps, nextInterpolatorReady } = useInterpolatedStylesMap();
47
52
 
48
53
  const slotsMap = useResolvedStylesMap({
49
- localStylesMaps: rawStylesMaps,
54
+ localStylesMaps,
50
55
  ancestorStylesMap: parentContext?.slotsMap,
51
56
  });
52
57
  const { animatedStyle, animatedProps } =
53
58
  useMaybeBlockVisibility(isFloatingOverlay);
59
+ const value = useMemo(
60
+ () => ({
61
+ localStylesMaps,
62
+ nextInterpolatorReady,
63
+ slotsMap,
64
+ }),
65
+ [localStylesMaps, nextInterpolatorReady, slotsMap],
66
+ );
67
+
68
+ useLayoutEffect(() => {
69
+ registerScreenSlots(currentScreenKey, value);
70
+
71
+ return () => {
72
+ unregisterScreenSlots(currentScreenKey, value);
73
+ };
74
+ }, [currentScreenKey, value]);
54
75
 
55
76
  return {
56
- value: {
57
- slotsMap,
58
- },
77
+ value,
59
78
  children: (
60
79
  <FloatingOverlayLayer enabled={isFloatingOverlay}>
61
80
  <Animated.View
@@ -72,40 +91,3 @@ export const {
72
91
  const styles = StyleSheet.create({
73
92
  container: { flex: 1 },
74
93
  });
75
-
76
- export const useSlotStyles = (slotId: string | undefined) => {
77
- const { slotsMap } = useScreenSlots();
78
-
79
- return useAnimatedStyle(() => {
80
- return (slotId ? slotsMap.get()[slotId]?.style : undefined) ?? NO_STYLES;
81
- });
82
- };
83
-
84
- /**
85
- * Stacking-only slice (`zIndex`/`elevation`) of a slot's style. Returned
86
- * separately so an owner can keep just its stacking context while a nested
87
- * target takes the full associated style. Yields `NO_STYLES` when neither is set.
88
- */
89
- export const useSlotStackingStyles = (slotId: string | undefined) => {
90
- const { slotsMap } = useScreenSlots();
91
-
92
- return useAnimatedStyle(() => {
93
- const baseStyle = slotId ? slotsMap.get()[slotId]?.style : undefined;
94
- const zIndex = baseStyle?.zIndex ?? 0;
95
- const elevation = baseStyle?.elevation ?? 0;
96
-
97
- if (zIndex === 0 && elevation === 0) {
98
- return NO_STYLES;
99
- }
100
-
101
- return { zIndex, elevation };
102
- });
103
- };
104
-
105
- export const useSlotProps = (slotId: string | undefined) => {
106
- const { slotsMap } = useScreenSlots();
107
-
108
- return useAnimatedProps(() => {
109
- return (slotId ? slotsMap.get()[slotId]?.props : undefined) ?? NO_PROPS;
110
- });
111
- };
@@ -0,0 +1,71 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import type { ScreenKey } from "../../../../stores/bounds/types";
3
+ import type { ScreenSlotContextValue } from "../slot.provider";
4
+
5
+ /**
6
+ * Screen-owned slot reference registry.
7
+ *
8
+ * This is important for portals: a teleported component can render outside the
9
+ * screen provider that owns its active transition, but it still needs references
10
+ * to that provider's shared values. This store does not copy or own styles; it
11
+ * only exposes the existing ScreenSlotProvider value by screen key.
12
+ */
13
+ type ScreenSlotsSnapshot = Record<ScreenKey, ScreenSlotContextValue>;
14
+
15
+ const listeners = new Set<() => void>();
16
+ const slotsByScreenKey = new Map<ScreenKey, ScreenSlotContextValue>();
17
+
18
+ let snapshot: ScreenSlotsSnapshot = {};
19
+
20
+ const emit = () => {
21
+ snapshot = Object.fromEntries(slotsByScreenKey);
22
+
23
+ for (const listener of listeners) {
24
+ listener();
25
+ }
26
+ };
27
+
28
+ export const registerScreenSlots = (
29
+ screenKey: ScreenKey,
30
+ slots: ScreenSlotContextValue,
31
+ ) => {
32
+ const previous = slotsByScreenKey.get(screenKey);
33
+ if (
34
+ previous?.localStylesMaps === slots.localStylesMaps &&
35
+ previous.nextInterpolatorReady === slots.nextInterpolatorReady &&
36
+ previous.slotsMap === slots.slotsMap
37
+ ) {
38
+ return;
39
+ }
40
+
41
+ slotsByScreenKey.set(screenKey, slots);
42
+ emit();
43
+ };
44
+
45
+ export const unregisterScreenSlots = (
46
+ screenKey: ScreenKey,
47
+ slots: ScreenSlotContextValue,
48
+ ) => {
49
+ if (slotsByScreenKey.get(screenKey) !== slots) {
50
+ return;
51
+ }
52
+
53
+ slotsByScreenKey.delete(screenKey);
54
+ emit();
55
+ };
56
+
57
+ const subscribe = (listener: () => void) => {
58
+ listeners.add(listener);
59
+
60
+ return () => {
61
+ listeners.delete(listener);
62
+ };
63
+ };
64
+
65
+ export const useRegisteredScreenSlots = (screenKey?: ScreenKey | null) => {
66
+ return useSyncExternalStore(
67
+ subscribe,
68
+ () => (screenKey ? (snapshot[screenKey] ?? null) : null),
69
+ () => null,
70
+ );
71
+ };
@@ -36,6 +36,15 @@ export const getSourceScreenKeyFromPairKey = (
36
36
  return pairKey.slice(0, separatorIndex);
37
37
  };
38
38
 
39
+ export const getDestinationScreenKeyFromPairKey = (
40
+ pairKey: ScreenPairKey,
41
+ ): ScreenIdentifier["screenKey"] | "" => {
42
+ "worklet";
43
+ const separatorIndex = pairKey.indexOf(PAIR_SEPARATOR);
44
+ if (separatorIndex === -1) return "";
45
+ return pairKey.slice(separatorIndex + PAIR_SEPARATOR.length);
46
+ };
47
+
39
48
  export const isScreenPairKeyForScreen = (
40
49
  pairKey: ScreenPairKey,
41
50
  screenKey: ScreenIdentifier["screenKey"],
@@ -94,7 +103,9 @@ const ensurePairState = (
94
103
  groups: {},
95
104
  };
96
105
  }
97
- state[pairKey].groups ??= {};
106
+ if (!state[pairKey].groups) {
107
+ state[pairKey].groups = {};
108
+ }
98
109
  return state[pairKey];
99
110
  };
100
111
 
@@ -114,6 +125,18 @@ export const ensurePairGroups = (
114
125
  return ensurePairState(state, pairKey).groups;
115
126
  };
116
127
 
128
+ export const ensurePairSourceRequests = (
129
+ state: LinkPairsState,
130
+ pairKey: ScreenPairKey,
131
+ ): Record<LinkKey, true> => {
132
+ "worklet";
133
+ const pair = ensurePairState(state, pairKey);
134
+ if (!pair.sourceRequests) {
135
+ pair.sourceRequests = {};
136
+ }
137
+ return pair.sourceRequests;
138
+ };
139
+
117
140
  export const removePairLink = (
118
141
  state: LinkPairsState,
119
142
  pairKey: ScreenPairKey,
@@ -38,15 +38,23 @@ const applyEntryPatch = (entry: Entry, patch: EntryPatch) => {
38
38
  entry.styles = patch.styles ?? {};
39
39
  }
40
40
 
41
- if (patch.boundaryConfig === undefined) {
42
- return;
43
- }
44
-
45
41
  if (patch.boundaryConfig === null) {
46
42
  delete entry.boundaryConfig;
47
- } else {
43
+ } else if (patch.boundaryConfig !== undefined) {
48
44
  entry.boundaryConfig = patch.boundaryConfig;
49
45
  }
46
+
47
+ if (patch.handoff === null) {
48
+ delete entry.handoff;
49
+ } else if (patch.handoff !== undefined) {
50
+ entry.handoff = patch.handoff;
51
+ }
52
+
53
+ if (patch.escapeClipping === null) {
54
+ delete entry.escapeClipping;
55
+ } else if (patch.escapeClipping !== undefined) {
56
+ entry.escapeClipping = patch.escapeClipping;
57
+ }
50
58
  };
51
59
 
52
60
  function getEntry(tag: TagID, key: ScreenKey): Entry | null {
@@ -1,26 +1,23 @@
1
1
  import type { MeasuredDimensions, StyleProps } from "react-native-reanimated";
2
2
  import {
3
3
  createGroupTag,
4
- createPendingPairKey,
5
4
  ensurePairGroups,
6
5
  ensurePairLinks,
6
+ ensurePairSourceRequests,
7
7
  getGroupKeyFromTag,
8
8
  getLinkKeyFromTag,
9
9
  getActiveGroupId as getPairActiveGroupId,
10
10
  getDestination as getPairDestination,
11
11
  getLink as getPairLink,
12
12
  getSource as getPairSource,
13
- getSourceScreenKeyFromPairKey,
14
- removePairLink,
15
13
  } from "../helpers/link-pairs.helpers";
16
14
  import type {
17
- BoundsPortalAttachTarget,
15
+ BoundaryRuntimeFlags,
18
16
  GroupKey,
19
17
  LinkKey,
20
18
  LinkPairsState,
21
19
  ScreenKey,
22
20
  ScreenPairKey,
23
- SourceHostRef,
24
21
  SourceTagLinkSide,
25
22
  TagID,
26
23
  TagLink,
@@ -36,16 +33,151 @@ const syncLinkStatus = (link: TagLink) => {
36
33
  : "source-incomplete";
37
34
  };
38
35
 
36
+ type SharedValueLike = {
37
+ _isReanimatedSharedValue: true;
38
+ get?: () => unknown;
39
+ value?: unknown;
40
+ };
41
+
42
+ const isSharedValueLike = (value: unknown): value is SharedValueLike => {
43
+ "worklet";
44
+ return (
45
+ (value as Partial<SharedValueLike> | null)?._isReanimatedSharedValue ===
46
+ true
47
+ );
48
+ };
49
+
50
+ const snapshotSharedValue = (value: SharedValueLike): unknown => {
51
+ "worklet";
52
+ return value.value;
53
+ };
54
+
55
+ const snapshotTransformArrayValue = (
56
+ value: unknown[],
57
+ ): unknown[] | undefined => {
58
+ "worklet";
59
+ const snapshot: unknown[] = [];
60
+
61
+ for (let index = 0; index < value.length; index++) {
62
+ const snapshotValue = snapshotTransformEntryValue(value[index]);
63
+ if (snapshotValue !== undefined) {
64
+ snapshot.push(snapshotValue);
65
+ }
66
+ }
67
+
68
+ return snapshot;
69
+ };
70
+
71
+ const snapshotTransformEntryValue = (value: unknown): unknown => {
72
+ "worklet";
73
+ if (isSharedValueLike(value)) {
74
+ return snapshotSharedValue(value);
75
+ }
76
+
77
+ if (Array.isArray(value)) {
78
+ return snapshotTransformArrayValue(value);
79
+ }
80
+
81
+ if (typeof value === "function") {
82
+ return undefined;
83
+ }
84
+
85
+ return value === null || typeof value !== "object" ? value : undefined;
86
+ };
87
+
88
+ const snapshotTransformItem = (value: unknown): unknown => {
89
+ "worklet";
90
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
91
+ return snapshotTransformEntryValue(value);
92
+ }
93
+
94
+ const snapshot: Record<string, unknown> = {};
95
+ const source = value as Record<string, unknown>;
96
+ let hasValue = false;
97
+
98
+ for (const key in source) {
99
+ const snapshotValue = snapshotTransformEntryValue(source[key]);
100
+ if (snapshotValue !== undefined) {
101
+ snapshot[key] = snapshotValue;
102
+ hasValue = true;
103
+ }
104
+ }
105
+
106
+ return hasValue ? snapshot : undefined;
107
+ };
108
+
109
+ const snapshotTransform = (value: unknown): unknown => {
110
+ "worklet";
111
+ if (!Array.isArray(value)) {
112
+ return undefined;
113
+ }
114
+
115
+ const snapshot: unknown[] = [];
116
+
117
+ for (let index = 0; index < value.length; index++) {
118
+ const snapshotValue = snapshotTransformItem(value[index]);
119
+ if (snapshotValue !== undefined) {
120
+ snapshot.push(snapshotValue);
121
+ }
122
+ }
123
+
124
+ return snapshot;
125
+ };
126
+
127
+ /**
128
+ * Link styles are measurement metadata, not a general style serializer.
129
+ * Snapshot only the fields bounds currently consume: primitives, top-level
130
+ * shared values, and transform entries. Object-valued non-transform styles are
131
+ * intentionally omitted to avoid retaining opaque/native style objects.
132
+ */
133
+ const snapshotStyles = (styles: StyleProps): StyleProps => {
134
+ "worklet";
135
+ if (!styles || typeof styles !== "object" || Array.isArray(styles)) {
136
+ return {};
137
+ }
138
+
139
+ const snapshot: Record<string, unknown> = {};
140
+ const source = styles as Record<string, unknown>;
141
+
142
+ for (const key in source) {
143
+ const value = source[key];
144
+
145
+ if (key === "transform") {
146
+ const transform = snapshotTransform(value);
147
+
148
+ if (transform !== undefined) {
149
+ snapshot.transform = transform;
150
+ }
151
+
152
+ continue;
153
+ }
154
+
155
+ if (isSharedValueLike(value)) {
156
+ snapshot[key] = snapshotSharedValue(value);
157
+ continue;
158
+ }
159
+
160
+ if (value === null || typeof value !== "object") {
161
+ snapshot[key] = value;
162
+ }
163
+ }
164
+
165
+ return snapshot as StyleProps;
166
+ };
167
+
39
168
  const createLinkSide = (
40
169
  screenKey: ScreenKey,
41
170
  bounds: MeasuredDimensions,
42
171
  styles: StyleProps,
172
+ runtimeFlags: BoundaryRuntimeFlags = {},
43
173
  ) => {
44
174
  "worklet";
45
175
  return {
46
176
  screenKey,
47
177
  bounds,
48
- styles,
178
+ styles: snapshotStyles(styles),
179
+ handoff: runtimeFlags.handoff ? true : undefined,
180
+ escapeClipping: runtimeFlags.escapeClipping ? true : undefined,
49
181
  };
50
182
  };
51
183
 
@@ -100,7 +232,9 @@ const writeDestination = (
100
232
 
101
233
  link.group = group ?? link.group;
102
234
  link.destination = destination;
103
- link.initialDestination ??= destination;
235
+ if (!link.initialDestination) {
236
+ link.initialDestination = destination;
237
+ }
104
238
  syncLinkStatus(link);
105
239
 
106
240
  writePairLink(state, pairKey, linkKey, link);
@@ -110,41 +244,6 @@ const writeDestination = (
110
244
  }
111
245
  };
112
246
 
113
- const promotePendingSource = (
114
- state: LinkPairsState,
115
- pairKey: ScreenPairKey,
116
- linkKey: LinkKey,
117
- ) => {
118
- "worklet";
119
- if (getPairLink(state, pairKey, linkKey)) return;
120
-
121
- const sourceScreenKey = getSourceScreenKeyFromPairKey(pairKey);
122
- const pendingPairKey = createPendingPairKey(sourceScreenKey);
123
- if (pendingPairKey === pairKey) return;
124
-
125
- const pendingLink = getPairLink(state, pendingPairKey, linkKey);
126
- if (!pendingLink) return;
127
-
128
- writePairLink(state, pairKey, linkKey, pendingLink);
129
-
130
- if (pendingLink.group) {
131
- const pendingGroupState =
132
- state[pendingPairKey]?.groups?.[pendingLink.group];
133
-
134
- if (pendingGroupState) {
135
- writeGroup(
136
- state,
137
- pairKey,
138
- pendingLink.group,
139
- pendingGroupState.activeId,
140
- pendingGroupState.initialId,
141
- );
142
- }
143
- }
144
-
145
- removePairLink(state, pendingPairKey, linkKey);
146
- };
147
-
148
247
  function setSource(
149
248
  pairKey: ScreenPairKey,
150
249
  tag: TagID,
@@ -152,8 +251,7 @@ function setSource(
152
251
  bounds: MeasuredDimensions,
153
252
  styles: StyleProps = {},
154
253
  group?: GroupKey,
155
- portalAttachTarget?: BoundsPortalAttachTarget,
156
- sourceHost?: SourceHostRef,
254
+ runtimeFlags: BoundaryRuntimeFlags = {},
157
255
  ) {
158
256
  "worklet";
159
257
  pairs.modify(<T extends LinkPairsState>(state: T): T => {
@@ -164,13 +262,8 @@ function setSource(
164
262
 
165
263
  const existingLink = pairLinks[linkKey];
166
264
 
167
- // Refresh paths may re-measure the source without portal context;
168
- // keep the previously recorded host in that case.
169
265
  const source: SourceTagLinkSide = {
170
- ...createLinkSide(screenKey, bounds, styles),
171
- portalAttachTarget:
172
- portalAttachTarget ?? existingLink?.source?.portalAttachTarget,
173
- sourceHost: sourceHost ?? existingLink?.source?.sourceHost,
266
+ ...createLinkSide(screenKey, bounds, styles, runtimeFlags),
174
267
  };
175
268
  const link =
176
269
  existingLink ??
@@ -184,15 +277,13 @@ function setSource(
184
277
 
185
278
  link.group = group ?? link.group;
186
279
  link.source = source;
187
- link.initialSource ??= source;
280
+ if (!link.initialSource) {
281
+ link.initialSource = source;
282
+ }
188
283
  syncLinkStatus(link);
189
284
 
190
285
  pairLinks[linkKey] = link;
191
-
192
- const pendingPairKey = createPendingPairKey(screenKey);
193
- if (pendingPairKey !== pairKey) {
194
- removePairLink(state, pendingPairKey, linkKey);
195
- }
286
+ delete state[pairKey]?.sourceRequests?.[linkKey];
196
287
 
197
288
  return state;
198
289
  });
@@ -210,7 +301,6 @@ function setDestination(
210
301
  pairs.modify(<T extends LinkPairsState>(state: T): T => {
211
302
  "worklet";
212
303
  const linkKey = getLinkKeyFromTag(tag);
213
- promotePendingSource(state, pairKey, linkKey);
214
304
  writeDestination(state, pairKey, linkKey, screenKey, bounds, styles, group);
215
305
 
216
306
  return state;
@@ -226,6 +316,23 @@ function setActiveGroupId(pairKey: ScreenPairKey, group: GroupKey, tag: TagID) {
226
316
  });
227
317
  }
228
318
 
319
+ function requestSourceMeasure(pairKey: ScreenPairKey, tag: TagID) {
320
+ "worklet";
321
+ pairs.modify(<T extends LinkPairsState>(state: T): T => {
322
+ "worklet";
323
+ const linkKey = getLinkKeyFromTag(tag);
324
+ const link = getPairLink(state, pairKey, linkKey);
325
+
326
+ if (link?.source || state[pairKey]?.sourceRequests?.[linkKey]) {
327
+ return state;
328
+ }
329
+
330
+ ensurePairSourceRequests(state, pairKey)[linkKey] = true;
331
+
332
+ return state;
333
+ });
334
+ }
335
+
229
336
  function getActiveGroupId(
230
337
  pairKey: ScreenPairKey,
231
338
  group: GroupKey,
@@ -246,20 +353,6 @@ const hasSourceLink = (
246
353
  return !!link?.source;
247
354
  };
248
355
 
249
- const getPendingSourceLink = (
250
- state: LinkPairsState,
251
- pairKey: ScreenPairKey,
252
- linkKey: LinkKey,
253
- ): TagLink | null => {
254
- "worklet";
255
- const sourceScreenKey = getSourceScreenKeyFromPairKey(pairKey);
256
- const pendingPairKey = createPendingPairKey(sourceScreenKey);
257
-
258
- if (pendingPairKey === pairKey) return null;
259
-
260
- return getPairLink(state, pendingPairKey, linkKey);
261
- };
262
-
263
356
  function getResolvedLink(
264
357
  pairKey: ScreenPairKey,
265
358
  tag: TagID,
@@ -268,17 +361,7 @@ function getResolvedLink(
268
361
  const state = pairs.get();
269
362
  const linkKey = getLinkKeyFromTag(tag);
270
363
  const group = getGroupKeyFromTag(tag);
271
- const requestedLink = getPairLink(state, pairKey, linkKey);
272
-
273
- // Press-triggered zoom captures the source before navigation under a pending
274
- // source<> pair. If the destination screen has no Boundary.View, nothing
275
- // promotes that source into source<>destination, but zoom can still animate to
276
- // its default top target from the pending source bounds.
277
- const fallbackPendingLink = requestedLink
278
- ? null
279
- : getPendingSourceLink(state, pairKey, linkKey);
280
-
281
- const link = requestedLink ?? fallbackPendingLink;
364
+ const link = getPairLink(state, pairKey, linkKey);
282
365
 
283
366
  // Group active ids can update before the new member has a full source/destination
284
367
  // link. As soon as the requested member has source bounds, prefer it; only
@@ -292,9 +375,7 @@ function getResolvedLink(
292
375
 
293
376
  const initialId = state[pairKey]?.groups?.[group]?.initialId;
294
377
  if (initialId) {
295
- const initialLink =
296
- getPairLink(state, pairKey, initialId) ??
297
- getPendingSourceLink(state, pairKey, initialId);
378
+ const initialLink = getPairLink(state, pairKey, initialId);
298
379
 
299
380
  if (hasSourceLink(initialLink)) {
300
381
  return {
@@ -332,6 +413,7 @@ export {
332
413
  getLink,
333
414
  getResolvedLink,
334
415
  getSource,
416
+ requestSourceMeasure,
335
417
  setActiveGroupId,
336
418
  setDestination,
337
419
  setSource,
@@ -39,8 +39,6 @@ function resolveTransitionPair(
39
39
  destinationStyles: matchedLink?.destination?.styles ?? null,
40
40
  sourceScreenKey: matchedLink?.source?.screenKey ?? null,
41
41
  destinationScreenKey: matchedLink?.destination?.screenKey ?? null,
42
- sourcePortalAttachTarget: matchedLink?.source?.portalAttachTarget,
43
- sourceHost: matchedLink?.source?.sourceHost,
44
42
  };
45
43
  }
46
44