@robertlinde/react-tour-kit 0.8.8 → 1.0.0

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 (368) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/MIGRATION.md +205 -0
  3. package/README.md +401 -850
  4. package/dist/react-native-platform/hooks/use-tour-scroll-view.hook.d.ts +14 -0
  5. package/dist/react-native-platform/hooks/use-tour-scroll-view.hook.d.ts.map +1 -0
  6. package/dist/react-native-platform/hooks/use-tour-scroll-view.hook.js +21 -0
  7. package/dist/react-native-platform/hooks/use-tour-scroll-view.hook.js.map +1 -0
  8. package/dist/react-native-platform/hooks/use-tour-target.hook.d.ts +15 -0
  9. package/dist/react-native-platform/hooks/use-tour-target.hook.d.ts.map +1 -0
  10. package/dist/react-native-platform/hooks/use-tour-target.hook.js +28 -0
  11. package/dist/react-native-platform/hooks/use-tour-target.hook.js.map +1 -0
  12. package/dist/react-native-platform/host-store.d.ts +24 -0
  13. package/dist/react-native-platform/host-store.d.ts.map +1 -0
  14. package/dist/react-native-platform/host-store.js +63 -0
  15. package/dist/react-native-platform/host-store.js.map +1 -0
  16. package/dist/react-native-platform/insets.util.d.ts +11 -0
  17. package/dist/react-native-platform/insets.util.d.ts.map +1 -0
  18. package/dist/react-native-platform/insets.util.js +31 -0
  19. package/dist/react-native-platform/insets.util.js.map +1 -0
  20. package/dist/react-native-platform/layer/native-renderer.d.ts +7 -0
  21. package/dist/react-native-platform/layer/native-renderer.d.ts.map +1 -0
  22. package/dist/react-native-platform/layer/native-renderer.js +496 -0
  23. package/dist/react-native-platform/layer/native-renderer.js.map +1 -0
  24. package/dist/react-native-platform/layer/tour-host.d.ts +13 -0
  25. package/dist/react-native-platform/layer/tour-host.d.ts.map +1 -0
  26. package/dist/react-native-platform/layer/tour-host.js +70 -0
  27. package/dist/react-native-platform/layer/tour-host.js.map +1 -0
  28. package/dist/react-native-platform/measure.util.d.ts +20 -0
  29. package/dist/react-native-platform/measure.util.d.ts.map +1 -0
  30. package/dist/react-native-platform/measure.util.js +100 -0
  31. package/dist/react-native-platform/measure.util.js.map +1 -0
  32. package/dist/react-native-platform/native-context.d.ts +12 -0
  33. package/dist/react-native-platform/native-context.d.ts.map +1 -0
  34. package/dist/react-native-platform/native-context.js +4 -0
  35. package/dist/react-native-platform/native-context.js.map +1 -0
  36. package/dist/react-native-platform/native-environment.d.ts +14 -0
  37. package/dist/react-native-platform/native-environment.d.ts.map +1 -0
  38. package/dist/react-native-platform/native-environment.js +20 -0
  39. package/dist/react-native-platform/native-environment.js.map +1 -0
  40. package/dist/react-native-platform/native-platform.d.ts +19 -0
  41. package/dist/react-native-platform/native-platform.d.ts.map +1 -0
  42. package/dist/react-native-platform/native-platform.js +265 -0
  43. package/dist/react-native-platform/native-platform.js.map +1 -0
  44. package/dist/react-native-platform/reduced-motion.d.ts +4 -0
  45. package/dist/react-native-platform/reduced-motion.d.ts.map +1 -0
  46. package/dist/react-native-platform/reduced-motion.js +44 -0
  47. package/dist/react-native-platform/reduced-motion.js.map +1 -0
  48. package/dist/react-native-platform/registry.d.ts +18 -0
  49. package/dist/react-native-platform/registry.d.ts.map +1 -0
  50. package/dist/react-native-platform/registry.js +51 -0
  51. package/dist/react-native-platform/registry.js.map +1 -0
  52. package/dist/react-native-platform/tour-provider.d.ts +16 -3
  53. package/dist/react-native-platform/tour-provider.d.ts.map +1 -0
  54. package/dist/react-native-platform/tour-provider.js +92 -211
  55. package/dist/react-native-platform/tour-provider.js.map +1 -1
  56. package/dist/react-native.d.ts +14 -8
  57. package/dist/react-native.d.ts.map +1 -0
  58. package/dist/react-native.js +7 -6
  59. package/dist/react-native.js.map +1 -1
  60. package/dist/react-platform/dom/elements.util.d.ts +35 -0
  61. package/dist/react-platform/dom/elements.util.d.ts.map +1 -0
  62. package/dist/react-platform/dom/elements.util.js +155 -0
  63. package/dist/react-platform/dom/elements.util.js.map +1 -0
  64. package/dist/react-platform/dom/occluders.util.d.ts +13 -0
  65. package/dist/react-platform/dom/occluders.util.d.ts.map +1 -0
  66. package/dist/react-platform/dom/occluders.util.js +75 -0
  67. package/dist/react-platform/dom/occluders.util.js.map +1 -0
  68. package/dist/react-platform/dom/scroll-lock.util.d.ts +13 -0
  69. package/dist/react-platform/dom/scroll-lock.util.d.ts.map +1 -0
  70. package/dist/react-platform/dom/scroll-lock.util.js +219 -0
  71. package/dist/react-platform/dom/scroll-lock.util.js.map +1 -0
  72. package/dist/react-platform/dom/scroll.util.d.ts +44 -0
  73. package/dist/react-platform/dom/scroll.util.d.ts.map +1 -0
  74. package/dist/react-platform/dom/scroll.util.js +250 -0
  75. package/dist/react-platform/dom/scroll.util.js.map +1 -0
  76. package/dist/react-platform/dom/viewport.util.d.ts +16 -0
  77. package/dist/react-platform/dom/viewport.util.d.ts.map +1 -0
  78. package/dist/react-platform/dom/viewport.util.js +65 -0
  79. package/dist/react-platform/dom/viewport.util.js.map +1 -0
  80. package/dist/react-platform/dom/web-platform.d.ts +15 -0
  81. package/dist/react-platform/dom/web-platform.d.ts.map +1 -0
  82. package/dist/react-platform/dom/web-platform.js +169 -0
  83. package/dist/react-platform/dom/web-platform.js.map +1 -0
  84. package/dist/react-platform/layer/styles.d.ts +12 -0
  85. package/dist/react-platform/layer/styles.d.ts.map +1 -0
  86. package/dist/react-platform/layer/styles.js +285 -0
  87. package/dist/react-platform/layer/styles.js.map +1 -0
  88. package/dist/react-platform/layer/web-renderer.d.ts +4 -0
  89. package/dist/react-platform/layer/web-renderer.d.ts.map +1 -0
  90. package/dist/react-platform/layer/web-renderer.js +390 -0
  91. package/dist/react-platform/layer/web-renderer.js.map +1 -0
  92. package/dist/react-platform/tour-provider.d.ts +9 -3
  93. package/dist/react-platform/tour-provider.d.ts.map +1 -0
  94. package/dist/react-platform/tour-provider.js +28 -218
  95. package/dist/react-platform/tour-provider.js.map +1 -1
  96. package/dist/react.d.ts +10 -8
  97. package/dist/react.d.ts.map +1 -0
  98. package/dist/react.js +5 -6
  99. package/dist/react.js.map +1 -1
  100. package/dist/shared/engine/abort.util.d.ts +17 -0
  101. package/dist/shared/engine/abort.util.d.ts.map +1 -0
  102. package/dist/shared/engine/abort.util.js +72 -0
  103. package/dist/shared/engine/abort.util.js.map +1 -0
  104. package/dist/shared/engine/report.util.d.ts +12 -0
  105. package/dist/shared/engine/report.util.d.ts.map +1 -0
  106. package/dist/shared/engine/report.util.js +51 -0
  107. package/dist/shared/engine/report.util.js.map +1 -0
  108. package/dist/shared/engine/tour-adapter.type.d.ts +60 -0
  109. package/dist/shared/engine/tour-adapter.type.d.ts.map +1 -0
  110. package/dist/shared/engine/tour-adapter.type.js +2 -0
  111. package/dist/shared/engine/tour-adapter.type.js.map +1 -0
  112. package/dist/shared/engine/tour-engine.d.ts +92 -0
  113. package/dist/shared/engine/tour-engine.d.ts.map +1 -0
  114. package/dist/shared/engine/tour-engine.js +787 -0
  115. package/dist/shared/engine/tour-engine.js.map +1 -0
  116. package/dist/shared/geometry/box.util.d.ts +39 -0
  117. package/dist/shared/geometry/box.util.d.ts.map +1 -0
  118. package/dist/shared/geometry/box.util.js +146 -0
  119. package/dist/shared/geometry/box.util.js.map +1 -0
  120. package/dist/shared/geometry/compute-tooltip-layout.util.d.ts +60 -0
  121. package/dist/shared/geometry/compute-tooltip-layout.util.d.ts.map +1 -0
  122. package/dist/shared/geometry/compute-tooltip-layout.util.js +148 -0
  123. package/dist/shared/geometry/compute-tooltip-layout.util.js.map +1 -0
  124. package/dist/shared/geometry/geometry.type.d.ts +34 -0
  125. package/dist/shared/geometry/geometry.type.d.ts.map +1 -0
  126. package/dist/shared/geometry/geometry.type.js +2 -0
  127. package/dist/shared/geometry/geometry.type.js.map +1 -0
  128. package/dist/shared/geometry/reveal.util.d.ts +38 -0
  129. package/dist/shared/geometry/reveal.util.d.ts.map +1 -0
  130. package/dist/shared/geometry/reveal.util.js +135 -0
  131. package/dist/shared/geometry/reveal.util.js.map +1 -0
  132. package/dist/shared/geometry/target-visibility.util.d.ts +10 -0
  133. package/dist/shared/geometry/target-visibility.util.d.ts.map +1 -0
  134. package/dist/shared/geometry/target-visibility.util.js +29 -0
  135. package/dist/shared/geometry/target-visibility.util.js.map +1 -0
  136. package/dist/shared/platform/create-tour-adapter.d.ts +9 -0
  137. package/dist/shared/platform/create-tour-adapter.d.ts.map +1 -0
  138. package/dist/shared/platform/create-tour-adapter.js +130 -0
  139. package/dist/shared/platform/create-tour-adapter.js.map +1 -0
  140. package/dist/shared/platform/platform.type.d.ts +77 -0
  141. package/dist/shared/platform/platform.type.d.ts.map +1 -0
  142. package/dist/shared/platform/platform.type.js +2 -0
  143. package/dist/shared/platform/platform.type.js.map +1 -0
  144. package/dist/shared/platform/reveal-in-scroll-containers.d.ts +27 -0
  145. package/dist/shared/platform/reveal-in-scroll-containers.d.ts.map +1 -0
  146. package/dist/shared/platform/reveal-in-scroll-containers.js +49 -0
  147. package/dist/shared/platform/reveal-in-scroll-containers.js.map +1 -0
  148. package/dist/shared/react/tour-context.d.ts +7 -0
  149. package/dist/shared/react/tour-context.d.ts.map +1 -0
  150. package/dist/shared/react/tour-context.js +23 -0
  151. package/dist/shared/react/tour-context.js.map +1 -0
  152. package/dist/shared/react/tour-provider-core.d.ts +41 -0
  153. package/dist/shared/react/tour-provider-core.d.ts.map +1 -0
  154. package/dist/shared/react/tour-provider-core.js +24 -0
  155. package/dist/shared/react/tour-provider-core.js.map +1 -0
  156. package/dist/shared/react/tour-root.d.ts +14 -0
  157. package/dist/shared/react/tour-root.d.ts.map +1 -0
  158. package/dist/shared/react/tour-root.js +22 -0
  159. package/dist/shared/react/tour-root.js.map +1 -0
  160. package/dist/shared/react/use-isomorphic-layout-effect.hook.d.ts +4 -0
  161. package/dist/shared/react/use-isomorphic-layout-effect.hook.d.ts.map +1 -0
  162. package/dist/shared/react/use-isomorphic-layout-effect.hook.js +5 -0
  163. package/dist/shared/react/use-isomorphic-layout-effect.hook.js.map +1 -0
  164. package/dist/shared/react/use-tour-view.hook.d.ts +5 -0
  165. package/dist/shared/react/use-tour-view.hook.d.ts.map +1 -0
  166. package/dist/shared/react/use-tour-view.hook.js +14 -0
  167. package/dist/shared/react/use-tour-view.hook.js.map +1 -0
  168. package/dist/shared/react/use-tour.hook.d.ts +7 -0
  169. package/dist/shared/react/use-tour.hook.d.ts.map +1 -0
  170. package/dist/shared/react/use-tour.hook.js +10 -0
  171. package/dist/shared/react/use-tour.hook.js.map +1 -0
  172. package/dist/shared/renderer/default-tooltip.d.ts +5 -0
  173. package/dist/shared/renderer/default-tooltip.d.ts.map +1 -0
  174. package/dist/shared/renderer/default-tooltip.js +13 -0
  175. package/dist/shared/renderer/default-tooltip.js.map +1 -0
  176. package/dist/shared/renderer/motion.d.ts +29 -0
  177. package/dist/shared/renderer/motion.d.ts.map +1 -0
  178. package/dist/shared/renderer/motion.js +49 -0
  179. package/dist/shared/renderer/motion.js.map +1 -0
  180. package/dist/shared/renderer/renderer-context.d.ts +17 -0
  181. package/dist/shared/renderer/renderer-context.d.ts.map +1 -0
  182. package/dist/shared/renderer/renderer-context.js +16 -0
  183. package/dist/shared/renderer/renderer-context.js.map +1 -0
  184. package/dist/shared/renderer/renderer.type.d.ts +164 -0
  185. package/dist/shared/renderer/renderer.type.d.ts.map +1 -0
  186. package/dist/shared/renderer/renderer.type.js +2 -0
  187. package/dist/shared/renderer/renderer.type.js.map +1 -0
  188. package/dist/shared/renderer/tooltip-model.d.ts +32 -0
  189. package/dist/shared/renderer/tooltip-model.d.ts.map +1 -0
  190. package/dist/shared/renderer/tooltip-model.js +24 -0
  191. package/dist/shared/renderer/tooltip-model.js.map +1 -0
  192. package/dist/shared/renderer/tour-overlay.d.ts +24 -0
  193. package/dist/shared/renderer/tour-overlay.d.ts.map +1 -0
  194. package/dist/shared/renderer/tour-overlay.js +228 -0
  195. package/dist/shared/renderer/tour-overlay.js.map +1 -0
  196. package/dist/shared/types/tour-context.type.d.ts +21 -11
  197. package/dist/shared/types/tour-context.type.d.ts.map +1 -0
  198. package/dist/shared/types/tour-end-info.type.d.ts +19 -2
  199. package/dist/shared/types/tour-end-info.type.d.ts.map +1 -0
  200. package/dist/shared/types/tour-i18n.type.d.ts +8 -0
  201. package/dist/shared/types/tour-i18n.type.d.ts.map +1 -0
  202. package/dist/shared/types/tour-step.type.d.ts +35 -6
  203. package/dist/shared/types/tour-step.type.d.ts.map +1 -0
  204. package/dist/shared/types/tour-theme.type.d.ts +22 -2
  205. package/dist/shared/types/tour-theme.type.d.ts.map +1 -0
  206. package/dist/shared/types/tour-theme.type.js +1 -16
  207. package/dist/shared/types/tour-theme.type.js.map +1 -1
  208. package/dist/shared/types/tour-tooltip-props.type.d.ts +21 -17
  209. package/dist/shared/types/tour-tooltip-props.type.d.ts.map +1 -0
  210. package/dist/shared/utils/frame.util.d.ts +6 -0
  211. package/dist/shared/utils/frame.util.d.ts.map +1 -0
  212. package/dist/shared/utils/frame.util.js +20 -0
  213. package/dist/shared/utils/frame.util.js.map +1 -0
  214. package/dist/shared/utils/get-truncated-dots.util.d.ts +13 -7
  215. package/dist/shared/utils/get-truncated-dots.util.d.ts.map +1 -0
  216. package/dist/shared/utils/get-truncated-dots.util.js +30 -30
  217. package/dist/shared/utils/get-truncated-dots.util.js.map +1 -1
  218. package/dist/shared/utils/i18n.util.d.ts +7 -0
  219. package/dist/shared/utils/i18n.util.d.ts.map +1 -0
  220. package/dist/shared/utils/i18n.util.js +34 -0
  221. package/dist/shared/utils/i18n.util.js.map +1 -0
  222. package/dist/shared/utils/theme.util.d.ts +6 -0
  223. package/dist/shared/utils/theme.util.d.ts.map +1 -0
  224. package/dist/shared/utils/theme.util.js +31 -0
  225. package/dist/shared/utils/theme.util.js.map +1 -0
  226. package/package.json +72 -55
  227. package/src/react-native-platform/hooks/use-tour-scroll-view.hook.ts +24 -0
  228. package/src/react-native-platform/hooks/use-tour-target.hook.ts +30 -0
  229. package/src/react-native-platform/host-store.ts +92 -0
  230. package/src/react-native-platform/insets.util.ts +39 -0
  231. package/src/react-native-platform/layer/native-renderer.tsx +776 -0
  232. package/src/react-native-platform/layer/tour-host.tsx +105 -0
  233. package/src/react-native-platform/measure.util.ts +140 -0
  234. package/src/react-native-platform/native-context.ts +15 -0
  235. package/src/react-native-platform/native-environment.ts +33 -0
  236. package/src/react-native-platform/native-platform.ts +368 -0
  237. package/src/react-native-platform/reduced-motion.ts +47 -0
  238. package/src/react-native-platform/registry.ts +70 -0
  239. package/src/react-native-platform/tour-provider.tsx +148 -0
  240. package/src/react-native.ts +15 -0
  241. package/src/react-platform/dom/elements.util.ts +191 -0
  242. package/src/react-platform/dom/occluders.util.ts +88 -0
  243. package/src/react-platform/dom/scroll-lock.util.ts +261 -0
  244. package/src/react-platform/dom/scroll.util.ts +310 -0
  245. package/src/react-platform/dom/viewport.util.ts +74 -0
  246. package/src/react-platform/dom/web-platform.ts +208 -0
  247. package/src/react-platform/layer/styles.ts +286 -0
  248. package/src/react-platform/layer/web-renderer.tsx +594 -0
  249. package/src/react-platform/tour-provider.tsx +44 -0
  250. package/src/react.ts +13 -0
  251. package/src/shared/engine/abort.util.ts +84 -0
  252. package/src/shared/engine/report.util.ts +58 -0
  253. package/src/shared/engine/tour-adapter.type.ts +62 -0
  254. package/src/shared/engine/tour-engine.ts +1068 -0
  255. package/src/shared/geometry/box.util.ts +185 -0
  256. package/src/shared/geometry/compute-tooltip-layout.util.ts +238 -0
  257. package/src/shared/geometry/geometry.type.ts +38 -0
  258. package/src/shared/geometry/reveal.util.ts +190 -0
  259. package/src/shared/geometry/target-visibility.util.ts +44 -0
  260. package/src/shared/platform/create-tour-adapter.ts +151 -0
  261. package/src/shared/platform/platform.type.ts +81 -0
  262. package/src/shared/platform/reveal-in-scroll-containers.ts +78 -0
  263. package/src/shared/react/tour-context.ts +28 -0
  264. package/src/shared/react/tour-provider-core.ts +67 -0
  265. package/src/shared/react/tour-root.tsx +34 -0
  266. package/src/shared/react/use-isomorphic-layout-effect.hook.ts +7 -0
  267. package/src/shared/react/use-tour-view.hook.ts +17 -0
  268. package/src/shared/react/use-tour.hook.ts +11 -0
  269. package/src/shared/renderer/default-tooltip.tsx +52 -0
  270. package/src/shared/renderer/motion.ts +59 -0
  271. package/src/shared/renderer/renderer-context.ts +33 -0
  272. package/src/shared/renderer/renderer.type.ts +183 -0
  273. package/src/shared/renderer/tooltip-model.ts +44 -0
  274. package/src/shared/renderer/tour-overlay.tsx +453 -0
  275. package/src/shared/types/tour-context.type.ts +23 -0
  276. package/src/shared/types/tour-end-info.type.ts +32 -0
  277. package/src/shared/types/tour-i18n.type.ts +15 -0
  278. package/src/shared/types/tour-step.type.ts +40 -0
  279. package/src/shared/types/tour-theme.type.ts +28 -0
  280. package/src/shared/types/tour-tooltip-props.type.ts +27 -0
  281. package/src/shared/utils/frame.util.ts +21 -0
  282. package/src/shared/utils/get-truncated-dots.util.ts +46 -0
  283. package/src/shared/utils/i18n.util.ts +44 -0
  284. package/src/shared/utils/theme.util.ts +38 -0
  285. package/dist/react-native-platform/components/index.d.ts +0 -2
  286. package/dist/react-native-platform/components/index.js +0 -3
  287. package/dist/react-native-platform/components/index.js.map +0 -1
  288. package/dist/react-native-platform/components/tour-overlay.d.ts +0 -3
  289. package/dist/react-native-platform/components/tour-overlay.js +0 -26
  290. package/dist/react-native-platform/components/tour-overlay.js.map +0 -1
  291. package/dist/react-native-platform/components/tour-tooltip.d.ts +0 -3
  292. package/dist/react-native-platform/components/tour-tooltip.js +0 -167
  293. package/dist/react-native-platform/components/tour-tooltip.js.map +0 -1
  294. package/dist/react-native-platform/hooks/index.d.ts +0 -1
  295. package/dist/react-native-platform/hooks/index.js +0 -2
  296. package/dist/react-native-platform/hooks/index.js.map +0 -1
  297. package/dist/react-native-platform/hooks/use-tour-target.d.ts +0 -2
  298. package/dist/react-native-platform/hooks/use-tour-target.js +0 -13
  299. package/dist/react-native-platform/hooks/use-tour-target.js.map +0 -1
  300. package/dist/react-native-platform/index.d.ts +0 -7
  301. package/dist/react-native-platform/index.js +0 -7
  302. package/dist/react-native-platform/index.js.map +0 -1
  303. package/dist/react-native-platform/platform-adapter.d.ts +0 -2
  304. package/dist/react-native-platform/platform-adapter.js +0 -84
  305. package/dist/react-native-platform/platform-adapter.js.map +0 -1
  306. package/dist/react-native-platform/target-registry.d.ts +0 -10
  307. package/dist/react-native-platform/target-registry.js +0 -17
  308. package/dist/react-native-platform/target-registry.js.map +0 -1
  309. package/dist/react-native-platform/types/tour-provider.props.type.d.ts +0 -12
  310. package/dist/react-native-platform/types/tour-provider.props.type.js +0 -2
  311. package/dist/react-native-platform/types/tour-provider.props.type.js.map +0 -1
  312. package/dist/react-platform/components/index.d.ts +0 -2
  313. package/dist/react-platform/components/index.js +0 -3
  314. package/dist/react-platform/components/index.js.map +0 -1
  315. package/dist/react-platform/components/tour-overlay.d.ts +0 -3
  316. package/dist/react-platform/components/tour-overlay.js +0 -29
  317. package/dist/react-platform/components/tour-overlay.js.map +0 -1
  318. package/dist/react-platform/components/tour-tooltip.d.ts +0 -2
  319. package/dist/react-platform/components/tour-tooltip.js +0 -155
  320. package/dist/react-platform/components/tour-tooltip.js.map +0 -1
  321. package/dist/react-platform/index.d.ts +0 -6
  322. package/dist/react-platform/index.js +0 -6
  323. package/dist/react-platform/index.js.map +0 -1
  324. package/dist/react-platform/platform-adapter.d.ts +0 -2
  325. package/dist/react-platform/platform-adapter.js +0 -101
  326. package/dist/react-platform/platform-adapter.js.map +0 -1
  327. package/dist/react-platform/types/tour-provider.props.type.d.ts +0 -12
  328. package/dist/react-platform/types/tour-provider.props.type.js +0 -2
  329. package/dist/react-platform/types/tour-provider.props.type.js.map +0 -1
  330. package/dist/react-platform/utils/find-visible-element.util.d.ts +0 -1
  331. package/dist/react-platform/utils/find-visible-element.util.js +0 -11
  332. package/dist/react-platform/utils/find-visible-element.util.js.map +0 -1
  333. package/dist/react-platform/utils/index.d.ts +0 -1
  334. package/dist/react-platform/utils/index.js +0 -2
  335. package/dist/react-platform/utils/index.js.map +0 -1
  336. package/dist/shared/context/index.d.ts +0 -1
  337. package/dist/shared/context/index.js +0 -2
  338. package/dist/shared/context/index.js.map +0 -1
  339. package/dist/shared/context/tour-context.d.ts +0 -3
  340. package/dist/shared/context/tour-context.js +0 -14
  341. package/dist/shared/context/tour-context.js.map +0 -1
  342. package/dist/shared/hooks/index.d.ts +0 -1
  343. package/dist/shared/hooks/index.js +0 -2
  344. package/dist/shared/hooks/index.js.map +0 -1
  345. package/dist/shared/hooks/use-tour.hook.d.ts +0 -2
  346. package/dist/shared/hooks/use-tour.hook.js +0 -7
  347. package/dist/shared/hooks/use-tour.hook.js.map +0 -1
  348. package/dist/shared/index.d.ts +0 -5
  349. package/dist/shared/index.js +0 -5
  350. package/dist/shared/index.js.map +0 -1
  351. package/dist/shared/types/index.d.ts +0 -10
  352. package/dist/shared/types/index.js +0 -2
  353. package/dist/shared/types/index.js.map +0 -1
  354. package/dist/shared/types/platform-adapter.type.d.ts +0 -24
  355. package/dist/shared/types/platform-adapter.type.js +0 -2
  356. package/dist/shared/types/platform-adapter.type.js.map +0 -1
  357. package/dist/shared/types/rect.type.d.ts +0 -11
  358. package/dist/shared/types/rect.type.js +0 -2
  359. package/dist/shared/types/rect.type.js.map +0 -1
  360. package/dist/shared/types/tour-overlay-props.type.d.ts +0 -8
  361. package/dist/shared/types/tour-overlay-props.type.js +0 -2
  362. package/dist/shared/types/tour-overlay-props.type.js.map +0 -1
  363. package/dist/shared/utils/calculate-tooltip-position.util.d.ts +0 -14
  364. package/dist/shared/utils/calculate-tooltip-position.util.js +0 -49
  365. package/dist/shared/utils/calculate-tooltip-position.util.js.map +0 -1
  366. package/dist/shared/utils/index.d.ts +0 -3
  367. package/dist/shared/utils/index.js +0 -3
  368. package/dist/shared/utils/index.js.map +0 -1
@@ -0,0 +1,20 @@
1
+ import type { Box } from '../shared/geometry/geometry.type.js';
2
+ /**
3
+ * Measures a native view relative to the root view. Uses the synchronous `getBoundingClientRect`
4
+ * (New Architecture, includes transforms) and falls back to `measure`. Resolves `undefined` for
5
+ * views that are not rendered (unmounted, zero size, or flattened away on the old architecture).
6
+ *
7
+ * Positions are only compared with other positions from this function, so whichever origin the
8
+ * platform uses (status bar, edge-to-edge) cancels out.
9
+ */
10
+ export declare function measureView(instance: unknown): Promise<Box | undefined>;
11
+ export declare function relativeTo(box: Box, origin: Box): Box;
12
+ /**
13
+ * Where `instance` is inside `ancestor` (from the layout, so also for views that cannot be
14
+ * measured on screen; possibly zero-sized), `false` when it is not inside it, or `undefined` when
15
+ * React Native cannot tell.
16
+ */
17
+ export declare function measureLayoutIn(instance: unknown, ancestor: unknown): Promise<Box | false | undefined>;
18
+ /** Whether `instance` is a descendant of `ancestor`, or `undefined` when React Native cannot tell. */
19
+ export declare function isDescendant(instance: unknown, ancestor: unknown): Promise<boolean | undefined>;
20
+ //# sourceMappingURL=measure.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.util.d.ts","sourceRoot":"","sources":["../../src/react-native-platform/measure.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,qCAAqC,CAAC;AAqB7D;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAyB7E;AAaD,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAErD;AAKD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC,CA+B5G;AAKD,sGAAsG;AACtG,wBAAsB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAuBrG"}
@@ -0,0 +1,100 @@
1
+ function isMeasurable(value) {
2
+ return typeof value === 'object' && value !== null;
3
+ }
4
+ /**
5
+ * Measures a native view relative to the root view. Uses the synchronous `getBoundingClientRect`
6
+ * (New Architecture, includes transforms) and falls back to `measure`. Resolves `undefined` for
7
+ * views that are not rendered (unmounted, zero size, or flattened away on the old architecture).
8
+ *
9
+ * Positions are only compared with other positions from this function, so whichever origin the
10
+ * platform uses (status bar, edge-to-edge) cancels out.
11
+ */
12
+ export async function measureView(instance) {
13
+ if (!isMeasurable(instance)) {
14
+ return undefined;
15
+ }
16
+ if (typeof instance.getBoundingClientRect === 'function') {
17
+ const rect = instance.getBoundingClientRect();
18
+ return valid({ x: rect.x, y: rect.y, width: rect.width, height: rect.height });
19
+ }
20
+ const { measure } = instance;
21
+ if (typeof measure !== 'function') {
22
+ return undefined;
23
+ }
24
+ return new Promise((resolve) => {
25
+ try {
26
+ // eslint-disable-next-line max-params -- signature defined by React Native
27
+ measure.call(instance, (_x, _y, width, height, pageX, pageY) => {
28
+ resolve(valid({ x: pageX, y: pageY, width, height }));
29
+ });
30
+ }
31
+ catch {
32
+ resolve(undefined);
33
+ }
34
+ });
35
+ }
36
+ function valid(box) {
37
+ const finite = [box.x, box.y, box.width, box.height].every((value) => typeof value === 'number' && Number.isFinite(value));
38
+ if (!finite || (box.width <= 0 && box.height <= 0)) {
39
+ return undefined;
40
+ }
41
+ return box;
42
+ }
43
+ export function relativeTo(box, origin) {
44
+ return { x: box.x - origin.x, y: box.y - origin.y, width: box.width, height: box.height };
45
+ }
46
+ /** Longest wait for `measureLayout` (on the Old Architecture a round trip to native). */
47
+ const measureLayoutTimeoutMs = 500;
48
+ /**
49
+ * Where `instance` is inside `ancestor` (from the layout, so also for views that cannot be
50
+ * measured on screen; possibly zero-sized), `false` when it is not inside it, or `undefined` when
51
+ * React Native cannot tell.
52
+ */
53
+ export async function measureLayoutIn(instance, ancestor) {
54
+ if (!isMeasurable(instance) || !isMeasurable(ancestor) || typeof instance.measureLayout !== 'function') {
55
+ return undefined;
56
+ }
57
+ const { measureLayout } = instance;
58
+ return new Promise((resolve) => {
59
+ const timer = setTimeout(() => {
60
+ resolve(undefined);
61
+ }, measureLayoutTimeoutMs);
62
+ const settle = (result) => {
63
+ clearTimeout(timer);
64
+ resolve(result);
65
+ };
66
+ try {
67
+ measureLayout.call(instance, ancestor, (left, top, width, height) => {
68
+ const box = { x: left, y: top, width, height };
69
+ settle(Object.values(box).every((value) => Number.isFinite(value)) ? box : undefined);
70
+ }, () => {
71
+ settle(false);
72
+ });
73
+ }
74
+ catch {
75
+ settle(undefined);
76
+ }
77
+ });
78
+ }
79
+ /** Ancestry does not change for a mounted view (React Native never moves views to another parent). */
80
+ const ancestry = new WeakMap();
81
+ /** Whether `instance` is a descendant of `ancestor`, or `undefined` when React Native cannot tell. */
82
+ export async function isDescendant(instance, ancestor) {
83
+ if (!isMeasurable(instance) || !isMeasurable(ancestor)) {
84
+ return undefined;
85
+ }
86
+ const known = ancestry.get(instance)?.get(ancestor);
87
+ if (known !== undefined) {
88
+ return known;
89
+ }
90
+ const result = typeof ancestor.contains === 'function'
91
+ ? ancestor.contains(instance)
92
+ : await measureLayoutIn(instance, ancestor).then((position) => position === undefined ? undefined : position !== false);
93
+ if (result !== undefined) {
94
+ const forInstance = ancestry.get(instance) ?? new WeakMap();
95
+ forInstance.set(ancestor, result);
96
+ ancestry.set(instance, forInstance);
97
+ }
98
+ return result;
99
+ }
100
+ //# sourceMappingURL=measure.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.util.js","sourceRoot":"","sources":["../../src/react-native-platform/measure.util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { TourOverlayProps } from '../shared/renderer/tour-overlay.js';
2
+ import type { HostStore } from './host-store.js';
3
+ import type { TourRegistry } from './registry.js';
4
+ /** Everything the native hooks and hosts need from the provider. Internal. */
5
+ export type NativeTourContextValue = {
6
+ readonly registry: TourRegistry;
7
+ readonly hosts: HostStore;
8
+ /** Rendered by the active host. */
9
+ readonly overlay: TourOverlayProps;
10
+ };
11
+ export declare const NativeTourContext: import("react").Context<NativeTourContextValue | undefined>;
12
+ //# sourceMappingURL=native-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-context.d.ts","sourceRoot":"","sources":["../../src/react-native-platform/native-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAEhD,8EAA8E;AAC9E,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,iBAAiB,6DAA+D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { createContext } from 'react';
2
+ export const NativeTourContext = createContext(undefined);
3
+ NativeTourContext.displayName = 'NativeTourContext';
4
+ //# sourceMappingURL=native-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-context.js","sourceRoot":"","sources":["../../src/react-native-platform/native-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC;AAapC,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAqC,SAAS,CAAC,CAAC;AAC9F,iBAAiB,CAAC,WAAW,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Insets, Size } from '../shared/geometry/geometry.type.js';
2
+ import { type TourInsets } from './insets.util.js';
3
+ /**
4
+ * Values the native platform reads at measuring time (outside React rendering): safe-area insets
5
+ * and the on-screen keyboard. Updated by the provider in effects.
6
+ */
7
+ export type NativeEnvironment = {
8
+ readonly setInsets: (insets: TourInsets | undefined) => void;
9
+ /** How much of the layer the keyboard covers. Returns whether that changed. */
10
+ readonly setKeyboardOverlap: (overlap: number) => boolean;
11
+ readonly getInsets: (layer: Size) => Insets;
12
+ };
13
+ export declare function createNativeEnvironment(): NativeEnvironment;
14
+ //# sourceMappingURL=native-environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-environment.d.ts","sourceRoot":"","sources":["../../src/react-native-platform/native-environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAE,IAAI,EAAC,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAgB,KAAK,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7D,+EAA+E;IAC/E,QAAQ,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC;CAC7C,CAAC;AAEF,wBAAgB,uBAAuB,IAAI,iBAAiB,CAkB3D"}
@@ -0,0 +1,20 @@
1
+ import { resolveInsets } from './insets.util.js';
2
+ export function createNativeEnvironment() {
3
+ let insets;
4
+ let keyboardOverlap = 0;
5
+ return {
6
+ setInsets(value) {
7
+ insets = value;
8
+ },
9
+ setKeyboardOverlap(overlap) {
10
+ const next = Number.isFinite(overlap) ? Math.max(0, overlap) : 0;
11
+ if (Math.abs(next - keyboardOverlap) < 0.5) {
12
+ return false;
13
+ }
14
+ keyboardOverlap = next;
15
+ return true;
16
+ },
17
+ getInsets: (layer) => resolveInsets(insets, layer, keyboardOverlap),
18
+ };
19
+ }
20
+ //# sourceMappingURL=native-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-environment.js","sourceRoot":"","sources":["../../src/react-native-platform/native-environment.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAahE,MAAM,UAAU,uBAAuB;IACrC,IAAI,MAA8B,CAAC;IACnC,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,OAAO;QACL,SAAS,CAAC,KAAK;YACb,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QACD,kBAAkB,CAAC,OAAO;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,eAAe,CAAC,GAAG,GAAG,EAAE,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,eAAe,GAAG,IAAI,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC;KACpE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Insets, Size } from '../shared/geometry/geometry.type.js';
2
+ import type { ExternalValue, PlatformAdapter } from '../shared/platform/platform.type.js';
3
+ import type { TourRegistry } from './registry.js';
4
+ export type NativePlatformOptions = {
5
+ readonly registry: TourRegistry;
6
+ /** The view the tour is drawn in (the provider's root layer, or the newest `TourHost`). */
7
+ readonly getHost: () => {
8
+ readonly instance: unknown;
9
+ readonly size: Size;
10
+ } | undefined;
11
+ readonly getInsets: () => Insets;
12
+ /** Subscribes to anything that can move targets: layer size, keyboard, safe-area changes. */
13
+ readonly subscribeLayout: (listener: () => void) => () => void;
14
+ readonly reducedMotion: ExternalValue<boolean>;
15
+ readonly getPixelRatio: () => number;
16
+ };
17
+ /** React Native's raw facts for the tour: measuring views, registered targets and scroll views, the host layer. */
18
+ export declare function createNativePlatform(env: NativePlatformOptions): PlatformAdapter;
19
+ //# sourceMappingURL=native-platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-platform.d.ts","sourceRoot":"","sources":["../../src/react-native-platform/native-platform.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAM,MAAM,EAAE,IAAI,EAAW,MAAM,qCAAqC,CAAC;AACrF,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAGhB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,MAAM;QAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;KAAC,GAAG,SAAS,CAAC;IACtF,QAAQ,CAAC,SAAS,EAAE,MAAM,MAAM,CAAC;IACjC,6FAA6F;IAC7F,QAAQ,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,MAAM,CAAC;CACtC,CAAC;AA0EF,mHAAmH;AACnH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,GAAG,eAAe,CA6QhF"}
@@ -0,0 +1,265 @@
1
+ import { nextFrame } from '../shared/engine/abort.util.js';
2
+ import { containsBox, intersect, narrowClip } from '../shared/geometry/box.util.js';
3
+ import { isDescendant, measureLayoutIn, measureView, relativeTo } from './measure.util.js';
4
+ const area = (box) => box.width * box.height;
5
+ function isObject(value) {
6
+ return typeof value === 'object' && value !== null;
7
+ }
8
+ /**
9
+ * The `ScrollView` behind a registered ref. Lists (`FlatList`, `SectionList`, `VirtualizedList`)
10
+ * expose theirs as the scroll responder; a `ScrollView` is its own.
11
+ */
12
+ function scrollViewOf(registered) {
13
+ if (!isObject(registered)) {
14
+ return undefined;
15
+ }
16
+ if (typeof registered.scrollTo === 'function') {
17
+ return registered;
18
+ }
19
+ const responder = registered.getScrollResponder?.();
20
+ return isObject(responder) && typeof responder.scrollTo === 'function' ? responder : undefined;
21
+ }
22
+ /** Scroll offsets are rounded to physical pixels: up to one point off still counts as arrived. */
23
+ const arrivalTolerance = 1;
24
+ /** Frames without movement after which a scroll that moved but stopped short counts as finished. */
25
+ const stillFramesAfterMoving = 3;
26
+ /** Which axes a scroll view can scroll: those where its content is bigger than the view. */
27
+ function scrollAxes(geometry) {
28
+ return {
29
+ x: geometry.content.width > geometry.viewport.width + arrivalTolerance,
30
+ y: geometry.content.height > geometry.viewport.height + arrivalTolerance,
31
+ };
32
+ }
33
+ /**
34
+ * Orders scroll views that all contain the target innermost first: a scroll view inside another
35
+ * one lies within that one's content.
36
+ */
37
+ function innermostFirst(geometries) {
38
+ const depth = (geometry) => geometries.filter((other) => other !== geometry && containsBox(other.content, geometry.viewport, 1)).length;
39
+ // Not `toSorted`: ES2023 is not available on every supported React Native version.
40
+ // eslint-disable-next-line unicorn/no-array-sort
41
+ return [...geometries].sort((a, b) => depth(b) - depth(a) || area(a.content) - area(b.content));
42
+ }
43
+ /** React Native's raw facts for the tour: measuring views, registered targets and scroll views, the host layer. */
44
+ export function createNativePlatform(env) {
45
+ async function hostOrigin() {
46
+ const host = env.getHost();
47
+ return host ? measureView(host.instance) : undefined;
48
+ }
49
+ function candidates(target) {
50
+ if (typeof target === 'string') {
51
+ return env.registry.targets(target).map((ref) => ref.current);
52
+ }
53
+ return [target.current];
54
+ }
55
+ async function registeredScrollViews(origin) {
56
+ const geometries = await Promise.all(env.registry.scrollViews().map(async (ref) => scrollViewGeometry(ref.current, origin)));
57
+ return geometries.filter((geometry) => geometry !== undefined);
58
+ }
59
+ async function scrollViewGeometry(registered, origin) {
60
+ const scrollView = scrollViewOf(registered);
61
+ if (!scrollView) {
62
+ return undefined;
63
+ }
64
+ const [viewport, content] = await Promise.all([
65
+ measureView(scrollView.getNativeScrollRef?.() ?? scrollView),
66
+ measureView(scrollView.getInnerViewRef?.()),
67
+ ]);
68
+ if (!viewport || !content) {
69
+ return undefined;
70
+ }
71
+ return { scrollView, viewport: relativeTo(viewport, origin), content: relativeTo(content, origin) };
72
+ }
73
+ /**
74
+ * The scroll views around the target, innermost first. A scroll view counts when the target is
75
+ * one of its descendants, where React Native can tell: a header button above a page that has
76
+ * been scrolled is not inside the page, even though the page's content reaches behind it.
77
+ * Otherwise it counts when its content contains the target, or another scroll view around it (a
78
+ * target at the end of a horizontal list below the fold is inside the list, the list inside the page).
79
+ */
80
+ async function containingScrollViews(located, geometries) {
81
+ const ancestry = await Promise.all(geometries.map(async (geometry) => isDescendant(located.instance, geometry.scrollView.getInnerViewRef?.())));
82
+ const around = new Set(geometries.filter((_geometry, index) => ancestry[index] === true));
83
+ const unknown = geometries.filter((_geometry, index) => ancestry[index] === undefined);
84
+ let isGrowing = true;
85
+ while (isGrowing) {
86
+ isGrowing = false;
87
+ for (const geometry of unknown) {
88
+ const contains = !around.has(geometry) &&
89
+ (containsBox(geometry.content, located.rect, 1) ||
90
+ [...around].some((inner) => containsBox(geometry.content, inner.viewport, 1)));
91
+ if (contains) {
92
+ around.add(geometry);
93
+ isGrowing = true;
94
+ }
95
+ }
96
+ }
97
+ return innermostFirst([...around]);
98
+ }
99
+ /** The part of `box` not covered by insets (system bars, the keyboard); all of it when nothing of it is uncovered. */
100
+ function unobstructedPart(box) {
101
+ const size = env.getHost()?.size ?? { width: 0, height: 0 };
102
+ const insets = env.getInsets();
103
+ const screen = {
104
+ x: insets.left,
105
+ y: insets.top,
106
+ width: size.width - insets.left - insets.right,
107
+ height: size.height - insets.top - insets.bottom,
108
+ };
109
+ const visible = intersect(box, screen);
110
+ return visible && visible.width > 0 && visible.height > 0 ? visible : box;
111
+ }
112
+ async function scrollViewMetrics(scrollView) {
113
+ const origin = await hostOrigin();
114
+ const current = origin ? await scrollViewGeometry(scrollView, origin) : undefined;
115
+ if (!current) {
116
+ return undefined;
117
+ }
118
+ const offset = { x: current.viewport.x - current.content.x, y: current.viewport.y - current.content.y };
119
+ const axes = scrollAxes(current);
120
+ const end = {
121
+ x: current.content.width - current.viewport.width,
122
+ y: current.content.height - current.viewport.height,
123
+ };
124
+ return {
125
+ // The part the user can see: scroll views of edge-to-edge apps reach behind the keyboard and
126
+ // the system bars, and a target scrolled there would still be hidden.
127
+ area: unobstructedPart(current.viewport),
128
+ offset,
129
+ // Content can rest away from offset 0 (content insets under a translucent header, margins,
130
+ // content centred on a tablet), so the offset can be negative. An axis the scroll view does
131
+ // not scroll stays where it is.
132
+ minOffset: { x: axes.x ? Math.min(0, offset.x) : offset.x, y: axes.y ? Math.min(0, offset.y) : offset.y },
133
+ maxOffset: { x: axes.x ? Math.max(offset.x, end.x) : offset.x, y: axes.y ? Math.max(offset.y, end.y) : offset.y },
134
+ };
135
+ }
136
+ function scrollContainer(scrollView) {
137
+ return {
138
+ measure: async () => scrollViewMetrics(scrollView),
139
+ async scrollTo(offset, { animated, signal }) {
140
+ const start = await scrollViewMetrics(scrollView);
141
+ scrollView.scrollTo?.({ x: offset.x, y: offset.y, animated });
142
+ if (!start) {
143
+ return;
144
+ }
145
+ // Scroll views report no "scroll end" for programmatic scrolls, and measurements cannot be
146
+ // trusted to move either: on the New Architecture they come from the shadow tree, which iOS
147
+ // only updates when a scroll animation has finished. So wait until the scroll view measures
148
+ // at the offset it was sent to, on the axes it was asked to move. Content that rests away
149
+ // from offset 0 can stop a little short: then it counts as done once it moved and stopped.
150
+ const moves = {
151
+ x: Math.abs(offset.x - start.offset.x) > arrivalTolerance,
152
+ y: Math.abs(offset.y - start.offset.y) > arrivalTolerance,
153
+ };
154
+ let previous = start.offset;
155
+ let stillFrames = 0;
156
+ let hasMoved = false;
157
+ while (!signal.aborted) {
158
+ // eslint-disable-next-line no-await-in-loop -- frame by frame
159
+ await nextFrame(signal);
160
+ // eslint-disable-next-line no-await-in-loop -- see above
161
+ const current = await scrollViewMetrics(scrollView);
162
+ if (signal.aborted || !current) {
163
+ return;
164
+ }
165
+ const hasArrived = (!moves.x || Math.abs(current.offset.x - offset.x) <= arrivalTolerance) &&
166
+ (!moves.y || Math.abs(current.offset.y - offset.y) <= arrivalTolerance);
167
+ const isStill = Math.abs(current.offset.x - previous.x) < 0.5 && Math.abs(current.offset.y - previous.y) < 0.5;
168
+ hasMoved ||= !isStill;
169
+ stillFrames = isStill ? stillFrames + 1 : 0;
170
+ previous = current.offset;
171
+ if (hasArrived || (hasMoved && stillFrames >= stillFramesAfterMoving)) {
172
+ return;
173
+ }
174
+ }
175
+ },
176
+ };
177
+ }
178
+ /**
179
+ * Measures a target that cannot be measured directly through a scroll view's content: on the
180
+ * Old Architecture, views the layout flattened away and list items scrolled out of the visible
181
+ * window cannot be measured on screen, but their position in the content is known.
182
+ */
183
+ async function measureThroughScrollViews(instance, geometries) {
184
+ for (const geometry of geometries) {
185
+ // eslint-disable-next-line no-await-in-loop -- the first scroll view that knows the target is enough
186
+ const position = await measureLayoutIn(instance, geometry.scrollView.getInnerViewRef?.());
187
+ if (position && (position.width > 0 || position.height > 0)) {
188
+ return { ...position, x: geometry.content.x + position.x, y: geometry.content.y + position.y };
189
+ }
190
+ }
191
+ return undefined;
192
+ }
193
+ async function locateTarget(target, origin) {
194
+ const screen = { x: 0, y: 0, width: origin.width, height: origin.height };
195
+ let geometries;
196
+ // Several components can register the same id (tabs that stay mounted, two screens during a
197
+ // transition): prefer the newest one that is actually on screen.
198
+ let fallback;
199
+ for (const instance of candidates(target)) {
200
+ // eslint-disable-next-line no-await-in-loop -- candidates are checked in priority order
201
+ const measured = await measureView(instance);
202
+ let rect = measured ? relativeTo(measured, origin) : undefined;
203
+ if (!rect) {
204
+ // eslint-disable-next-line no-await-in-loop -- only when measuring directly failed
205
+ geometries ??= await registeredScrollViews(origin);
206
+ // eslint-disable-next-line no-await-in-loop -- see above
207
+ rect = await measureThroughScrollViews(instance, geometries);
208
+ }
209
+ if (!rect) {
210
+ continue;
211
+ }
212
+ if (intersect(rect, screen)) {
213
+ return { instance, rect, geometries };
214
+ }
215
+ fallback ??= { instance, rect, geometries };
216
+ }
217
+ return fallback;
218
+ }
219
+ async function measureTarget(target) {
220
+ const origin = await hostOrigin();
221
+ const located = origin ? await locateTarget(target, origin) : undefined;
222
+ if (!origin || !located) {
223
+ return undefined;
224
+ }
225
+ const containers = await containingScrollViews(located, located.geometries ?? (await registeredScrollViews(origin)));
226
+ let clip;
227
+ for (const container of containers) {
228
+ clip = narrowClip(clip, container.viewport);
229
+ }
230
+ return { rect: located.rect, clip };
231
+ }
232
+ return {
233
+ measure: measureTarget,
234
+ subscribe(_target, onChange) {
235
+ // Views report no layout events to the outside; registrations, the host layer, the keyboard
236
+ // and safe-area changes do.
237
+ const unsubscribeLayout = env.subscribeLayout(onChange);
238
+ const unsubscribeRegistry = env.registry.subscribe(onChange);
239
+ return () => {
240
+ unsubscribeLayout();
241
+ unsubscribeRegistry();
242
+ };
243
+ },
244
+ // A registered view (or a ref) that cannot be measured yet has not been laid out: nothing
245
+ // announces when it is, so the tour checks every frame.
246
+ isAwaitingLayout: (target) => typeof target !== 'string' || env.registry.targets(target).length > 0,
247
+ async scrollContainers(target) {
248
+ const origin = await hostOrigin();
249
+ const located = origin ? await locateTarget(target, origin) : undefined;
250
+ if (!origin || !located) {
251
+ return [];
252
+ }
253
+ const chain = await containingScrollViews(located, located.geometries ?? (await registeredScrollViews(origin)));
254
+ return chain.map(({ scrollView }) => scrollContainer(scrollView));
255
+ },
256
+ getViewport() {
257
+ const size = env.getHost()?.size ?? { width: 0, height: 0 };
258
+ return { rect: { x: 0, y: 0, width: size.width, height: size.height }, insets: env.getInsets() };
259
+ },
260
+ reducedMotion: env.reducedMotion,
261
+ measuresWhileScrolling: false,
262
+ getPixelRatio: env.getPixelRatio,
263
+ };
264
+ }
265
+ //# sourceMappingURL=native-platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-platform.js","sourceRoot":"","sources":["../../src/react-native-platform/native-platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,gCAAgC,CAAC;AAEzD,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAC,MAAM,gCAAgC,CAAC;AASlF,OAAO,EAAC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAsCzF,MAAM,IAAI,GAAG,CAAC,GAAQ,EAAU,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;AAE1D,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,UAAmB;IACvC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC9C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC;IACpD,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACjG,CAAC;AAED,kGAAkG;AAClG,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,oGAAoG;AACpG,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,4FAA4F;AAC5F,SAAS,UAAU,CAAC,QAA4B;IAC9C,OAAO;QACL,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,gBAAgB;QACtE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,gBAAgB;KACzE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,UAAyC;IAC/D,MAAM,KAAK,GAAG,CAAC,QAA4B,EAAU,EAAE,CACrD,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9G,mFAAmF;IACnF,iDAAiD;IACjD,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,oBAAoB,CAAC,GAA0B;IAC7D,KAAK,UAAU,UAAU;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IAED,SAAS,UAAU,CAAC,MAAkB;QACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,UAAU,qBAAqB,CAAC,MAAW;QAC9C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CACvF,CAAC;QACF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAkC,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,UAAU,kBAAkB,CAAC,UAAmB,EAAE,MAAW;QAChE,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5C,WAAW,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,IAAI,UAAU,CAAC;YAC5D,WAAW,CAAC,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,EAAC,CAAC;IACpG,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,qBAAqB,CAClC,OAAsB,EACtB,UAAyC;QAEzC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAC5G,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;QACvF,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,OAAO,SAAS,EAAE,CAAC;YACjB,SAAS,GAAG,KAAK,CAAC;YAClB,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GACZ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACrB,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;wBAC7C,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACrB,SAAS,GAAG,IAAI,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,sHAAsH;IACtH,SAAS,gBAAgB,CAAC,GAAQ;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,IAAI,EAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,MAAM,CAAC,IAAI;YACd,CAAC,EAAE,MAAM,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;YAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM;SACjD,CAAC;QACF,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO,OAAO,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5E,CAAC;IAED,KAAK,UAAU,iBAAiB,CAAC,UAA8B;QAC7D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,EAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,EAAC,CAAC;QACtG,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG;YACV,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK;YACjD,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM;SACpD,CAAC;QACF,OAAO;YACL,6FAA6F;YAC7F,sEAAsE;YACtE,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;YACxC,MAAM;YACN,2FAA2F;YAC3F,4FAA4F;YAC5F,gCAAgC;YAChC,SAAS,EAAE,EAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAC;YACvG,SAAS,EAAE,EAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAC;SAChH,CAAC;IACJ,CAAC;IAED,SAAS,eAAe,CAAC,UAA8B;QACrD,OAAO;YACL,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC;YAClD,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAC;gBACvC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBAClD,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAC,CAAC,CAAC;gBAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;gBAED,2FAA2F;gBAC3F,4FAA4F;gBAC5F,4FAA4F;gBAC5F,0FAA0F;gBAC1F,2FAA2F;gBAC3F,MAAM,KAAK,GAAG;oBACZ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB;oBACzD,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB;iBAC1D,CAAC;gBACF,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,IAAI,WAAW,GAAG,CAAC,CAAC;gBACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvB,8DAA8D;oBAC9D,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;oBACxB,yDAAyD;oBACzD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;oBACpD,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;wBAC/B,OAAO;oBACT,CAAC;oBAED,MAAM,UAAU,GACd,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC;wBACvE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC;oBAC1E,MAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBACjG,QAAQ,KAAK,CAAC,OAAO,CAAC;oBACtB,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC5C,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;oBAC1B,IAAI,UAAU,IAAI,CAAC,QAAQ,IAAI,WAAW,IAAI,sBAAsB,CAAC,EAAE,CAAC;wBACtE,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,UAAU,yBAAyB,CACtC,QAAiB,EACjB,UAAyC;QAEzC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,qGAAqG;YACrG,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;YAC1F,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5D,OAAO,EAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,MAAkB,EAAE,MAAW;QACzD,MAAM,MAAM,GAAG,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAC,CAAC;QACxE,IAAI,UAA4C,CAAC;QACjD,4FAA4F;QAC5F,iEAAiE;QACjE,IAAI,QAAmC,CAAC;QACxC,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,wFAAwF;YACxF,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,mFAAmF;gBACnF,UAAU,KAAK,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBACnD,yDAAyD;gBACzD,IAAI,GAAG,MAAM,yBAAyB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC/D,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAC,CAAC;YACtC,CAAC;YAED,QAAQ,KAAK,EAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAC,CAAC;QAC5C,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,MAAkB;QAC7C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAC5C,OAAO,EACP,OAAO,CAAC,UAAU,IAAI,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAC5D,CAAC;QACF,IAAI,IAAqB,CAAC;QAC1B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAC,CAAC;IACpC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,aAAa;QAEtB,SAAS,CAAC,OAAO,EAAE,QAAQ;YACzB,4FAA4F;YAC5F,4BAA4B;YAC5B,MAAM,iBAAiB,GAAG,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,mBAAmB,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC7D,OAAO,GAAG,EAAE;gBACV,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;YACxB,CAAC,CAAC;QACJ,CAAC;QAED,0FAA0F;QAC1F,wDAAwD;QACxD,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAEnG,KAAK,CAAC,gBAAgB,CAAC,MAAM;YAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAChH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAC,UAAU,EAAC,EAAE,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,WAAW;YACT,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,IAAI,EAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAC,CAAC;YAC1D,OAAO,EAAC,IAAI,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAC,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,EAAC,CAAC;QAC/F,CAAC;QAED,aAAa,EAAE,GAAG,CAAC,aAAa;QAEhC,sBAAsB,EAAE,KAAK;QAE7B,aAAa,EAAE,GAAG,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ExternalValue } from '../shared/platform/platform.type.js';
2
+ /** The system's "reduce motion" setting, live. Listens to the system only while someone is subscribed. */
3
+ export declare function createReducedMotionSetting(): ExternalValue<boolean>;
4
+ //# sourceMappingURL=reduced-motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reduced-motion.d.ts","sourceRoot":"","sources":["../../src/react-native-platform/reduced-motion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qCAAqC,CAAC;AAEvE,0GAA0G;AAC1G,wBAAgB,0BAA0B,IAAI,aAAa,CAAC,OAAO,CAAC,CA0CnE"}
@@ -0,0 +1,44 @@
1
+ import { AccessibilityInfo } from 'react-native';
2
+ /** The system's "reduce motion" setting, live. Listens to the system only while someone is subscribed. */
3
+ export function createReducedMotionSetting() {
4
+ let value = false;
5
+ const listeners = new Set();
6
+ let stop;
7
+ const set = (next) => {
8
+ if (next !== value) {
9
+ value = next;
10
+ // Snapshot: listeners may unsubscribe while being notified.
11
+ const snapshot = [...listeners];
12
+ for (const listener of snapshot) {
13
+ listener();
14
+ }
15
+ }
16
+ };
17
+ return {
18
+ get: () => value,
19
+ subscribe(listener) {
20
+ listeners.add(listener);
21
+ if (!stop) {
22
+ let isListening = true;
23
+ void AccessibilityInfo.isReduceMotionEnabled().then((enabled) => {
24
+ if (isListening) {
25
+ set(enabled);
26
+ }
27
+ });
28
+ const subscription = AccessibilityInfo.addEventListener('reduceMotionChanged', set);
29
+ stop = () => {
30
+ isListening = false;
31
+ subscription.remove();
32
+ };
33
+ }
34
+ return () => {
35
+ listeners.delete(listener);
36
+ if (listeners.size === 0) {
37
+ stop?.();
38
+ stop = undefined;
39
+ }
40
+ };
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=reduced-motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reduced-motion.js","sourceRoot":"","sources":["../../src/react-native-platform/reduced-motion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAG/C,0GAA0G;AAC1G,MAAM,UAAU,0BAA0B;IACxC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,IAAI,IAA8B,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,IAAa,EAAQ,EAAE;QAClC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,KAAK,GAAG,IAAI,CAAC;YACb,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;YAChC,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBAChC,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;QAChB,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,WAAW,GAAG,IAAI,CAAC;gBACvB,KAAK,iBAAiB,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC9D,IAAI,WAAW,EAAE,CAAC;wBAChB,GAAG,CAAC,OAAO,CAAC,CAAC;oBACf,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;gBACpF,IAAI,GAAG,GAAS,EAAE;oBAChB,WAAW,GAAG,KAAK,CAAC;oBACpB,YAAY,CAAC,MAAM,EAAE,CAAC;gBACxB,CAAC,CAAC;YACJ,CAAC;YAED,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC3B,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACzB,IAAI,EAAE,EAAE,CAAC;oBACT,IAAI,GAAG,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { RefObject } from 'react';
2
+ /**
3
+ * Targets and scroll views registered by `useTourTarget` / `useTourScrollView`, one registry per
4
+ * `TourProvider`. A target id can be registered by several components at once (two screens of a
5
+ * stack during a transition, tabs that stay mounted); unregistering only removes the caller's own
6
+ * registration, and the newest registration comes first.
7
+ */
8
+ export type TourRegistry = {
9
+ readonly registerTarget: (id: string, ref: RefObject<unknown>) => () => void;
10
+ /** Refs registered for `id`, newest first. */
11
+ readonly targets: (id: string) => ReadonlyArray<RefObject<unknown>>;
12
+ readonly registerScrollView: (ref: RefObject<unknown>) => () => void;
13
+ readonly scrollViews: () => ReadonlyArray<RefObject<unknown>>;
14
+ /** Called after any registration change. */
15
+ readonly subscribe: (listener: () => void) => () => void;
16
+ };
17
+ export declare function createRegistry(): TourRegistry;
18
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/react-native-platform/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAErC;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC;IAC7E,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAC1D,CAAC;AAEF,wBAAgB,cAAc,IAAI,YAAY,CAmD7C"}