react-native-screen-transitions 3.9.0-alpha.1 → 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 (481) hide show
  1. package/lib/commonjs/shared/components/boundary/components/boundary-target.js +21 -16
  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 +88 -114
  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} +14 -7
  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} +51 -24
  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} +7 -10
  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} +10 -7
  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 +82 -0
  14. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -0
  15. package/lib/commonjs/shared/components/boundary/hooks/use-measurer.js +10 -13
  16. package/lib/commonjs/shared/components/boundary/hooks/use-measurer.js.map +1 -1
  17. package/lib/commonjs/shared/components/boundary/index.js +27 -30
  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 +65 -0
  52. package/lib/commonjs/shared/components/boundary/providers/boundary-root.provider.js.map +1 -0
  53. package/lib/commonjs/shared/components/boundary/utils/destination-signals.js +12 -2
  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/components/create-transition-aware-component.js +2 -20
  60. package/lib/commonjs/shared/components/create-transition-aware-component.js.map +1 -1
  61. package/lib/commonjs/shared/components/overlay/variations/float-overlay.js +1 -1
  62. package/lib/commonjs/shared/components/overlay/variations/float-overlay.js.map +1 -1
  63. package/lib/commonjs/shared/components/screen-container/layers/backdrop.js +2 -14
  64. package/lib/commonjs/shared/components/screen-container/layers/backdrop.js.map +1 -1
  65. package/lib/commonjs/shared/components/screen-container/layers/content.js +4 -16
  66. package/lib/commonjs/shared/components/screen-container/layers/content.js.map +1 -1
  67. package/lib/commonjs/shared/components/screen-container/layers/maybe-masked-navigation-container.js +4 -15
  68. package/lib/commonjs/shared/components/screen-container/layers/maybe-masked-navigation-container.js.map +1 -1
  69. package/lib/commonjs/shared/components/screen-container/layers/surface-container.js +4 -16
  70. package/lib/commonjs/shared/components/screen-container/layers/surface-container.js.map +1 -1
  71. package/lib/commonjs/shared/index.js.map +1 -1
  72. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js +6 -3
  73. package/lib/commonjs/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  74. package/lib/commonjs/shared/providers/screen/animation/helpers/derivations.js +1 -0
  75. package/lib/commonjs/shared/providers/screen/animation/helpers/derivations.js.map +1 -1
  76. package/lib/commonjs/shared/providers/screen/animation/helpers/pipeline.js +143 -24
  77. package/lib/commonjs/shared/providers/screen/animation/helpers/pipeline.js.map +1 -1
  78. package/lib/commonjs/shared/providers/screen/screen-composer.js +1 -1
  79. package/lib/commonjs/shared/providers/screen/screen-composer.js.map +1 -1
  80. package/lib/commonjs/shared/providers/screen/styles/helpers/compose-slot-style.js +95 -0
  81. package/lib/commonjs/shared/providers/screen/styles/helpers/compose-slot-style.js.map +1 -0
  82. package/lib/commonjs/shared/providers/screen/styles/helpers/normalize-slots.js +30 -9
  83. package/lib/commonjs/shared/providers/screen/styles/helpers/normalize-slots.js.map +1 -1
  84. package/lib/commonjs/shared/providers/screen/styles/helpers/opening-phase.js +32 -0
  85. package/lib/commonjs/shared/providers/screen/styles/helpers/opening-phase.js.map +1 -0
  86. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js +16 -11
  87. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js.map +1 -1
  88. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.js +2 -0
  89. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.js.map +1 -1
  90. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/slot-state.js +1 -20
  91. package/lib/commonjs/shared/providers/screen/styles/helpers/resolve-slot-styles/slot-state.js.map +1 -1
  92. package/lib/commonjs/shared/providers/screen/styles/helpers/visibility-gate.js +1 -11
  93. package/lib/commonjs/shared/providers/screen/styles/helpers/visibility-gate.js.map +1 -1
  94. package/lib/commonjs/shared/providers/screen/styles/hooks/slot-resolvers.js +96 -0
  95. package/lib/commonjs/shared/providers/screen/styles/hooks/slot-resolvers.js.map +1 -0
  96. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +36 -36
  97. package/lib/commonjs/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  98. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +1 -19
  99. package/lib/commonjs/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  100. package/lib/commonjs/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.js +8 -3
  101. package/lib/commonjs/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.js.map +1 -1
  102. package/lib/commonjs/shared/providers/screen/styles/index.js +38 -7
  103. package/lib/commonjs/shared/providers/screen/styles/index.js.map +1 -1
  104. package/lib/commonjs/shared/providers/screen/styles/{styles.provider.js → slot.provider.js} +34 -21
  105. package/lib/commonjs/shared/providers/screen/styles/slot.provider.js.map +1 -0
  106. package/lib/commonjs/shared/providers/screen/styles/stores/slot-references.store.js +53 -0
  107. package/lib/commonjs/shared/providers/screen/styles/stores/slot-references.store.js.map +1 -0
  108. package/lib/commonjs/shared/stores/bounds/helpers/link-pairs.helpers.js +37 -2
  109. package/lib/commonjs/shared/stores/bounds/helpers/link-pairs.helpers.js.map +1 -1
  110. package/lib/commonjs/shared/stores/bounds/internals/entries.js +11 -4
  111. package/lib/commonjs/shared/stores/bounds/internals/entries.js.map +1 -1
  112. package/lib/commonjs/shared/stores/bounds/internals/links.js +134 -51
  113. package/lib/commonjs/shared/stores/bounds/internals/links.js.map +1 -1
  114. package/lib/commonjs/shared/stores/bounds/internals/resolver.js +1 -3
  115. package/lib/commonjs/shared/stores/bounds/internals/resolver.js.map +1 -1
  116. package/lib/commonjs/shared/stores/system.store.js +5 -0
  117. package/lib/commonjs/shared/stores/system.store.js.map +1 -1
  118. package/lib/commonjs/shared/utils/bounds/helpers/styles/compute.js +10 -69
  119. package/lib/commonjs/shared/utils/bounds/helpers/styles/compute.js.map +1 -1
  120. package/lib/commonjs/shared/utils/bounds/helpers/styles/local-transform.js +59 -0
  121. package/lib/commonjs/shared/utils/bounds/helpers/styles/local-transform.js.map +1 -0
  122. package/lib/commonjs/shared/utils/bounds/navigation/zoom/build.js +8 -1
  123. package/lib/commonjs/shared/utils/bounds/navigation/zoom/build.js.map +1 -1
  124. package/lib/commonjs/shared/utils/bounds/navigation/zoom/helpers.js +59 -0
  125. package/lib/commonjs/shared/utils/bounds/navigation/zoom/helpers.js.map +1 -1
  126. package/lib/commonjs/shared/utils/logger.js +11 -0
  127. package/lib/commonjs/shared/utils/logger.js.map +1 -1
  128. package/lib/module/shared/components/boundary/components/boundary-target.js +19 -14
  129. package/lib/module/shared/components/boundary/components/boundary-target.js.map +1 -1
  130. package/lib/module/shared/components/boundary/create-boundary-component.js +93 -119
  131. package/lib/module/shared/components/boundary/create-boundary-component.js.map +1 -1
  132. package/lib/module/shared/components/boundary/hooks/lifecycles/use-boundary-presence.js +30 -0
  133. package/lib/module/shared/components/boundary/hooks/lifecycles/use-boundary-presence.js.map +1 -0
  134. package/lib/module/shared/components/boundary/hooks/{use-initial-destination-measurement.js → lifecycles/use-initial-destination-measurement.js} +51 -24
  135. package/lib/module/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.js.map +1 -0
  136. package/lib/module/shared/components/boundary/hooks/{use-initial-source-measurement.js → lifecycles/use-initial-source-measurement.js} +7 -10
  137. package/lib/module/shared/components/boundary/hooks/lifecycles/use-initial-source-measurement.js.map +1 -0
  138. package/lib/module/shared/components/boundary/hooks/{use-refresh-boundary.js → lifecycles/use-refresh-boundary.js} +10 -7
  139. package/lib/module/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.js.map +1 -0
  140. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js +77 -0
  141. package/lib/module/shared/components/boundary/hooks/use-boundary-measurement.js.map +1 -0
  142. package/lib/module/shared/components/boundary/hooks/use-measurer.js +10 -13
  143. package/lib/module/shared/components/boundary/hooks/use-measurer.js.map +1 -1
  144. package/lib/module/shared/components/boundary/index.js +27 -30
  145. package/lib/module/shared/components/boundary/index.js.map +1 -1
  146. package/lib/module/shared/components/boundary/portal/components/boundary-local-portal-host.js +53 -0
  147. package/lib/module/shared/components/boundary/portal/components/boundary-local-portal-host.js.map +1 -0
  148. package/lib/module/shared/components/boundary/portal/components/host.js +21 -5
  149. package/lib/module/shared/components/boundary/portal/components/host.js.map +1 -1
  150. package/lib/module/shared/components/boundary/portal/components/portal-boundary-host.js +53 -32
  151. package/lib/module/shared/components/boundary/portal/components/portal-boundary-host.js.map +1 -1
  152. package/lib/module/shared/components/boundary/portal/components/portal.js +213 -103
  153. package/lib/module/shared/components/boundary/portal/components/portal.js.map +1 -1
  154. package/lib/module/shared/components/boundary/portal/hooks/use-host-measurement.js +15 -3
  155. package/lib/module/shared/components/boundary/portal/hooks/use-host-measurement.js.map +1 -1
  156. package/lib/module/shared/components/boundary/portal/stores/host-registry.store.js +4 -41
  157. package/lib/module/shared/components/boundary/portal/stores/host-registry.store.js.map +1 -1
  158. package/lib/module/shared/components/boundary/portal/stores/portal-boundary-host.store.js +35 -4
  159. package/lib/module/shared/components/boundary/portal/stores/portal-boundary-host.store.js.map +1 -1
  160. package/lib/module/shared/components/boundary/portal/teleport.js +16 -2
  161. package/lib/module/shared/components/boundary/portal/teleport.js.map +1 -1
  162. package/lib/module/shared/components/boundary/portal/utils/has-local-slot.js +13 -0
  163. package/lib/module/shared/components/boundary/portal/utils/has-local-slot.js.map +1 -0
  164. package/lib/module/shared/components/boundary/portal/utils/naming.js +8 -2
  165. package/lib/module/shared/components/boundary/portal/utils/naming.js.map +1 -1
  166. package/lib/module/shared/components/boundary/portal/utils/offset-style.js +29 -49
  167. package/lib/module/shared/components/boundary/portal/utils/offset-style.js.map +1 -1
  168. package/lib/module/shared/components/boundary/portal/utils/ownership.js +246 -0
  169. package/lib/module/shared/components/boundary/portal/utils/ownership.js.map +1 -0
  170. package/lib/module/shared/components/boundary/portal/utils/resolve-portal.js +33 -0
  171. package/lib/module/shared/components/boundary/portal/utils/resolve-portal.js.map +1 -0
  172. package/lib/module/shared/components/boundary/portal/utils/shallow-equal.js +24 -0
  173. package/lib/module/shared/components/boundary/portal/utils/shallow-equal.js.map +1 -0
  174. package/lib/module/shared/components/boundary/portal/utils/teleport-control.js +8 -0
  175. package/lib/module/shared/components/boundary/portal/utils/teleport-control.js.map +1 -1
  176. package/lib/module/shared/components/boundary/portal/utils/visible-host.js +20 -0
  177. package/lib/module/shared/components/boundary/portal/utils/visible-host.js.map +1 -0
  178. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js +57 -0
  179. package/lib/module/shared/components/boundary/providers/boundary-root.provider.js.map +1 -0
  180. package/lib/module/shared/components/boundary/utils/destination-signals.js +12 -2
  181. package/lib/module/shared/components/boundary/utils/destination-signals.js.map +1 -1
  182. package/lib/module/shared/components/boundary/utils/refresh-signals.js +0 -21
  183. package/lib/module/shared/components/boundary/utils/refresh-signals.js.map +1 -1
  184. package/lib/module/shared/components/boundary/utils/source-signals.js +4 -9
  185. package/lib/module/shared/components/boundary/utils/source-signals.js.map +1 -1
  186. package/lib/module/shared/components/create-transition-aware-component.js +4 -22
  187. package/lib/module/shared/components/create-transition-aware-component.js.map +1 -1
  188. package/lib/module/shared/components/overlay/variations/float-overlay.js +2 -2
  189. package/lib/module/shared/components/overlay/variations/float-overlay.js.map +1 -1
  190. package/lib/module/shared/components/screen-container/layers/backdrop.js +4 -16
  191. package/lib/module/shared/components/screen-container/layers/backdrop.js.map +1 -1
  192. package/lib/module/shared/components/screen-container/layers/content.js +4 -16
  193. package/lib/module/shared/components/screen-container/layers/content.js.map +1 -1
  194. package/lib/module/shared/components/screen-container/layers/maybe-masked-navigation-container.js +5 -16
  195. package/lib/module/shared/components/screen-container/layers/maybe-masked-navigation-container.js.map +1 -1
  196. package/lib/module/shared/components/screen-container/layers/surface-container.js +4 -16
  197. package/lib/module/shared/components/screen-container/layers/surface-container.js.map +1 -1
  198. package/lib/module/shared/index.js.map +1 -1
  199. package/lib/module/shared/providers/helpers/measured-bounds-writes.js +6 -3
  200. package/lib/module/shared/providers/helpers/measured-bounds-writes.js.map +1 -1
  201. package/lib/module/shared/providers/screen/animation/helpers/derivations.js +1 -0
  202. package/lib/module/shared/providers/screen/animation/helpers/derivations.js.map +1 -1
  203. package/lib/module/shared/providers/screen/animation/helpers/pipeline.js +144 -25
  204. package/lib/module/shared/providers/screen/animation/helpers/pipeline.js.map +1 -1
  205. package/lib/module/shared/providers/screen/screen-composer.js +2 -2
  206. package/lib/module/shared/providers/screen/screen-composer.js.map +1 -1
  207. package/lib/module/shared/providers/screen/styles/helpers/compose-slot-style.js +89 -0
  208. package/lib/module/shared/providers/screen/styles/helpers/compose-slot-style.js.map +1 -0
  209. package/lib/module/shared/providers/screen/styles/helpers/normalize-slots.js +30 -9
  210. package/lib/module/shared/providers/screen/styles/helpers/normalize-slots.js.map +1 -1
  211. package/lib/module/shared/providers/screen/styles/helpers/opening-phase.js +26 -0
  212. package/lib/module/shared/providers/screen/styles/helpers/opening-phase.js.map +1 -0
  213. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js +16 -11
  214. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/index.js.map +1 -1
  215. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.js +2 -0
  216. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.js.map +1 -1
  217. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/slot-state.js +0 -18
  218. package/lib/module/shared/providers/screen/styles/helpers/resolve-slot-styles/slot-state.js.map +1 -1
  219. package/lib/module/shared/providers/screen/styles/helpers/visibility-gate.js +0 -9
  220. package/lib/module/shared/providers/screen/styles/helpers/visibility-gate.js.map +1 -1
  221. package/lib/module/shared/providers/screen/styles/hooks/slot-resolvers.js +87 -0
  222. package/lib/module/shared/providers/screen/styles/hooks/slot-resolvers.js.map +1 -0
  223. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js +36 -36
  224. package/lib/module/shared/providers/screen/styles/hooks/use-interpolated-style-maps.js.map +1 -1
  225. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js +1 -19
  226. package/lib/module/shared/providers/screen/styles/hooks/use-maybe-block-visibility.js.map +1 -1
  227. package/lib/module/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.js +9 -4
  228. package/lib/module/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.js.map +1 -1
  229. package/lib/module/shared/providers/screen/styles/index.js +2 -1
  230. package/lib/module/shared/providers/screen/styles/index.js.map +1 -1
  231. package/lib/module/shared/providers/screen/styles/slot.provider.js +66 -0
  232. package/lib/module/shared/providers/screen/styles/slot.provider.js.map +1 -0
  233. package/lib/module/shared/providers/screen/styles/stores/slot-references.store.js +47 -0
  234. package/lib/module/shared/providers/screen/styles/stores/slot-references.store.js.map +1 -0
  235. package/lib/module/shared/stores/bounds/helpers/link-pairs.helpers.js +33 -1
  236. package/lib/module/shared/stores/bounds/helpers/link-pairs.helpers.js.map +1 -1
  237. package/lib/module/shared/stores/bounds/internals/entries.js +11 -4
  238. package/lib/module/shared/stores/bounds/internals/entries.js.map +1 -1
  239. package/lib/module/shared/stores/bounds/internals/links.js +135 -53
  240. package/lib/module/shared/stores/bounds/internals/links.js.map +1 -1
  241. package/lib/module/shared/stores/bounds/internals/resolver.js +1 -3
  242. package/lib/module/shared/stores/bounds/internals/resolver.js.map +1 -1
  243. package/lib/module/shared/stores/system.store.js +5 -0
  244. package/lib/module/shared/stores/system.store.js.map +1 -1
  245. package/lib/module/shared/types/animation.types.js.map +1 -1
  246. package/lib/module/shared/utils/bounds/helpers/styles/compute.js +10 -69
  247. package/lib/module/shared/utils/bounds/helpers/styles/compute.js.map +1 -1
  248. package/lib/module/shared/utils/bounds/helpers/styles/local-transform.js +52 -0
  249. package/lib/module/shared/utils/bounds/helpers/styles/local-transform.js.map +1 -0
  250. package/lib/module/shared/utils/bounds/navigation/zoom/build.js +9 -2
  251. package/lib/module/shared/utils/bounds/navigation/zoom/build.js.map +1 -1
  252. package/lib/module/shared/utils/bounds/navigation/zoom/helpers.js +58 -0
  253. package/lib/module/shared/utils/bounds/navigation/zoom/helpers.js.map +1 -1
  254. package/lib/module/shared/utils/logger.js +11 -0
  255. package/lib/module/shared/utils/logger.js.map +1 -1
  256. package/lib/typescript/shared/components/boundary/components/boundary-target.d.ts.map +1 -1
  257. package/lib/typescript/shared/components/boundary/create-boundary-component.d.ts +0 -1
  258. package/lib/typescript/shared/components/boundary/create-boundary-component.d.ts.map +1 -1
  259. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-boundary-presence.d.ts +11 -0
  260. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-boundary-presence.d.ts.map +1 -0
  261. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.d.ts +10 -0
  262. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-destination-measurement.d.ts.map +1 -0
  263. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-source-measurement.d.ts +8 -0
  264. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-initial-source-measurement.d.ts.map +1 -0
  265. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.d.ts +10 -0
  266. package/lib/typescript/shared/components/boundary/hooks/lifecycles/use-refresh-boundary.d.ts.map +1 -0
  267. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts +28 -0
  268. package/lib/typescript/shared/components/boundary/hooks/use-boundary-measurement.d.ts.map +1 -0
  269. package/lib/typescript/shared/components/boundary/hooks/use-measurer.d.ts +5 -6
  270. package/lib/typescript/shared/components/boundary/hooks/use-measurer.d.ts.map +1 -1
  271. package/lib/typescript/shared/components/boundary/index.d.ts +36 -229
  272. package/lib/typescript/shared/components/boundary/index.d.ts.map +1 -1
  273. package/lib/typescript/shared/components/boundary/portal/components/boundary-local-portal-host.d.ts +8 -0
  274. package/lib/typescript/shared/components/boundary/portal/components/boundary-local-portal-host.d.ts.map +1 -0
  275. package/lib/typescript/shared/components/boundary/portal/components/host.d.ts.map +1 -1
  276. package/lib/typescript/shared/components/boundary/portal/components/portal-boundary-host.d.ts +1 -1
  277. package/lib/typescript/shared/components/boundary/portal/components/portal-boundary-host.d.ts.map +1 -1
  278. package/lib/typescript/shared/components/boundary/portal/components/portal.d.ts +4 -3
  279. package/lib/typescript/shared/components/boundary/portal/components/portal.d.ts.map +1 -1
  280. package/lib/typescript/shared/components/boundary/portal/hooks/use-host-measurement.d.ts.map +1 -1
  281. package/lib/typescript/shared/components/boundary/portal/stores/host-registry.store.d.ts +0 -7
  282. package/lib/typescript/shared/components/boundary/portal/stores/host-registry.store.d.ts.map +1 -1
  283. package/lib/typescript/shared/components/boundary/portal/stores/portal-boundary-host.store.d.ts +16 -1
  284. package/lib/typescript/shared/components/boundary/portal/stores/portal-boundary-host.store.d.ts.map +1 -1
  285. package/lib/typescript/shared/components/boundary/portal/teleport.d.ts +1 -1
  286. package/lib/typescript/shared/components/boundary/portal/teleport.d.ts.map +1 -1
  287. package/lib/typescript/shared/components/boundary/portal/utils/has-local-slot.d.ts +3 -0
  288. package/lib/typescript/shared/components/boundary/portal/utils/has-local-slot.d.ts.map +1 -0
  289. package/lib/typescript/shared/components/boundary/portal/utils/naming.d.ts +2 -1
  290. package/lib/typescript/shared/components/boundary/portal/utils/naming.d.ts.map +1 -1
  291. package/lib/typescript/shared/components/boundary/portal/utils/offset-style.d.ts +16 -32
  292. package/lib/typescript/shared/components/boundary/portal/utils/offset-style.d.ts.map +1 -1
  293. package/lib/typescript/shared/components/boundary/portal/utils/ownership.d.ts +35 -0
  294. package/lib/typescript/shared/components/boundary/portal/utils/ownership.d.ts.map +1 -0
  295. package/lib/typescript/shared/components/boundary/portal/utils/resolve-portal.d.ts +12 -0
  296. package/lib/typescript/shared/components/boundary/portal/utils/resolve-portal.d.ts.map +1 -0
  297. package/lib/typescript/shared/components/boundary/portal/utils/shallow-equal.d.ts +8 -0
  298. package/lib/typescript/shared/components/boundary/portal/utils/shallow-equal.d.ts.map +1 -0
  299. package/lib/typescript/shared/components/boundary/portal/utils/teleport-control.d.ts +4 -0
  300. package/lib/typescript/shared/components/boundary/portal/utils/teleport-control.d.ts.map +1 -1
  301. package/lib/typescript/shared/components/boundary/portal/utils/visible-host.d.ts +8 -0
  302. package/lib/typescript/shared/components/boundary/portal/utils/visible-host.d.ts.map +1 -0
  303. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts +37 -0
  304. package/lib/typescript/shared/components/boundary/providers/boundary-root.provider.d.ts.map +1 -0
  305. package/lib/typescript/shared/components/boundary/types.d.ts +9 -36
  306. package/lib/typescript/shared/components/boundary/types.d.ts.map +1 -1
  307. package/lib/typescript/shared/components/boundary/utils/destination-signals.d.ts +1 -0
  308. package/lib/typescript/shared/components/boundary/utils/destination-signals.d.ts.map +1 -1
  309. package/lib/typescript/shared/components/boundary/utils/refresh-signals.d.ts.map +1 -1
  310. package/lib/typescript/shared/components/boundary/utils/source-signals.d.ts +0 -1
  311. package/lib/typescript/shared/components/boundary/utils/source-signals.d.ts.map +1 -1
  312. package/lib/typescript/shared/components/create-transition-aware-component.d.ts.map +1 -1
  313. package/lib/typescript/shared/components/screen-container/layers/backdrop.d.ts.map +1 -1
  314. package/lib/typescript/shared/components/screen-container/layers/content.d.ts.map +1 -1
  315. package/lib/typescript/shared/components/screen-container/layers/maybe-masked-navigation-container.d.ts.map +1 -1
  316. package/lib/typescript/shared/components/screen-container/layers/surface-container.d.ts.map +1 -1
  317. package/lib/typescript/shared/index.d.ts +3 -215
  318. package/lib/typescript/shared/index.d.ts.map +1 -1
  319. package/lib/typescript/shared/providers/helpers/measured-bounds-writes.d.ts +3 -3
  320. package/lib/typescript/shared/providers/helpers/measured-bounds-writes.d.ts.map +1 -1
  321. package/lib/typescript/shared/providers/screen/animation/helpers/derivations.d.ts +1 -0
  322. package/lib/typescript/shared/providers/screen/animation/helpers/derivations.d.ts.map +1 -1
  323. package/lib/typescript/shared/providers/screen/animation/helpers/pipeline.d.ts.map +1 -1
  324. package/lib/typescript/shared/providers/screen/styles/helpers/compose-slot-style.d.ts +4 -0
  325. package/lib/typescript/shared/providers/screen/styles/helpers/compose-slot-style.d.ts.map +1 -0
  326. package/lib/typescript/shared/providers/screen/styles/helpers/normalize-slots.d.ts.map +1 -1
  327. package/lib/typescript/shared/providers/screen/styles/helpers/opening-phase.d.ts +16 -0
  328. package/lib/typescript/shared/providers/screen/styles/helpers/opening-phase.d.ts.map +1 -0
  329. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/index.d.ts +3 -4
  330. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/index.d.ts.map +1 -1
  331. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.d.ts +2 -1
  332. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.d.ts.map +1 -1
  333. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/slot-state.d.ts +0 -1
  334. package/lib/typescript/shared/providers/screen/styles/helpers/resolve-slot-styles/slot-state.d.ts.map +1 -1
  335. package/lib/typescript/shared/providers/screen/styles/helpers/visibility-gate.d.ts +0 -1
  336. package/lib/typescript/shared/providers/screen/styles/helpers/visibility-gate.d.ts.map +1 -1
  337. package/lib/typescript/shared/providers/screen/styles/hooks/slot-resolvers.d.ts +11 -0
  338. package/lib/typescript/shared/providers/screen/styles/hooks/slot-resolvers.d.ts.map +1 -0
  339. package/lib/typescript/shared/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts +4 -6
  340. package/lib/typescript/shared/providers/screen/styles/hooks/use-interpolated-style-maps.d.ts.map +1 -1
  341. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts +0 -1
  342. package/lib/typescript/shared/providers/screen/styles/hooks/use-maybe-block-visibility.d.ts.map +1 -1
  343. package/lib/typescript/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.d.ts.map +1 -1
  344. package/lib/typescript/shared/providers/screen/styles/index.d.ts +2 -1
  345. package/lib/typescript/shared/providers/screen/styles/index.d.ts.map +1 -1
  346. package/lib/typescript/shared/providers/screen/styles/slot.provider.d.ts +18 -0
  347. package/lib/typescript/shared/providers/screen/styles/slot.provider.d.ts.map +1 -0
  348. package/lib/typescript/shared/providers/screen/styles/stores/slot-references.store.d.ts +6 -0
  349. package/lib/typescript/shared/providers/screen/styles/stores/slot-references.store.d.ts.map +1 -0
  350. package/lib/typescript/shared/stores/bounds/helpers/link-pairs.helpers.d.ts +8 -1
  351. package/lib/typescript/shared/stores/bounds/helpers/link-pairs.helpers.d.ts.map +1 -1
  352. package/lib/typescript/shared/stores/bounds/internals/entries.d.ts.map +1 -1
  353. package/lib/typescript/shared/stores/bounds/internals/links.d.ts +4 -3
  354. package/lib/typescript/shared/stores/bounds/internals/links.d.ts.map +1 -1
  355. package/lib/typescript/shared/stores/bounds/internals/resolver.d.ts.map +1 -1
  356. package/lib/typescript/shared/stores/bounds/types.d.ts +22 -20
  357. package/lib/typescript/shared/stores/bounds/types.d.ts.map +1 -1
  358. package/lib/typescript/shared/stores/system.store.d.ts +1 -0
  359. package/lib/typescript/shared/stores/system.store.d.ts.map +1 -1
  360. package/lib/typescript/shared/types/animation.types.d.ts +7 -1
  361. package/lib/typescript/shared/types/animation.types.d.ts.map +1 -1
  362. package/lib/typescript/shared/utils/bounds/helpers/styles/compute.d.ts.map +1 -1
  363. package/lib/typescript/shared/utils/bounds/helpers/styles/local-transform.d.ts +6 -0
  364. package/lib/typescript/shared/utils/bounds/helpers/styles/local-transform.d.ts.map +1 -0
  365. package/lib/typescript/shared/utils/bounds/navigation/zoom/build.d.ts.map +1 -1
  366. package/lib/typescript/shared/utils/bounds/navigation/zoom/helpers.d.ts +9 -0
  367. package/lib/typescript/shared/utils/bounds/navigation/zoom/helpers.d.ts.map +1 -1
  368. package/lib/typescript/shared/utils/logger.d.ts +6 -0
  369. package/lib/typescript/shared/utils/logger.d.ts.map +1 -1
  370. package/package.json +1 -1
  371. package/src/shared/components/boundary/components/boundary-target.tsx +30 -16
  372. package/src/shared/components/boundary/create-boundary-component.tsx +132 -164
  373. package/src/shared/components/boundary/hooks/lifecycles/use-boundary-presence.ts +41 -0
  374. package/src/shared/components/boundary/hooks/{use-initial-destination-measurement.ts → lifecycles/use-initial-destination-measurement.ts} +65 -22
  375. package/src/shared/components/boundary/hooks/{use-initial-source-measurement.ts → lifecycles/use-initial-source-measurement.ts} +10 -12
  376. package/src/shared/components/boundary/hooks/{use-refresh-boundary.ts → lifecycles/use-refresh-boundary.ts} +10 -10
  377. package/src/shared/components/boundary/hooks/use-boundary-measurement.ts +97 -0
  378. package/src/shared/components/boundary/hooks/use-measurer.ts +16 -24
  379. package/src/shared/components/boundary/index.tsx +56 -30
  380. package/src/shared/components/boundary/portal/components/boundary-local-portal-host.tsx +66 -0
  381. package/src/shared/components/boundary/portal/components/host.tsx +20 -5
  382. package/src/shared/components/boundary/portal/components/portal-boundary-host.tsx +67 -52
  383. package/src/shared/components/boundary/portal/components/portal.tsx +281 -120
  384. package/src/shared/components/boundary/portal/hooks/use-host-measurement.ts +23 -2
  385. package/src/shared/components/boundary/portal/stores/host-registry.store.ts +4 -51
  386. package/src/shared/components/boundary/portal/stores/portal-boundary-host.store.ts +59 -6
  387. package/src/shared/components/boundary/portal/teleport.ts +28 -3
  388. package/src/shared/components/boundary/portal/utils/has-local-slot.ts +16 -0
  389. package/src/shared/components/boundary/portal/utils/naming.ts +11 -1
  390. package/src/shared/components/boundary/portal/utils/offset-style.ts +37 -139
  391. package/src/shared/components/boundary/portal/utils/ownership.ts +371 -0
  392. package/src/shared/components/boundary/portal/utils/resolve-portal.ts +50 -0
  393. package/src/shared/components/boundary/portal/utils/shallow-equal.ts +25 -0
  394. package/src/shared/components/boundary/portal/utils/teleport-control.ts +12 -0
  395. package/src/shared/components/boundary/portal/utils/visible-host.ts +24 -0
  396. package/src/shared/components/boundary/providers/{boundary-owner.provider.tsx → boundary-root.provider.tsx} +33 -47
  397. package/src/shared/components/boundary/types.ts +9 -39
  398. package/src/shared/components/boundary/utils/destination-signals.ts +22 -2
  399. package/src/shared/components/boundary/utils/refresh-signals.ts +0 -41
  400. package/src/shared/components/boundary/utils/source-signals.ts +5 -17
  401. package/src/shared/components/create-transition-aware-component.tsx +3 -25
  402. package/src/shared/components/overlay/variations/float-overlay.tsx +3 -3
  403. package/src/shared/components/screen-container/layers/backdrop.tsx +4 -17
  404. package/src/shared/components/screen-container/layers/content.tsx +4 -16
  405. package/src/shared/components/screen-container/layers/maybe-masked-navigation-container.tsx +8 -18
  406. package/src/shared/components/screen-container/layers/surface-container.tsx +4 -17
  407. package/src/shared/index.ts +0 -5
  408. package/src/shared/providers/helpers/measured-bounds-writes.ts +6 -11
  409. package/src/shared/providers/screen/animation/helpers/derivations.ts +3 -0
  410. package/src/shared/providers/screen/animation/helpers/pipeline.ts +251 -68
  411. package/src/shared/providers/screen/screen-composer.tsx +3 -3
  412. package/src/shared/providers/screen/styles/helpers/compose-slot-style.ts +129 -0
  413. package/src/shared/providers/screen/styles/helpers/normalize-slots.ts +45 -8
  414. package/src/shared/providers/screen/styles/helpers/opening-phase.ts +25 -0
  415. package/src/shared/providers/screen/styles/helpers/resolve-slot-styles/index.ts +22 -12
  416. package/src/shared/providers/screen/styles/helpers/resolve-slot-styles/materialize-slot.ts +3 -1
  417. package/src/shared/providers/screen/styles/helpers/resolve-slot-styles/slot-state.ts +0 -24
  418. package/src/shared/providers/screen/styles/helpers/visibility-gate.ts +0 -12
  419. package/src/shared/providers/screen/styles/hooks/slot-resolvers.tsx +111 -0
  420. package/src/shared/providers/screen/styles/hooks/use-interpolated-style-maps.tsx +48 -38
  421. package/src/shared/providers/screen/styles/hooks/use-maybe-block-visibility.tsx +0 -18
  422. package/src/shared/providers/screen/styles/hooks/use-resolved-slot-style-map.tsx +17 -4
  423. package/src/shared/providers/screen/styles/index.tsx +13 -4
  424. package/src/shared/providers/screen/styles/slot.provider.tsx +93 -0
  425. package/src/shared/providers/screen/styles/stores/slot-references.store.ts +71 -0
  426. package/src/shared/stores/bounds/helpers/link-pairs.helpers.ts +41 -1
  427. package/src/shared/stores/bounds/internals/entries.ts +13 -5
  428. package/src/shared/stores/bounds/internals/links.ts +167 -85
  429. package/src/shared/stores/bounds/internals/resolver.ts +0 -2
  430. package/src/shared/stores/bounds/types.ts +24 -22
  431. package/src/shared/stores/system.store.ts +6 -0
  432. package/src/shared/types/animation.types.ts +8 -1
  433. package/src/shared/utils/bounds/helpers/styles/compute.ts +22 -124
  434. package/src/shared/utils/bounds/helpers/styles/local-transform.ts +86 -0
  435. package/src/shared/utils/bounds/navigation/zoom/build.ts +9 -1
  436. package/src/shared/utils/bounds/navigation/zoom/helpers.ts +96 -0
  437. package/src/shared/utils/logger.ts +12 -0
  438. package/lib/commonjs/shared/components/boundary/hooks/use-boundary-presence.js.map +0 -1
  439. package/lib/commonjs/shared/components/boundary/hooks/use-initial-destination-measurement.js.map +0 -1
  440. package/lib/commonjs/shared/components/boundary/hooks/use-initial-source-measurement.js.map +0 -1
  441. package/lib/commonjs/shared/components/boundary/hooks/use-refresh-boundary.js.map +0 -1
  442. package/lib/commonjs/shared/components/boundary/portal/utils/attachment.js +0 -40
  443. package/lib/commonjs/shared/components/boundary/portal/utils/attachment.js.map +0 -1
  444. package/lib/commonjs/shared/components/boundary/providers/boundary-owner.provider.js +0 -68
  445. package/lib/commonjs/shared/components/boundary/providers/boundary-owner.provider.js.map +0 -1
  446. package/lib/commonjs/shared/providers/screen/styles/helpers/preserve-animated-props-only.js +0 -26
  447. package/lib/commonjs/shared/providers/screen/styles/helpers/preserve-animated-props-only.js.map +0 -1
  448. package/lib/commonjs/shared/providers/screen/styles/styles.provider.js.map +0 -1
  449. package/lib/module/shared/components/boundary/hooks/use-boundary-presence.js +0 -23
  450. package/lib/module/shared/components/boundary/hooks/use-boundary-presence.js.map +0 -1
  451. package/lib/module/shared/components/boundary/hooks/use-initial-destination-measurement.js.map +0 -1
  452. package/lib/module/shared/components/boundary/hooks/use-initial-source-measurement.js.map +0 -1
  453. package/lib/module/shared/components/boundary/hooks/use-refresh-boundary.js.map +0 -1
  454. package/lib/module/shared/components/boundary/portal/utils/attachment.js +0 -35
  455. package/lib/module/shared/components/boundary/portal/utils/attachment.js.map +0 -1
  456. package/lib/module/shared/components/boundary/providers/boundary-owner.provider.js +0 -60
  457. package/lib/module/shared/components/boundary/providers/boundary-owner.provider.js.map +0 -1
  458. package/lib/module/shared/providers/screen/styles/helpers/preserve-animated-props-only.js +0 -21
  459. package/lib/module/shared/providers/screen/styles/helpers/preserve-animated-props-only.js.map +0 -1
  460. package/lib/module/shared/providers/screen/styles/styles.provider.js +0 -53
  461. package/lib/module/shared/providers/screen/styles/styles.provider.js.map +0 -1
  462. package/lib/typescript/shared/components/boundary/hooks/use-boundary-presence.d.ts +0 -8
  463. package/lib/typescript/shared/components/boundary/hooks/use-boundary-presence.d.ts.map +0 -1
  464. package/lib/typescript/shared/components/boundary/hooks/use-initial-destination-measurement.d.ts +0 -9
  465. package/lib/typescript/shared/components/boundary/hooks/use-initial-destination-measurement.d.ts.map +0 -1
  466. package/lib/typescript/shared/components/boundary/hooks/use-initial-source-measurement.d.ts +0 -9
  467. package/lib/typescript/shared/components/boundary/hooks/use-initial-source-measurement.d.ts.map +0 -1
  468. package/lib/typescript/shared/components/boundary/hooks/use-refresh-boundary.d.ts +0 -10
  469. package/lib/typescript/shared/components/boundary/hooks/use-refresh-boundary.d.ts.map +0 -1
  470. package/lib/typescript/shared/components/boundary/portal/utils/attachment.d.ts +0 -21
  471. package/lib/typescript/shared/components/boundary/portal/utils/attachment.d.ts.map +0 -1
  472. package/lib/typescript/shared/components/boundary/providers/boundary-owner.provider.d.ts +0 -44
  473. package/lib/typescript/shared/components/boundary/providers/boundary-owner.provider.d.ts.map +0 -1
  474. package/lib/typescript/shared/providers/screen/styles/helpers/preserve-animated-props-only.d.ts +0 -3
  475. package/lib/typescript/shared/providers/screen/styles/helpers/preserve-animated-props-only.d.ts.map +0 -1
  476. package/lib/typescript/shared/providers/screen/styles/styles.provider.d.ts +0 -14
  477. package/lib/typescript/shared/providers/screen/styles/styles.provider.d.ts.map +0 -1
  478. package/src/shared/components/boundary/hooks/use-boundary-presence.ts +0 -28
  479. package/src/shared/components/boundary/portal/utils/attachment.ts +0 -48
  480. package/src/shared/providers/screen/styles/helpers/preserve-animated-props-only.ts +0 -22
  481. package/src/shared/providers/screen/styles/styles.provider.tsx +0 -60
@@ -0,0 +1,371 @@
1
+ import {
2
+ getDestinationScreenKeyFromPairKey,
3
+ getLinkKeyFromTag,
4
+ getLink as getPairLink,
5
+ getSourceScreenKeyFromPairKey,
6
+ } from "../../../../stores/bounds/helpers/link-pairs.helpers";
7
+ import type {
8
+ LinkKey,
9
+ LinkPairsState,
10
+ ScreenKey,
11
+ ScreenPairKey,
12
+ TagLink,
13
+ } from "../../../../stores/bounds/types";
14
+
15
+ export type PortalOwnershipSignal =
16
+ | {
17
+ hostScreenKey: null;
18
+ ownerPairKey?: ScreenPairKey;
19
+ ownerScreenKey: null;
20
+ status: "clear" | "pending";
21
+ }
22
+ | {
23
+ hostScreenKey: ScreenKey;
24
+ ownerPairKey: ScreenPairKey;
25
+ ownerScreenKey: ScreenKey;
26
+ status: "complete";
27
+ };
28
+
29
+ const hasSeenScreenKey = (screenKeys: ScreenKey[], screenKey: ScreenKey) => {
30
+ "worklet";
31
+ for (let index = 0; index < screenKeys.length; index++) {
32
+ if (screenKeys[index] === screenKey) {
33
+ return true;
34
+ }
35
+ }
36
+ return false;
37
+ };
38
+
39
+ export const usesEscapeClippingHost = (
40
+ link: TagLink | null | undefined,
41
+ ): boolean => {
42
+ "worklet";
43
+ return link?.source?.handoff === true && link.source.escapeClipping === true;
44
+ };
45
+
46
+ const isReturningToPreviousSourceHost = ({
47
+ hostScreenKey,
48
+ ownerPairKey,
49
+ previousOwnerPairKey,
50
+ }: {
51
+ hostScreenKey: ScreenKey;
52
+ ownerPairKey: ScreenPairKey;
53
+ previousOwnerPairKey: ScreenPairKey;
54
+ }) => {
55
+ "worklet";
56
+ const previousSourceScreenKey =
57
+ getSourceScreenKeyFromPairKey(previousOwnerPairKey);
58
+ const previousDestinationScreenKey =
59
+ getDestinationScreenKeyFromPairKey(previousOwnerPairKey);
60
+ const ownerDestinationScreenKey =
61
+ getDestinationScreenKeyFromPairKey(ownerPairKey);
62
+
63
+ return (
64
+ previousDestinationScreenKey !== "" &&
65
+ ownerDestinationScreenKey !== "" &&
66
+ previousDestinationScreenKey !== previousSourceScreenKey &&
67
+ ownerDestinationScreenKey === previousSourceScreenKey &&
68
+ hostScreenKey === previousSourceScreenKey
69
+ );
70
+ };
71
+
72
+ export const canSwitchBoundaryLocalHandoffImmediately = ({
73
+ hostScreenKey,
74
+ ownerPairKey,
75
+ previousOwnerPairKey,
76
+ }: {
77
+ hostScreenKey: ScreenKey | null;
78
+ ownerPairKey?: ScreenPairKey;
79
+ previousOwnerPairKey?: ScreenPairKey;
80
+ }) => {
81
+ "worklet";
82
+ if (!hostScreenKey || !ownerPairKey) {
83
+ return false;
84
+ }
85
+
86
+ if (hostScreenKey === getSourceScreenKeyFromPairKey(ownerPairKey)) {
87
+ return true;
88
+ }
89
+
90
+ if (!previousOwnerPairKey) {
91
+ return false;
92
+ }
93
+
94
+ return isReturningToPreviousSourceHost({
95
+ hostScreenKey,
96
+ ownerPairKey,
97
+ previousOwnerPairKey,
98
+ });
99
+ };
100
+
101
+ const isActiveHandoffLink = ({
102
+ link,
103
+ linkKey,
104
+ pairKey,
105
+ pairsState,
106
+ }: {
107
+ link: TagLink;
108
+ linkKey: LinkKey;
109
+ pairKey: ScreenPairKey;
110
+ pairsState: LinkPairsState;
111
+ }) => {
112
+ "worklet";
113
+ if (!link.group) {
114
+ return true;
115
+ }
116
+
117
+ const activeId = pairsState[pairKey]?.groups?.[link.group]?.activeId;
118
+ return !activeId || activeId === linkKey;
119
+ };
120
+
121
+ const resolveBoundaryLocalStyleOwnerScreenKey = ({
122
+ hostScreenKey,
123
+ isSettledHostReady,
124
+ settledHostScreenKey,
125
+ sourceScreenKey,
126
+ }: {
127
+ hostScreenKey: ScreenKey;
128
+ isSettledHostReady: boolean;
129
+ settledHostScreenKey?: ScreenKey | null;
130
+ sourceScreenKey: ScreenKey;
131
+ }): ScreenKey => {
132
+ "worklet";
133
+ if (settledHostScreenKey === hostScreenKey && isSettledHostReady) {
134
+ return hostScreenKey;
135
+ }
136
+
137
+ return sourceScreenKey;
138
+ };
139
+
140
+ const pendingSignal = (sourcePairKey: ScreenPairKey): PortalOwnershipSignal => {
141
+ "worklet";
142
+ return {
143
+ hostScreenKey: null,
144
+ ownerPairKey: sourcePairKey,
145
+ ownerScreenKey: null,
146
+ status: "pending",
147
+ };
148
+ };
149
+
150
+ const clearSignal = (sourcePairKey: ScreenPairKey): PortalOwnershipSignal => {
151
+ "worklet";
152
+ return {
153
+ hostScreenKey: null,
154
+ ownerPairKey: sourcePairKey,
155
+ ownerScreenKey: null,
156
+ status: "clear",
157
+ };
158
+ };
159
+
160
+ export const resolveBoundaryPortalOwnership = ({
161
+ boundaryId,
162
+ currentScreenKey,
163
+ escapeClipping,
164
+ handoff,
165
+ isSettledHostClosingComplete = false,
166
+ isSettledHostReady = false,
167
+ pairsState,
168
+ settledHostScreenKey = null,
169
+ sourcePairKey,
170
+ }: {
171
+ boundaryId: string;
172
+ currentScreenKey: ScreenKey;
173
+ escapeClipping: boolean;
174
+ handoff: boolean;
175
+ isSettledHostClosingComplete?: boolean;
176
+ isSettledHostReady?: boolean;
177
+ pairsState: LinkPairsState;
178
+ settledHostScreenKey?: ScreenKey | null;
179
+ sourcePairKey: ScreenPairKey;
180
+ }): PortalOwnershipSignal => {
181
+ "worklet";
182
+ const linkKey = getLinkKeyFromTag(boundaryId);
183
+ const link = getPairLink(pairsState, sourcePairKey, linkKey);
184
+
185
+ if (link?.status !== "complete") {
186
+ return pendingSignal(sourcePairKey);
187
+ }
188
+
189
+ if (
190
+ !isActiveHandoffLink({
191
+ link,
192
+ linkKey,
193
+ pairKey: sourcePairKey,
194
+ pairsState,
195
+ })
196
+ ) {
197
+ return clearSignal(sourcePairKey);
198
+ }
199
+
200
+ if (!handoff) {
201
+ return {
202
+ hostScreenKey: currentScreenKey,
203
+ ownerPairKey: sourcePairKey,
204
+ ownerScreenKey: currentScreenKey,
205
+ status: "complete",
206
+ };
207
+ }
208
+
209
+ let hostScreenKey = link.destination.screenKey;
210
+ let ownerPairKey = sourcePairKey;
211
+ let previousOwnerPairKey: ScreenPairKey | null = null;
212
+ const seenScreenKeys: ScreenKey[] = [
213
+ getSourceScreenKeyFromPairKey(sourcePairKey),
214
+ hostScreenKey,
215
+ ];
216
+
217
+ const pairKeys = Object.keys(pairsState);
218
+
219
+ for (let hop = 0; hop < pairKeys.length; hop++) {
220
+ let didAdvance = false;
221
+ let hasPendingNextHop = false;
222
+ let didHitVisitedScreen = false;
223
+
224
+ for (let index = 0; index < pairKeys.length; index++) {
225
+ const candidatePairKey = pairKeys[index];
226
+ if (!candidatePairKey || candidatePairKey === ownerPairKey) {
227
+ continue;
228
+ }
229
+
230
+ const candidate = getPairLink(pairsState, candidatePairKey, linkKey);
231
+ if (!candidate?.source || candidate.source.screenKey !== hostScreenKey) {
232
+ continue;
233
+ }
234
+
235
+ if (!candidate.source.handoff) {
236
+ continue;
237
+ }
238
+
239
+ if (
240
+ !isActiveHandoffLink({
241
+ link: candidate,
242
+ linkKey,
243
+ pairKey: candidatePairKey,
244
+ pairsState,
245
+ })
246
+ ) {
247
+ continue;
248
+ }
249
+
250
+ if (candidate.status !== "complete") {
251
+ hasPendingNextHop = true;
252
+ continue;
253
+ }
254
+
255
+ const nextHostScreenKey = candidate.destination.screenKey;
256
+
257
+ previousOwnerPairKey = ownerPairKey;
258
+ ownerPairKey = candidatePairKey;
259
+ hostScreenKey = nextHostScreenKey;
260
+
261
+ if (hasSeenScreenKey(seenScreenKeys, nextHostScreenKey)) {
262
+ didHitVisitedScreen = true;
263
+ break;
264
+ }
265
+
266
+ seenScreenKeys.push(nextHostScreenKey);
267
+ didAdvance = true;
268
+ break;
269
+ }
270
+
271
+ if (didHitVisitedScreen) {
272
+ break;
273
+ }
274
+
275
+ if (didAdvance) {
276
+ continue;
277
+ }
278
+
279
+ if (hasPendingNextHop) {
280
+ return pendingSignal(ownerPairKey);
281
+ }
282
+
283
+ break;
284
+ }
285
+
286
+ const ownerLink = getPairLink(pairsState, ownerPairKey, linkKey);
287
+ const ownerUsesEscapeClipping =
288
+ ownerLink?.source?.escapeClipping ?? escapeClipping;
289
+
290
+ if (
291
+ !ownerUsesEscapeClipping &&
292
+ isSettledHostClosingComplete &&
293
+ settledHostScreenKey === hostScreenKey &&
294
+ previousOwnerPairKey
295
+ ) {
296
+ hostScreenKey = getSourceScreenKeyFromPairKey(ownerPairKey);
297
+ }
298
+
299
+ const ownerScreenKey = ownerUsesEscapeClipping
300
+ ? getSourceScreenKeyFromPairKey(ownerPairKey)
301
+ : resolveBoundaryLocalStyleOwnerScreenKey({
302
+ hostScreenKey,
303
+ isSettledHostReady,
304
+ settledHostScreenKey,
305
+ sourceScreenKey: getSourceScreenKeyFromPairKey(ownerPairKey),
306
+ });
307
+
308
+ return {
309
+ hostScreenKey,
310
+ ownerPairKey,
311
+ ownerScreenKey,
312
+ status: "complete",
313
+ };
314
+ };
315
+
316
+ export const hasHandoffEscapeContinuation = ({
317
+ linkKey,
318
+ linkState,
319
+ sourceScreenKey,
320
+ }: {
321
+ linkKey: string;
322
+ linkState: LinkPairsState;
323
+ sourceScreenKey: ScreenKey;
324
+ }) => {
325
+ "worklet";
326
+ const pairKeys = Object.keys(linkState);
327
+ const visitedScreenKeys: ScreenKey[] = [];
328
+ let cursorScreenKey = sourceScreenKey;
329
+
330
+ for (let hop = 0; hop < pairKeys.length; hop++) {
331
+ if (hasSeenScreenKey(visitedScreenKeys, cursorScreenKey)) {
332
+ return false;
333
+ }
334
+ visitedScreenKeys.push(cursorScreenKey);
335
+
336
+ let previousScreenKey: ScreenKey | null = null;
337
+ for (let index = 0; index < pairKeys.length; index++) {
338
+ const candidatePairKey = pairKeys[index];
339
+ const link = candidatePairKey
340
+ ? linkState[candidatePairKey]?.links?.[linkKey]
341
+ : null;
342
+
343
+ if (
344
+ !link?.source ||
345
+ !link.destination ||
346
+ link.destination.screenKey !== cursorScreenKey
347
+ ) {
348
+ continue;
349
+ }
350
+
351
+ if (usesEscapeClippingHost(link)) {
352
+ return true;
353
+ }
354
+
355
+ if (!link.source.handoff) {
356
+ return false;
357
+ }
358
+
359
+ previousScreenKey = link.source.screenKey;
360
+ break;
361
+ }
362
+
363
+ if (!previousScreenKey) {
364
+ return false;
365
+ }
366
+
367
+ cursorScreenKey = previousScreenKey;
368
+ }
369
+
370
+ return false;
371
+ };
@@ -0,0 +1,50 @@
1
+ import { logger } from "../../../../utils/logger";
2
+ import { isTeleportAvailable } from "../teleport";
3
+
4
+ export type BoundaryPortalRuntime = {
5
+ handoff: boolean;
6
+ escapeClipping: boolean;
7
+ enabled: boolean;
8
+ };
9
+
10
+ type ResolveBoundaryPortalParams = {
11
+ handoff?: boolean;
12
+ escapeClipping?: boolean;
13
+ };
14
+
15
+ export const resolveBoundaryPortal = ({
16
+ handoff,
17
+ escapeClipping,
18
+ }: ResolveBoundaryPortalParams): BoundaryPortalRuntime => {
19
+ const resolvedHandoff = handoff ?? false;
20
+ const resolvedEscapeClipping = escapeClipping ?? false;
21
+
22
+ const enabled = resolvedHandoff || resolvedEscapeClipping;
23
+
24
+ if (!enabled) {
25
+ return {
26
+ handoff: false,
27
+ escapeClipping: false,
28
+ enabled: false,
29
+ };
30
+ }
31
+
32
+ if (!isTeleportAvailable) {
33
+ logger.warnOnce(
34
+ "boundary:teleport-missing",
35
+ "react-native-teleport is not installed; handoff and escapeClipping boundaries will render inline.",
36
+ );
37
+
38
+ return {
39
+ handoff: false,
40
+ escapeClipping: false,
41
+ enabled: false,
42
+ };
43
+ }
44
+
45
+ return {
46
+ handoff: resolvedHandoff,
47
+ escapeClipping: resolvedEscapeClipping,
48
+ enabled,
49
+ };
50
+ };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shallow equality for the flat signal objects produced by the portal
3
+ * `useAnimatedReaction` blocks. Both sides always carry the same fixed key set,
4
+ * so iterating one side's keys is sufficient. A `null`/`undefined` operand
5
+ * (the first reaction run) is treated as not-equal so the reaction proceeds.
6
+ */
7
+ export const shallowEqual = (
8
+ a: Record<string, unknown> | null | undefined,
9
+ b: Record<string, unknown> | null | undefined,
10
+ ) => {
11
+ "worklet";
12
+ if (!a || !b) {
13
+ return false;
14
+ }
15
+
16
+ const keys = Object.keys(a);
17
+ for (let index = 0; index < keys.length; index++) {
18
+ const key = keys[index];
19
+ if (a[key] !== b[key]) {
20
+ return false;
21
+ }
22
+ }
23
+
24
+ return true;
25
+ };
@@ -11,3 +11,15 @@ export const isTeleportEnabled = (
11
11
 
12
12
  return teleport?.enabled !== false;
13
13
  };
14
+
15
+ export const shouldAttachBoundaryPortal = ({
16
+ enabled,
17
+ teleport,
18
+ }: {
19
+ enabled: boolean;
20
+ teleport?: BoundaryTeleportControl;
21
+ }) => {
22
+ "worklet";
23
+
24
+ return enabled && isTeleportEnabled(teleport);
25
+ };
@@ -0,0 +1,24 @@
1
+ export const resolveNextVisiblePortalHostName = ({
2
+ canSwitchImmediately,
3
+ isInterpolatorReady,
4
+ requestedName,
5
+ shouldTeleport,
6
+ visibleName,
7
+ }: {
8
+ canSwitchImmediately?: boolean;
9
+ isInterpolatorReady: boolean;
10
+ requestedName: string | null;
11
+ shouldTeleport: boolean;
12
+ visibleName: string | null;
13
+ }) => {
14
+ "worklet";
15
+ if (!shouldTeleport) {
16
+ return null;
17
+ }
18
+
19
+ if (requestedName && (canSwitchImmediately || isInterpolatorReady)) {
20
+ return requestedName;
21
+ }
22
+
23
+ return visibleName;
24
+ };
@@ -1,18 +1,13 @@
1
- import type React from "react";
2
- import { type ReactNode, useCallback, useMemo, useRef, useState } from "react";
1
+ import { type ReactNode, useCallback, useMemo, useState } from "react";
3
2
  import type { View } from "react-native";
4
- import type Animated from "react-native-reanimated";
5
3
  import type { AnimatedRef, StyleProps } from "react-native-reanimated";
4
+ import { useAnimatedRef } from "react-native-reanimated";
5
+ import type { BoundTag } from "../../../stores/bounds/types";
6
6
  import createProvider from "../../../utils/create-provider";
7
7
  import { logger } from "../../../utils/logger";
8
- import type { BoundaryPortal } from "../types";
8
+ import type { BoundaryPortalRuntime } from "../portal/utils/resolve-portal";
9
9
 
10
- type BoundaryAssociatedStyle = React.ComponentProps<
11
- typeof Animated.View
12
- >["style"];
13
-
14
- interface BoundaryOwnerContextValue {
15
- ownerRef: AnimatedRef<View>;
10
+ interface BoundaryRootContextValue {
16
11
  registerTargetRef: (
17
12
  targetRef: AnimatedRef<View>,
18
13
  preparedStyles: StyleProps,
@@ -20,9 +15,8 @@ interface BoundaryOwnerContextValue {
20
15
  ) => void;
21
16
  unregisterTargetRef: (targetRef: AnimatedRef<View>) => void;
22
17
  activeTargetRef: AnimatedRef<View> | null;
23
- associatedTargetStyles?: BoundaryAssociatedStyle;
24
- entryTag: string;
25
- portal?: BoundaryPortal;
18
+ boundTag: BoundTag;
19
+ portalRuntime: BoundaryPortalRuntime;
26
20
  }
27
21
 
28
22
  type BoundaryTargetEntry = {
@@ -34,30 +28,28 @@ type BoundaryTargetEntry = {
34
28
 
35
29
  // logger.warn prepends the library prefix.
36
30
  const MULTIPLE_TARGETS_WARNING =
37
- "Multiple Boundary.Target elements were rendered under the same boundary owner. The first registered target will be measured.";
31
+ "Multiple Boundary.Target elements were rendered under the same boundary root. The first registered target will be measured.";
38
32
 
39
- export const TARGET_OUTSIDE_OWNER_WARNING =
40
- "Boundary.Target must be rendered inside a Boundary owner (Boundary.View, Boundary.Trigger, or a component created by createBoundaryComponent).";
33
+ export const TARGET_OUTSIDE_ROOT_WARNING =
34
+ "Boundary.Target must be rendered inside Transition.Boundary or a component created by createBoundaryComponent.";
41
35
 
42
- interface BoundaryOwnerProps {
43
- value: BoundaryOwnerContextValue;
36
+ interface BoundaryRootProps {
37
+ value: BoundaryRootContextValue;
44
38
  children: ReactNode;
45
39
  }
46
40
 
47
- export const { BoundaryOwnerProvider, useBoundaryOwnerContext } =
48
- createProvider("BoundaryOwner", { guarded: false })<
49
- BoundaryOwnerProps,
50
- BoundaryOwnerContextValue
51
- >((props) => props);
41
+ export const { BoundaryRootProvider, useBoundaryRootContext } = createProvider(
42
+ "BoundaryRoot",
43
+ { guarded: false },
44
+ )<BoundaryRootProps, BoundaryRootContextValue>((props) => props);
52
45
 
53
- export const useBoundaryOwner = (params: {
54
- ownerRef: AnimatedRef<View>;
55
- associatedTargetStyles?: BoundaryAssociatedStyle;
56
- entryTag: string;
57
- portal?: BoundaryPortal;
46
+ export const useBoundaryRootState = (params: {
47
+ boundTag: BoundTag;
48
+ portalRuntime: BoundaryPortalRuntime;
49
+ rootMeasurementRef?: AnimatedRef<View>;
58
50
  }) => {
59
- const { ownerRef, associatedTargetStyles, entryTag, portal } = params;
60
- const warnedAboutMultipleTargetsRef = useRef(false);
51
+ const { boundTag, portalRuntime, rootMeasurementRef } = params;
52
+ const rootRef = useAnimatedRef<View>();
61
53
  const [targetEntry, setTargetEntry] = useState<BoundaryTargetEntry | null>(
62
54
  null,
63
55
  );
@@ -73,13 +65,11 @@ export const useBoundaryOwner = (params: {
73
65
  return prev;
74
66
  }
75
67
 
76
- if (
77
- __DEV__ &&
78
- prev !== null &&
79
- !warnedAboutMultipleTargetsRef.current
80
- ) {
81
- warnedAboutMultipleTargetsRef.current = true;
82
- logger.warn(MULTIPLE_TARGETS_WARNING);
68
+ if (__DEV__ && prev !== null) {
69
+ logger.warnOnce(
70
+ "boundary:multiple-targets",
71
+ MULTIPLE_TARGETS_WARNING,
72
+ );
83
73
  }
84
74
 
85
75
  return (
@@ -100,30 +90,26 @@ export const useBoundaryOwner = (params: {
100
90
 
101
91
  const contextValue = useMemo(
102
92
  () => ({
103
- ownerRef,
104
93
  registerTargetRef,
105
94
  unregisterTargetRef,
106
95
  activeTargetRef: targetEntry?.ref ?? null,
107
- associatedTargetStyles,
108
- entryTag,
109
- portal,
96
+ boundTag,
97
+ portalRuntime,
110
98
  }),
111
99
  [
112
- ownerRef,
113
100
  registerTargetRef,
114
101
  unregisterTargetRef,
115
102
  targetEntry,
116
- associatedTargetStyles,
117
- entryTag,
118
- portal,
103
+ boundTag,
104
+ portalRuntime,
119
105
  ],
120
106
  );
121
107
 
122
108
  return {
109
+ ref: rootRef,
123
110
  contextValue,
124
111
  hasActiveTarget: targetEntry !== null,
125
- measuredRef: targetEntry?.measurementRef ?? ownerRef,
112
+ measuredRef: targetEntry?.measurementRef ?? rootMeasurementRef ?? rootRef,
126
113
  targetPreparedStyles: targetEntry?.preparedStyles,
127
- portal,
128
114
  };
129
115
  };
@@ -3,35 +3,6 @@ import type { BoundsOptions } from "../../utils/bounds/types/options";
3
3
 
4
4
  export type BoundaryId = string | number;
5
5
 
6
- export type BoundaryPortalAttachTarget = "current-screen" | "matched-screen";
7
-
8
- /**
9
- * Configures automatic portal attachment for a boundary target.
10
- *
11
- * `attachTo` selects where the portal physically renders. Independently of
12
- * that choice, `Transition.Boundary.Host` marks the screen-local coordinate
13
- * space the portal should render within.
14
- *
15
- * - `current-screen`: the portal attaches to this screen's active host — for a
16
- * scroll-hosted screen, place `Transition.Boundary.Host` inside that
17
- * ScrollView to make the content ride with it.
18
- * - `matched-screen`: the portal attaches to the matched screen's active host
19
- * for the whole transition (open and close), which avoids re-parenting
20
- * flicker while keeping the source placeholder measured at home.
21
- */
22
- export type BoundaryPortalOptions = {
23
- /**
24
- * `current-screen` keeps the portal on this boundary's screen.
25
- * `matched-screen` moves it to the matched screen once the
26
- * source/destination link completes.
27
- *
28
- * @default "current-screen"
29
- */
30
- attachTo?: BoundaryPortalAttachTarget;
31
- };
32
-
33
- export type BoundaryPortal = boolean | BoundaryPortalOptions;
34
-
35
6
  export type BoundaryConfigProps = Pick<
36
7
  BoundsOptions,
37
8
  "anchor" | "scaleMode" | "target" | "method"
@@ -55,20 +26,19 @@ export interface BoundaryOwnProps extends BoundaryConfigProps {
55
26
  */
56
27
  enabled?: boolean;
57
28
  /**
58
- * Renders this boundary target through a layout-preserving portal when
59
- * `react-native-teleport` is installed.
60
- *
61
- * The target keeps its measured layout space in the original tree. Once the
62
- * active source/destination link for this boundary is complete, the screen
63
- * portal layer can render a boundary-specific host and attach this target to
64
- * it so the active matched target escapes local clipping.
29
+ * Teleports this boundary's live payload to the next matching boundary while
30
+ * a transition is active.
65
31
  *
66
- * Use `true` to attach to the current screen host. Use
67
- * `{ attachTo: "matched-screen" }` to attach to the matched screen host.
32
+ * @default false
33
+ */
34
+ handoff?: boolean;
35
+ /**
36
+ * Renders this boundary through the current screen's portal host while a
37
+ * transition is active so the payload can escape clipping/layout constraints.
68
38
  *
69
39
  * @default false
70
40
  */
71
- portal?: BoundaryPortal;
41
+ escapeClipping?: boolean;
72
42
  id: BoundaryId;
73
43
  }
74
44