@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
@@ -0,0 +1,216 @@
1
+ import type { IColorValue, ISymbioteEvent } from '@symbiote-native/engine';
2
+ import type { IImageSourceProp } from '@symbiote-native/components';
3
+ export type IStackAnimation = 'default' | 'flip' | 'simple_push' | 'none' | 'fade' | 'slide_from_right' | 'slide_from_left' | 'slide_from_bottom' | 'fade_from_bottom' | 'ios_from_right' | 'ios_from_left';
4
+ export type IStackPresentation = 'push' | 'modal' | 'transparentModal' | 'fullScreenModal' | 'formSheet' | 'pageSheet' | 'containedModal' | 'containedTransparentModal';
5
+ export type IHeaderBackButtonDisplayMode = 'minimal' | 'default' | 'generic';
6
+ export type IHeaderUserInterfaceStyle = 'unspecified' | 'light' | 'dark';
7
+ export type IOptionalBooleanNativeProp = 'undefined' | 'false' | 'true';
8
+ export type ISheetAllowedDetents = number[] | 'fitToContents' | 'large' | 'medium' | 'all';
9
+ export type ISheetLargestUndimmedDetent = number | 'last' | 'none' | 'all' | 'large' | 'medium';
10
+ export type ISheetInitialDetent = number | 'last';
11
+ export type IHeaderBarButtonIcon = {
12
+ type: 'sfSymbol';
13
+ name: string;
14
+ } | {
15
+ type: 'xcasset';
16
+ name: string;
17
+ } | {
18
+ type: 'imageSource';
19
+ imageSource: IImageSourceProp;
20
+ } | {
21
+ type: 'templateSource';
22
+ templateSource: IImageSourceProp;
23
+ };
24
+ export type IHeaderBarButtonItemBadge = {
25
+ value: string;
26
+ style?: {
27
+ color?: IColorValue;
28
+ backgroundColor?: IColorValue;
29
+ fontFamily?: string;
30
+ fontSize?: number;
31
+ fontWeight?: string;
32
+ };
33
+ };
34
+ type ISharedHeaderBarButtonItem = {
35
+ index?: number;
36
+ title?: string;
37
+ titleStyle?: {
38
+ fontFamily?: string;
39
+ fontSize?: number;
40
+ fontWeight?: string;
41
+ color?: IColorValue;
42
+ };
43
+ icon?: IHeaderBarButtonIcon;
44
+ variant?: 'plain' | 'done' | 'prominent';
45
+ tintColor?: IColorValue;
46
+ disabled?: boolean;
47
+ width?: number;
48
+ hidesSharedBackground?: boolean;
49
+ sharesBackground?: boolean;
50
+ identifier?: string;
51
+ badge?: IHeaderBarButtonItemBadge;
52
+ accessibilityLabel?: string;
53
+ accessibilityHint?: string;
54
+ };
55
+ export type IHeaderBarButtonItemAction = ISharedHeaderBarButtonItem & {
56
+ type: 'button';
57
+ onPress: () => void;
58
+ selected?: boolean;
59
+ };
60
+ export type IHeaderBarButtonMenuAction = {
61
+ type: 'action';
62
+ title?: string;
63
+ subtitle?: string;
64
+ onPress: () => void;
65
+ icon?: IHeaderBarButtonIcon;
66
+ state?: 'on' | 'off' | 'mixed';
67
+ disabled?: boolean;
68
+ destructive?: boolean;
69
+ hidden?: boolean;
70
+ keepsMenuPresented?: boolean;
71
+ discoverabilityLabel?: string;
72
+ };
73
+ export type IHeaderBarButtonSubmenu = {
74
+ type: 'submenu';
75
+ title?: string;
76
+ icon?: IHeaderBarButtonIcon;
77
+ items: (IHeaderBarButtonMenuAction | IHeaderBarButtonSubmenu)[];
78
+ displayInline?: boolean;
79
+ destructive?: boolean;
80
+ singleSelection?: boolean;
81
+ displayAsPalette?: boolean;
82
+ };
83
+ export type IHeaderBarButtonItemMenu = ISharedHeaderBarButtonItem & {
84
+ type: 'menu';
85
+ menu: {
86
+ title?: string;
87
+ items: (IHeaderBarButtonMenuAction | IHeaderBarButtonSubmenu)[];
88
+ singleSelection?: boolean;
89
+ displayAsPalette?: boolean;
90
+ };
91
+ changesSelectionAsPrimaryAction?: boolean;
92
+ };
93
+ export type IHeaderBarButtonItemSpacing = {
94
+ type: 'spacing';
95
+ spacing: number;
96
+ };
97
+ export type IHeaderBarButtonItem = IHeaderBarButtonItemAction | IHeaderBarButtonItemMenu | IHeaderBarButtonItemSpacing;
98
+ export type ISearchBarAutoCapitalize = 'systemDefault' | 'none' | 'words' | 'sentences' | 'characters';
99
+ export type ISearchBarPlacement = 'automatic' | 'inline' | 'stacked' | 'integrated' | 'integratedButton' | 'integratedCentered';
100
+ export type ISearchBarOptions = {
101
+ placeholder?: string;
102
+ autoCapitalize?: ISearchBarAutoCapitalize;
103
+ placement?: ISearchBarPlacement;
104
+ hideWhenScrolling?: boolean;
105
+ allowToolbarIntegration?: boolean;
106
+ obscureBackground?: boolean;
107
+ hideNavigationBar?: boolean;
108
+ cancelButtonText?: string;
109
+ barTintColor?: IColorValue;
110
+ tintColor?: IColorValue;
111
+ textColor?: IColorValue;
112
+ autoFocus?: boolean;
113
+ disableBackButtonOverride?: boolean;
114
+ inputType?: string;
115
+ hintTextColor?: IColorValue;
116
+ headerIconColor?: IColorValue;
117
+ shouldShowHintSearchIcon?: boolean;
118
+ onChangeText?: (text: string) => void;
119
+ onFocus?: () => void;
120
+ onBlur?: () => void;
121
+ onCancelButtonPress?: () => void;
122
+ onSearchButtonPress?: (text: string) => void;
123
+ onClose?: () => void;
124
+ onOpen?: () => void;
125
+ };
126
+ export type IScreenOrientation = 'default' | 'all' | 'portrait' | 'portrait_up' | 'portrait_down' | 'landscape' | 'landscape_left' | 'landscape_right';
127
+ export interface IScreenOptions {
128
+ title?: string;
129
+ headerShown?: boolean;
130
+ headerTitleColor?: IColorValue;
131
+ headerStyle?: {
132
+ backgroundColor?: IColorValue;
133
+ };
134
+ headerTintColor?: IColorValue;
135
+ headerBackTitle?: string;
136
+ headerBackButtonDisplayMode?: IHeaderBackButtonDisplayMode;
137
+ headerLargeTitle?: boolean;
138
+ headerLargeStyle?: {
139
+ backgroundColor?: IColorValue;
140
+ };
141
+ headerUserInterfaceStyle?: IHeaderUserInterfaceStyle;
142
+ headerTranslucent?: boolean;
143
+ headerLeftBarButtonItems?: IHeaderBarButtonItem[];
144
+ headerRightBarButtonItems?: IHeaderBarButtonItem[];
145
+ headerSearchBarOptions?: ISearchBarOptions;
146
+ gestureEnabled?: boolean;
147
+ stackAnimation?: IStackAnimation;
148
+ stackPresentation?: IStackPresentation;
149
+ transitionDuration?: number;
150
+ sheetAllowedDetents?: ISheetAllowedDetents;
151
+ sheetLargestUndimmedDetentIndex?: ISheetLargestUndimmedDetent;
152
+ sheetInitialDetentIndex?: ISheetInitialDetent;
153
+ sheetGrabberVisible?: boolean;
154
+ sheetCornerRadius?: number;
155
+ sheetExpandsWhenScrolledToEdge?: boolean;
156
+ sheetElevation?: number;
157
+ sheetShouldOverflowTopInset?: boolean;
158
+ sheetDefaultResizeAnimationEnabled?: boolean;
159
+ statusBarStyle?: 'inverted' | 'auto' | 'light' | 'dark';
160
+ statusBarHidden?: boolean;
161
+ statusBarAnimation?: 'none' | 'fade' | 'slide';
162
+ screenOrientation?: IScreenOrientation;
163
+ }
164
+ export type INavigatorPlatform = {
165
+ defaultHeaderBackTitleVisible: boolean;
166
+ };
167
+ export type IScreenViewProps = {
168
+ screenId: string;
169
+ activityState: number;
170
+ gestureEnabled?: boolean;
171
+ stackAnimation?: IStackAnimation;
172
+ stackPresentation?: IStackPresentation;
173
+ transitionDuration?: number;
174
+ sheetAllowedDetents?: number[];
175
+ sheetLargestUndimmedDetent?: number;
176
+ sheetInitialDetent?: number;
177
+ sheetGrabberVisible?: boolean;
178
+ sheetCornerRadius?: number;
179
+ sheetExpandsWhenScrolledToEdge?: boolean;
180
+ sheetElevation?: number;
181
+ sheetShouldOverflowTopInset?: boolean;
182
+ sheetDefaultResizeAnimationEnabled?: boolean;
183
+ statusBarStyle?: 'inverted' | 'auto' | 'light' | 'dark';
184
+ statusBarHidden?: boolean;
185
+ statusBarAnimation?: 'none' | 'fade' | 'slide';
186
+ screenOrientation?: IScreenOrientation;
187
+ passthrough: Record<string, unknown>;
188
+ };
189
+ export type IHeaderConfigViewProps = {
190
+ title?: string;
191
+ hidden: boolean;
192
+ backTitle?: string;
193
+ backTitleVisible: boolean;
194
+ backButtonDisplayMode?: IHeaderBackButtonDisplayMode;
195
+ largeTitle?: boolean;
196
+ translucent?: boolean;
197
+ color?: IColorValue;
198
+ titleColor?: IColorValue;
199
+ backgroundColor?: IColorValue;
200
+ largeTitleBackgroundColor?: IColorValue;
201
+ userInterfaceStyle?: IHeaderUserInterfaceStyle;
202
+ headerLeftBarButtonItems?: unknown[];
203
+ headerRightBarButtonItems?: unknown[];
204
+ onPressHeaderBarButtonItem?: (event: ISymbioteEvent) => void;
205
+ onPressHeaderBarButtonMenuItem?: (event: ISymbioteEvent) => void;
206
+ passthrough: Record<string, unknown>;
207
+ };
208
+ export type IStackViewProps = {
209
+ passthrough: Record<string, unknown>;
210
+ };
211
+ export type ISearchBarViewProps = Omit<ISearchBarOptions, 'obscureBackground' | 'hideNavigationBar' | 'onChangeText' | 'onFocus' | 'onBlur' | 'onCancelButtonPress' | 'onSearchButtonPress' | 'onClose' | 'onOpen'> & {
212
+ obscureBackground?: IOptionalBooleanNativeProp;
213
+ hideNavigationBar?: IOptionalBooleanNativeProp;
214
+ passthrough: Record<string, unknown>;
215
+ };
216
+ export {};
@@ -0,0 +1,7 @@
1
+ // Navigator prop types. Per CLAUDE.md <prop_types_split_agnostic_vs_per_adapter>: screen
2
+ // options (title, header styling, transition/presentation) are entirely scalar/color-typed, so
3
+ // they live here as the shared agnostic base every adapter re-exports. The Stack/Screen PUBLIC
4
+ // component props are NOT here - they carry framework children (the screen content) and a
5
+ // framework ref (the navigator handle), so each adapter declares its own flavored type over
6
+ // this base, same split as IPressableProps.
7
+ export {};
@@ -0,0 +1,36 @@
1
+ export type IRoute<TParams = undefined> = Readonly<{
2
+ key: string;
3
+ name: string;
4
+ params: TParams;
5
+ }>;
6
+ type IRouteEntry = IRoute<unknown>;
7
+ export type INavigatorState = Readonly<{
8
+ routes: readonly IRouteEntry[];
9
+ }>;
10
+ export type INavigatorAction = {
11
+ type: 'push';
12
+ route: IRouteEntry;
13
+ } | {
14
+ type: 'pop';
15
+ count?: number;
16
+ } | {
17
+ type: 'popToTop';
18
+ } | {
19
+ type: 'popTo';
20
+ key: string;
21
+ } | {
22
+ type: 'replace';
23
+ route: IRouteEntry;
24
+ } | {
25
+ type: 'setParams';
26
+ key?: string;
27
+ params: unknown;
28
+ } | {
29
+ type: 'reset';
30
+ state: INavigatorState;
31
+ };
32
+ export declare function createInitialNavigatorState(initialRoute: IRouteEntry): INavigatorState;
33
+ export declare function navigatorReducer(state: INavigatorState, action: INavigatorAction): INavigatorState;
34
+ export declare function computeActivityState(index: number, routesLength: number): number;
35
+ export declare function isTopRoute(index: number, routesLength: number): boolean;
36
+ export {};
@@ -0,0 +1,81 @@
1
+ // Navigator: the logic half (framework-agnostic, zero render). A pure reducer over a route
2
+ // stack - push/pop/popToTop/popTo/replace - mirroring what @react-navigation/native-stack keeps
3
+ // in its router, minus the React-specific action-creator/linking machinery. Route identity
4
+ // (`key`) is generated by the CALLER (the adapter, via React's useId or an equivalent) - the
5
+ // reducer never invents identity itself, so it stays a pure (state, action) => state function.
6
+ import { SCREEN_ACTIVITY_STATE_FOCUSED, SCREEN_ACTIVITY_STATE_INACTIVE } from '../constants.js';
7
+ import { mergeParams } from '../guards.js';
8
+ export function createInitialNavigatorState(initialRoute) {
9
+ return { routes: [initialRoute] };
10
+ }
11
+ // The stack never pops its last route - mirrors the library refusing to pop the initial screen;
12
+ // the caller (e.g. a hardware back handler) decides what a pop-at-root means for the host app.
13
+ export function navigatorReducer(state, action) {
14
+ switch (action.type) {
15
+ case 'push':
16
+ return { routes: [...state.routes, action.route] };
17
+ case 'pop': {
18
+ if (state.routes.length <= 1)
19
+ return state;
20
+ const count = action.count ?? 1;
21
+ const nextLength = Math.max(1, state.routes.length - count);
22
+ return { routes: state.routes.slice(0, nextLength) };
23
+ }
24
+ case 'popToTop':
25
+ return state.routes.length <= 1 ? state : { routes: state.routes.slice(0, 1) };
26
+ case 'popTo': {
27
+ const index = state.routes.findIndex(route => route.key === action.key);
28
+ if (index === -1)
29
+ return state;
30
+ return { routes: state.routes.slice(0, index + 1) };
31
+ }
32
+ case 'replace': {
33
+ if (state.routes.length === 0)
34
+ return { routes: [action.route] };
35
+ return { routes: [...state.routes.slice(0, -1), action.route] };
36
+ }
37
+ // Mirrors @react-navigation's CommonActions.setParams: merges onto the route matched by
38
+ // `key`, defaulting to the focused (top-of-stack) route when omitted - same shape as its
39
+ // `source`-defaults-to-focused-route behavior, minus the cross-navigator target routing this
40
+ // single-navigator reducer has no need for.
41
+ case 'setParams': {
42
+ const targetKey = action.key ?? state.routes[state.routes.length - 1]?.key;
43
+ if (targetKey === undefined)
44
+ return state;
45
+ const index = state.routes.findIndex(route => route.key === targetKey);
46
+ if (index === -1)
47
+ return state;
48
+ const target = state.routes[index];
49
+ const nextRoute = {
50
+ ...target,
51
+ params: mergeParams(target.params, action.params),
52
+ };
53
+ return {
54
+ routes: [...state.routes.slice(0, index), nextRoute, ...state.routes.slice(index + 1)],
55
+ };
56
+ }
57
+ // Mirrors @react-navigation's CommonActions.reset / BaseRouter's RESET handler: the payload
58
+ // state replaces the current one verbatim, no merge - full rehydration (e.g. restoring a
59
+ // persisted stack) is just a reset with the deserialized state as the payload.
60
+ case 'reset':
61
+ return action.state;
62
+ default:
63
+ return state;
64
+ }
65
+ }
66
+ // Mirrors @react-navigation/native-stack's actual algorithm (NativeStackView.native.tsx:
67
+ // `activityState={isInactive ? 0 : 2}`, where isInactive = index > state.index) - NOT a
68
+ // three-way top/one-below/rest split. A route index beyond the focused one only exists for a
69
+ // preloaded-but-not-yet-navigated-to screen, a feature this reducer doesn't implement, so the
70
+ // focused index is always routesLength - 1 (the last route) and every currently-mounted route is
71
+ // FOCUSED. This is required, not just simpler: react-native-screens' native RNSScreen.mm asserts
72
+ // an already-mounted NativeStack screen's activityState can never decrease via a plain prop
73
+ // update ("activityState can only progress in NativeStack") - since no mounted route's index ever
74
+ // exceeds routesLength - 1, this formula never produces a decrease across a push or pop.
75
+ export function computeActivityState(index, routesLength) {
76
+ const focusedIndex = routesLength - 1;
77
+ return index > focusedIndex ? SCREEN_ACTIVITY_STATE_INACTIVE : SCREEN_ACTIVITY_STATE_FOCUSED;
78
+ }
79
+ export function isTopRoute(index, routesLength) {
80
+ return index === routesLength - 1;
81
+ }
@@ -0,0 +1,13 @@
1
+ import { type IDescriptor } from '@symbiote-native/components';
2
+ import type { IStyleProp, IViewStyle } from '@symbiote-native/engine';
3
+ import { type IDrawerOptions } from './drawer-options';
4
+ export type IDrawerSlot = 'content' | 'overlay' | 'panel';
5
+ export declare function drawerChildOrder(options: IDrawerOptions): readonly IDrawerSlot[];
6
+ export type IDrawerViewProps = {
7
+ overlayColor?: string;
8
+ drawerStyle?: IStyleProp<IViewStyle>;
9
+ contentPassthrough: Record<string, unknown>;
10
+ overlayPassthrough: Record<string, unknown>;
11
+ panelPassthrough: Record<string, unknown>;
12
+ };
13
+ export declare function renderDrawer(view: IDrawerViewProps, options: IDrawerOptions): IDescriptor;
@@ -0,0 +1,88 @@
1
+ // Drawer: the render half (framework-agnostic). Like render-stack.ts's screen content, both the
2
+ // drawer panel's content (renderDrawerContent) and the wrapped screen content are arbitrary
3
+ // framework subtrees the adapter owns - so, mirroring render-modal.ts's container-slot precedent,
4
+ // renderDrawer hands back one root Descriptor whose structural children are EMPTY placeholder
5
+ // nodes (`content` / `overlay?` / `panel`) that the adapter fills with real framework children.
6
+ // Paint order (and therefore which slot is present) is drawerType-dependent, so `drawerChildOrder`
7
+ // is exported alongside renderDrawer as the single source of truth the adapter zips its own
8
+ // children against - no adapter re-derives the ordering itself.
9
+ //
10
+ // All positioning here is STATIC (position/top/bottom/side/width) - the animated slide transform
11
+ // and overlay opacity are NOT baked into this Descriptor. They are computed once per drawerType
12
+ // via drawer-options.ts's resolveDrawerGeometry() and then driven per-frame by the adapter's own
13
+ // Animated value (Animated.View), because "how to animate a style" is a framework-lifecycle
14
+ // concern (React: Animated.View; a future Vue adapter: a reactive style binding) - see
15
+ // CLAUDE.md <adapters_stay_thin>.
16
+ import { el } from '@symbiote-native/components';
17
+ import { isDrawerOverlayVisible, resolveDrawerPosition, resolveDrawerType, resolveDrawerWidth, } from './drawer-options/index.js';
18
+ // front: content, overlay (dims it), panel (paints on top, last-sibling-on-top).
19
+ // back: panel (stationary, behind), content (slides away to reveal it) - no overlay. Both are
20
+ // absolutely positioned, so sibling order here only decides z-stacking, not screen side.
21
+ // slide: panel, overlay, content (both panel and content animate; content stays visually on top).
22
+ // permanent: NOT absolutely positioned (an ordinary flexDirection:'row' sidebar), so sibling
23
+ // order IS the left-to-right screen position - it must follow drawerPosition.
24
+ export function drawerChildOrder(options) {
25
+ const type = resolveDrawerType(options);
26
+ switch (type) {
27
+ case 'back':
28
+ return ['panel', 'content'];
29
+ case 'slide':
30
+ return ['panel', 'overlay', 'content'];
31
+ case 'permanent':
32
+ return resolveDrawerPosition(options) === 'left'
33
+ ? ['panel', 'content']
34
+ : ['content', 'panel'];
35
+ case 'front':
36
+ default:
37
+ return ['content', 'overlay', 'panel'];
38
+ }
39
+ }
40
+ const ROOT_STYLE = { flex: 1 };
41
+ const CONTENT_STYLE = { flex: 1 };
42
+ // Fabric paints later siblings on top; position:absolute + inset:0 is enough for the overlay
43
+ // (its own sibling order, not zIndex, decides whether it sits above the content).
44
+ const OVERLAY_BASE_STYLE = {
45
+ position: 'absolute',
46
+ top: 0,
47
+ left: 0,
48
+ right: 0,
49
+ bottom: 0,
50
+ };
51
+ const DRAWER_PANEL_DEFAULT_BACKGROUND_COLOR = 'white';
52
+ function panelBaseStyle(options) {
53
+ const type = resolveDrawerType(options);
54
+ const width = resolveDrawerWidth(options);
55
+ const side = resolveDrawerPosition(options);
56
+ if (type === 'permanent') {
57
+ // A sidebar: an ordinary flex child, no absolute positioning, no translate needed.
58
+ return { width, backgroundColor: DRAWER_PANEL_DEFAULT_BACKGROUND_COLOR };
59
+ }
60
+ return {
61
+ position: 'absolute',
62
+ top: 0,
63
+ bottom: 0,
64
+ width,
65
+ backgroundColor: DRAWER_PANEL_DEFAULT_BACKGROUND_COLOR,
66
+ [side]: 0,
67
+ };
68
+ }
69
+ export function renderDrawer(view, options) {
70
+ const type = resolveDrawerType(options);
71
+ const content = el('symbiote-view', { ...view.contentPassthrough, style: CONTENT_STYLE }, []);
72
+ const panel = el('symbiote-view', { ...view.panelPassthrough, style: [panelBaseStyle(options), view.drawerStyle] }, []);
73
+ const slots = { content, panel };
74
+ if (isDrawerOverlayVisible(options)) {
75
+ slots.overlay = el('symbiote-view', {
76
+ ...view.overlayPassthrough,
77
+ style: [OVERLAY_BASE_STYLE, { backgroundColor: view.overlayColor }],
78
+ }, []);
79
+ }
80
+ const children = drawerChildOrder(options).reduce((acc, slot) => {
81
+ const descriptor = slots[slot];
82
+ if (descriptor !== undefined)
83
+ acc.push(descriptor);
84
+ return acc;
85
+ }, []);
86
+ const rootStyle = type === 'permanent' ? { ...ROOT_STYLE, flexDirection: 'row' } : ROOT_STYLE;
87
+ return el('symbiote-view', { style: rootStyle }, children);
88
+ }
@@ -0,0 +1,35 @@
1
+ import type { IDescriptor } from '@symbiote-native/components';
2
+ import type { ISymbioteEvent } from '@symbiote-native/engine';
3
+ import type { IHeaderConfigViewProps, INavigatorPlatform, IScreenOptions, IScreenViewProps, ISearchBarOptions, ISearchBarViewProps, IStackPresentation, IStackViewProps } from './navigator-props';
4
+ export declare function resolveScreenViewName(stackPresentation: IStackPresentation | undefined, isAndroid: boolean): string;
5
+ export declare function resolveScreenContentWrapperStyle(stackPresentation: IStackPresentation | undefined, headerHidden: boolean, headerTranslucent: boolean | undefined, isAndroid: boolean): Record<string, unknown>;
6
+ export declare function isHeaderInModal(stackPresentation: IStackPresentation | undefined, headerHidden: boolean, isAndroid: boolean): boolean;
7
+ export declare function resolveHeaderInModalStackStyle(): Record<string, unknown>;
8
+ export declare function resolveHeaderInModalScreenStyle(): Record<string, unknown>;
9
+ export declare function resolveScreenProps(view: IScreenViewProps): Record<string, unknown>;
10
+ export declare function resolveStackProps(view: IStackViewProps): Record<string, unknown>;
11
+ export declare function renderHeaderConfig(view: IHeaderConfigViewProps, searchBarProps?: Record<string, unknown>): IDescriptor;
12
+ export declare function resolveSearchBarProps(view: ISearchBarViewProps): Record<string, unknown>;
13
+ export declare function buildSearchBarPassthrough(options: ISearchBarOptions, log?: (message: string) => void): Record<string, (event: ISymbioteEvent) => void>;
14
+ export type IScreenRenderPlanInput = {
15
+ screenId: string;
16
+ index: number;
17
+ routeCount: number;
18
+ options: IScreenOptions | undefined;
19
+ platform: INavigatorPlatform;
20
+ isAndroid: boolean;
21
+ screenPassthrough: Record<string, unknown>;
22
+ searchBarPassthrough?: Record<string, unknown>;
23
+ };
24
+ export type IScreenRenderPlan = {
25
+ activityState: number;
26
+ screenViewName: string;
27
+ screenProps: Record<string, unknown>;
28
+ headerConfig: IDescriptor;
29
+ searchBarProps: Record<string, unknown> | undefined;
30
+ contentWrapperProps: Record<string, unknown>;
31
+ inModal: boolean;
32
+ innerStackStyle: Record<string, unknown>;
33
+ innerScreenStyle: Record<string, unknown>;
34
+ };
35
+ export declare function resolveScreenRenderPlan(input: IScreenRenderPlanInput): IScreenRenderPlan;