@symbiote-native/navigation 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 (455) hide show
  1. package/LICENSE +21 -0
  2. package/build/angular/drawer/index.d.ts +76 -0
  3. package/build/angular/drawer/index.js +508 -0
  4. package/build/angular/drawer-screen.directive.d.ts +14 -0
  5. package/build/angular/drawer-screen.directive.js +87 -0
  6. package/build/angular/index.d.ts +23 -0
  7. package/build/angular/index.js +22 -0
  8. package/build/angular/injectors/index.d.ts +13 -0
  9. package/build/angular/injectors/index.js +8 -0
  10. package/build/angular/injectors/inject-drawer-navigation.d.ts +4 -0
  11. package/build/angular/injectors/inject-drawer-navigation.js +12 -0
  12. package/build/angular/injectors/inject-focus-effect.d.ts +2 -0
  13. package/build/angular/injectors/inject-focus-effect.js +29 -0
  14. package/build/angular/injectors/inject-is-focused.d.ts +2 -0
  15. package/build/angular/injectors/inject-is-focused.js +20 -0
  16. package/build/angular/injectors/inject-navigation-state.d.ts +3 -0
  17. package/build/angular/injectors/inject-navigation-state.js +35 -0
  18. package/build/angular/injectors/inject-navigation.d.ts +7 -0
  19. package/build/angular/injectors/inject-navigation.js +16 -0
  20. package/build/angular/injectors/inject-route.d.ts +3 -0
  21. package/build/angular/injectors/inject-route.js +20 -0
  22. package/build/angular/injectors/inject-stack-navigation.d.ts +4 -0
  23. package/build/angular/injectors/inject-stack-navigation.js +15 -0
  24. package/build/angular/injectors/inject-tab-navigation.d.ts +4 -0
  25. package/build/angular/injectors/inject-tab-navigation.js +11 -0
  26. package/build/angular/linking.d.ts +3 -0
  27. package/build/angular/linking.js +43 -0
  28. package/build/angular/navigation-context.service.d.ts +13 -0
  29. package/build/angular/navigation-context.service.js +105 -0
  30. package/build/angular/navigation-scope.directive.d.ts +10 -0
  31. package/build/angular/navigation-scope.directive.js +90 -0
  32. package/build/angular/screen.directive.d.ts +22 -0
  33. package/build/angular/screen.directive.js +90 -0
  34. package/build/angular/search-bar-ref.directive.d.ts +10 -0
  35. package/build/angular/search-bar-ref.directive.js +88 -0
  36. package/build/angular/stack/index.d.ts +55 -0
  37. package/build/angular/stack/index.js +386 -0
  38. package/build/angular/tab-screen.directive.d.ts +14 -0
  39. package/build/angular/tab-screen.directive.js +87 -0
  40. package/build/angular/tabs/index.d.ts +42 -0
  41. package/build/angular/tabs/index.js +263 -0
  42. package/build/core/constants.d.ts +27 -0
  43. package/build/core/constants.js +61 -0
  44. package/build/core/drawer-options/index.d.ts +64 -0
  45. package/build/core/drawer-options/index.js +200 -0
  46. package/build/core/drawer-router-state/index.d.ts +21 -0
  47. package/build/core/drawer-router-state/index.js +40 -0
  48. package/build/core/guards.d.ts +2 -0
  49. package/build/core/guards.js +22 -0
  50. package/build/core/header-bar-buttons.d.ts +9 -0
  51. package/build/core/header-bar-buttons.js +163 -0
  52. package/build/core/index.d.ts +29 -0
  53. package/build/core/index.js +32 -0
  54. package/build/core/linking-config/index.d.ts +13 -0
  55. package/build/core/linking-config/index.js +171 -0
  56. package/build/core/navigation-events/index.d.ts +16 -0
  57. package/build/core/navigation-events/index.js +57 -0
  58. package/build/core/navigator-handles/index.d.ts +30 -0
  59. package/build/core/navigator-handles/index.js +15 -0
  60. package/build/core/navigator-props.d.ts +216 -0
  61. package/build/core/navigator-props.js +7 -0
  62. package/build/core/navigator-state/index.d.ts +36 -0
  63. package/build/core/navigator-state/index.js +81 -0
  64. package/build/core/render-drawer.d.ts +13 -0
  65. package/build/core/render-drawer.js +88 -0
  66. package/build/core/render-stack.d.ts +35 -0
  67. package/build/core/render-stack.js +294 -0
  68. package/build/core/render-tabs.d.ts +20 -0
  69. package/build/core/render-tabs.js +97 -0
  70. package/build/core/screen-options.d.ts +4 -0
  71. package/build/core/screen-options.js +133 -0
  72. package/build/core/search-bar-commands.d.ts +10 -0
  73. package/build/core/search-bar-commands.js +42 -0
  74. package/build/core/state-persistence/index.d.ts +3 -0
  75. package/build/core/state-persistence/index.js +23 -0
  76. package/build/core/tab-options.d.ts +13 -0
  77. package/build/core/tab-options.js +10 -0
  78. package/build/core/tab-router-state/index.d.ts +19 -0
  79. package/build/core/tab-router-state/index.js +51 -0
  80. package/build/react/collect-registry.d.ts +4 -0
  81. package/build/react/collect-registry.js +15 -0
  82. package/build/react/drawer/index.d.ts +29 -0
  83. package/build/react/drawer/index.js +277 -0
  84. package/build/react/drawer-screen.d.ts +14 -0
  85. package/build/react/drawer-screen.js +8 -0
  86. package/build/react/hooks/index.d.ts +12 -0
  87. package/build/react/hooks/index.js +8 -0
  88. package/build/react/hooks/use-drawer-navigation.d.ts +4 -0
  89. package/build/react/hooks/use-drawer-navigation.js +12 -0
  90. package/build/react/hooks/use-focus-effect.d.ts +2 -0
  91. package/build/react/hooks/use-focus-effect.js +29 -0
  92. package/build/react/hooks/use-is-focused.d.ts +1 -0
  93. package/build/react/hooks/use-is-focused.js +22 -0
  94. package/build/react/hooks/use-navigation-state/index.d.ts +2 -0
  95. package/build/react/hooks/use-navigation-state/index.js +39 -0
  96. package/build/react/hooks/use-navigation.d.ts +7 -0
  97. package/build/react/hooks/use-navigation.js +16 -0
  98. package/build/react/hooks/use-route.d.ts +2 -0
  99. package/build/react/hooks/use-route.js +8 -0
  100. package/build/react/hooks/use-stack-navigation.d.ts +4 -0
  101. package/build/react/hooks/use-stack-navigation.js +14 -0
  102. package/build/react/hooks/use-tab-navigation.d.ts +4 -0
  103. package/build/react/hooks/use-tab-navigation.js +12 -0
  104. package/build/react/index.d.ts +24 -0
  105. package/build/react/index.js +21 -0
  106. package/build/react/linking.d.ts +3 -0
  107. package/build/react/linking.js +47 -0
  108. package/build/react/navigation-context.d.ts +10 -0
  109. package/build/react/navigation-context.js +22 -0
  110. package/build/react/screen.d.ts +22 -0
  111. package/build/react/screen.js +7 -0
  112. package/build/react/stack/index.d.ts +13 -0
  113. package/build/react/stack/index.js +202 -0
  114. package/build/react/tab-screen.d.ts +15 -0
  115. package/build/react/tab-screen.js +8 -0
  116. package/build/react/tabs/index.d.ts +12 -0
  117. package/build/react/tabs/index.js +116 -0
  118. package/build/register.d.ts +7 -0
  119. package/build/register.js +58 -0
  120. package/build/vue/composables/index.d.ts +12 -0
  121. package/build/vue/composables/index.js +8 -0
  122. package/build/vue/composables/use-drawer-navigation.d.ts +5 -0
  123. package/build/vue/composables/use-drawer-navigation.js +15 -0
  124. package/build/vue/composables/use-focus-effect.d.ts +1 -0
  125. package/build/vue/composables/use-focus-effect.js +31 -0
  126. package/build/vue/composables/use-is-focused.d.ts +2 -0
  127. package/build/vue/composables/use-is-focused.js +28 -0
  128. package/build/vue/composables/use-navigation-state.d.ts +3 -0
  129. package/build/vue/composables/use-navigation-state.js +29 -0
  130. package/build/vue/composables/use-navigation.d.ts +8 -0
  131. package/build/vue/composables/use-navigation.js +13 -0
  132. package/build/vue/composables/use-route.d.ts +3 -0
  133. package/build/vue/composables/use-route.js +9 -0
  134. package/build/vue/composables/use-stack-navigation.d.ts +5 -0
  135. package/build/vue/composables/use-stack-navigation.js +18 -0
  136. package/build/vue/composables/use-tab-navigation.d.ts +5 -0
  137. package/build/vue/composables/use-tab-navigation.js +15 -0
  138. package/build/vue/drawer/index.d.ts +19 -0
  139. package/build/vue/drawer/index.js +390 -0
  140. package/build/vue/drawer-screen.d.ts +14 -0
  141. package/build/vue/drawer-screen.js +12 -0
  142. package/build/vue/index.d.ts +21 -0
  143. package/build/vue/index.js +19 -0
  144. package/build/vue/linking.d.ts +3 -0
  145. package/build/vue/linking.js +57 -0
  146. package/build/vue/navigation-context.d.ts +16 -0
  147. package/build/vue/navigation-context.js +65 -0
  148. package/build/vue/screen.d.ts +21 -0
  149. package/build/vue/screen.js +12 -0
  150. package/build/vue/stack/index.d.ts +9 -0
  151. package/build/vue/stack/index.js +279 -0
  152. package/build/vue/tab-screen.d.ts +14 -0
  153. package/build/vue/tab-screen.js +11 -0
  154. package/build/vue/tabs/index.d.ts +10 -0
  155. package/build/vue/tabs/index.js +209 -0
  156. package/build-ngc/angular/drawer/index.d.ts +79 -0
  157. package/build-ngc/angular/drawer/index.js +479 -0
  158. package/build-ngc/angular/drawer/index.js.map +1 -0
  159. package/build-ngc/angular/drawer-screen.directive.d.ts +17 -0
  160. package/build-ngc/angular/drawer-screen.directive.js +32 -0
  161. package/build-ngc/angular/drawer-screen.directive.js.map +1 -0
  162. package/build-ngc/angular/drawer.d.ts +79 -0
  163. package/build-ngc/angular/drawer.js +475 -0
  164. package/build-ngc/angular/drawer.js.map +1 -0
  165. package/build-ngc/angular/index.d.ts +23 -0
  166. package/build-ngc/angular/index.js +23 -0
  167. package/build-ngc/angular/index.js.map +1 -0
  168. package/build-ngc/angular/injectors/index.d.ts +13 -0
  169. package/build-ngc/angular/injectors/index.js +9 -0
  170. package/build-ngc/angular/injectors/index.js.map +1 -0
  171. package/build-ngc/angular/injectors/inject-drawer-navigation.d.ts +4 -0
  172. package/build-ngc/angular/injectors/inject-drawer-navigation.js +13 -0
  173. package/build-ngc/angular/injectors/inject-drawer-navigation.js.map +1 -0
  174. package/build-ngc/angular/injectors/inject-focus-effect.d.ts +2 -0
  175. package/build-ngc/angular/injectors/inject-focus-effect.js +30 -0
  176. package/build-ngc/angular/injectors/inject-focus-effect.js.map +1 -0
  177. package/build-ngc/angular/injectors/inject-is-focused.d.ts +2 -0
  178. package/build-ngc/angular/injectors/inject-is-focused.js +22 -0
  179. package/build-ngc/angular/injectors/inject-is-focused.js.map +1 -0
  180. package/build-ngc/angular/injectors/inject-navigation-state.d.ts +3 -0
  181. package/build-ngc/angular/injectors/inject-navigation-state.js +37 -0
  182. package/build-ngc/angular/injectors/inject-navigation-state.js.map +1 -0
  183. package/build-ngc/angular/injectors/inject-navigation.d.ts +7 -0
  184. package/build-ngc/angular/injectors/inject-navigation.js +17 -0
  185. package/build-ngc/angular/injectors/inject-navigation.js.map +1 -0
  186. package/build-ngc/angular/injectors/inject-route.d.ts +3 -0
  187. package/build-ngc/angular/injectors/inject-route.js +21 -0
  188. package/build-ngc/angular/injectors/inject-route.js.map +1 -0
  189. package/build-ngc/angular/injectors/inject-stack-navigation.d.ts +4 -0
  190. package/build-ngc/angular/injectors/inject-stack-navigation.js +16 -0
  191. package/build-ngc/angular/injectors/inject-stack-navigation.js.map +1 -0
  192. package/build-ngc/angular/injectors/inject-tab-navigation.d.ts +4 -0
  193. package/build-ngc/angular/injectors/inject-tab-navigation.js +12 -0
  194. package/build-ngc/angular/injectors/inject-tab-navigation.js.map +1 -0
  195. package/build-ngc/angular/linking.d.ts +3 -0
  196. package/build-ngc/angular/linking.js +44 -0
  197. package/build-ngc/angular/linking.js.map +1 -0
  198. package/build-ngc/angular/navigation-context.service.d.ts +16 -0
  199. package/build-ngc/angular/navigation-context.service.js +63 -0
  200. package/build-ngc/angular/navigation-context.service.js.map +1 -0
  201. package/build-ngc/angular/navigation-scope.directive.d.ts +13 -0
  202. package/build-ngc/angular/navigation-scope.directive.js +42 -0
  203. package/build-ngc/angular/navigation-scope.directive.js.map +1 -0
  204. package/build-ngc/angular/screen.directive.d.ts +25 -0
  205. package/build-ngc/angular/screen.directive.js +35 -0
  206. package/build-ngc/angular/screen.directive.js.map +1 -0
  207. package/build-ngc/angular/search-bar-ref.directive.d.ts +13 -0
  208. package/build-ngc/angular/search-bar-ref.directive.js +44 -0
  209. package/build-ngc/angular/search-bar-ref.directive.js.map +1 -0
  210. package/build-ngc/angular/stack/index.d.ts +58 -0
  211. package/build-ngc/angular/stack/index.js +406 -0
  212. package/build-ngc/angular/stack/index.js.map +1 -0
  213. package/build-ngc/angular/stack.d.ts +58 -0
  214. package/build-ngc/angular/stack.js +402 -0
  215. package/build-ngc/angular/stack.js.map +1 -0
  216. package/build-ngc/angular/tab-screen.directive.d.ts +17 -0
  217. package/build-ngc/angular/tab-screen.directive.js +32 -0
  218. package/build-ngc/angular/tab-screen.directive.js.map +1 -0
  219. package/build-ngc/angular/tabs/index.d.ts +45 -0
  220. package/build-ngc/angular/tabs/index.js +231 -0
  221. package/build-ngc/angular/tabs/index.js.map +1 -0
  222. package/build-ngc/angular/tabs.d.ts +45 -0
  223. package/build-ngc/angular/tabs.js +231 -0
  224. package/build-ngc/angular/tabs.js.map +1 -0
  225. package/build-ngc/core/constants.d.ts +27 -0
  226. package/build-ngc/core/constants.js +62 -0
  227. package/build-ngc/core/constants.js.map +1 -0
  228. package/build-ngc/core/drawer-options/index.d.ts +64 -0
  229. package/build-ngc/core/drawer-options/index.js +201 -0
  230. package/build-ngc/core/drawer-options/index.js.map +1 -0
  231. package/build-ngc/core/drawer-options.d.ts +64 -0
  232. package/build-ngc/core/drawer-options.js +201 -0
  233. package/build-ngc/core/drawer-options.js.map +1 -0
  234. package/build-ngc/core/drawer-router-state/index.d.ts +21 -0
  235. package/build-ngc/core/drawer-router-state/index.js +41 -0
  236. package/build-ngc/core/drawer-router-state/index.js.map +1 -0
  237. package/build-ngc/core/drawer-router-state.d.ts +21 -0
  238. package/build-ngc/core/drawer-router-state.js +41 -0
  239. package/build-ngc/core/drawer-router-state.js.map +1 -0
  240. package/build-ngc/core/guards.d.ts +2 -0
  241. package/build-ngc/core/guards.js +23 -0
  242. package/build-ngc/core/guards.js.map +1 -0
  243. package/build-ngc/core/header-bar-buttons.d.ts +9 -0
  244. package/build-ngc/core/header-bar-buttons.js +164 -0
  245. package/build-ngc/core/header-bar-buttons.js.map +1 -0
  246. package/build-ngc/core/href.d.ts +16 -0
  247. package/build-ngc/core/href.js +55 -0
  248. package/build-ngc/core/href.js.map +1 -0
  249. package/build-ngc/core/index.d.ts +29 -0
  250. package/build-ngc/core/index.js +33 -0
  251. package/build-ngc/core/index.js.map +1 -0
  252. package/build-ngc/core/linking-config/index.d.ts +13 -0
  253. package/build-ngc/core/linking-config/index.js +172 -0
  254. package/build-ngc/core/linking-config/index.js.map +1 -0
  255. package/build-ngc/core/linking-config.d.ts +13 -0
  256. package/build-ngc/core/linking-config.js +172 -0
  257. package/build-ngc/core/linking-config.js.map +1 -0
  258. package/build-ngc/core/navigation-events/index.d.ts +16 -0
  259. package/build-ngc/core/navigation-events/index.js +58 -0
  260. package/build-ngc/core/navigation-events/index.js.map +1 -0
  261. package/build-ngc/core/navigation-events.d.ts +16 -0
  262. package/build-ngc/core/navigation-events.js +58 -0
  263. package/build-ngc/core/navigation-events.js.map +1 -0
  264. package/build-ngc/core/navigator-handles/index.d.ts +30 -0
  265. package/build-ngc/core/navigator-handles/index.js +16 -0
  266. package/build-ngc/core/navigator-handles/index.js.map +1 -0
  267. package/build-ngc/core/navigator-handles.d.ts +30 -0
  268. package/build-ngc/core/navigator-handles.js +16 -0
  269. package/build-ngc/core/navigator-handles.js.map +1 -0
  270. package/build-ngc/core/navigator-props.d.ts +216 -0
  271. package/build-ngc/core/navigator-props.js +8 -0
  272. package/build-ngc/core/navigator-props.js.map +1 -0
  273. package/build-ngc/core/navigator-state/index.d.ts +36 -0
  274. package/build-ngc/core/navigator-state/index.js +82 -0
  275. package/build-ngc/core/navigator-state/index.js.map +1 -0
  276. package/build-ngc/core/navigator-state.d.ts +36 -0
  277. package/build-ngc/core/navigator-state.js +82 -0
  278. package/build-ngc/core/navigator-state.js.map +1 -0
  279. package/build-ngc/core/render-drawer.d.ts +13 -0
  280. package/build-ngc/core/render-drawer.js +89 -0
  281. package/build-ngc/core/render-drawer.js.map +1 -0
  282. package/build-ngc/core/render-stack.d.ts +35 -0
  283. package/build-ngc/core/render-stack.js +295 -0
  284. package/build-ngc/core/render-stack.js.map +1 -0
  285. package/build-ngc/core/render-tabs.d.ts +20 -0
  286. package/build-ngc/core/render-tabs.js +98 -0
  287. package/build-ngc/core/render-tabs.js.map +1 -0
  288. package/build-ngc/core/screen-options.d.ts +4 -0
  289. package/build-ngc/core/screen-options.js +134 -0
  290. package/build-ngc/core/screen-options.js.map +1 -0
  291. package/build-ngc/core/search-bar-commands.d.ts +10 -0
  292. package/build-ngc/core/search-bar-commands.js +43 -0
  293. package/build-ngc/core/search-bar-commands.js.map +1 -0
  294. package/build-ngc/core/search-params.d.ts +9 -0
  295. package/build-ngc/core/search-params.js +60 -0
  296. package/build-ngc/core/search-params.js.map +1 -0
  297. package/build-ngc/core/state-persistence/index.d.ts +3 -0
  298. package/build-ngc/core/state-persistence/index.js +24 -0
  299. package/build-ngc/core/state-persistence/index.js.map +1 -0
  300. package/build-ngc/core/state-persistence.d.ts +3 -0
  301. package/build-ngc/core/state-persistence.js +24 -0
  302. package/build-ngc/core/state-persistence.js.map +1 -0
  303. package/build-ngc/core/tab-options.d.ts +13 -0
  304. package/build-ngc/core/tab-options.js +11 -0
  305. package/build-ngc/core/tab-options.js.map +1 -0
  306. package/build-ngc/core/tab-router-state/index.d.ts +19 -0
  307. package/build-ngc/core/tab-router-state/index.js +52 -0
  308. package/build-ngc/core/tab-router-state/index.js.map +1 -0
  309. package/build-ngc/core/tab-router-state.d.ts +19 -0
  310. package/build-ngc/core/tab-router-state.js +52 -0
  311. package/build-ngc/core/tab-router-state.js.map +1 -0
  312. package/build-ngc/register.d.ts +7 -0
  313. package/build-ngc/register.js +59 -0
  314. package/build-ngc/register.js.map +1 -0
  315. package/codegen-specs/FullWindowOverlayNativeComponent.ts +13 -0
  316. package/codegen-specs/ModalScreenNativeComponent.ts +129 -0
  317. package/codegen-specs/NativeScreensModule.ts +8 -0
  318. package/codegen-specs/NativeScreensModule.web.ts +1 -0
  319. package/codegen-specs/ScreenContainerNativeComponent.ts +8 -0
  320. package/codegen-specs/ScreenContentWrapperNativeComponent.ts +9 -0
  321. package/codegen-specs/ScreenFooterNativeComponent.ts +6 -0
  322. package/codegen-specs/ScreenNativeComponent.ts +133 -0
  323. package/codegen-specs/ScreenNavigationContainerNativeComponent.ts +11 -0
  324. package/codegen-specs/ScreenStackHeaderConfigNativeComponent.ts +99 -0
  325. package/codegen-specs/ScreenStackHeaderSubviewNativeComponent.ts +25 -0
  326. package/codegen-specs/ScreenStackNativeComponent.ts +17 -0
  327. package/codegen-specs/SearchBarNativeComponent.ts +101 -0
  328. package/codegen-specs/codegenUtils.ts +6 -0
  329. package/codegen-specs/gamma/ScrollViewMarkerNativeComponent.ts +15 -0
  330. package/codegen-specs/gamma/modals/form-sheet/FormSheetContentWrapperNativeComponent.ts +10 -0
  331. package/codegen-specs/gamma/modals/form-sheet/FormSheetHostNativeComponent.ts +47 -0
  332. package/codegen-specs/gamma/split/SplitHostNativeComponent.ts +124 -0
  333. package/codegen-specs/gamma/split/SplitScreenNativeComponent.ts +24 -0
  334. package/codegen-specs/gamma/stack/StackHeaderConfigAndroidNativeComponent.ts +144 -0
  335. package/codegen-specs/gamma/stack/StackHeaderConfigIOSNativeComponent.ts +34 -0
  336. package/codegen-specs/gamma/stack/StackHeaderItemIOSNativeComponent.ts +47 -0
  337. package/codegen-specs/gamma/stack/StackHeaderItemSpacerIOSNativeComponent.ts +20 -0
  338. package/codegen-specs/gamma/stack/StackHeaderSubviewAndroidNativeComponent.ts +27 -0
  339. package/codegen-specs/gamma/stack/StackHostNativeComponent.ts +8 -0
  340. package/codegen-specs/gamma/stack/StackScreenNativeComponent.ts +42 -0
  341. package/codegen-specs/safe-area/SafeAreaViewNativeComponent.ts +24 -0
  342. package/codegen-specs/tabs/TabsBottomAccessoryContentNativeComponent.ts +15 -0
  343. package/codegen-specs/tabs/TabsBottomAccessoryNativeComponent.ts +19 -0
  344. package/codegen-specs/tabs/TabsHostAndroidNativeComponent.ts +69 -0
  345. package/codegen-specs/tabs/TabsHostIOSNativeComponent.ts +92 -0
  346. package/codegen-specs/tabs/TabsScreenAndroidNativeComponent.ts +112 -0
  347. package/codegen-specs/tabs/TabsScreenIOSNativeComponent.ts +171 -0
  348. package/package.json +201 -0
  349. package/react-native.config.cjs +58 -0
  350. package/src/angular/drawer/drawer.test.ts +299 -0
  351. package/src/angular/drawer/index.ts +546 -0
  352. package/src/angular/drawer-screen.directive.ts +28 -0
  353. package/src/angular/index.ts +63 -0
  354. package/src/angular/injectors/index.ts +13 -0
  355. package/src/angular/injectors/inject-drawer-navigation.ts +21 -0
  356. package/src/angular/injectors/inject-focus-effect.ts +37 -0
  357. package/src/angular/injectors/inject-is-focused.ts +28 -0
  358. package/src/angular/injectors/inject-navigation-state.ts +46 -0
  359. package/src/angular/injectors/inject-navigation.ts +26 -0
  360. package/src/angular/injectors/inject-route.ts +25 -0
  361. package/src/angular/injectors/inject-stack-navigation.ts +24 -0
  362. package/src/angular/injectors/inject-tab-navigation.ts +20 -0
  363. package/src/angular/injectors/injectors.test.ts +247 -0
  364. package/src/angular/injectors/use-typed-navigation.test.ts +229 -0
  365. package/src/angular/linking.ts +55 -0
  366. package/src/angular/navigation-context.service.ts +68 -0
  367. package/src/angular/navigation-scope.directive.ts +31 -0
  368. package/src/angular/nested-navigation.test.ts +189 -0
  369. package/src/angular/screen.directive.ts +48 -0
  370. package/src/angular/search-bar-ref.directive.ts +38 -0
  371. package/src/angular/stack/index.ts +401 -0
  372. package/src/angular/stack/stack.test.ts +419 -0
  373. package/src/angular/tab-screen.directive.ts +26 -0
  374. package/src/angular/tabs/index.ts +254 -0
  375. package/src/angular/tabs/tabs.test.ts +249 -0
  376. package/src/core/constants.ts +68 -0
  377. package/src/core/drawer-options/drawer-options.test.ts +415 -0
  378. package/src/core/drawer-options/index.ts +331 -0
  379. package/src/core/drawer-router-state/drawer-router-state.test.ts +116 -0
  380. package/src/core/drawer-router-state/index.ts +71 -0
  381. package/src/core/guards.ts +23 -0
  382. package/src/core/header-bar-buttons.ts +212 -0
  383. package/src/core/index.ts +170 -0
  384. package/src/core/linking-config/index.ts +209 -0
  385. package/src/core/linking-config/linking-config.test.ts +109 -0
  386. package/src/core/navigation-events/index.ts +94 -0
  387. package/src/core/navigation-events/navigation-events.test.ts +56 -0
  388. package/src/core/navigator-handles/index.ts +63 -0
  389. package/src/core/navigator-handles/navigator-handles.test.ts +46 -0
  390. package/src/core/navigator-props.ts +323 -0
  391. package/src/core/navigator-state/index.ts +112 -0
  392. package/src/core/navigator-state/navigator-state.test.ts +80 -0
  393. package/src/core/render-drawer.ts +123 -0
  394. package/src/core/render-stack.ts +414 -0
  395. package/src/core/render-tabs.ts +138 -0
  396. package/src/core/screen-options.ts +181 -0
  397. package/src/core/search-bar-commands.ts +57 -0
  398. package/src/core/state-persistence/index.ts +30 -0
  399. package/src/core/state-persistence/state-persistence.test.ts +42 -0
  400. package/src/core/tab-options.ts +25 -0
  401. package/src/core/tab-router-state/index.ts +75 -0
  402. package/src/core/tab-router-state/tab-router-state.test.ts +34 -0
  403. package/src/globals.d.ts +4 -0
  404. package/src/react/collect-registry.ts +19 -0
  405. package/src/react/drawer/drawer.test.tsx +472 -0
  406. package/src/react/drawer/index.ts +451 -0
  407. package/src/react/drawer-screen.ts +29 -0
  408. package/src/react/hooks/hooks.test.tsx +199 -0
  409. package/src/react/hooks/index.ts +12 -0
  410. package/src/react/hooks/use-drawer-navigation.ts +21 -0
  411. package/src/react/hooks/use-focus-effect.ts +36 -0
  412. package/src/react/hooks/use-is-focused.ts +26 -0
  413. package/src/react/hooks/use-navigation-state/index.ts +47 -0
  414. package/src/react/hooks/use-navigation-state/use-navigation-state.test.ts +85 -0
  415. package/src/react/hooks/use-navigation.ts +36 -0
  416. package/src/react/hooks/use-route.ts +11 -0
  417. package/src/react/hooks/use-stack-navigation.ts +23 -0
  418. package/src/react/hooks/use-tab-navigation.ts +21 -0
  419. package/src/react/hooks/use-typed-navigation.test.tsx +187 -0
  420. package/src/react/index.ts +52 -0
  421. package/src/react/linking.ts +59 -0
  422. package/src/react/navigation-context.ts +40 -0
  423. package/src/react/nested-navigation.test.tsx +145 -0
  424. package/src/react/screen.ts +44 -0
  425. package/src/react/stack/index.ts +323 -0
  426. package/src/react/stack/stack.test.tsx +514 -0
  427. package/src/react/tab-screen.ts +30 -0
  428. package/src/react/tabs/index.ts +204 -0
  429. package/src/react/tabs/tabs.test.tsx +256 -0
  430. package/src/register.ts +59 -0
  431. package/src/vue/composables/composables.test.ts +221 -0
  432. package/src/vue/composables/index.ts +12 -0
  433. package/src/vue/composables/use-drawer-navigation.ts +25 -0
  434. package/src/vue/composables/use-focus-effect.ts +37 -0
  435. package/src/vue/composables/use-is-focused.ts +34 -0
  436. package/src/vue/composables/use-navigation-state.ts +38 -0
  437. package/src/vue/composables/use-navigation.ts +30 -0
  438. package/src/vue/composables/use-route.ts +13 -0
  439. package/src/vue/composables/use-stack-navigation.ts +28 -0
  440. package/src/vue/composables/use-tab-navigation.ts +25 -0
  441. package/src/vue/composables/use-typed-navigation.test.ts +205 -0
  442. package/src/vue/drawer/drawer.test.ts +451 -0
  443. package/src/vue/drawer/index.ts +550 -0
  444. package/src/vue/drawer-screen.ts +32 -0
  445. package/src/vue/index.ts +70 -0
  446. package/src/vue/linking.ts +69 -0
  447. package/src/vue/navigation-context.ts +87 -0
  448. package/src/vue/nested-navigation.test.ts +155 -0
  449. package/src/vue/screen.ts +52 -0
  450. package/src/vue/stack/index.ts +376 -0
  451. package/src/vue/stack/stack.test.ts +501 -0
  452. package/src/vue/tab-screen.ts +29 -0
  453. package/src/vue/tabs/index.ts +302 -0
  454. package/src/vue/tabs/tabs.test.ts +278 -0
  455. package/symbiote-navigation.podspec +84 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 A. Prokopenko
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,76 @@
1
+ import { TemplateRef, type AfterContentInit, type OnChanges, type OnDestroy, type Type } from '@angular/core';
2
+ import { type IStyleProp, type IViewStyle } from '@symbiote-native/engine';
3
+ import type { IDrawerDescriptorMap, IDrawerNavigatorHandle, IDrawerPosition, IDrawerRouterState, IDrawerSlot, IDrawerType, INavigationEmitter, IRoute } from '../../core';
4
+ export type { IDrawerNavigatorHandle, IDrawerDescriptorMap } from '../../core';
5
+ export type IDrawerContentContext = {
6
+ $implicit: {
7
+ state: IDrawerRouterState;
8
+ descriptors: IDrawerDescriptorMap;
9
+ navigation: IDrawerNavigatorHandle;
10
+ };
11
+ };
12
+ export declare class Drawer implements AfterContentInit, OnChanges, OnDestroy, IDrawerNavigatorHandle {
13
+ private readonly drawerScreenChildren;
14
+ drawerContentTemplate?: TemplateRef<IDrawerContentContext>;
15
+ initialRouteName?: string;
16
+ drawerStyle?: IStyleProp<IViewStyle>;
17
+ drawerType?: IDrawerType;
18
+ drawerPosition?: IDrawerPosition;
19
+ drawerWidth?: number;
20
+ overlayColor?: string;
21
+ swipeEnabled?: boolean;
22
+ swipeEdgeWidth?: number;
23
+ swipeMinDistance?: number;
24
+ swipeMinVelocity?: number;
25
+ private readonly windowDimensions;
26
+ private readonly routeIdPrefix;
27
+ private readonly registry;
28
+ private drawerScreenChildrenSubscription;
29
+ private readonly stateSignal;
30
+ readonly state: import("@angular/core").Signal<Readonly<{
31
+ routes: readonly Readonly<{
32
+ key: string;
33
+ name: string;
34
+ params: unknown;
35
+ }>[];
36
+ index: number;
37
+ isOpen: boolean;
38
+ }> | undefined>;
39
+ private currentEmitterKey;
40
+ private currentEmitter;
41
+ private readonly progress;
42
+ private dragStartProgress;
43
+ readonly openDrawer: () => void;
44
+ readonly closeDrawer: () => void;
45
+ readonly toggleDrawer: () => void;
46
+ readonly jumpTo: (name: string) => void;
47
+ readonly panResponder: import("@symbiote-native/engine").IPanResponderInstance;
48
+ ngAfterContentInit(): void;
49
+ ngOnDestroy(): void;
50
+ private rebuildRegistry;
51
+ private routesFromRegistry;
52
+ private initializeState;
53
+ private dispatch;
54
+ private animateProgressTo;
55
+ private readonly optionsSnapshot;
56
+ private readonly drawerStyleSnapshot;
57
+ ngOnChanges(): void;
58
+ private buildOptionsSnapshot;
59
+ private overlayResponderPassthrough;
60
+ private readonly drawerRoot;
61
+ private readonly slotsMap;
62
+ isAnimated(): boolean;
63
+ slotOrder(): readonly IDrawerSlot[];
64
+ rootStyle(): Record<string, unknown>;
65
+ rootPanHandlers(): Record<string, unknown>;
66
+ slotAnimatedProps(slot: IDrawerSlot): Record<string, unknown>;
67
+ private slotStyle;
68
+ contentStyle(): Record<string, unknown>;
69
+ overlayStyle(): Record<string, unknown>;
70
+ panelStyle(): Record<string, unknown>;
71
+ focusedRoute(): IRoute<unknown> | undefined;
72
+ componentForRoute(route: IRoute<unknown>): Type<unknown> | null;
73
+ private resolveDrawerScreenOptions;
74
+ focusedRouteEmitter(): INavigationEmitter;
75
+ drawerContentContext(currentState: IDrawerRouterState): IDrawerContentContext;
76
+ }
@@ -0,0 +1,508 @@
1
+ // Drawer, the Angular lifecycle half. The open/closed + focused-route router
2
+ // (drawer-router-state) and the pure swipe/geometry math (drawer-options) live in
3
+ // @symbiote-native/navigation core, shared verbatim with the React/Vue adapters; here Angular
4
+ // supplies the lifecycle - a signal-backed router, a PanResponder (RN's own idiom, framework-
5
+ // agnostic per `@symbiote-native/engine` - built ONCE as a class field, callbacks read LIVE `this`
6
+ // state at call time, no ref-mirroring dance needed the way react/drawer.ts's `useRef`s are: a
7
+ // class instance already gives every callback a live view of current state, closing the exact gap
8
+ // React's own hook rules force it to work around), an Animated.Value driving the slide/opacity
9
+ // transforms via the real `AnimatedView` component (`@symbiote-native/angular`), and
10
+ // `openDrawer`/`closeDrawer`/`toggleDrawer`/`jumpTo` as plain public methods directly on the class,
11
+ // mirroring tabs.ts's shape (Tab is the closer sibling: both are fixed-route-list,
12
+ // no-react-native-screens navigators; Stack's push/pop + native-screen bridging don't apply here;
13
+ // `Drawer implements IDrawerNavigatorHandle`).
14
+ //
15
+ // FEASIBILITY NOTE (mirrors react/drawer.ts's own header): the REAL @react-navigation/drawer is
16
+ // built on react-native-gesture-handler + react-native-reanimated, neither of which this codebase
17
+ // depends on. This reaches the same swipe-to-open/close + front/back/slide/permanent behavior with
18
+ // only PanResponder + Animated, sufficient for a solid drawer but NOT byte-for-byte parity - same
19
+ // explicit gap list as react/drawer.ts's tail comment (not repeated here, nothing Angular-specific
20
+ // changes it).
21
+ //
22
+ // RESOLVED (see stack.ts's header, identical reasoning): `'Drawer'` has an `ANCHOR_HOST_COMPONENTS`
23
+ // entry in `adapters/angular/src/renderer.ts`, so a real device build paints `<Drawer>` correctly
24
+ // as a nested tag. `View`/`AnimatedView`, imported below, were already anchor-hosted.
25
+ //
26
+ // DRAWER CONTENT PROJECTION: react/drawer.ts's `renderDrawerContent` is a render-PROP callback
27
+ // (`(props) => ReactNode`) - per CLAUDE.md's <prop_types_split_agnostic_vs_per_adapter>, a
28
+ // render-callback returning a framework element is inherently per-adapter. Angular's own idiom for
29
+ // "a caller-supplied template that needs live data" is a `TemplateRef` + `NgTemplateOutlet` with a
30
+ // context object, NOT a callback @Input(): `<Drawer><ng-template #drawerContent let-ctx>...
31
+ // {{ ctx.state }}...</ng-template></Drawer>`, read here via `@ContentChild('drawerContent', {read:
32
+ // TemplateRef})`.
33
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
34
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
35
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
36
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
37
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
38
+ var _, done = false;
39
+ for (var i = decorators.length - 1; i >= 0; i--) {
40
+ var context = {};
41
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
42
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
43
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
44
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
45
+ if (kind === "accessor") {
46
+ if (result === void 0) continue;
47
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
48
+ if (_ = accept(result.get)) descriptor.get = _;
49
+ if (_ = accept(result.set)) descriptor.set = _;
50
+ if (_ = accept(result.init)) initializers.unshift(_);
51
+ }
52
+ else if (_ = accept(result)) {
53
+ if (kind === "field") initializers.unshift(_);
54
+ else descriptor[key] = _;
55
+ }
56
+ }
57
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
58
+ done = true;
59
+ };
60
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
61
+ var useValue = arguments.length > 2;
62
+ for (var i = 0; i < initializers.length; i++) {
63
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
64
+ }
65
+ return useValue ? value : void 0;
66
+ };
67
+ import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, Input, QueryList, TemplateRef, computed, inject, signal, untracked, } from '@angular/core';
68
+ import { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';
69
+ import { PanResponder, dlog, flattenStyle, } from '@symbiote-native/engine';
70
+ import { Animated, AnimatedView, SymbioteHostPropsDirective, View, WindowDimensionsService, } from '@symbiote-native/angular';
71
+ import { DRAWER_DEFAULT_OVERLAY_COLOR, NAVIGATION_EVENT_BLUR, NAVIGATION_EVENT_FOCUS, createInitialDrawerRouterState, createNavigationEmitter, diffFocusedRoute, drawerChildOrder, drawerRouterReducer, isDrawerAnimated, renderDrawer, resolveDragProgress, resolveDrawerGeometry, resolveDrawerSlotInterpolation, resolveSwipeIntent, shouldClaimDrawerSwipe, } from '../../core/index.js';
72
+ import { NavigationScopeDirective } from '../navigation-scope.directive.js';
73
+ import { DrawerScreenDirective } from '../drawer-screen.directive.js';
74
+ const DRAWER_SNAP_DURATION = 250;
75
+ let drawerInstanceCounter = 0;
76
+ let Drawer = (() => {
77
+ let _classDecorators = [Component({
78
+ selector: 'Drawer',
79
+ standalone: true,
80
+ imports: [
81
+ NgComponentOutlet,
82
+ NgTemplateOutlet,
83
+ NavigationScopeDirective,
84
+ SymbioteHostPropsDirective,
85
+ View,
86
+ AnimatedView,
87
+ ],
88
+ changeDetection: ChangeDetectionStrategy.OnPush,
89
+ template: `
90
+ @if (state(); as currentState) {
91
+ <View [style]="rootStyle()" [symbioteHostProps]="rootPanHandlers()">
92
+ @for (slot of slotOrder(); track slot) {
93
+ @switch (slot) {
94
+ @case ('content') {
95
+ <AnimatedView [style]="contentStyle()" [animatedProps]="slotAnimatedProps('content')">
96
+ @if (focusedRoute(); as route) {
97
+ @if (componentForRoute(route); as component) {
98
+ <ng-container
99
+ [symbioteNavigationScope]="route"
100
+ [navigation]="this"
101
+ [emitter]="focusedRouteEmitter()"
102
+ >
103
+ <ng-container *ngComponentOutlet="component" />
104
+ </ng-container>
105
+ }
106
+ }
107
+ </AnimatedView>
108
+ }
109
+ @case ('overlay') {
110
+ <AnimatedView
111
+ [style]="overlayStyle()"
112
+ [animatedProps]="slotAnimatedProps('overlay')"
113
+ />
114
+ }
115
+ @case ('panel') {
116
+ <AnimatedView [style]="panelStyle()" [animatedProps]="slotAnimatedProps('panel')">
117
+ @if (drawerContentTemplate) {
118
+ <ng-container
119
+ *ngTemplateOutlet="
120
+ drawerContentTemplate;
121
+ context: drawerContentContext(currentState)
122
+ "
123
+ />
124
+ }
125
+ </AnimatedView>
126
+ }
127
+ }
128
+ }
129
+ </View>
130
+ }
131
+ `,
132
+ })];
133
+ let _classDescriptor;
134
+ let _classExtraInitializers = [];
135
+ let _classThis;
136
+ let _drawerScreenChildren_decorators;
137
+ let _drawerScreenChildren_initializers = [];
138
+ let _drawerScreenChildren_extraInitializers = [];
139
+ let _drawerContentTemplate_decorators;
140
+ let _drawerContentTemplate_initializers = [];
141
+ let _drawerContentTemplate_extraInitializers = [];
142
+ let _initialRouteName_decorators;
143
+ let _initialRouteName_initializers = [];
144
+ let _initialRouteName_extraInitializers = [];
145
+ let _drawerStyle_decorators;
146
+ let _drawerStyle_initializers = [];
147
+ let _drawerStyle_extraInitializers = [];
148
+ let _drawerType_decorators;
149
+ let _drawerType_initializers = [];
150
+ let _drawerType_extraInitializers = [];
151
+ let _drawerPosition_decorators;
152
+ let _drawerPosition_initializers = [];
153
+ let _drawerPosition_extraInitializers = [];
154
+ let _drawerWidth_decorators;
155
+ let _drawerWidth_initializers = [];
156
+ let _drawerWidth_extraInitializers = [];
157
+ let _overlayColor_decorators;
158
+ let _overlayColor_initializers = [];
159
+ let _overlayColor_extraInitializers = [];
160
+ let _swipeEnabled_decorators;
161
+ let _swipeEnabled_initializers = [];
162
+ let _swipeEnabled_extraInitializers = [];
163
+ let _swipeEdgeWidth_decorators;
164
+ let _swipeEdgeWidth_initializers = [];
165
+ let _swipeEdgeWidth_extraInitializers = [];
166
+ let _swipeMinDistance_decorators;
167
+ let _swipeMinDistance_initializers = [];
168
+ let _swipeMinDistance_extraInitializers = [];
169
+ let _swipeMinVelocity_decorators;
170
+ let _swipeMinVelocity_initializers = [];
171
+ let _swipeMinVelocity_extraInitializers = [];
172
+ var Drawer = class {
173
+ static { _classThis = this; }
174
+ static {
175
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
176
+ _drawerScreenChildren_decorators = [ContentChildren(DrawerScreenDirective)];
177
+ _drawerContentTemplate_decorators = [ContentChild('drawerContent', { read: TemplateRef })];
178
+ _initialRouteName_decorators = [Input()];
179
+ _drawerStyle_decorators = [Input()];
180
+ _drawerType_decorators = [Input()];
181
+ _drawerPosition_decorators = [Input()];
182
+ _drawerWidth_decorators = [Input()];
183
+ _overlayColor_decorators = [Input()];
184
+ _swipeEnabled_decorators = [Input()];
185
+ _swipeEdgeWidth_decorators = [Input()];
186
+ _swipeMinDistance_decorators = [Input()];
187
+ _swipeMinVelocity_decorators = [Input()];
188
+ __esDecorate(null, null, _drawerScreenChildren_decorators, { kind: "field", name: "drawerScreenChildren", static: false, private: false, access: { has: obj => "drawerScreenChildren" in obj, get: obj => obj.drawerScreenChildren, set: (obj, value) => { obj.drawerScreenChildren = value; } }, metadata: _metadata }, _drawerScreenChildren_initializers, _drawerScreenChildren_extraInitializers);
189
+ __esDecorate(null, null, _drawerContentTemplate_decorators, { kind: "field", name: "drawerContentTemplate", static: false, private: false, access: { has: obj => "drawerContentTemplate" in obj, get: obj => obj.drawerContentTemplate, set: (obj, value) => { obj.drawerContentTemplate = value; } }, metadata: _metadata }, _drawerContentTemplate_initializers, _drawerContentTemplate_extraInitializers);
190
+ __esDecorate(null, null, _initialRouteName_decorators, { kind: "field", name: "initialRouteName", static: false, private: false, access: { has: obj => "initialRouteName" in obj, get: obj => obj.initialRouteName, set: (obj, value) => { obj.initialRouteName = value; } }, metadata: _metadata }, _initialRouteName_initializers, _initialRouteName_extraInitializers);
191
+ __esDecorate(null, null, _drawerStyle_decorators, { kind: "field", name: "drawerStyle", static: false, private: false, access: { has: obj => "drawerStyle" in obj, get: obj => obj.drawerStyle, set: (obj, value) => { obj.drawerStyle = value; } }, metadata: _metadata }, _drawerStyle_initializers, _drawerStyle_extraInitializers);
192
+ __esDecorate(null, null, _drawerType_decorators, { kind: "field", name: "drawerType", static: false, private: false, access: { has: obj => "drawerType" in obj, get: obj => obj.drawerType, set: (obj, value) => { obj.drawerType = value; } }, metadata: _metadata }, _drawerType_initializers, _drawerType_extraInitializers);
193
+ __esDecorate(null, null, _drawerPosition_decorators, { kind: "field", name: "drawerPosition", static: false, private: false, access: { has: obj => "drawerPosition" in obj, get: obj => obj.drawerPosition, set: (obj, value) => { obj.drawerPosition = value; } }, metadata: _metadata }, _drawerPosition_initializers, _drawerPosition_extraInitializers);
194
+ __esDecorate(null, null, _drawerWidth_decorators, { kind: "field", name: "drawerWidth", static: false, private: false, access: { has: obj => "drawerWidth" in obj, get: obj => obj.drawerWidth, set: (obj, value) => { obj.drawerWidth = value; } }, metadata: _metadata }, _drawerWidth_initializers, _drawerWidth_extraInitializers);
195
+ __esDecorate(null, null, _overlayColor_decorators, { kind: "field", name: "overlayColor", static: false, private: false, access: { has: obj => "overlayColor" in obj, get: obj => obj.overlayColor, set: (obj, value) => { obj.overlayColor = value; } }, metadata: _metadata }, _overlayColor_initializers, _overlayColor_extraInitializers);
196
+ __esDecorate(null, null, _swipeEnabled_decorators, { kind: "field", name: "swipeEnabled", static: false, private: false, access: { has: obj => "swipeEnabled" in obj, get: obj => obj.swipeEnabled, set: (obj, value) => { obj.swipeEnabled = value; } }, metadata: _metadata }, _swipeEnabled_initializers, _swipeEnabled_extraInitializers);
197
+ __esDecorate(null, null, _swipeEdgeWidth_decorators, { kind: "field", name: "swipeEdgeWidth", static: false, private: false, access: { has: obj => "swipeEdgeWidth" in obj, get: obj => obj.swipeEdgeWidth, set: (obj, value) => { obj.swipeEdgeWidth = value; } }, metadata: _metadata }, _swipeEdgeWidth_initializers, _swipeEdgeWidth_extraInitializers);
198
+ __esDecorate(null, null, _swipeMinDistance_decorators, { kind: "field", name: "swipeMinDistance", static: false, private: false, access: { has: obj => "swipeMinDistance" in obj, get: obj => obj.swipeMinDistance, set: (obj, value) => { obj.swipeMinDistance = value; } }, metadata: _metadata }, _swipeMinDistance_initializers, _swipeMinDistance_extraInitializers);
199
+ __esDecorate(null, null, _swipeMinVelocity_decorators, { kind: "field", name: "swipeMinVelocity", static: false, private: false, access: { has: obj => "swipeMinVelocity" in obj, get: obj => obj.swipeMinVelocity, set: (obj, value) => { obj.swipeMinVelocity = value; } }, metadata: _metadata }, _swipeMinVelocity_initializers, _swipeMinVelocity_extraInitializers);
200
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
201
+ Drawer = _classThis = _classDescriptor.value;
202
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
203
+ __runInitializers(_classThis, _classExtraInitializers);
204
+ }
205
+ drawerScreenChildren = __runInitializers(this, _drawerScreenChildren_initializers, void 0);
206
+ drawerContentTemplate = (__runInitializers(this, _drawerScreenChildren_extraInitializers), __runInitializers(this, _drawerContentTemplate_initializers, void 0));
207
+ initialRouteName = (__runInitializers(this, _drawerContentTemplate_extraInitializers), __runInitializers(this, _initialRouteName_initializers, void 0));
208
+ drawerStyle = (__runInitializers(this, _initialRouteName_extraInitializers), __runInitializers(this, _drawerStyle_initializers, void 0));
209
+ drawerType = (__runInitializers(this, _drawerStyle_extraInitializers), __runInitializers(this, _drawerType_initializers, void 0));
210
+ drawerPosition = (__runInitializers(this, _drawerType_extraInitializers), __runInitializers(this, _drawerPosition_initializers, void 0));
211
+ drawerWidth = (__runInitializers(this, _drawerPosition_extraInitializers), __runInitializers(this, _drawerWidth_initializers, void 0));
212
+ overlayColor = (__runInitializers(this, _drawerWidth_extraInitializers), __runInitializers(this, _overlayColor_initializers, void 0));
213
+ swipeEnabled = (__runInitializers(this, _overlayColor_extraInitializers), __runInitializers(this, _swipeEnabled_initializers, void 0));
214
+ swipeEdgeWidth = (__runInitializers(this, _swipeEnabled_extraInitializers), __runInitializers(this, _swipeEdgeWidth_initializers, void 0));
215
+ swipeMinDistance = (__runInitializers(this, _swipeEdgeWidth_extraInitializers), __runInitializers(this, _swipeMinDistance_initializers, void 0));
216
+ swipeMinVelocity = (__runInitializers(this, _swipeMinDistance_extraInitializers), __runInitializers(this, _swipeMinVelocity_initializers, void 0));
217
+ windowDimensions = (__runInitializers(this, _swipeMinVelocity_extraInitializers), inject(WindowDimensionsService).dimensions);
218
+ routeIdPrefix = `drawer-${(drawerInstanceCounter += 1)}`;
219
+ // Keyed by name -> the LIVE DrawerScreenDirective instance - see stack.ts's matching comment
220
+ // for why a snapshot copy would go stale on an in-place `[options]`/`[component]` change.
221
+ registry = new Map();
222
+ drawerScreenChildrenSubscription;
223
+ stateSignal = signal(undefined);
224
+ state = this.stateSignal.asReadonly();
225
+ currentEmitterKey;
226
+ currentEmitter;
227
+ // progress: 0 closed -> 1 open. Always starts closed (createInitialDrawerRouterState's own
228
+ // contract), so a plain field initializer is safe - no dependency on `state` existing yet.
229
+ progress = new Animated.Value(0);
230
+ // Where a drag STARTS from, in progress units - always exactly 0 or 1 (see react/drawer.ts's
231
+ // matching field for why).
232
+ dragStartProgress = 0;
233
+ openDrawer = () => {
234
+ this.animateProgressTo(true);
235
+ this.dispatch({ type: 'openDrawer' });
236
+ };
237
+ closeDrawer = () => {
238
+ this.animateProgressTo(false);
239
+ this.dispatch({ type: 'closeDrawer' });
240
+ };
241
+ toggleDrawer = () => {
242
+ this.animateProgressTo(!(this.stateSignal()?.isOpen ?? false));
243
+ this.dispatch({ type: 'toggleDrawer' });
244
+ };
245
+ jumpTo = (name) => {
246
+ // Captured BEFORE dispatch, mirroring vue/drawer/index.ts's jumpTo: a signal (like Vue's ref)
247
+ // mutates synchronously inside dispatch, so reading isOpen after it would already see the
248
+ // reducer's own isOpen: false and never animate the panel closed.
249
+ const wasOpen = this.stateSignal()?.isOpen ?? false;
250
+ this.dispatch({ type: 'jumpTo', name });
251
+ if (wasOpen)
252
+ this.animateProgressTo(false);
253
+ };
254
+ panResponder = PanResponder.create({
255
+ onStartShouldSetPanResponder: (event, gestureState) => shouldClaimDrawerSwipe(event, gestureState, this.windowDimensions().width, this.stateSignal()?.isOpen ?? false, this.optionsSnapshot(), 'start'),
256
+ onMoveShouldSetPanResponder: (event, gestureState) => shouldClaimDrawerSwipe(event, gestureState, this.windowDimensions().width, this.stateSignal()?.isOpen ?? false, this.optionsSnapshot(), 'move'),
257
+ onPanResponderGrant: () => {
258
+ dlog('Drawer: gesture grant');
259
+ this.dragStartProgress = (this.stateSignal()?.isOpen ?? false) ? 1 : 0;
260
+ },
261
+ onPanResponderMove: (_event, gestureState) => {
262
+ this.progress.setValue(resolveDragProgress(gestureState, this.dragStartProgress, this.optionsSnapshot()));
263
+ },
264
+ onPanResponderRelease: (_event, gestureState) => {
265
+ const intent = resolveSwipeIntent(gestureState, this.stateSignal()?.isOpen ?? false, this.optionsSnapshot());
266
+ const open = intent === 'open';
267
+ dlog(`Drawer: gesture release -> ${open ? 'open' : 'close'}`);
268
+ this.animateProgressTo(open);
269
+ this.dispatch(open ? { type: 'openDrawer' } : { type: 'closeDrawer' });
270
+ },
271
+ onPanResponderTerminate: () => {
272
+ dlog('Drawer: gesture terminated, snapping back');
273
+ this.animateProgressTo(this.stateSignal()?.isOpen ?? false);
274
+ },
275
+ });
276
+ ngAfterContentInit() {
277
+ this.rebuildRegistry();
278
+ this.initializeState();
279
+ this.drawerScreenChildrenSubscription = this.drawerScreenChildren.changes.subscribe(() => {
280
+ this.rebuildRegistry();
281
+ });
282
+ }
283
+ ngOnDestroy() {
284
+ this.drawerScreenChildrenSubscription?.unsubscribe();
285
+ if (this.currentEmitter)
286
+ this.currentEmitter.emit(NAVIGATION_EVENT_BLUR);
287
+ }
288
+ rebuildRegistry() {
289
+ this.registry.clear();
290
+ for (const screen of this.drawerScreenChildren) {
291
+ this.registry.set(screen.name, screen);
292
+ }
293
+ }
294
+ routesFromRegistry() {
295
+ return Array.from(this.registry.entries()).map(([name, entry]) => ({
296
+ key: `${this.routeIdPrefix}-${name}`,
297
+ name,
298
+ params: entry.initialParams,
299
+ }));
300
+ }
301
+ initializeState() {
302
+ if (this.stateSignal() !== undefined)
303
+ return;
304
+ const routes = this.routesFromRegistry();
305
+ if (routes.length === 0)
306
+ dlog('Drawer: no <ng-template symbioteDrawerScreen> children registered');
307
+ this.stateSignal.set(createInitialDrawerRouterState(routes, this.initialRouteName));
308
+ }
309
+ dispatch(action) {
310
+ const current = this.stateSignal();
311
+ if (current === undefined)
312
+ return;
313
+ this.stateSignal.set(drawerRouterReducer(current, action));
314
+ }
315
+ animateProgressTo(open) {
316
+ dlog(`Drawer: animateProgressTo(open=${open})`);
317
+ Animated.timing(this.progress, {
318
+ toValue: open ? 1 : 0,
319
+ duration: DRAWER_SNAP_DURATION,
320
+ // Native-driver wiring is deferred for v1 - mirrors react/drawer.ts's own scope note.
321
+ useNativeDriver: false,
322
+ }).start();
323
+ }
324
+ // A plain writable signal, not a computed() - it mirrors @Input() properties, which are ordinary
325
+ // mutable fields Angular assigns directly rather than signals, so a computed() reading them would
326
+ // never register them as a tracked dependency and would go stale after its first evaluation.
327
+ // ngOnChanges (below) pushes every input change in here instead, which drawerRoot/slotsMap CAN
328
+ // track correctly since reading a signal (unlike a plain field) IS visible to computed()'s
329
+ // dependency collection.
330
+ optionsSnapshot = signal(this.buildOptionsSnapshot());
331
+ drawerStyleSnapshot = signal(this.drawerStyle);
332
+ ngOnChanges() {
333
+ this.optionsSnapshot.set(this.buildOptionsSnapshot());
334
+ this.drawerStyleSnapshot.set(this.drawerStyle);
335
+ }
336
+ buildOptionsSnapshot() {
337
+ return {
338
+ drawerType: this.drawerType,
339
+ drawerPosition: this.drawerPosition,
340
+ drawerWidth: this.drawerWidth,
341
+ overlayColor: this.overlayColor,
342
+ swipeEnabled: this.swipeEnabled,
343
+ swipeEdgeWidth: this.swipeEdgeWidth,
344
+ swipeMinDistance: this.swipeMinDistance,
345
+ swipeMinVelocity: this.swipeMinVelocity,
346
+ };
347
+ }
348
+ overlayResponderPassthrough() {
349
+ return {
350
+ pointerEvents: this.stateSignal()?.isOpen ? 'auto' : 'none',
351
+ onStartShouldSetResponder: () => true,
352
+ onResponderRelease: () => {
353
+ this.animateProgressTo(false);
354
+ this.dispatch({ type: 'closeDrawer' });
355
+ },
356
+ };
357
+ }
358
+ // Recomputed only when a dependency signal actually changes, so every template read within a
359
+ // single change-detection pass (rootStyle, plus slotStyle/slotAnimatedProps once per @for slot -
360
+ // 6-7 reads total) shares one cached descriptor tree instead of re-running renderDrawer /
361
+ // drawerChildOrder on each read.
362
+ drawerRoot = computed(() => renderDrawer({
363
+ overlayColor: this.optionsSnapshot().overlayColor ?? DRAWER_DEFAULT_OVERLAY_COLOR,
364
+ drawerStyle: this.drawerStyleSnapshot(),
365
+ contentPassthrough: {},
366
+ overlayPassthrough: this.isAnimated() ? this.overlayResponderPassthrough() : {},
367
+ panelPassthrough: {},
368
+ }, this.optionsSnapshot()));
369
+ slotsMap = computed(() => {
370
+ const root = this.drawerRoot();
371
+ const order = drawerChildOrder(this.optionsSnapshot());
372
+ const map = new Map();
373
+ order.forEach((slot, index) => {
374
+ const child = root.children[index];
375
+ if (child !== undefined && typeof child !== 'string')
376
+ map.set(slot, child);
377
+ });
378
+ return map;
379
+ });
380
+ isAnimated() {
381
+ return isDrawerAnimated(this.optionsSnapshot());
382
+ }
383
+ slotOrder() {
384
+ return drawerChildOrder(this.optionsSnapshot());
385
+ }
386
+ rootStyle() {
387
+ return flattenStyle(this.drawerRoot().props.style);
388
+ }
389
+ rootPanHandlers() {
390
+ return { ...this.panResponder.panHandlers };
391
+ }
392
+ slotAnimatedProps(slot) {
393
+ const descriptor = this.slotsMap().get(slot);
394
+ if (!descriptor)
395
+ return {};
396
+ const { style: _style, ...rest } = descriptor.props;
397
+ return rest;
398
+ }
399
+ slotStyle(slot, animatedStyle) {
400
+ const base = this.slotsMap().get(slot)?.props.style;
401
+ return this.isAnimated() ? flattenStyle([base, animatedStyle()]) : flattenStyle(base);
402
+ }
403
+ contentStyle() {
404
+ return this.slotStyle('content', () => {
405
+ const g = resolveDrawerGeometry(this.optionsSnapshot());
406
+ const { translateX } = resolveDrawerSlotInterpolation(g, 'content');
407
+ return {
408
+ transform: [{ translateX: this.progress.interpolate(translateX) }],
409
+ };
410
+ });
411
+ }
412
+ // The overlay's translateX follows content's own delta (see render-drawer.ts's comment on
413
+ // `overlayTranslateX`): for `slide`, content itself moves away, and without the overlay
414
+ // following it the dimming stays pinned full-screen instead of tracking the revealed panel.
415
+ overlayStyle() {
416
+ return this.slotStyle('overlay', () => {
417
+ const g = resolveDrawerGeometry(this.optionsSnapshot());
418
+ const { opacity, translateX } = resolveDrawerSlotInterpolation(g, 'overlay');
419
+ return {
420
+ opacity: this.progress.interpolate(opacity),
421
+ transform: [{ translateX: this.progress.interpolate(translateX) }],
422
+ };
423
+ });
424
+ }
425
+ panelStyle() {
426
+ return this.slotStyle('panel', () => {
427
+ const g = resolveDrawerGeometry(this.optionsSnapshot());
428
+ const { translateX } = resolveDrawerSlotInterpolation(g, 'panel');
429
+ return {
430
+ transform: [{ translateX: this.progress.interpolate(translateX) }],
431
+ };
432
+ });
433
+ }
434
+ focusedRoute() {
435
+ const state = this.stateSignal();
436
+ return state?.routes[state.index];
437
+ }
438
+ componentForRoute(route) {
439
+ return this.registry.get(route.name)?.component ?? null;
440
+ }
441
+ resolveDrawerScreenOptions(entry, route) {
442
+ if (typeof entry.options === 'function') {
443
+ const props = { route, navigation: this };
444
+ return entry.options(props);
445
+ }
446
+ return entry.options ?? {};
447
+ }
448
+ // Lazily creates/replaces the focused route's emitter and synthesizes focus/blur - Drawer paints
449
+ // its own panel in pure JS (no native onAppear/onDisappear the way Stack's RNSScreen has), so
450
+ // focus/blur is synthesized here exactly like react/drawer.ts's own useEffect does, just
451
+ // idempotent per read instead of dependency-array gated. Keyed on the route KEY, not the object,
452
+ // so a no-op re-focus of the already-focused route doesn't spuriously re-fire.
453
+ //
454
+ // Called from the template ([emitter]="focusedRouteEmitter()"), which runs inside Angular's
455
+ // reactive-read tracking context for the current CD pass - unlike React's useEffect, which runs
456
+ // in a separate post-commit phase. Two consequences of that, both fixed below (see tabs.ts's
457
+ // identical fix for the full mechanism):
458
+ //
459
+ // 1. Writing a signal from inside a tracked template read throws Angular's NG600 ("signal write
460
+ // during a template execution") - untracked() opts this whole synthesis out of that
461
+ // tracking context.
462
+ // 2. The NEW route's screen component (injectIsFocused's listener source) is created by
463
+ // *ngComponentOutlet AFTER this binding is evaluated but still within the SAME synchronous
464
+ // template refresh - emitting FOCUS right here fires to zero listeners and is silently lost
465
+ // forever. queueMicrotask defers the FOCUS emit past the end of the current refresh
466
+ // (including the new screen's construction). BLUR doesn't need this: the outgoing screen's
467
+ // listener was already attached on an earlier tick.
468
+ focusedRouteEmitter() {
469
+ const key = this.focusedRoute()?.key;
470
+ return untracked(() => {
471
+ if (key === this.currentEmitterKey && this.currentEmitter)
472
+ return this.currentEmitter;
473
+ const { blurKey, focusKey } = diffFocusedRoute(this.currentEmitterKey, key);
474
+ if (blurKey !== undefined && this.currentEmitter) {
475
+ dlog('Drawer: previous route blurred');
476
+ this.currentEmitter.emit(NAVIGATION_EVENT_BLUR);
477
+ }
478
+ const emitter = createNavigationEmitter();
479
+ this.currentEmitter = emitter;
480
+ this.currentEmitterKey = key;
481
+ if (focusKey !== undefined) {
482
+ queueMicrotask(() => {
483
+ if (this.currentEmitter !== emitter)
484
+ return; // superseded by a later switch
485
+ dlog(`Drawer: route "${this.focusedRoute()?.name}" focused`);
486
+ emitter.emit(NAVIGATION_EVENT_FOCUS);
487
+ });
488
+ }
489
+ return emitter;
490
+ });
491
+ }
492
+ drawerContentContext(currentState) {
493
+ const descriptors = {};
494
+ for (const route of currentState.routes) {
495
+ const entry = this.registry.get(route.name);
496
+ if (entry === undefined)
497
+ continue;
498
+ descriptors[route.key] = {
499
+ options: this.resolveDrawerScreenOptions(entry, route),
500
+ navigation: this,
501
+ };
502
+ }
503
+ return { $implicit: { state: currentState, descriptors, navigation: this } };
504
+ }
505
+ };
506
+ return Drawer = _classThis;
507
+ })();
508
+ export { Drawer };
@@ -0,0 +1,14 @@
1
+ import { type Type } from '@angular/core';
2
+ import type { IDrawerScreenOptions, IRoute } from '../core';
3
+ import type { IDrawerNavigatorHandle } from '../core';
4
+ export type IDrawerScreenOptionsArgs = {
5
+ route: IRoute<unknown>;
6
+ navigation: IDrawerNavigatorHandle;
7
+ };
8
+ export type IDrawerScreenOptionsResolver = (props: IDrawerScreenOptionsArgs) => IDrawerScreenOptions;
9
+ export declare class DrawerScreenDirective {
10
+ name: string;
11
+ component: Type<unknown>;
12
+ options?: IDrawerScreenOptions | IDrawerScreenOptionsResolver;
13
+ initialParams?: unknown;
14
+ }