@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.
- package/LICENSE +21 -0
- package/build/angular/drawer/index.d.ts +76 -0
- package/build/angular/drawer/index.js +508 -0
- package/build/angular/drawer-screen.directive.d.ts +14 -0
- package/build/angular/drawer-screen.directive.js +87 -0
- package/build/angular/index.d.ts +23 -0
- package/build/angular/index.js +22 -0
- package/build/angular/injectors/index.d.ts +13 -0
- package/build/angular/injectors/index.js +8 -0
- package/build/angular/injectors/inject-drawer-navigation.d.ts +4 -0
- package/build/angular/injectors/inject-drawer-navigation.js +12 -0
- package/build/angular/injectors/inject-focus-effect.d.ts +2 -0
- package/build/angular/injectors/inject-focus-effect.js +29 -0
- package/build/angular/injectors/inject-is-focused.d.ts +2 -0
- package/build/angular/injectors/inject-is-focused.js +20 -0
- package/build/angular/injectors/inject-navigation-state.d.ts +3 -0
- package/build/angular/injectors/inject-navigation-state.js +35 -0
- package/build/angular/injectors/inject-navigation.d.ts +7 -0
- package/build/angular/injectors/inject-navigation.js +16 -0
- package/build/angular/injectors/inject-route.d.ts +3 -0
- package/build/angular/injectors/inject-route.js +20 -0
- package/build/angular/injectors/inject-stack-navigation.d.ts +4 -0
- package/build/angular/injectors/inject-stack-navigation.js +15 -0
- package/build/angular/injectors/inject-tab-navigation.d.ts +4 -0
- package/build/angular/injectors/inject-tab-navigation.js +11 -0
- package/build/angular/linking.d.ts +3 -0
- package/build/angular/linking.js +43 -0
- package/build/angular/navigation-context.service.d.ts +13 -0
- package/build/angular/navigation-context.service.js +105 -0
- package/build/angular/navigation-scope.directive.d.ts +10 -0
- package/build/angular/navigation-scope.directive.js +90 -0
- package/build/angular/screen.directive.d.ts +22 -0
- package/build/angular/screen.directive.js +90 -0
- package/build/angular/search-bar-ref.directive.d.ts +10 -0
- package/build/angular/search-bar-ref.directive.js +88 -0
- package/build/angular/stack/index.d.ts +55 -0
- package/build/angular/stack/index.js +386 -0
- package/build/angular/tab-screen.directive.d.ts +14 -0
- package/build/angular/tab-screen.directive.js +87 -0
- package/build/angular/tabs/index.d.ts +42 -0
- package/build/angular/tabs/index.js +263 -0
- package/build/core/constants.d.ts +27 -0
- package/build/core/constants.js +61 -0
- package/build/core/drawer-options/index.d.ts +64 -0
- package/build/core/drawer-options/index.js +200 -0
- package/build/core/drawer-router-state/index.d.ts +21 -0
- package/build/core/drawer-router-state/index.js +40 -0
- package/build/core/guards.d.ts +2 -0
- package/build/core/guards.js +22 -0
- package/build/core/header-bar-buttons.d.ts +9 -0
- package/build/core/header-bar-buttons.js +163 -0
- package/build/core/index.d.ts +29 -0
- package/build/core/index.js +32 -0
- package/build/core/linking-config/index.d.ts +13 -0
- package/build/core/linking-config/index.js +171 -0
- package/build/core/navigation-events/index.d.ts +16 -0
- package/build/core/navigation-events/index.js +57 -0
- package/build/core/navigator-handles/index.d.ts +30 -0
- package/build/core/navigator-handles/index.js +15 -0
- package/build/core/navigator-props.d.ts +216 -0
- package/build/core/navigator-props.js +7 -0
- package/build/core/navigator-state/index.d.ts +36 -0
- package/build/core/navigator-state/index.js +81 -0
- package/build/core/render-drawer.d.ts +13 -0
- package/build/core/render-drawer.js +88 -0
- package/build/core/render-stack.d.ts +35 -0
- package/build/core/render-stack.js +294 -0
- package/build/core/render-tabs.d.ts +20 -0
- package/build/core/render-tabs.js +97 -0
- package/build/core/screen-options.d.ts +4 -0
- package/build/core/screen-options.js +133 -0
- package/build/core/search-bar-commands.d.ts +10 -0
- package/build/core/search-bar-commands.js +42 -0
- package/build/core/state-persistence/index.d.ts +3 -0
- package/build/core/state-persistence/index.js +23 -0
- package/build/core/tab-options.d.ts +13 -0
- package/build/core/tab-options.js +10 -0
- package/build/core/tab-router-state/index.d.ts +19 -0
- package/build/core/tab-router-state/index.js +51 -0
- package/build/react/collect-registry.d.ts +4 -0
- package/build/react/collect-registry.js +15 -0
- package/build/react/drawer/index.d.ts +29 -0
- package/build/react/drawer/index.js +277 -0
- package/build/react/drawer-screen.d.ts +14 -0
- package/build/react/drawer-screen.js +8 -0
- package/build/react/hooks/index.d.ts +12 -0
- package/build/react/hooks/index.js +8 -0
- package/build/react/hooks/use-drawer-navigation.d.ts +4 -0
- package/build/react/hooks/use-drawer-navigation.js +12 -0
- package/build/react/hooks/use-focus-effect.d.ts +2 -0
- package/build/react/hooks/use-focus-effect.js +29 -0
- package/build/react/hooks/use-is-focused.d.ts +1 -0
- package/build/react/hooks/use-is-focused.js +22 -0
- package/build/react/hooks/use-navigation-state/index.d.ts +2 -0
- package/build/react/hooks/use-navigation-state/index.js +39 -0
- package/build/react/hooks/use-navigation.d.ts +7 -0
- package/build/react/hooks/use-navigation.js +16 -0
- package/build/react/hooks/use-route.d.ts +2 -0
- package/build/react/hooks/use-route.js +8 -0
- package/build/react/hooks/use-stack-navigation.d.ts +4 -0
- package/build/react/hooks/use-stack-navigation.js +14 -0
- package/build/react/hooks/use-tab-navigation.d.ts +4 -0
- package/build/react/hooks/use-tab-navigation.js +12 -0
- package/build/react/index.d.ts +24 -0
- package/build/react/index.js +21 -0
- package/build/react/linking.d.ts +3 -0
- package/build/react/linking.js +47 -0
- package/build/react/navigation-context.d.ts +10 -0
- package/build/react/navigation-context.js +22 -0
- package/build/react/screen.d.ts +22 -0
- package/build/react/screen.js +7 -0
- package/build/react/stack/index.d.ts +13 -0
- package/build/react/stack/index.js +202 -0
- package/build/react/tab-screen.d.ts +15 -0
- package/build/react/tab-screen.js +8 -0
- package/build/react/tabs/index.d.ts +12 -0
- package/build/react/tabs/index.js +116 -0
- package/build/register.d.ts +7 -0
- package/build/register.js +58 -0
- package/build/vue/composables/index.d.ts +12 -0
- package/build/vue/composables/index.js +8 -0
- package/build/vue/composables/use-drawer-navigation.d.ts +5 -0
- package/build/vue/composables/use-drawer-navigation.js +15 -0
- package/build/vue/composables/use-focus-effect.d.ts +1 -0
- package/build/vue/composables/use-focus-effect.js +31 -0
- package/build/vue/composables/use-is-focused.d.ts +2 -0
- package/build/vue/composables/use-is-focused.js +28 -0
- package/build/vue/composables/use-navigation-state.d.ts +3 -0
- package/build/vue/composables/use-navigation-state.js +29 -0
- package/build/vue/composables/use-navigation.d.ts +8 -0
- package/build/vue/composables/use-navigation.js +13 -0
- package/build/vue/composables/use-route.d.ts +3 -0
- package/build/vue/composables/use-route.js +9 -0
- package/build/vue/composables/use-stack-navigation.d.ts +5 -0
- package/build/vue/composables/use-stack-navigation.js +18 -0
- package/build/vue/composables/use-tab-navigation.d.ts +5 -0
- package/build/vue/composables/use-tab-navigation.js +15 -0
- package/build/vue/drawer/index.d.ts +19 -0
- package/build/vue/drawer/index.js +390 -0
- package/build/vue/drawer-screen.d.ts +14 -0
- package/build/vue/drawer-screen.js +12 -0
- package/build/vue/index.d.ts +21 -0
- package/build/vue/index.js +19 -0
- package/build/vue/linking.d.ts +3 -0
- package/build/vue/linking.js +57 -0
- package/build/vue/navigation-context.d.ts +16 -0
- package/build/vue/navigation-context.js +65 -0
- package/build/vue/screen.d.ts +21 -0
- package/build/vue/screen.js +12 -0
- package/build/vue/stack/index.d.ts +9 -0
- package/build/vue/stack/index.js +279 -0
- package/build/vue/tab-screen.d.ts +14 -0
- package/build/vue/tab-screen.js +11 -0
- package/build/vue/tabs/index.d.ts +10 -0
- package/build/vue/tabs/index.js +209 -0
- package/build-ngc/angular/drawer/index.d.ts +79 -0
- package/build-ngc/angular/drawer/index.js +479 -0
- package/build-ngc/angular/drawer/index.js.map +1 -0
- package/build-ngc/angular/drawer-screen.directive.d.ts +17 -0
- package/build-ngc/angular/drawer-screen.directive.js +32 -0
- package/build-ngc/angular/drawer-screen.directive.js.map +1 -0
- package/build-ngc/angular/drawer.d.ts +79 -0
- package/build-ngc/angular/drawer.js +475 -0
- package/build-ngc/angular/drawer.js.map +1 -0
- package/build-ngc/angular/index.d.ts +23 -0
- package/build-ngc/angular/index.js +23 -0
- package/build-ngc/angular/index.js.map +1 -0
- package/build-ngc/angular/injectors/index.d.ts +13 -0
- package/build-ngc/angular/injectors/index.js +9 -0
- package/build-ngc/angular/injectors/index.js.map +1 -0
- package/build-ngc/angular/injectors/inject-drawer-navigation.d.ts +4 -0
- package/build-ngc/angular/injectors/inject-drawer-navigation.js +13 -0
- package/build-ngc/angular/injectors/inject-drawer-navigation.js.map +1 -0
- package/build-ngc/angular/injectors/inject-focus-effect.d.ts +2 -0
- package/build-ngc/angular/injectors/inject-focus-effect.js +30 -0
- package/build-ngc/angular/injectors/inject-focus-effect.js.map +1 -0
- package/build-ngc/angular/injectors/inject-is-focused.d.ts +2 -0
- package/build-ngc/angular/injectors/inject-is-focused.js +22 -0
- package/build-ngc/angular/injectors/inject-is-focused.js.map +1 -0
- package/build-ngc/angular/injectors/inject-navigation-state.d.ts +3 -0
- package/build-ngc/angular/injectors/inject-navigation-state.js +37 -0
- package/build-ngc/angular/injectors/inject-navigation-state.js.map +1 -0
- package/build-ngc/angular/injectors/inject-navigation.d.ts +7 -0
- package/build-ngc/angular/injectors/inject-navigation.js +17 -0
- package/build-ngc/angular/injectors/inject-navigation.js.map +1 -0
- package/build-ngc/angular/injectors/inject-route.d.ts +3 -0
- package/build-ngc/angular/injectors/inject-route.js +21 -0
- package/build-ngc/angular/injectors/inject-route.js.map +1 -0
- package/build-ngc/angular/injectors/inject-stack-navigation.d.ts +4 -0
- package/build-ngc/angular/injectors/inject-stack-navigation.js +16 -0
- package/build-ngc/angular/injectors/inject-stack-navigation.js.map +1 -0
- package/build-ngc/angular/injectors/inject-tab-navigation.d.ts +4 -0
- package/build-ngc/angular/injectors/inject-tab-navigation.js +12 -0
- package/build-ngc/angular/injectors/inject-tab-navigation.js.map +1 -0
- package/build-ngc/angular/linking.d.ts +3 -0
- package/build-ngc/angular/linking.js +44 -0
- package/build-ngc/angular/linking.js.map +1 -0
- package/build-ngc/angular/navigation-context.service.d.ts +16 -0
- package/build-ngc/angular/navigation-context.service.js +63 -0
- package/build-ngc/angular/navigation-context.service.js.map +1 -0
- package/build-ngc/angular/navigation-scope.directive.d.ts +13 -0
- package/build-ngc/angular/navigation-scope.directive.js +42 -0
- package/build-ngc/angular/navigation-scope.directive.js.map +1 -0
- package/build-ngc/angular/screen.directive.d.ts +25 -0
- package/build-ngc/angular/screen.directive.js +35 -0
- package/build-ngc/angular/screen.directive.js.map +1 -0
- package/build-ngc/angular/search-bar-ref.directive.d.ts +13 -0
- package/build-ngc/angular/search-bar-ref.directive.js +44 -0
- package/build-ngc/angular/search-bar-ref.directive.js.map +1 -0
- package/build-ngc/angular/stack/index.d.ts +58 -0
- package/build-ngc/angular/stack/index.js +406 -0
- package/build-ngc/angular/stack/index.js.map +1 -0
- package/build-ngc/angular/stack.d.ts +58 -0
- package/build-ngc/angular/stack.js +402 -0
- package/build-ngc/angular/stack.js.map +1 -0
- package/build-ngc/angular/tab-screen.directive.d.ts +17 -0
- package/build-ngc/angular/tab-screen.directive.js +32 -0
- package/build-ngc/angular/tab-screen.directive.js.map +1 -0
- package/build-ngc/angular/tabs/index.d.ts +45 -0
- package/build-ngc/angular/tabs/index.js +231 -0
- package/build-ngc/angular/tabs/index.js.map +1 -0
- package/build-ngc/angular/tabs.d.ts +45 -0
- package/build-ngc/angular/tabs.js +231 -0
- package/build-ngc/angular/tabs.js.map +1 -0
- package/build-ngc/core/constants.d.ts +27 -0
- package/build-ngc/core/constants.js +62 -0
- package/build-ngc/core/constants.js.map +1 -0
- package/build-ngc/core/drawer-options/index.d.ts +64 -0
- package/build-ngc/core/drawer-options/index.js +201 -0
- package/build-ngc/core/drawer-options/index.js.map +1 -0
- package/build-ngc/core/drawer-options.d.ts +64 -0
- package/build-ngc/core/drawer-options.js +201 -0
- package/build-ngc/core/drawer-options.js.map +1 -0
- package/build-ngc/core/drawer-router-state/index.d.ts +21 -0
- package/build-ngc/core/drawer-router-state/index.js +41 -0
- package/build-ngc/core/drawer-router-state/index.js.map +1 -0
- package/build-ngc/core/drawer-router-state.d.ts +21 -0
- package/build-ngc/core/drawer-router-state.js +41 -0
- package/build-ngc/core/drawer-router-state.js.map +1 -0
- package/build-ngc/core/guards.d.ts +2 -0
- package/build-ngc/core/guards.js +23 -0
- package/build-ngc/core/guards.js.map +1 -0
- package/build-ngc/core/header-bar-buttons.d.ts +9 -0
- package/build-ngc/core/header-bar-buttons.js +164 -0
- package/build-ngc/core/header-bar-buttons.js.map +1 -0
- package/build-ngc/core/href.d.ts +16 -0
- package/build-ngc/core/href.js +55 -0
- package/build-ngc/core/href.js.map +1 -0
- package/build-ngc/core/index.d.ts +29 -0
- package/build-ngc/core/index.js +33 -0
- package/build-ngc/core/index.js.map +1 -0
- package/build-ngc/core/linking-config/index.d.ts +13 -0
- package/build-ngc/core/linking-config/index.js +172 -0
- package/build-ngc/core/linking-config/index.js.map +1 -0
- package/build-ngc/core/linking-config.d.ts +13 -0
- package/build-ngc/core/linking-config.js +172 -0
- package/build-ngc/core/linking-config.js.map +1 -0
- package/build-ngc/core/navigation-events/index.d.ts +16 -0
- package/build-ngc/core/navigation-events/index.js +58 -0
- package/build-ngc/core/navigation-events/index.js.map +1 -0
- package/build-ngc/core/navigation-events.d.ts +16 -0
- package/build-ngc/core/navigation-events.js +58 -0
- package/build-ngc/core/navigation-events.js.map +1 -0
- package/build-ngc/core/navigator-handles/index.d.ts +30 -0
- package/build-ngc/core/navigator-handles/index.js +16 -0
- package/build-ngc/core/navigator-handles/index.js.map +1 -0
- package/build-ngc/core/navigator-handles.d.ts +30 -0
- package/build-ngc/core/navigator-handles.js +16 -0
- package/build-ngc/core/navigator-handles.js.map +1 -0
- package/build-ngc/core/navigator-props.d.ts +216 -0
- package/build-ngc/core/navigator-props.js +8 -0
- package/build-ngc/core/navigator-props.js.map +1 -0
- package/build-ngc/core/navigator-state/index.d.ts +36 -0
- package/build-ngc/core/navigator-state/index.js +82 -0
- package/build-ngc/core/navigator-state/index.js.map +1 -0
- package/build-ngc/core/navigator-state.d.ts +36 -0
- package/build-ngc/core/navigator-state.js +82 -0
- package/build-ngc/core/navigator-state.js.map +1 -0
- package/build-ngc/core/render-drawer.d.ts +13 -0
- package/build-ngc/core/render-drawer.js +89 -0
- package/build-ngc/core/render-drawer.js.map +1 -0
- package/build-ngc/core/render-stack.d.ts +35 -0
- package/build-ngc/core/render-stack.js +295 -0
- package/build-ngc/core/render-stack.js.map +1 -0
- package/build-ngc/core/render-tabs.d.ts +20 -0
- package/build-ngc/core/render-tabs.js +98 -0
- package/build-ngc/core/render-tabs.js.map +1 -0
- package/build-ngc/core/screen-options.d.ts +4 -0
- package/build-ngc/core/screen-options.js +134 -0
- package/build-ngc/core/screen-options.js.map +1 -0
- package/build-ngc/core/search-bar-commands.d.ts +10 -0
- package/build-ngc/core/search-bar-commands.js +43 -0
- package/build-ngc/core/search-bar-commands.js.map +1 -0
- package/build-ngc/core/search-params.d.ts +9 -0
- package/build-ngc/core/search-params.js +60 -0
- package/build-ngc/core/search-params.js.map +1 -0
- package/build-ngc/core/state-persistence/index.d.ts +3 -0
- package/build-ngc/core/state-persistence/index.js +24 -0
- package/build-ngc/core/state-persistence/index.js.map +1 -0
- package/build-ngc/core/state-persistence.d.ts +3 -0
- package/build-ngc/core/state-persistence.js +24 -0
- package/build-ngc/core/state-persistence.js.map +1 -0
- package/build-ngc/core/tab-options.d.ts +13 -0
- package/build-ngc/core/tab-options.js +11 -0
- package/build-ngc/core/tab-options.js.map +1 -0
- package/build-ngc/core/tab-router-state/index.d.ts +19 -0
- package/build-ngc/core/tab-router-state/index.js +52 -0
- package/build-ngc/core/tab-router-state/index.js.map +1 -0
- package/build-ngc/core/tab-router-state.d.ts +19 -0
- package/build-ngc/core/tab-router-state.js +52 -0
- package/build-ngc/core/tab-router-state.js.map +1 -0
- package/build-ngc/register.d.ts +7 -0
- package/build-ngc/register.js +59 -0
- package/build-ngc/register.js.map +1 -0
- package/codegen-specs/FullWindowOverlayNativeComponent.ts +13 -0
- package/codegen-specs/ModalScreenNativeComponent.ts +129 -0
- package/codegen-specs/NativeScreensModule.ts +8 -0
- package/codegen-specs/NativeScreensModule.web.ts +1 -0
- package/codegen-specs/ScreenContainerNativeComponent.ts +8 -0
- package/codegen-specs/ScreenContentWrapperNativeComponent.ts +9 -0
- package/codegen-specs/ScreenFooterNativeComponent.ts +6 -0
- package/codegen-specs/ScreenNativeComponent.ts +133 -0
- package/codegen-specs/ScreenNavigationContainerNativeComponent.ts +11 -0
- package/codegen-specs/ScreenStackHeaderConfigNativeComponent.ts +99 -0
- package/codegen-specs/ScreenStackHeaderSubviewNativeComponent.ts +25 -0
- package/codegen-specs/ScreenStackNativeComponent.ts +17 -0
- package/codegen-specs/SearchBarNativeComponent.ts +101 -0
- package/codegen-specs/codegenUtils.ts +6 -0
- package/codegen-specs/gamma/ScrollViewMarkerNativeComponent.ts +15 -0
- package/codegen-specs/gamma/modals/form-sheet/FormSheetContentWrapperNativeComponent.ts +10 -0
- package/codegen-specs/gamma/modals/form-sheet/FormSheetHostNativeComponent.ts +47 -0
- package/codegen-specs/gamma/split/SplitHostNativeComponent.ts +124 -0
- package/codegen-specs/gamma/split/SplitScreenNativeComponent.ts +24 -0
- package/codegen-specs/gamma/stack/StackHeaderConfigAndroidNativeComponent.ts +144 -0
- package/codegen-specs/gamma/stack/StackHeaderConfigIOSNativeComponent.ts +34 -0
- package/codegen-specs/gamma/stack/StackHeaderItemIOSNativeComponent.ts +47 -0
- package/codegen-specs/gamma/stack/StackHeaderItemSpacerIOSNativeComponent.ts +20 -0
- package/codegen-specs/gamma/stack/StackHeaderSubviewAndroidNativeComponent.ts +27 -0
- package/codegen-specs/gamma/stack/StackHostNativeComponent.ts +8 -0
- package/codegen-specs/gamma/stack/StackScreenNativeComponent.ts +42 -0
- package/codegen-specs/safe-area/SafeAreaViewNativeComponent.ts +24 -0
- package/codegen-specs/tabs/TabsBottomAccessoryContentNativeComponent.ts +15 -0
- package/codegen-specs/tabs/TabsBottomAccessoryNativeComponent.ts +19 -0
- package/codegen-specs/tabs/TabsHostAndroidNativeComponent.ts +69 -0
- package/codegen-specs/tabs/TabsHostIOSNativeComponent.ts +92 -0
- package/codegen-specs/tabs/TabsScreenAndroidNativeComponent.ts +112 -0
- package/codegen-specs/tabs/TabsScreenIOSNativeComponent.ts +171 -0
- package/package.json +201 -0
- package/react-native.config.cjs +58 -0
- package/src/angular/drawer/drawer.test.ts +299 -0
- package/src/angular/drawer/index.ts +546 -0
- package/src/angular/drawer-screen.directive.ts +28 -0
- package/src/angular/index.ts +63 -0
- package/src/angular/injectors/index.ts +13 -0
- package/src/angular/injectors/inject-drawer-navigation.ts +21 -0
- package/src/angular/injectors/inject-focus-effect.ts +37 -0
- package/src/angular/injectors/inject-is-focused.ts +28 -0
- package/src/angular/injectors/inject-navigation-state.ts +46 -0
- package/src/angular/injectors/inject-navigation.ts +26 -0
- package/src/angular/injectors/inject-route.ts +25 -0
- package/src/angular/injectors/inject-stack-navigation.ts +24 -0
- package/src/angular/injectors/inject-tab-navigation.ts +20 -0
- package/src/angular/injectors/injectors.test.ts +247 -0
- package/src/angular/injectors/use-typed-navigation.test.ts +229 -0
- package/src/angular/linking.ts +55 -0
- package/src/angular/navigation-context.service.ts +68 -0
- package/src/angular/navigation-scope.directive.ts +31 -0
- package/src/angular/nested-navigation.test.ts +189 -0
- package/src/angular/screen.directive.ts +48 -0
- package/src/angular/search-bar-ref.directive.ts +38 -0
- package/src/angular/stack/index.ts +401 -0
- package/src/angular/stack/stack.test.ts +419 -0
- package/src/angular/tab-screen.directive.ts +26 -0
- package/src/angular/tabs/index.ts +254 -0
- package/src/angular/tabs/tabs.test.ts +249 -0
- package/src/core/constants.ts +68 -0
- package/src/core/drawer-options/drawer-options.test.ts +415 -0
- package/src/core/drawer-options/index.ts +331 -0
- package/src/core/drawer-router-state/drawer-router-state.test.ts +116 -0
- package/src/core/drawer-router-state/index.ts +71 -0
- package/src/core/guards.ts +23 -0
- package/src/core/header-bar-buttons.ts +212 -0
- package/src/core/index.ts +170 -0
- package/src/core/linking-config/index.ts +209 -0
- package/src/core/linking-config/linking-config.test.ts +109 -0
- package/src/core/navigation-events/index.ts +94 -0
- package/src/core/navigation-events/navigation-events.test.ts +56 -0
- package/src/core/navigator-handles/index.ts +63 -0
- package/src/core/navigator-handles/navigator-handles.test.ts +46 -0
- package/src/core/navigator-props.ts +323 -0
- package/src/core/navigator-state/index.ts +112 -0
- package/src/core/navigator-state/navigator-state.test.ts +80 -0
- package/src/core/render-drawer.ts +123 -0
- package/src/core/render-stack.ts +414 -0
- package/src/core/render-tabs.ts +138 -0
- package/src/core/screen-options.ts +181 -0
- package/src/core/search-bar-commands.ts +57 -0
- package/src/core/state-persistence/index.ts +30 -0
- package/src/core/state-persistence/state-persistence.test.ts +42 -0
- package/src/core/tab-options.ts +25 -0
- package/src/core/tab-router-state/index.ts +75 -0
- package/src/core/tab-router-state/tab-router-state.test.ts +34 -0
- package/src/globals.d.ts +4 -0
- package/src/react/collect-registry.ts +19 -0
- package/src/react/drawer/drawer.test.tsx +472 -0
- package/src/react/drawer/index.ts +451 -0
- package/src/react/drawer-screen.ts +29 -0
- package/src/react/hooks/hooks.test.tsx +199 -0
- package/src/react/hooks/index.ts +12 -0
- package/src/react/hooks/use-drawer-navigation.ts +21 -0
- package/src/react/hooks/use-focus-effect.ts +36 -0
- package/src/react/hooks/use-is-focused.ts +26 -0
- package/src/react/hooks/use-navigation-state/index.ts +47 -0
- package/src/react/hooks/use-navigation-state/use-navigation-state.test.ts +85 -0
- package/src/react/hooks/use-navigation.ts +36 -0
- package/src/react/hooks/use-route.ts +11 -0
- package/src/react/hooks/use-stack-navigation.ts +23 -0
- package/src/react/hooks/use-tab-navigation.ts +21 -0
- package/src/react/hooks/use-typed-navigation.test.tsx +187 -0
- package/src/react/index.ts +52 -0
- package/src/react/linking.ts +59 -0
- package/src/react/navigation-context.ts +40 -0
- package/src/react/nested-navigation.test.tsx +145 -0
- package/src/react/screen.ts +44 -0
- package/src/react/stack/index.ts +323 -0
- package/src/react/stack/stack.test.tsx +514 -0
- package/src/react/tab-screen.ts +30 -0
- package/src/react/tabs/index.ts +204 -0
- package/src/react/tabs/tabs.test.tsx +256 -0
- package/src/register.ts +59 -0
- package/src/vue/composables/composables.test.ts +221 -0
- package/src/vue/composables/index.ts +12 -0
- package/src/vue/composables/use-drawer-navigation.ts +25 -0
- package/src/vue/composables/use-focus-effect.ts +37 -0
- package/src/vue/composables/use-is-focused.ts +34 -0
- package/src/vue/composables/use-navigation-state.ts +38 -0
- package/src/vue/composables/use-navigation.ts +30 -0
- package/src/vue/composables/use-route.ts +13 -0
- package/src/vue/composables/use-stack-navigation.ts +28 -0
- package/src/vue/composables/use-tab-navigation.ts +25 -0
- package/src/vue/composables/use-typed-navigation.test.ts +205 -0
- package/src/vue/drawer/drawer.test.ts +451 -0
- package/src/vue/drawer/index.ts +550 -0
- package/src/vue/drawer-screen.ts +32 -0
- package/src/vue/index.ts +70 -0
- package/src/vue/linking.ts +69 -0
- package/src/vue/navigation-context.ts +87 -0
- package/src/vue/nested-navigation.test.ts +155 -0
- package/src/vue/screen.ts +52 -0
- package/src/vue/stack/index.ts +376 -0
- package/src/vue/stack/stack.test.ts +501 -0
- package/src/vue/tab-screen.ts +29 -0
- package/src/vue/tabs/index.ts +302 -0
- package/src/vue/tabs/tabs.test.ts +278 -0
- package/symbiote-navigation.podspec +84 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IRoute } from './navigator-state';
|
|
2
|
+
export type IScreenLinkingConfig = string | {
|
|
3
|
+
path?: string;
|
|
4
|
+
screens?: Record<string, IScreenLinkingConfig>;
|
|
5
|
+
};
|
|
6
|
+
export type ILinkingConfig = {
|
|
7
|
+
prefixes: string[];
|
|
8
|
+
config: {
|
|
9
|
+
screens: Record<string, IScreenLinkingConfig>;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export declare function resolveRouteFromUrl(config: ILinkingConfig, url: string): IRoute<unknown> | null;
|
|
13
|
+
export declare function resolveUrlFromRoute(config: ILinkingConfig, route: IRoute<unknown>): string | null;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// Linking config: the piece @react-navigation's `NavigationContainer`'s `linking` prop provides
|
|
2
|
+
// on top of the framework-agnostic `Linking` module (core/engine/src/linking) — resolving a URL
|
|
3
|
+
// ('myapp://user/42', '/user/42') to a route, and a route back to a URL. This is OUR OWN type,
|
|
4
|
+
// not imported from react-navigation, kept close to its shape (`prefixes` + `config.screens`)
|
|
5
|
+
// only so the DX is familiar.
|
|
6
|
+
//
|
|
7
|
+
// Why hand-rolled matching instead of react-router's `matchPath`/`generatePath` (evaluated per
|
|
8
|
+
// task): react-router 8's package has no subpath export for the pure `lib/router/utils.ts`
|
|
9
|
+
// matcher — its only general entry point (`.`) eagerly imports `./lib/dom/*`
|
|
10
|
+
// (BrowserRouter/ScrollRestoration/cookies) and `./lib/server-runtime/*`, code that assumes DOM
|
|
11
|
+
// and Node globals a Metro/Hermes RN bundle doesn't have; its `peerDependencies` also pin
|
|
12
|
+
// `react-dom`, which this DOM-free monorepo never installs (see CLAUDE.md
|
|
13
|
+
// react_native_is_an_explicit_top_level_peer — no foreign runtime singleton gets smuggled in).
|
|
14
|
+
// On top of the bundling risk, `matchPath`'s/`generatePath`'s param-name extraction is a
|
|
15
|
+
// template-literal-type trick that only fires for a compile-time LITERAL path string; our
|
|
16
|
+
// patterns come from a runtime config object (`Path` widens to plain `string`), so the generic
|
|
17
|
+
// degrades to an empty params type and using the result would force an `as` cast — forbidden by
|
|
18
|
+
// this project's TS conventions. A minimal `:param`-segment matcher sidesteps both problems and
|
|
19
|
+
// is the right size for a single flat Stack (no optional/splat segments — no nested-navigator use
|
|
20
|
+
// for them yet).
|
|
21
|
+
import { dlog } from '@symbiote-native/engine';
|
|
22
|
+
import { isRecord } from './guards';
|
|
23
|
+
// Strips leading/trailing slashes so segments join predictably regardless of how the caller
|
|
24
|
+
// wrote a path ('feed/:sort', '/feed/:sort/', etc).
|
|
25
|
+
function normalizeSegment(segment) {
|
|
26
|
+
return segment.replace(/^\/+|\/+$/g, '');
|
|
27
|
+
}
|
|
28
|
+
function joinPath(parent, child) {
|
|
29
|
+
const parts = [normalizeSegment(parent), normalizeSegment(child)].filter(part => part.length > 0);
|
|
30
|
+
return parts.join('/');
|
|
31
|
+
}
|
|
32
|
+
// Walks `screens` recursively, accumulating the path down to each LEAF screen. Unlike
|
|
33
|
+
// react-navigation (which resolves nested config into nested navigation state), our navigator is
|
|
34
|
+
// a single flat Stack — a `screens` group with no `path` of its own is transparent (consumes no
|
|
35
|
+
// URL segment); a group WITH a `path` but no nested `screens` is itself a leaf using that path.
|
|
36
|
+
function flattenScreens(screens, parentPath, out) {
|
|
37
|
+
for (const [name, entry] of Object.entries(screens)) {
|
|
38
|
+
if (typeof entry === 'string') {
|
|
39
|
+
out.push({ name, pattern: joinPath(parentPath, entry) });
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const nextParent = entry.path !== undefined ? joinPath(parentPath, entry.path) : parentPath;
|
|
43
|
+
if (entry.screens !== undefined) {
|
|
44
|
+
flattenScreens(entry.screens, nextParent, out);
|
|
45
|
+
}
|
|
46
|
+
else if (entry.path !== undefined) {
|
|
47
|
+
out.push({ name, pattern: nextParent });
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
dlog(`linking-config: screen "${name}" has neither a path nor nested screens, skipping`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
function dynamicSegmentCount(pattern) {
|
|
56
|
+
if (pattern.length === 0)
|
|
57
|
+
return 0;
|
|
58
|
+
return pattern.split('/').filter(segment => segment.startsWith(':')).length;
|
|
59
|
+
}
|
|
60
|
+
function segmentCount(pattern) {
|
|
61
|
+
return pattern.length === 0 ? 0 : pattern.split('/').length;
|
|
62
|
+
}
|
|
63
|
+
// More static segments should win over a param that would also match (e.g. a literal
|
|
64
|
+
// '/user/me' pattern over '/user/:id'), mirroring how react-navigation prefers exact matches.
|
|
65
|
+
function bySpecificity(a, b) {
|
|
66
|
+
const dynamicDiff = dynamicSegmentCount(a.pattern) - dynamicSegmentCount(b.pattern);
|
|
67
|
+
if (dynamicDiff !== 0)
|
|
68
|
+
return dynamicDiff;
|
|
69
|
+
return segmentCount(b.pattern) - segmentCount(a.pattern);
|
|
70
|
+
}
|
|
71
|
+
function matchPattern(pattern, pathname) {
|
|
72
|
+
const patternSegments = pattern.length === 0 ? [] : pattern.split('/');
|
|
73
|
+
const pathSegments = pathname.length === 0 ? [] : pathname.split('/');
|
|
74
|
+
if (patternSegments.length !== pathSegments.length)
|
|
75
|
+
return null;
|
|
76
|
+
const params = {};
|
|
77
|
+
for (let index = 0; index < patternSegments.length; index += 1) {
|
|
78
|
+
const patternSegment = patternSegments[index];
|
|
79
|
+
const pathSegment = pathSegments[index];
|
|
80
|
+
if (patternSegment.startsWith(':')) {
|
|
81
|
+
params[patternSegment.slice(1)] = decodeURIComponent(pathSegment);
|
|
82
|
+
}
|
|
83
|
+
else if (patternSegment !== pathSegment) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return params;
|
|
88
|
+
}
|
|
89
|
+
function stripQueryAndHash(url) {
|
|
90
|
+
const match = /[?#]/.exec(url);
|
|
91
|
+
return match === null ? url : url.slice(0, match.index);
|
|
92
|
+
}
|
|
93
|
+
// Resolves a full URL down to the bare path segment string ('user/42', no leading slash) by
|
|
94
|
+
// stripping the longest matching configured prefix, falling back to treating the URL as an
|
|
95
|
+
// already-bare path when it starts with '/' (the task's second example form). Returns null when
|
|
96
|
+
// neither applies — an unrecognized scheme/host, not "no route matched".
|
|
97
|
+
function extractPathname(config, url) {
|
|
98
|
+
const withoutQuery = stripQueryAndHash(url);
|
|
99
|
+
const sortedPrefixes = [...config.prefixes].sort((a, b) => b.length - a.length);
|
|
100
|
+
for (const prefix of sortedPrefixes) {
|
|
101
|
+
if (withoutQuery.startsWith(prefix)) {
|
|
102
|
+
return normalizeSegment(withoutQuery.slice(prefix.length));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (withoutQuery.startsWith('/'))
|
|
106
|
+
return normalizeSegment(withoutQuery);
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
export function resolveRouteFromUrl(config, url) {
|
|
110
|
+
const pathname = extractPathname(config, url);
|
|
111
|
+
if (pathname === null) {
|
|
112
|
+
dlog(`linking-config: url "${url}" matched no configured prefix`);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
const candidates = flattenScreens(config.config.screens, '', []).sort(bySpecificity);
|
|
116
|
+
for (const candidate of candidates) {
|
|
117
|
+
const params = matchPattern(candidate.pattern, pathname);
|
|
118
|
+
if (params !== null) {
|
|
119
|
+
dlog(`linking-config: resolved "${url}" -> ${candidate.name}`);
|
|
120
|
+
// `key` is not real route identity here — the navigator mints its own on push/replace
|
|
121
|
+
// (stack.ts's createRoute); `name` is a stable enough placeholder to satisfy IRoute's shape.
|
|
122
|
+
return {
|
|
123
|
+
key: candidate.name,
|
|
124
|
+
name: candidate.name,
|
|
125
|
+
params: Object.keys(params).length > 0 ? params : undefined,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
dlog(`linking-config: url "${url}" (path "${pathname}") matched no configured screen`);
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
// The inverse of matchPattern: fills a pattern's ':param' segments from `params`, or returns
|
|
133
|
+
// null when a required param is missing (mirrors react-router's generatePath throwing, minus the
|
|
134
|
+
// throw — a resolver returning null reads more naturally at the call site here).
|
|
135
|
+
function fillPattern(pattern, params) {
|
|
136
|
+
if (pattern.length === 0)
|
|
137
|
+
return '';
|
|
138
|
+
const source = isRecord(params) ? params : {};
|
|
139
|
+
const segments = [];
|
|
140
|
+
for (const segment of pattern.split('/')) {
|
|
141
|
+
if (!segment.startsWith(':')) {
|
|
142
|
+
segments.push(segment);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const value = source[segment.slice(1)];
|
|
146
|
+
if (value === undefined || value === null)
|
|
147
|
+
return null;
|
|
148
|
+
segments.push(encodeURIComponent(String(value)));
|
|
149
|
+
}
|
|
150
|
+
return segments.join('/');
|
|
151
|
+
}
|
|
152
|
+
export function resolveUrlFromRoute(config, route) {
|
|
153
|
+
const candidate = flattenScreens(config.config.screens, '', []).find(entry => entry.name === route.name);
|
|
154
|
+
if (candidate === undefined) {
|
|
155
|
+
dlog(`linking-config: no configured screen for route name "${route.name}"`);
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
const path = fillPattern(candidate.pattern, route.params);
|
|
159
|
+
if (path === null) {
|
|
160
|
+
dlog(`linking-config: route "${route.name}" is missing a param required by "${candidate.pattern}"`);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const prefix = config.prefixes[0];
|
|
164
|
+
if (prefix === undefined)
|
|
165
|
+
return path.length > 0 ? `/${path}` : '/';
|
|
166
|
+
// A prefix already carrying its own trailing separator ('myapp://') must not be truncated to
|
|
167
|
+
// 'myapp:/' by naively slicing one char off — only add a '/' when the prefix doesn't have one.
|
|
168
|
+
if (path.length === 0)
|
|
169
|
+
return prefix;
|
|
170
|
+
return prefix.endsWith('/') ? `${prefix}${path}` : `${prefix}/${path}`;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=linking-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linking-config.js","sourceRoot":"","sources":["../../src/core/linking-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const NAVIGATION_EVENT_FOCUS = "focus";
|
|
2
|
+
export declare const NAVIGATION_EVENT_BLUR = "blur";
|
|
3
|
+
export declare const NAVIGATION_EVENT_STATE = "state";
|
|
4
|
+
export declare const NAVIGATION_EVENT_BEFORE_REMOVE = "beforeRemove";
|
|
5
|
+
export type INavigationEventName = typeof NAVIGATION_EVENT_FOCUS | typeof NAVIGATION_EVENT_BLUR | typeof NAVIGATION_EVENT_STATE | typeof NAVIGATION_EVENT_BEFORE_REMOVE;
|
|
6
|
+
export type INavigationEventListener<TData = unknown> = (data: TData) => void;
|
|
7
|
+
export type INavigationEmitter = {
|
|
8
|
+
emit: (event: INavigationEventName, data?: unknown) => void;
|
|
9
|
+
addListener: (event: INavigationEventName, listener: INavigationEventListener) => () => void;
|
|
10
|
+
};
|
|
11
|
+
export declare function createNavigationEmitter(): INavigationEmitter;
|
|
12
|
+
export type IFocusTransition = {
|
|
13
|
+
blurKey?: string;
|
|
14
|
+
focusKey?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function diffFocusedRoute(prevKey: string | undefined, nextKey: string | undefined): IFocusTransition;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// The framework-agnostic half of what @react-navigation exposes as `navigation.addListener` /
|
|
2
|
+
// `useFocusEffect` / `useIsFocused` / `useNavigationState`: a plain pub/sub emitter, zero React.
|
|
3
|
+
// addListener is NOT React-specific there either - React's hooks are thin useEffect wrappers
|
|
4
|
+
// around exactly this subscribe/unsubscribe shape (confirmed against the 8.x docs: `const
|
|
5
|
+
// unsubscribe = navigation.addListener('focus', cb); return unsubscribe;` inside a bare
|
|
6
|
+
// `useEffect`). One emitter per route (created by the adapter, e.g. stack.ts's per-route
|
|
7
|
+
// `emitters` map) carries that route's own focus/blur/state lifecycle; every adapter's lifecycle
|
|
8
|
+
// hooks subscribe to it, matching this file's single responsibility split from `constants.ts`
|
|
9
|
+
// (which only names Fabric view/prop-key strings, not this JS-only event system).
|
|
10
|
+
//
|
|
11
|
+
// diffFocusedRoute below centralizes the "which route lost focus, which gained it" comparison
|
|
12
|
+
// that tabs.ts and drawer.ts independently reimplemented in all three adapters (each watching its
|
|
13
|
+
// own router state for the focused index/key changing, then manually emitting BLUR to the old key
|
|
14
|
+
// and FOCUS to the new one, plus an initial FOCUS seed on first mount) - the diff is pure and
|
|
15
|
+
// identical everywhere; only WHEN to run it differs per framework (a `useEffect` dependency array,
|
|
16
|
+
// a Vue `watch`, an idempotent-per-read Angular method), so that half stays adapter-owned.
|
|
17
|
+
import { dlog } from '@symbiote-native/engine';
|
|
18
|
+
export const NAVIGATION_EVENT_FOCUS = 'focus';
|
|
19
|
+
export const NAVIGATION_EVENT_BLUR = 'blur';
|
|
20
|
+
export const NAVIGATION_EVENT_STATE = 'state';
|
|
21
|
+
export const NAVIGATION_EVENT_BEFORE_REMOVE = 'beforeRemove';
|
|
22
|
+
export function createNavigationEmitter() {
|
|
23
|
+
const listenersByEvent = new Map();
|
|
24
|
+
function addListener(event, listener) {
|
|
25
|
+
let listeners = listenersByEvent.get(event);
|
|
26
|
+
if (!listeners) {
|
|
27
|
+
listeners = new Set();
|
|
28
|
+
listenersByEvent.set(event, listeners);
|
|
29
|
+
}
|
|
30
|
+
listeners.add(listener);
|
|
31
|
+
return () => {
|
|
32
|
+
listeners?.delete(listener);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function emit(event, data) {
|
|
36
|
+
const listeners = listenersByEvent.get(event);
|
|
37
|
+
// Investigation instrumentation (flicker-on-focus bug): every emission, whether or not a
|
|
38
|
+
// listener is attached, so the log stream shows if focus/blur ever fires with 0 subscribers
|
|
39
|
+
// (a silent no-op) vs racing an actual effect. Kept behind DEBUG, never removed.
|
|
40
|
+
dlog(`Navigation emitter: emit "${event}" (${listeners?.size ?? 0} listener(s)) at t=${Date.now()}`);
|
|
41
|
+
if (!listeners)
|
|
42
|
+
return;
|
|
43
|
+
for (const listener of listeners)
|
|
44
|
+
listener(data);
|
|
45
|
+
}
|
|
46
|
+
return { emit, addListener };
|
|
47
|
+
}
|
|
48
|
+
export function diffFocusedRoute(prevKey, nextKey) {
|
|
49
|
+
if (prevKey === nextKey)
|
|
50
|
+
return {};
|
|
51
|
+
const transition = {};
|
|
52
|
+
if (prevKey !== undefined)
|
|
53
|
+
transition.blurKey = prevKey;
|
|
54
|
+
if (nextKey !== undefined)
|
|
55
|
+
transition.focusKey = nextKey;
|
|
56
|
+
return transition;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/navigation-events/index.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,iGAAiG;AACjG,6FAA6F;AAC7F,0FAA0F;AAC1F,wFAAwF;AACxF,yFAAyF;AACzF,iGAAiG;AACjG,8FAA8F;AAC9F,kFAAkF;AAClF,EAAE;AACF,8FAA8F;AAC9F,kGAAkG;AAClG,kGAAkG;AAClG,8FAA8F;AAC9F,mGAAmG;AACnG,2FAA2F;AAE3F,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAC9C,MAAM,CAAC,MAAM,8BAA8B,GAAG,cAAc,CAAC;AAe7D,MAAM,UAAU,uBAAuB;IACrC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuD,CAAC;IAExF,SAAS,WAAW,CAClB,KAA2B,EAC3B,QAAkC;QAElC,IAAI,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC;IAED,SAAS,IAAI,CAAC,KAA2B,EAAE,IAAc;QACvD,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,yFAAyF;QACzF,4FAA4F;QAC5F,iFAAiF;QACjF,IAAI,CACF,6BAA6B,KAAK,MAAM,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CAC/F,CAAC;QACF,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC;AAeD,MAAM,UAAU,gBAAgB,CAC9B,OAA2B,EAC3B,OAA2B;IAE3B,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,SAAS;QAAE,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IACxD,IAAI,OAAO,KAAK,SAAS;QAAE,UAAU,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const NAVIGATION_EVENT_FOCUS = "focus";
|
|
2
|
+
export declare const NAVIGATION_EVENT_BLUR = "blur";
|
|
3
|
+
export declare const NAVIGATION_EVENT_STATE = "state";
|
|
4
|
+
export declare const NAVIGATION_EVENT_BEFORE_REMOVE = "beforeRemove";
|
|
5
|
+
export type INavigationEventName = typeof NAVIGATION_EVENT_FOCUS | typeof NAVIGATION_EVENT_BLUR | typeof NAVIGATION_EVENT_STATE | typeof NAVIGATION_EVENT_BEFORE_REMOVE;
|
|
6
|
+
export type INavigationEventListener<TData = unknown> = (data: TData) => void;
|
|
7
|
+
export type INavigationEmitter = {
|
|
8
|
+
emit: (event: INavigationEventName, data?: unknown) => void;
|
|
9
|
+
addListener: (event: INavigationEventName, listener: INavigationEventListener) => () => void;
|
|
10
|
+
};
|
|
11
|
+
export declare function createNavigationEmitter(): INavigationEmitter;
|
|
12
|
+
export type IFocusTransition = {
|
|
13
|
+
blurKey?: string;
|
|
14
|
+
focusKey?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function diffFocusedRoute(prevKey: string | undefined, nextKey: string | undefined): IFocusTransition;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// The framework-agnostic half of what @react-navigation exposes as `navigation.addListener` /
|
|
2
|
+
// `useFocusEffect` / `useIsFocused` / `useNavigationState`: a plain pub/sub emitter, zero React.
|
|
3
|
+
// addListener is NOT React-specific there either — React's hooks are thin useEffect wrappers
|
|
4
|
+
// around exactly this subscribe/unsubscribe shape (confirmed against the 8.x docs: `const
|
|
5
|
+
// unsubscribe = navigation.addListener('focus', cb); return unsubscribe;` inside a bare
|
|
6
|
+
// `useEffect`). One emitter per route (created by the adapter, e.g. stack.ts's per-route
|
|
7
|
+
// `emitters` map) carries that route's own focus/blur/state lifecycle; every adapter's lifecycle
|
|
8
|
+
// hooks subscribe to it, matching this file's single responsibility split from `constants.ts`
|
|
9
|
+
// (which only names Fabric view/prop-key strings, not this JS-only event system).
|
|
10
|
+
//
|
|
11
|
+
// diffFocusedRoute below centralizes the "which route lost focus, which gained it" comparison
|
|
12
|
+
// that tabs.ts and drawer.ts independently reimplemented in all three adapters (each watching its
|
|
13
|
+
// own router state for the focused index/key changing, then manually emitting BLUR to the old key
|
|
14
|
+
// and FOCUS to the new one, plus an initial FOCUS seed on first mount) — the diff is pure and
|
|
15
|
+
// identical everywhere; only WHEN to run it differs per framework (a `useEffect` dependency array,
|
|
16
|
+
// a Vue `watch`, an idempotent-per-read Angular method), so that half stays adapter-owned.
|
|
17
|
+
import { dlog } from '@symbiote-native/engine';
|
|
18
|
+
export const NAVIGATION_EVENT_FOCUS = 'focus';
|
|
19
|
+
export const NAVIGATION_EVENT_BLUR = 'blur';
|
|
20
|
+
export const NAVIGATION_EVENT_STATE = 'state';
|
|
21
|
+
export const NAVIGATION_EVENT_BEFORE_REMOVE = 'beforeRemove';
|
|
22
|
+
export function createNavigationEmitter() {
|
|
23
|
+
const listenersByEvent = new Map();
|
|
24
|
+
function addListener(event, listener) {
|
|
25
|
+
let listeners = listenersByEvent.get(event);
|
|
26
|
+
if (!listeners) {
|
|
27
|
+
listeners = new Set();
|
|
28
|
+
listenersByEvent.set(event, listeners);
|
|
29
|
+
}
|
|
30
|
+
listeners.add(listener);
|
|
31
|
+
return () => {
|
|
32
|
+
listeners?.delete(listener);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function emit(event, data) {
|
|
36
|
+
const listeners = listenersByEvent.get(event);
|
|
37
|
+
// Investigation instrumentation (flicker-on-focus bug): every emission, whether or not a
|
|
38
|
+
// listener is attached, so the log stream shows if focus/blur ever fires with 0 subscribers
|
|
39
|
+
// (a silent no-op) vs racing an actual effect. Kept behind DEBUG, never removed.
|
|
40
|
+
dlog(`Navigation emitter: emit "${event}" (${listeners?.size ?? 0} listener(s)) at t=${Date.now()}`);
|
|
41
|
+
if (!listeners)
|
|
42
|
+
return;
|
|
43
|
+
for (const listener of listeners)
|
|
44
|
+
listener(data);
|
|
45
|
+
}
|
|
46
|
+
return { emit, addListener };
|
|
47
|
+
}
|
|
48
|
+
export function diffFocusedRoute(prevKey, nextKey) {
|
|
49
|
+
if (prevKey === nextKey)
|
|
50
|
+
return {};
|
|
51
|
+
const transition = {};
|
|
52
|
+
if (prevKey !== undefined)
|
|
53
|
+
transition.blurKey = prevKey;
|
|
54
|
+
if (nextKey !== undefined)
|
|
55
|
+
transition.focusKey = nextKey;
|
|
56
|
+
return transition;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=navigation-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation-events.js","sourceRoot":"","sources":["../../src/core/navigation-events.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,iGAAiG;AACjG,6FAA6F;AAC7F,0FAA0F;AAC1F,wFAAwF;AACxF,yFAAyF;AACzF,iGAAiG;AACjG,8FAA8F;AAC9F,kFAAkF;AAClF,EAAE;AACF,8FAA8F;AAC9F,kGAAkG;AAClG,kGAAkG;AAClG,8FAA8F;AAC9F,mGAAmG;AACnG,2FAA2F;AAE3F,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAC9C,MAAM,CAAC,MAAM,8BAA8B,GAAG,cAAc,CAAC;AAe7D,MAAM,UAAU,uBAAuB;IACrC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuD,CAAC;IAExF,SAAS,WAAW,CAClB,KAA2B,EAC3B,QAAkC;QAElC,IAAI,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC;IAED,SAAS,IAAI,CAAC,KAA2B,EAAE,IAAc;QACvD,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,yFAAyF;QACzF,4FAA4F;QAC5F,iFAAiF;QACjF,IAAI,CACF,6BAA6B,KAAK,MAAM,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CAC/F,CAAC;QACF,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC;AAeD,MAAM,UAAU,gBAAgB,CAC9B,OAA2B,EAC3B,OAA2B;IAE3B,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,SAAS;QAAE,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IACxD,IAAI,OAAO,KAAK,SAAS;QAAE,UAAU,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { INavigatorState } from '../navigator-state';
|
|
2
|
+
import type { IDrawerScreenOptions } from '../drawer-options';
|
|
3
|
+
export type INavigatorHandle = {
|
|
4
|
+
push: (name: string, params?: unknown) => void;
|
|
5
|
+
pop: (count?: number) => void;
|
|
6
|
+
popToTop: () => void;
|
|
7
|
+
popTo: (key: string) => void;
|
|
8
|
+
replace: (name: string, params?: unknown) => void;
|
|
9
|
+
setParams: (params: unknown, key?: string) => void;
|
|
10
|
+
reset: (state: INavigatorState) => void;
|
|
11
|
+
canGoBack: () => boolean;
|
|
12
|
+
};
|
|
13
|
+
export type ITabNavigatorHandle = {
|
|
14
|
+
jumpTo: (name: string, params?: unknown) => void;
|
|
15
|
+
setParams: (params: unknown, key: string) => void;
|
|
16
|
+
};
|
|
17
|
+
export type IDrawerNavigatorHandle = {
|
|
18
|
+
openDrawer: () => void;
|
|
19
|
+
closeDrawer: () => void;
|
|
20
|
+
toggleDrawer: () => void;
|
|
21
|
+
jumpTo: (name: string) => void;
|
|
22
|
+
};
|
|
23
|
+
export type IDrawerDescriptorMap = Record<string, {
|
|
24
|
+
options: IDrawerScreenOptions;
|
|
25
|
+
navigation: IDrawerNavigatorHandle;
|
|
26
|
+
}>;
|
|
27
|
+
export type IAnyNavigatorHandle = INavigatorHandle | ITabNavigatorHandle | IDrawerNavigatorHandle;
|
|
28
|
+
export declare function isStackNavigatorHandle(handle: IAnyNavigatorHandle): handle is INavigatorHandle;
|
|
29
|
+
export declare function isDrawerNavigatorHandle(handle: IAnyNavigatorHandle): handle is IDrawerNavigatorHandle;
|
|
30
|
+
export declare function isTabNavigatorHandle(handle: IAnyNavigatorHandle): handle is ITabNavigatorHandle;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Imperative navigator handles: framework-agnostic (scalars, `unknown`, plain function
|
|
2
|
+
// signatures over `INavigatorState`/`IDrawerScreenOptions` - no framework element, ref, or
|
|
3
|
+
// children in any field), so each shape is declared once here and every adapter re-exports it
|
|
4
|
+
// verbatim (see CLAUDE.md <prop_types_split_agnostic_vs_per_adapter>).
|
|
5
|
+
export function isStackNavigatorHandle(handle) {
|
|
6
|
+
return 'push' in handle;
|
|
7
|
+
}
|
|
8
|
+
export function isDrawerNavigatorHandle(handle) {
|
|
9
|
+
return 'openDrawer' in handle;
|
|
10
|
+
}
|
|
11
|
+
// jumpTo exists on both Tab and Drawer handles, so a Tab handle is a jumpTo-having handle that
|
|
12
|
+
// isn't a Drawer handle (Drawer's own openDrawer/closeDrawer/toggleDrawer rule it out).
|
|
13
|
+
export function isTabNavigatorHandle(handle) {
|
|
14
|
+
return 'jumpTo' in handle && !isDrawerNavigatorHandle(handle);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/navigator-handles/index.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,2FAA2F;AAC3F,8FAA8F;AAC9F,uEAAuE;AA6CvE,MAAM,UAAU,sBAAsB,CAAC,MAA2B;IAChE,OAAO,MAAM,IAAI,MAAM,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAA2B;IAE3B,OAAO,YAAY,IAAI,MAAM,CAAC;AAChC,CAAC;AAED,+FAA+F;AAC/F,wFAAwF;AACxF,MAAM,UAAU,oBAAoB,CAAC,MAA2B;IAC9D,OAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { INavigatorState } from './navigator-state';
|
|
2
|
+
import type { IDrawerScreenOptions } from './drawer-options';
|
|
3
|
+
export type INavigatorHandle = {
|
|
4
|
+
push: (name: string, params?: unknown) => void;
|
|
5
|
+
pop: (count?: number) => void;
|
|
6
|
+
popToTop: () => void;
|
|
7
|
+
popTo: (key: string) => void;
|
|
8
|
+
replace: (name: string, params?: unknown) => void;
|
|
9
|
+
setParams: (params: unknown, key?: string) => void;
|
|
10
|
+
reset: (state: INavigatorState) => void;
|
|
11
|
+
canGoBack: () => boolean;
|
|
12
|
+
};
|
|
13
|
+
export type ITabNavigatorHandle = {
|
|
14
|
+
jumpTo: (name: string, params?: unknown) => void;
|
|
15
|
+
setParams: (params: unknown, key: string) => void;
|
|
16
|
+
};
|
|
17
|
+
export type IDrawerNavigatorHandle = {
|
|
18
|
+
openDrawer: () => void;
|
|
19
|
+
closeDrawer: () => void;
|
|
20
|
+
toggleDrawer: () => void;
|
|
21
|
+
jumpTo: (name: string) => void;
|
|
22
|
+
};
|
|
23
|
+
export type IDrawerDescriptorMap = Record<string, {
|
|
24
|
+
options: IDrawerScreenOptions;
|
|
25
|
+
navigation: IDrawerNavigatorHandle;
|
|
26
|
+
}>;
|
|
27
|
+
export type IAnyNavigatorHandle = INavigatorHandle | ITabNavigatorHandle | IDrawerNavigatorHandle;
|
|
28
|
+
export declare function isStackNavigatorHandle(handle: IAnyNavigatorHandle): handle is INavigatorHandle;
|
|
29
|
+
export declare function isDrawerNavigatorHandle(handle: IAnyNavigatorHandle): handle is IDrawerNavigatorHandle;
|
|
30
|
+
export declare function isTabNavigatorHandle(handle: IAnyNavigatorHandle): handle is ITabNavigatorHandle;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Imperative navigator handles: framework-agnostic (scalars, `unknown`, plain function
|
|
2
|
+
// signatures over `INavigatorState`/`IDrawerScreenOptions` — no framework element, ref, or
|
|
3
|
+
// children in any field), so each shape is declared once here and every adapter re-exports it
|
|
4
|
+
// verbatim (see CLAUDE.md <prop_types_split_agnostic_vs_per_adapter>).
|
|
5
|
+
export function isStackNavigatorHandle(handle) {
|
|
6
|
+
return 'push' in handle;
|
|
7
|
+
}
|
|
8
|
+
export function isDrawerNavigatorHandle(handle) {
|
|
9
|
+
return 'openDrawer' in handle;
|
|
10
|
+
}
|
|
11
|
+
// jumpTo exists on both Tab and Drawer handles, so a Tab handle is a jumpTo-having handle that
|
|
12
|
+
// isn't a Drawer handle (Drawer's own openDrawer/closeDrawer/toggleDrawer rule it out).
|
|
13
|
+
export function isTabNavigatorHandle(handle) {
|
|
14
|
+
return 'jumpTo' in handle && !isDrawerNavigatorHandle(handle);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=navigator-handles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigator-handles.js","sourceRoot":"","sources":["../../src/core/navigator-handles.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,2FAA2F;AAC3F,8FAA8F;AAC9F,uEAAuE;AA6CvE,MAAM,UAAU,sBAAsB,CAAC,MAA2B;IAChE,OAAO,MAAM,IAAI,MAAM,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAA2B;IAE3B,OAAO,YAAY,IAAI,MAAM,CAAC;AAChC,CAAC;AAED,+FAA+F;AAC/F,wFAAwF;AACxF,MAAM,UAAU,oBAAoB,CAAC,MAA2B;IAC9D,OAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC"}
|