expo-router 4.0.0-preview.11 → 4.0.0-preview.12

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 (116) hide show
  1. package/build/fast-refresh.d.ts.map +1 -1
  2. package/build/fast-refresh.js.map +1 -1
  3. package/build/getRoutesCore.d.ts +1 -0
  4. package/build/getRoutesCore.d.ts.map +1 -1
  5. package/build/getRoutesCore.js +3 -1
  6. package/build/getRoutesCore.js.map +1 -1
  7. package/build/head/url.d.ts +1 -0
  8. package/build/head/url.d.ts.map +1 -1
  9. package/build/head/url.js +21 -4
  10. package/build/head/url.js.map +1 -1
  11. package/build/hooks.d.ts +90 -38
  12. package/build/hooks.d.ts.map +1 -1
  13. package/build/hooks.js +46 -39
  14. package/build/hooks.js.map +1 -1
  15. package/build/imperative-api.d.ts +58 -15
  16. package/build/imperative-api.d.ts.map +1 -1
  17. package/build/imperative-api.js.map +1 -1
  18. package/build/layouts/withLayoutContext.d.ts +4 -1
  19. package/build/layouts/withLayoutContext.d.ts.map +1 -1
  20. package/build/layouts/withLayoutContext.js +4 -1
  21. package/build/layouts/withLayoutContext.js.map +1 -1
  22. package/build/link/Link.d.ts +48 -4
  23. package/build/link/Link.d.ts.map +1 -1
  24. package/build/link/Link.js +47 -3
  25. package/build/link/Link.js.map +1 -1
  26. package/build/link/href.d.ts +1 -1
  27. package/build/link/href.d.ts.map +1 -1
  28. package/build/link/href.js.map +1 -1
  29. package/build/link/useLinkHooks.d.ts +122 -29
  30. package/build/link/useLinkHooks.d.ts.map +1 -1
  31. package/build/link/useLinkHooks.js.map +1 -1
  32. package/build/rsc/exports.d.ts +3 -1
  33. package/build/rsc/exports.d.ts.map +1 -1
  34. package/build/rsc/exports.js +3 -1
  35. package/build/rsc/exports.js.map +1 -1
  36. package/build/rsc/router/client.d.ts +2 -2
  37. package/build/rsc/router/client.d.ts.map +1 -1
  38. package/build/rsc/router/client.js.map +1 -1
  39. package/build/rsc/router/host.d.ts.map +1 -1
  40. package/build/rsc/router/host.js +20 -15
  41. package/build/rsc/router/host.js.map +1 -1
  42. package/build/rsc/rsc-renderer.d.ts +1 -1
  43. package/build/rsc/rsc-renderer.d.ts.map +1 -1
  44. package/build/rsc/rsc-renderer.js +1 -1
  45. package/build/rsc/rsc-renderer.js.map +1 -1
  46. package/build/testing-library/context-stubs.d.ts.map +1 -1
  47. package/build/testing-library/context-stubs.js +3 -1
  48. package/build/testing-library/context-stubs.js.map +1 -1
  49. package/build/testing-library/mocks.js +14 -13
  50. package/build/testing-library/mocks.js.map +1 -1
  51. package/build/typed-routes/generate.d.ts +5 -1
  52. package/build/typed-routes/generate.d.ts.map +1 -1
  53. package/build/typed-routes/generate.js +129 -64
  54. package/build/typed-routes/generate.js.map +1 -1
  55. package/build/typed-routes/index.d.ts +5 -0
  56. package/build/typed-routes/index.d.ts.map +1 -1
  57. package/build/typed-routes/index.js +8 -3
  58. package/build/typed-routes/index.js.map +1 -1
  59. package/build/typed-routes/testSetup.d.ts +1 -1
  60. package/build/typed-routes/testSetup.d.ts.map +1 -1
  61. package/build/typed-routes/testSetup.js +29 -17
  62. package/build/typed-routes/testSetup.js.map +1 -1
  63. package/build/typed-routes/types.d.ts +43 -145
  64. package/build/typed-routes/types.d.ts.map +1 -1
  65. package/build/typed-routes/types.js.map +1 -1
  66. package/build/types.d.ts +33 -0
  67. package/build/types.d.ts.map +1 -1
  68. package/build/types.js.map +1 -1
  69. package/build/ui/TabContext.d.ts +157 -1
  70. package/build/ui/TabContext.d.ts.map +1 -1
  71. package/build/ui/TabContext.js +25 -1
  72. package/build/ui/TabContext.js.map +1 -1
  73. package/build/ui/TabList.d.ts +16 -0
  74. package/build/ui/TabList.d.ts.map +1 -1
  75. package/build/ui/TabList.js +16 -0
  76. package/build/ui/TabList.js.map +1 -1
  77. package/build/ui/TabSlot.d.ts +41 -5
  78. package/build/ui/TabSlot.d.ts.map +1 -1
  79. package/build/ui/TabSlot.js +36 -14
  80. package/build/ui/TabSlot.js.map +1 -1
  81. package/build/ui/TabTrigger.d.ts +50 -68
  82. package/build/ui/TabTrigger.d.ts.map +1 -1
  83. package/build/ui/TabTrigger.js +23 -1
  84. package/build/ui/TabTrigger.js.map +1 -1
  85. package/build/ui/Tabs.d.ts +96 -132
  86. package/build/ui/Tabs.d.ts.map +1 -1
  87. package/build/ui/Tabs.js +48 -8
  88. package/build/ui/Tabs.js.map +1 -1
  89. package/build/ui/common.d.ts +3 -3
  90. package/build/ui/common.d.ts.map +1 -1
  91. package/build/ui/common.js.map +1 -1
  92. package/build/useFocusEffect.d.ts +15 -6
  93. package/build/useFocusEffect.d.ts.map +1 -1
  94. package/build/useFocusEffect.js +15 -6
  95. package/build/useFocusEffect.js.map +1 -1
  96. package/build/useNavigation.d.ts +11 -5
  97. package/build/useNavigation.d.ts.map +1 -1
  98. package/build/useNavigation.js +11 -5
  99. package/build/useNavigation.js.map +1 -1
  100. package/build/views/Navigator.d.ts +6 -5
  101. package/build/views/Navigator.d.ts.map +1 -1
  102. package/build/views/Navigator.js +6 -5
  103. package/build/views/Navigator.js.map +1 -1
  104. package/build/views/Try.d.ts +1 -1
  105. package/build/views/Try.d.ts.map +1 -1
  106. package/build/views/Try.js.map +1 -1
  107. package/entry-classic.js +0 -6
  108. package/package.json +3 -4
  109. package/plugin/build/index.d.ts +2 -0
  110. package/plugin/options.json +74 -73
  111. package/rsc/entry.js +0 -6
  112. package/build/rsc/runtime.d.ts +0 -9
  113. package/build/rsc/runtime.d.ts.map +0 -1
  114. package/build/rsc/runtime.js +0 -36
  115. package/build/rsc/runtime.js.map +0 -1
  116. package/virtual-client-boundaries.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TabTrigger.d.ts","sourceRoot":"","sources":["../../src/ui/TabTrigger.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAc,YAAY,EAAE,cAAc,EAAe,MAAM,OAAO,CAAC;AACzF,OAAO,EAAE,IAAI,EAAyB,cAAc,EAAE,MAAM,cAAc,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGrC,KAAK,qCAAqC,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG;IAC9E,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,qCAAqC,GAAG;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,qCAAqC,GACrE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAIJ,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EACpD,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,KAAiB,EACjB,GAAG,KAAK,EACT,EAAE,eAAe,CAAC,CAAC,CAAC,+BA4BpB;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,GACvB,KAAK,IAAI,YAAY,CAAC,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC,CAE1D;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE7D,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,eAAe,CAAC,GAAG,CAAC;sBAyB9E,MAAM,YAAY,eAAe;uBApBjC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkGhB"}
1
+ {"version":3,"file":"TabTrigger.d.ts","sourceRoot":"","sources":["../../src/ui/TabTrigger.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAc,YAAY,EAAE,cAAc,EAAe,MAAM,OAAO,CAAC;AACzF,OAAO,EAAE,IAAI,EAAyB,cAAc,EAAE,MAAM,cAAc,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAK3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGrC,KAAK,qCAAqC,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG;IAC9E,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,qCAAqC,GAAG;IACpE,wHAAwH;IACxH,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,qCAAqC,GACrE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAIJ;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAiB,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,+BA4B/F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,GACvB,KAAK,IAAI,YAAY,CAAC,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC,CAE1D;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,qCAAqC;IACrC,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5D,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,WAAW,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CAC5C,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,mBAAmB,CAwG3E"}
@@ -11,6 +11,21 @@ const useLinkToPathProps_1 = require("../link/useLinkToPathProps");
11
11
  const matchers_1 = require("../matchers");
12
12
  const Navigator_1 = require("../views/Navigator");
13
13
  const TabTriggerSlot = react_slot_1.Slot;
14
+ /**
15
+ * Creates a trigger to navigate to a tab. `<TabTrigger />` functionality slightly changes when used as a child of `<TabList />`. In this instance, the `href` prop is required, and the trigger also defines what routes are present in the `<Tabs />`.
16
+ *
17
+ * When used outside of `<TabList />`, `<TabTrigger />` no longer requires a `href`.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * <Tabs>
22
+ * <TabSlot />
23
+ * <TabList>
24
+ * <TabTrigger name="home" href="/" />
25
+ * </TabList>
26
+ * </Tabs>
27
+ * ```
28
+ */
14
29
  function TabTrigger({ asChild, name, href, reset = 'onFocus', ...props }) {
15
30
  const { trigger, triggerProps } = useTabTrigger({
16
31
  name,
@@ -32,12 +47,19 @@ function TabTrigger({ asChild, name, href, reset = 'onFocus', ...props }) {
32
47
  }
33
48
  }
34
49
  exports.TabTrigger = TabTrigger;
50
+ /**
51
+ * @hidden
52
+ */
35
53
  function isTabTrigger(child) {
36
54
  return child.type === TabTrigger;
37
55
  }
38
56
  exports.isTabTrigger = isTabTrigger;
39
- function useTabTrigger({ name, reset, onPress, onLongPress }) {
57
+ /**
58
+ * Utility hook creating custom `<TabTrigger />`
59
+ */
60
+ function useTabTrigger(options) {
40
61
  const { state, navigation } = (0, Navigator_1.useNavigatorContext)();
62
+ const { name, reset, onPress, onLongPress } = options;
41
63
  const triggerMap = (0, react_1.useContext)(TabContext_1.TabTriggerMapContext);
42
64
  const getTrigger = (0, react_1.useCallback)((name) => {
43
65
  const config = triggerMap[name];
@@ -1 +1 @@
1
- {"version":3,"file":"TabTrigger.js","sourceRoot":"","sources":["../../src/ui/TabTrigger.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Slot } from '@radix-ui/react-slot';\nimport { ReactNode, useContext, ReactElement, ComponentProps, useCallback } from 'react';\nimport { View, StyleSheet, Pressable, PressableProps } from 'react-native';\n\nimport { TabTriggerMapContext } from './TabContext';\nimport { ExpoTabsResetValue } from './TabRouter';\nimport { appendBaseUrl } from '../fork/getPathFromState';\nimport { router } from '../imperative-api';\nimport { shouldHandleMouseEvent } from '../link/useLinkToPathProps';\nimport { stripGroupSegmentsFromPath } from '../matchers';\nimport type { Href } from '../types';\nimport { useNavigatorContext } from '../views/Navigator';\n\ntype PressablePropsWithoutFunctionChildren = Omit<PressableProps, 'children'> & {\n children?: ReactNode | undefined;\n};\n\nexport type TabTriggerProps<T extends string | object> = PressablePropsWithoutFunctionChildren & {\n name: string;\n href?: Href<T>;\n /** Forward props to child component. Useful for custom wrappers. */\n asChild?: boolean;\n /** Reset the route when switching to the tab */\n reset?: SwitchToOptions['reset'] | 'onLongPress';\n};\n\nexport type TabTriggerOptions<T extends string | object> = {\n name: string;\n href: Href<T>;\n};\n\nexport type TabTriggerSlotProps = PressablePropsWithoutFunctionChildren &\n React.RefAttributes<View> & {\n isFocused?: boolean;\n href?: string;\n };\n\nconst TabTriggerSlot = Slot as React.ForwardRefExoticComponent<TabTriggerSlotProps>;\n\nexport function TabTrigger<T extends string | object>({\n asChild,\n name,\n href,\n reset = 'onFocus',\n ...props\n}: TabTriggerProps<T>) {\n const { trigger, triggerProps } = useTabTrigger({\n name,\n reset,\n ...props,\n });\n\n // Pressable doesn't accept the extra props, so only pass them if we are using asChild\n if (asChild) {\n return (\n <TabTriggerSlot\n style={styles.tabTrigger}\n {...props}\n {...triggerProps}\n href={trigger?.resolvedHref}>\n {props.children}\n </TabTriggerSlot>\n );\n } else {\n // These props are not typed, but are allowed by React Native Web\n const reactNativeWebProps = { href: trigger?.resolvedHref };\n\n return (\n <Pressable style={styles.tabTrigger} {...reactNativeWebProps} {...props} {...triggerProps}>\n {props.children}\n </Pressable>\n );\n }\n}\n\nexport function isTabTrigger(\n child: ReactElement<any>\n): child is ReactElement<ComponentProps<typeof TabTrigger>> {\n return child.type === TabTrigger;\n}\n\nexport type SwitchToOptions = { reset?: ExpoTabsResetValue };\n\nexport function useTabTrigger({ name, reset, onPress, onLongPress }: TabTriggerProps<any>) {\n const { state, navigation } = useNavigatorContext();\n const triggerMap = useContext(TabTriggerMapContext);\n\n const getTrigger = useCallback(\n (name: string) => {\n const config = triggerMap[name];\n\n if (!config) {\n return;\n }\n\n return {\n isFocused: state.index === config.index,\n route: state.routes[config.index],\n resolvedHref: stripGroupSegmentsFromPath(appendBaseUrl(config.href)),\n ...config,\n };\n },\n [triggerMap]\n );\n\n const trigger = name !== undefined ? getTrigger(name) : undefined;\n\n const switchTab = useCallback(\n (name: string, options?: SwitchToOptions) => {\n const config = triggerMap[name];\n\n if (config) {\n if (config.type === 'external') {\n return router.navigate(config.href);\n } else {\n return navigation?.dispatch({\n type: 'JUMP_TO',\n payload: {\n name,\n ...options,\n },\n });\n }\n } else {\n return navigation?.dispatch({\n type: 'JUMP_TO',\n payload: {\n name,\n },\n });\n }\n },\n [navigation, triggerMap]\n );\n\n const handleOnPress = useCallback<NonNullable<PressableProps['onPress']>>(\n (event) => {\n onPress?.(event);\n if (!trigger) return;\n if (event?.isDefaultPrevented()) return;\n\n navigation?.emit({\n type: 'tabPress',\n target: trigger.type === 'internal' ? trigger.route.key : trigger?.href,\n canPreventDefault: true,\n });\n\n if (!shouldHandleMouseEvent(event)) return;\n\n switchTab(name, { reset: reset !== 'onLongPress' ? reset : undefined });\n },\n [onPress, name, reset, trigger]\n );\n\n const handleOnLongPress = useCallback<NonNullable<PressableProps['onPress']>>(\n (event) => {\n onPress?.(event);\n if (!trigger) return;\n if (event?.isDefaultPrevented()) return;\n\n navigation?.emit({\n type: 'tabLongPress',\n target: trigger.type === 'internal' ? trigger.route.key : trigger?.href,\n });\n\n if (!shouldHandleMouseEvent(event)) return;\n\n switchTab(name, {\n reset: reset === 'onLongPress' ? 'always' : reset,\n });\n },\n [onLongPress, name, reset, trigger]\n );\n\n const triggerProps = {\n isFocused: Boolean(trigger?.isFocused),\n onPress: handleOnPress,\n onLongPress: handleOnLongPress,\n };\n\n return {\n switchTab,\n getTrigger,\n trigger,\n triggerProps,\n };\n}\n\nconst styles = StyleSheet.create({\n tabTrigger: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n});\n"]}
1
+ {"version":3,"file":"TabTrigger.js","sourceRoot":"","sources":["../../src/ui/TabTrigger.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Slot } from '@radix-ui/react-slot';\nimport { TabNavigationState } from '@react-navigation/native';\nimport { ReactNode, useContext, ReactElement, ComponentProps, useCallback } from 'react';\nimport { View, StyleSheet, Pressable, PressableProps } from 'react-native';\n\nimport { TabTriggerMapContext } from './TabContext';\nimport { ExpoTabsResetValue } from './TabRouter';\nimport type { TriggerMap } from './common';\nimport { appendBaseUrl } from '../fork/getPathFromState';\nimport { router } from '../imperative-api';\nimport { shouldHandleMouseEvent } from '../link/useLinkToPathProps';\nimport { stripGroupSegmentsFromPath } from '../matchers';\nimport type { Href } from '../types';\nimport { useNavigatorContext } from '../views/Navigator';\n\ntype PressablePropsWithoutFunctionChildren = Omit<PressableProps, 'children'> & {\n children?: ReactNode | undefined;\n};\n\nexport type TabTriggerProps = PressablePropsWithoutFunctionChildren & {\n /** Name of tab. When used within a `<TabList />` this sets the name of the tab. Otherwise, this references the name. */\n name: string;\n /** Name of tab. Required when used within a `<TabList />` */\n href?: Href;\n /** Forward props to child component. Useful for custom wrappers. */\n asChild?: boolean;\n /** Reset the route when switching to the tab */\n reset?: SwitchToOptions['reset'] | 'onLongPress';\n};\n\nexport type TabTriggerOptions = {\n name: string;\n href: Href;\n};\n\nexport type TabTriggerSlotProps = PressablePropsWithoutFunctionChildren &\n React.RefAttributes<View> & {\n isFocused?: boolean;\n href?: string;\n };\n\nconst TabTriggerSlot = Slot as React.ForwardRefExoticComponent<TabTriggerSlotProps>;\n\n/**\n * Creates a trigger to navigate to a tab. `<TabTrigger />` functionality slightly changes when used as a child of `<TabList />`. In this instance, the `href` prop is required, and the trigger also defines what routes are present in the `<Tabs />`.\n *\n * When used outside of `<TabList />`, `<TabTrigger />` no longer requires a `href`.\n *\n * @example\n * ```ts\n * <Tabs>\n * <TabSlot />\n * <TabList>\n * <TabTrigger name=\"home\" href=\"/\" />\n * </TabList>\n * </Tabs>\n * ```\n */\nexport function TabTrigger({ asChild, name, href, reset = 'onFocus', ...props }: TabTriggerProps) {\n const { trigger, triggerProps } = useTabTrigger({\n name,\n reset,\n ...props,\n });\n\n // Pressable doesn't accept the extra props, so only pass them if we are using asChild\n if (asChild) {\n return (\n <TabTriggerSlot\n style={styles.tabTrigger}\n {...props}\n {...triggerProps}\n href={trigger?.resolvedHref}>\n {props.children}\n </TabTriggerSlot>\n );\n } else {\n // These props are not typed, but are allowed by React Native Web\n const reactNativeWebProps = { href: trigger?.resolvedHref };\n\n return (\n <Pressable style={styles.tabTrigger} {...reactNativeWebProps} {...props} {...triggerProps}>\n {props.children}\n </Pressable>\n );\n }\n}\n\n/**\n * @hidden\n */\nexport function isTabTrigger(\n child: ReactElement<any>\n): child is ReactElement<ComponentProps<typeof TabTrigger>> {\n return child.type === TabTrigger;\n}\n\n/**\n * Options for `switchTab` function.\n */\nexport type SwitchToOptions = {\n /** Navigate and reset the history */\n reset?: ExpoTabsResetValue;\n};\n\nexport type Trigger = TriggerMap[string] & {\n isFocused: boolean;\n resolvedHref: string;\n route: TabNavigationState<any>['routes'][number];\n};\n\nexport type UseTabTriggerResult = {\n switchTab: (name: string, options: SwitchToOptions) => void;\n getTrigger: (name: string) => Trigger | undefined;\n trigger?: Trigger;\n triggerProps: TriggerProps;\n};\n\nexport type TriggerProps = {\n isFocused: boolean;\n onPress: PressableProps['onPress'];\n onLongPress: PressableProps['onLongPress'];\n};\n\n/**\n * Utility hook creating custom `<TabTrigger />`\n */\nexport function useTabTrigger(options: TabTriggerProps): UseTabTriggerResult {\n const { state, navigation } = useNavigatorContext();\n const { name, reset, onPress, onLongPress } = options;\n const triggerMap = useContext(TabTriggerMapContext);\n\n const getTrigger = useCallback(\n (name: string) => {\n const config = triggerMap[name];\n\n if (!config) {\n return;\n }\n\n return {\n isFocused: state.index === config.index,\n route: state.routes[config.index],\n resolvedHref: stripGroupSegmentsFromPath(appendBaseUrl(config.href)),\n ...config,\n };\n },\n [triggerMap]\n );\n\n const trigger = name !== undefined ? getTrigger(name) : undefined;\n\n const switchTab = useCallback(\n (name: string, options?: SwitchToOptions) => {\n const config = triggerMap[name];\n\n if (config) {\n if (config.type === 'external') {\n return router.navigate(config.href);\n } else {\n return navigation?.dispatch({\n type: 'JUMP_TO',\n payload: {\n name,\n ...options,\n },\n });\n }\n } else {\n return navigation?.dispatch({\n type: 'JUMP_TO',\n payload: {\n name,\n },\n });\n }\n },\n [navigation, triggerMap]\n );\n\n const handleOnPress = useCallback<NonNullable<PressableProps['onPress']>>(\n (event) => {\n onPress?.(event);\n if (!trigger) return;\n if (event?.isDefaultPrevented()) return;\n\n navigation?.emit({\n type: 'tabPress',\n target: trigger.type === 'internal' ? trigger.route.key : trigger?.href,\n canPreventDefault: true,\n });\n\n if (!shouldHandleMouseEvent(event)) return;\n\n switchTab(name, { reset: reset !== 'onLongPress' ? reset : undefined });\n },\n [onPress, name, reset, trigger]\n );\n\n const handleOnLongPress = useCallback<NonNullable<PressableProps['onPress']>>(\n (event) => {\n onPress?.(event);\n if (!trigger) return;\n if (event?.isDefaultPrevented()) return;\n\n navigation?.emit({\n type: 'tabLongPress',\n target: trigger.type === 'internal' ? trigger.route.key : trigger?.href,\n });\n\n if (!shouldHandleMouseEvent(event)) return;\n\n switchTab(name, {\n reset: reset === 'onLongPress' ? 'always' : reset,\n });\n },\n [onLongPress, name, reset, trigger]\n );\n\n const triggerProps = {\n isFocused: Boolean(trigger?.isFocused),\n onPress: handleOnPress,\n onLongPress: handleOnLongPress,\n };\n\n return {\n switchTab,\n getTrigger,\n trigger,\n triggerProps,\n };\n}\n\nconst styles = StyleSheet.create({\n tabTrigger: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n});\n"]}
@@ -1,74 +1,57 @@
1
- import { ParamListBase, TabActionHelpers, TabNavigationState } from '@react-navigation/native';
1
+ import { DefaultNavigatorOptions, ParamListBase, TabActionHelpers, TabNavigationState, TabRouterOptions } from '@react-navigation/native';
2
2
  import { ReactNode } from 'react';
3
3
  import { ViewProps } from 'react-native';
4
- import { ExpoTabsProps, ExpoTabsScreenOptions, TabNavigationEventMap } from './TabContext';
5
- import { ExpoTabRouterOptions } from './TabRouter';
4
+ import { ExpoTabsScreenOptions, TabNavigationEventMap, TabsContextValue } from './TabContext';
6
5
  import { ScreenTrigger } from './common';
7
6
  export * from './TabContext';
8
7
  export * from './TabList';
9
8
  export * from './TabSlot';
10
9
  export * from './TabTrigger';
11
- export type UseTabsOptions = Omit<ExpoTabsProps, 'children'> & Omit<ExpoTabRouterOptions, 'initialRouteName' | 'triggerMap'>;
10
+ /**
11
+ * Options to provide to the Tab Router.
12
+ */
13
+ export type UseTabsOptions = Omit<DefaultNavigatorOptions<ParamListBase, any, TabNavigationState<any>, ExpoTabsScreenOptions, TabNavigationEventMap, any>, 'children'> & {
14
+ backBehavior?: TabRouterOptions['backBehavior'];
15
+ };
12
16
  export type TabsProps = ViewProps & {
17
+ /** Forward props to child component and removes the extra <View />. Useful for custom wrappers. */
13
18
  asChild?: boolean;
14
19
  options?: UseTabsOptions;
15
20
  };
16
- export declare function Tabs({ children, asChild, options, ...props }: TabsProps): import("react").JSX.Element;
21
+ /**
22
+ * Root component for the headless tabs.
23
+ *
24
+ * @see useTabsWithChildren - The hook version of this component.
25
+ * @example
26
+ * ```ts
27
+ * <Tabs>
28
+ * <TabSlot />
29
+ * <TabList>
30
+ * <TabTrigger name="home" href="/" />
31
+ * </TabList>
32
+ * </Tabs>
33
+ * ```
34
+ */
35
+ export declare function Tabs(props: TabsProps): import("react").JSX.Element;
17
36
  export type UseTabsWithChildrenOptions = UseTabsOptions & {
18
37
  children: ReactNode;
19
38
  };
20
- export type UseTabsWithTriggersOptions<T extends string | object> = UseTabsOptions & {
21
- triggers: ScreenTrigger<T>[];
39
+ export type UseTabsWithTriggersOptions = UseTabsOptions & {
40
+ triggers: ScreenTrigger[];
22
41
  };
23
- export declare function useTabsWithChildren({ children, ...options }: UseTabsWithChildrenOptions): {
42
+ /**
43
+ * Hook version of `<Tabs />`. The returned NavigationContent component should be rendered
44
+ *
45
+ * @see Tabs - The component version of this hook
46
+ * @example
47
+ * ```ts
48
+ * export function MyTabs({ children }) {
49
+ * const { NavigationContent } = useTabsWithChildren({ children })
50
+ * return <NavigationContent />
51
+ * ```
52
+ */
53
+ export declare function useTabsWithChildren(options: UseTabsWithChildrenOptions): {
24
54
  state: TabNavigationState<any>;
25
- descriptors: Record<string, import("@react-navigation/native").Descriptor<ExpoTabsScreenOptions, Omit<{
26
- dispatch(action: Readonly<{
27
- type: string;
28
- payload?: object | undefined;
29
- source?: string | undefined;
30
- target?: string | undefined;
31
- }> | ((state: Readonly<TabNavigationState<any>>) => Readonly<{
32
- type: string;
33
- payload?: object | undefined;
34
- source?: string | undefined;
35
- target?: string | undefined;
36
- }>)): void;
37
- navigate<RouteName extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
38
- navigate<RouteName_1 extends string>(options: {
39
- name: string;
40
- params: object | undefined;
41
- path?: string | undefined;
42
- merge?: boolean | undefined;
43
- }): void;
44
- navigateDeprecated<RouteName_2 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
45
- navigateDeprecated<RouteName_3 extends string>(options: {
46
- name: string;
47
- params: object | undefined;
48
- merge?: boolean | undefined;
49
- }): void;
50
- preload<RouteName_4 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
51
- reset(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
52
- goBack(): void;
53
- isFocused(): boolean;
54
- canGoBack(): boolean;
55
- getId(): string | undefined;
56
- getParent<T = import("@react-navigation/native").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string | undefined): T;
57
- getState(): TabNavigationState<any>;
58
- setStateForNextRouteNamesChange(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
59
- } & import("@react-navigation/native").PrivateValueStore<[ParamListBase, unknown, unknown]>, "getParent"> & {
60
- getParent<T_1 = import("@react-navigation/native").NavigationProp<ParamListBase, string, undefined, Readonly<{
61
- key: string;
62
- index: number;
63
- routeNames: string[];
64
- history?: unknown[] | undefined;
65
- routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
66
- type: string;
67
- stale: false;
68
- }>, {}, {}> | undefined>(id?: string | undefined): T_1;
69
- setParams(params: Partial<object | undefined>): void;
70
- setOptions(options: Partial<ExpoTabsScreenOptions>): void;
71
- } & import("@react-navigation/native").EventConsumer<TabNavigationEventMap & import("@react-navigation/native").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/native").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/native").RouteProp<ParamListBase, string>>>;
72
55
  navigation: {
73
56
  dispatch(action: Readonly<{
74
57
  type: string;
@@ -89,20 +72,20 @@ export declare function useTabsWithChildren({ children, ...options }: UseTabsWit
89
72
  source?: string | undefined;
90
73
  target?: string | undefined;
91
74
  }>)): void;
92
- navigate<RouteName_5 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
93
- navigate<RouteName_6 extends string>(options: {
75
+ navigate<RouteName extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
76
+ navigate<RouteName_1 extends string>(options: {
94
77
  name: string;
95
78
  params: object | undefined;
96
79
  path?: string | undefined;
97
80
  merge?: boolean | undefined;
98
81
  }): void;
99
- navigateDeprecated<RouteName_7 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
100
- navigateDeprecated<RouteName_8 extends string>(options: {
82
+ navigateDeprecated<RouteName_2 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
83
+ navigateDeprecated<RouteName_3 extends string>(options: {
101
84
  name: string;
102
85
  params: object | undefined;
103
86
  merge?: boolean | undefined;
104
87
  }): void;
105
- preload<RouteName_9 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
88
+ preload<RouteName_4 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
106
89
  reset(state: Readonly<{
107
90
  key: string;
108
91
  index: number;
@@ -124,9 +107,21 @@ export declare function useTabsWithChildren({ children, ...options }: UseTabsWit
124
107
  isFocused(): boolean;
125
108
  canGoBack(): boolean;
126
109
  getId(): string | undefined;
127
- getParent<T_2 = import("@react-navigation/native").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string | undefined): T_2;
110
+ getParent<T = import("@react-navigation/native").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string | undefined): T;
128
111
  getState(): Readonly<{
129
112
  key: string;
113
+ /**
114
+ * Alternative hook version of `<Tabs />` that uses explicit triggers instead of `children`
115
+ *
116
+ * @see Tabs - The component version of this hook
117
+ * @example
118
+ * ```ts
119
+ * export function MyTabs({ children }) {
120
+ * const { NavigationContent } = useTabsWithChildren({ triggers: [] })
121
+ * return <NavigationContent />
122
+ * }
123
+ * ```
124
+ */
130
125
  index: number;
131
126
  routeNames: string[];
132
127
  history?: unknown[] | undefined;
@@ -152,15 +147,9 @@ export declare function useTabsWithChildren({ children, ...options }: UseTabsWit
152
147
  stale: false;
153
148
  }>>): void;
154
149
  } & import("@react-navigation/native").PrivateValueStore<[ParamListBase, unknown, unknown]> & import("@react-navigation/native").EventEmitter<TabNavigationEventMap> & {
155
- setParams<RouteName_10 extends string>(params: Partial<object | undefined>): void;
150
+ setParams<RouteName_5 extends string>(params: Partial<object | undefined>): void;
156
151
  } & TabActionHelpers<ParamListBase>;
157
- NavigationContent: import("react").ForwardRefExoticComponent<{
158
- children: ReactNode;
159
- } & import("react").RefAttributes<unknown>>;
160
- };
161
- export declare function useTabsWithTriggers<T extends string | object>({ triggers, ...options }: UseTabsWithTriggersOptions<T>): {
162
- state: TabNavigationState<any>;
163
- descriptors: Record<string, import("@react-navigation/native").Descriptor<ExpoTabsScreenOptions, Omit<{
152
+ describe: (route: import("@react-navigation/native").RouteProp<ParamListBase, string>, placeholder: boolean) => import("@react-navigation/native").Descriptor<import("./TabContext").ExpoTabsNavigatorScreenOptions, Omit<{
164
153
  dispatch(action: Readonly<{
165
154
  type: string;
166
155
  payload?: object | undefined;
@@ -172,20 +161,20 @@ export declare function useTabsWithTriggers<T extends string | object>({ trigger
172
161
  source?: string | undefined;
173
162
  target?: string | undefined;
174
163
  }>)): void;
175
- navigate<RouteName extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
176
- navigate<RouteName_1 extends string>(options: {
164
+ navigate<RouteName_6 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
165
+ navigate<RouteName_7 extends string>(options: {
177
166
  name: string;
178
167
  params: object | undefined;
179
168
  path?: string | undefined;
180
169
  merge?: boolean | undefined;
181
170
  }): void;
182
- navigateDeprecated<RouteName_2 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
183
- navigateDeprecated<RouteName_3 extends string>(options: {
171
+ navigateDeprecated<RouteName_8 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
172
+ navigateDeprecated<RouteName_9 extends string>(options: {
184
173
  name: string;
185
174
  params: object | undefined;
186
175
  merge?: boolean | undefined;
187
176
  }): void;
188
- preload<RouteName_4 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
177
+ preload<RouteName_10 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
189
178
  reset(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
190
179
  goBack(): void;
191
180
  isFocused(): boolean;
@@ -205,82 +194,44 @@ export declare function useTabsWithTriggers<T extends string | object>({ trigger
205
194
  stale: false;
206
195
  }>, {}, {}> | undefined>(id?: string | undefined): T_2;
207
196
  setParams(params: Partial<object | undefined>): void;
208
- setOptions(options: Partial<ExpoTabsScreenOptions>): void;
209
- } & import("@react-navigation/native").EventConsumer<TabNavigationEventMap & import("@react-navigation/native").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/native").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/native").RouteProp<ParamListBase, string>>>;
210
- navigation: {
197
+ setOptions(options: Partial<import("./TabContext").ExpoTabsNavigatorScreenOptions>): void;
198
+ } & import("@react-navigation/native").EventConsumer<TabNavigationEventMap & import("@react-navigation/native").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/native").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/native").RouteProp<ParamListBase, string>>;
199
+ descriptors: Record<string, import("@react-navigation/native").Descriptor<import("./TabContext").ExpoTabsNavigatorScreenOptions, Omit<{
211
200
  dispatch(action: Readonly<{
212
201
  type: string;
213
202
  payload?: object | undefined;
214
203
  source?: string | undefined;
215
204
  target?: string | undefined;
216
- }> | ((state: Readonly<Readonly<{
217
- key: string;
218
- index: number;
219
- routeNames: string[];
220
- history?: unknown[] | undefined;
221
- routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
222
- type: string;
223
- stale: false;
224
- }>>) => Readonly<{
205
+ }> | ((state: Readonly<TabNavigationState<any>>) => Readonly<{
225
206
  type: string;
226
207
  payload?: object | undefined;
227
208
  source?: string | undefined;
228
209
  target?: string | undefined;
229
210
  }>)): void;
230
- navigate<RouteName_5 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
231
- navigate<RouteName_6 extends string>(options: {
211
+ navigate<RouteName_11 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
212
+ navigate<RouteName_12 extends string>(options: {
232
213
  name: string;
233
214
  params: object | undefined;
234
215
  path?: string | undefined;
235
216
  merge?: boolean | undefined;
236
217
  }): void;
237
- navigateDeprecated<RouteName_7 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
238
- navigateDeprecated<RouteName_8 extends string>(options: {
218
+ navigateDeprecated<RouteName_13 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
219
+ navigateDeprecated<RouteName_14 extends string>(options: {
239
220
  name: string;
240
221
  params: object | undefined;
241
222
  merge?: boolean | undefined;
242
223
  }): void;
243
- preload<RouteName_9 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
244
- reset(state: Readonly<{
245
- key: string;
246
- index: number;
247
- routeNames: string[];
248
- history?: unknown[] | undefined;
249
- routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
250
- type: string;
251
- stale: false;
252
- }> | import("@react-navigation/native").PartialState<Readonly<{
253
- key: string;
254
- index: number;
255
- routeNames: string[];
256
- history?: unknown[] | undefined;
257
- routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
258
- type: string;
259
- stale: false;
260
- }>>): void;
224
+ preload<RouteName_15 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
225
+ reset(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
261
226
  goBack(): void;
262
227
  isFocused(): boolean;
263
228
  canGoBack(): boolean;
264
229
  getId(): string | undefined;
265
230
  getParent<T_3 = import("@react-navigation/native").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string | undefined): T_3;
266
- getState(): Readonly<{
267
- key: string;
268
- index: number;
269
- routeNames: string[];
270
- history?: unknown[] | undefined;
271
- routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
272
- type: string;
273
- stale: false;
274
- }>;
275
- setStateForNextRouteNamesChange(state: Readonly<{
276
- key: string;
277
- index: number;
278
- routeNames: string[];
279
- history?: unknown[] | undefined;
280
- routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
281
- type: string;
282
- stale: false;
283
- }> | import("@react-navigation/native").PartialState<Readonly<{
231
+ getState(): TabNavigationState<any>;
232
+ setStateForNextRouteNamesChange(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
233
+ } & import("@react-navigation/native").PrivateValueStore<[ParamListBase, unknown, unknown]>, "getParent"> & {
234
+ getParent<T_4 = import("@react-navigation/native").NavigationProp<ParamListBase, string, undefined, Readonly<{
284
235
  key: string;
285
236
  index: number;
286
237
  routeNames: string[];
@@ -288,12 +239,25 @@ export declare function useTabsWithTriggers<T extends string | object>({ trigger
288
239
  routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
289
240
  type: string;
290
241
  stale: false;
291
- }>>): void;
292
- } & import("@react-navigation/native").PrivateValueStore<[ParamListBase, unknown, unknown]> & import("@react-navigation/native").EventEmitter<TabNavigationEventMap> & {
293
- setParams<RouteName_10 extends string>(params: Partial<object | undefined>): void;
294
- } & TabActionHelpers<ParamListBase>;
295
- NavigationContent: import("react").ForwardRefExoticComponent<{
242
+ }>, {}, {}> | undefined>(id?: string | undefined): T_4;
243
+ setParams(params: Partial<object | undefined>): void;
244
+ setOptions(options: Partial<import("./TabContext").ExpoTabsNavigatorScreenOptions>): void;
245
+ } & import("@react-navigation/native").EventConsumer<TabNavigationEventMap & import("@react-navigation/native").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/native").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/native").RouteProp<ParamListBase, string>>>;
246
+ NavigationContent: ({ children }: {
296
247
  children: ReactNode;
297
- } & import("react").RefAttributes<unknown>>;
248
+ }) => import("react/jsx-runtime").JSX.Element;
298
249
  };
250
+ /**
251
+ * Alternative hook version of `<Tabs />` that uses explicit triggers instead of `children`
252
+ *
253
+ * @see Tabs - The component version of this hook
254
+ * @example
255
+ * ```ts
256
+ * export function MyTabs({ children }) {
257
+ * const { NavigationContent } = useTabsWithChildren({ triggers: [] })
258
+ * return <NavigationContent />
259
+ * }
260
+ * ```
261
+ */
262
+ export declare function useTabsWithTriggers(options: UseTabsWithTriggersOptions): TabsContextValue;
299
263
  //# sourceMappingURL=Tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/ui/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAKL,SAAS,EAIV,MAAM,OAAO,CAAC;AACf,OAAO,EAAc,SAAS,EAAQ,MAAM,cAAc,CAAC;AAE3D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAiB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAoB,aAAa,EAAqB,MAAM,UAAU,CAAC;AAQ9E,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAE7B,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAC1D,IAAI,CAAC,oBAAoB,EAAE,kBAAkB,GAAG,YAAY,CAAC,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,+BAcvE;AAED,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG;IACxD,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,cAAc,GAAG;IACnF,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;CAC9B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEvF;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAC7D,QAAQ,EACR,GAAG,OAAO,EACX,EAAE,0BAA0B,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+D/B"}
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/ui/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EAEvB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAKL,SAAS,EAIV,MAAM,OAAO,CAAC;AACf,OAAO,EAAc,SAAS,EAAQ,MAAM,cAAc,CAAC;AAE3D,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EAErB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAKtB,OAAO,EAAoB,aAAa,EAAqB,MAAM,UAAU,CAAC;AAQ9E,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,uBAAuB,CACrB,aAAa,EACb,GAAG,EACH,kBAAkB,CAAC,GAAG,CAAC,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,GAAG,CACJ,EACD,UAAU,CACX,GAAG;IACF,YAAY,CAAC,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAClC,mGAAmG;IACnG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,+BAepC;AAED,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG;IACxD,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG;IACxD,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAKvE;;;;;;;;;;;eAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAbF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,gBAAgB,CAiEzF"}
package/build/ui/Tabs.js CHANGED
@@ -34,23 +34,63 @@ __exportStar(require("./TabContext"), exports);
34
34
  __exportStar(require("./TabList"), exports);
35
35
  __exportStar(require("./TabSlot"), exports);
36
36
  __exportStar(require("./TabTrigger"), exports);
37
- function Tabs({ children, asChild, options, ...props }) {
37
+ /**
38
+ * Root component for the headless tabs.
39
+ *
40
+ * @see useTabsWithChildren - The hook version of this component.
41
+ * @example
42
+ * ```ts
43
+ * <Tabs>
44
+ * <TabSlot />
45
+ * <TabList>
46
+ * <TabTrigger name="home" href="/" />
47
+ * </TabList>
48
+ * </Tabs>
49
+ * ```
50
+ */
51
+ function Tabs(props) {
52
+ const { children, asChild, options, ...rest } = props;
38
53
  const Comp = asChild ? common_1.SafeAreaViewSlot : react_native_1.View;
39
54
  const { NavigationContent } = useTabsWithChildren({
40
55
  // asChild adds an extra layer, so we need to process the child's children
41
56
  children: asChild && (0, react_1.isValidElement)(children) ? children.props.children : children,
42
57
  ...options,
43
58
  });
44
- return (<Comp style={styles.tabsRoot} {...props}>
59
+ return (<Comp style={styles.tabsRoot} {...rest}>
45
60
  <NavigationContent>{children}</NavigationContent>
46
61
  </Comp>);
47
62
  }
48
63
  exports.Tabs = Tabs;
49
- function useTabsWithChildren({ children, ...options }) {
50
- return useTabsWithTriggers({ triggers: parseTriggersFromChildren(children), ...options });
64
+ /**
65
+ * Hook version of `<Tabs />`. The returned NavigationContent component should be rendered
66
+ *
67
+ * @see Tabs - The component version of this hook
68
+ * @example
69
+ * ```ts
70
+ * export function MyTabs({ children }) {
71
+ * const { NavigationContent } = useTabsWithChildren({ children })
72
+ * return <NavigationContent />
73
+ * ```
74
+ */
75
+ function useTabsWithChildren(options) {
76
+ const { children, ...rest } = options;
77
+ return useTabsWithTriggers({ triggers: parseTriggersFromChildren(children), ...rest });
51
78
  }
52
79
  exports.useTabsWithChildren = useTabsWithChildren;
53
- function useTabsWithTriggers({ triggers, ...options }) {
80
+ /**
81
+ * Alternative hook version of `<Tabs />` that uses explicit triggers instead of `children`
82
+ *
83
+ * @see Tabs - The component version of this hook
84
+ * @example
85
+ * ```ts
86
+ * export function MyTabs({ children }) {
87
+ * const { NavigationContent } = useTabsWithChildren({ triggers: [] })
88
+ * return <NavigationContent />
89
+ * }
90
+ * ```
91
+ */
92
+ function useTabsWithTriggers(options) {
93
+ const { triggers, ...rest } = options;
54
94
  // Ensure we extend the parent triggers, so we can trigger them as well
55
95
  const parentTriggerMap = (0, react_1.useContext)(TabContext_1.TabTriggerMapContext);
56
96
  const routeNode = (0, Route_1.useRouteNode)();
@@ -64,12 +104,12 @@ function useTabsWithTriggers({ triggers, ...options }) {
64
104
  const { children, triggerMap } = (0, common_1.triggersToScreens)(triggers, routeNode, linking, initialRouteName, parentTriggerMap, routeInfo, contextKey);
65
105
  const navigatorContext = (0, native_1.useNavigationBuilder)(TabRouter_1.ExpoTabRouter, {
66
106
  children,
67
- ...options,
107
+ ...rest,
68
108
  triggerMap,
69
109
  id: contextKey,
70
110
  initialRouteName,
71
111
  });
72
- const { state, descriptors, navigation, NavigationContent: RNNavigationContent, } = navigatorContext;
112
+ const { state, descriptors, navigation, describe, NavigationContent: RNNavigationContent, } = navigatorContext;
73
113
  const navigatorContextValue = (0, react_1.useMemo)(() => ({
74
114
  ...navigatorContext,
75
115
  contextKey,
@@ -80,7 +120,7 @@ function useTabsWithTriggers({ triggers, ...options }) {
80
120
  <RNNavigationContent>{children}</RNNavigationContent>
81
121
  </Navigator_1.NavigatorContext.Provider>
82
122
  </TabContext_1.TabTriggerMapContext.Provider>));
83
- return { state, descriptors, navigation, NavigationContent };
123
+ return { state, descriptors, navigation, NavigationContent, describe };
84
124
  }
85
125
  exports.useTabsWithTriggers = useTabsWithTriggers;
86
126
  function parseTriggersFromChildren(children, screenTriggers = [], isInTabList = false) {
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../src/ui/Tabs.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n LinkingContext,\n ParamListBase,\n TabActionHelpers,\n TabNavigationState,\n useNavigationBuilder,\n} from '@react-navigation/native';\nimport {\n Children,\n ComponentProps,\n Fragment,\n ReactElement,\n ReactNode,\n isValidElement,\n useContext,\n useMemo,\n} from 'react';\nimport { StyleSheet, ViewProps, View } from 'react-native';\n\nimport {\n ExpoTabsProps,\n ExpoTabsScreenOptions,\n TabNavigationEventMap,\n TabTriggerMapContext,\n} from './TabContext';\nimport { isTabList } from './TabList';\nimport { ExpoTabRouter, ExpoTabRouterOptions } from './TabRouter';\nimport { isTabSlot } from './TabSlot';\nimport { isTabTrigger } from './TabTrigger';\nimport { SafeAreaViewSlot, ScreenTrigger, triggersToScreens } from './common';\nimport { useComponent } from './useComponent';\nimport { useRouteNode, useContextKey } from '../Route';\nimport { useRouteInfo } from '../hooks';\nimport { resolveHref } from '../link/href';\nimport { shouldLinkExternally } from '../utils/url';\nimport { NavigatorContext, NavigatorContextValue } from '../views/Navigator';\n\nexport * from './TabContext';\nexport * from './TabList';\nexport * from './TabSlot';\nexport * from './TabTrigger';\n\nexport type UseTabsOptions = Omit<ExpoTabsProps, 'children'> &\n Omit<ExpoTabRouterOptions, 'initialRouteName' | 'triggerMap'>;\n\nexport type TabsProps = ViewProps & {\n asChild?: boolean;\n options?: UseTabsOptions;\n};\n\nexport function Tabs({ children, asChild, options, ...props }: TabsProps) {\n const Comp = asChild ? SafeAreaViewSlot : View;\n\n const { NavigationContent } = useTabsWithChildren({\n // asChild adds an extra layer, so we need to process the child's children\n children: asChild && isValidElement(children) ? children.props.children : children,\n ...options,\n });\n\n return (\n <Comp style={styles.tabsRoot} {...props}>\n <NavigationContent>{children}</NavigationContent>\n </Comp>\n );\n}\n\nexport type UseTabsWithChildrenOptions = UseTabsOptions & {\n children: ReactNode;\n};\n\nexport type UseTabsWithTriggersOptions<T extends string | object> = UseTabsOptions & {\n triggers: ScreenTrigger<T>[];\n};\n\nexport function useTabsWithChildren({ children, ...options }: UseTabsWithChildrenOptions) {\n return useTabsWithTriggers({ triggers: parseTriggersFromChildren(children), ...options });\n}\n\nexport function useTabsWithTriggers<T extends string | object>({\n triggers,\n ...options\n}: UseTabsWithTriggersOptions<T>) {\n // Ensure we extend the parent triggers, so we can trigger them as well\n const parentTriggerMap = useContext(TabTriggerMapContext);\n const routeNode = useRouteNode();\n const contextKey = useContextKey();\n const linking = useContext(LinkingContext).options;\n const routeInfo = useRouteInfo();\n\n if (!routeNode || !linking) {\n throw new Error('No RouteNode. This is likely a bug in expo-router.');\n }\n\n const initialRouteName = routeNode.initialRouteName;\n\n const { children, triggerMap } = triggersToScreens(\n triggers,\n routeNode,\n linking,\n initialRouteName,\n parentTriggerMap,\n routeInfo,\n contextKey\n );\n\n const navigatorContext = useNavigationBuilder<\n TabNavigationState<any>,\n ExpoTabRouterOptions,\n TabActionHelpers<ParamListBase>,\n ExpoTabsScreenOptions,\n TabNavigationEventMap\n >(ExpoTabRouter, {\n children,\n ...options,\n triggerMap,\n id: contextKey,\n initialRouteName,\n });\n\n const {\n state,\n descriptors,\n navigation,\n NavigationContent: RNNavigationContent,\n } = navigatorContext;\n\n const navigatorContextValue = useMemo<NavigatorContextValue>(\n () => ({\n ...(navigatorContext as unknown as ReturnType<typeof useNavigationBuilder>),\n contextKey,\n router: ExpoTabRouter,\n }),\n [navigatorContext, contextKey, ExpoTabRouter]\n );\n\n const NavigationContent = useComponent((children: React.ReactNode) => (\n <TabTriggerMapContext.Provider value={triggerMap}>\n <NavigatorContext.Provider value={navigatorContextValue}>\n <RNNavigationContent>{children}</RNNavigationContent>\n </NavigatorContext.Provider>\n </TabTriggerMapContext.Provider>\n ));\n\n return { state, descriptors, navigation, NavigationContent };\n}\n\nfunction parseTriggersFromChildren(\n children: ReactNode,\n screenTriggers: ScreenTrigger<any>[] = [],\n isInTabList = false\n) {\n Children.forEach(children, (child) => {\n if (!child || !isValidElement(child) || isTabSlot(child)) {\n return;\n }\n\n if (isFragment(child) && typeof child.props.children !== 'function') {\n return parseTriggersFromChildren(\n child.props.children,\n screenTriggers,\n isInTabList || isTabList(child)\n );\n }\n\n if (isTabList(child) && typeof child.props.children !== 'function') {\n let children = child.props.children;\n\n // <TabList asChild /> adds an extra layer. We need to parse the child's children\n if (child.props.asChild && isValidElement(children)) {\n children = children.props.children;\n }\n\n return parseTriggersFromChildren(children, screenTriggers, isInTabList || isTabList(child));\n }\n\n // We should only process TabTriggers within the TabList. All other components will be ignored\n if (!isInTabList || !isTabTrigger(child)) {\n return;\n }\n\n const { href, name } = child.props;\n\n if (!href) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `<TabTrigger name={${name}}> does not have a 'href' prop. TabTriggers within a <TabList /> are required to have a href.`\n );\n }\n return;\n }\n\n const resolvedHref = resolveHref(href);\n\n if (shouldLinkExternally(resolvedHref)) {\n return screenTriggers.push({\n type: 'external',\n name,\n href: resolvedHref,\n });\n }\n\n if (!name) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `<TabTrigger> does not have a 'name' prop. TabTriggers within a <TabList /> are required to have a name.`\n );\n }\n return;\n }\n\n return screenTriggers.push({ type: 'internal', href: resolvedHref, name });\n });\n\n return screenTriggers;\n}\n\nfunction isFragment(\n child: ReactElement<any>\n): child is ReactElement<ComponentProps<typeof Fragment>> {\n return child.type === Fragment;\n}\n\nconst styles = StyleSheet.create({\n tabsRoot: {\n flex: 1,\n },\n});\n"]}
1
+ {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../src/ui/Tabs.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DefaultNavigatorOptions,\n LinkingContext,\n ParamListBase,\n TabActionHelpers,\n TabNavigationState,\n TabRouterOptions,\n useNavigationBuilder,\n} from '@react-navigation/native';\nimport {\n Children,\n ComponentProps,\n Fragment,\n ReactElement,\n ReactNode,\n isValidElement,\n useContext,\n useMemo,\n} from 'react';\nimport { StyleSheet, ViewProps, View } from 'react-native';\n\nimport {\n ExpoTabsScreenOptions,\n TabNavigationEventMap,\n TabTriggerMapContext,\n TabsContextValue,\n} from './TabContext';\nimport { isTabList } from './TabList';\nimport { ExpoTabRouter, ExpoTabRouterOptions } from './TabRouter';\nimport { isTabSlot } from './TabSlot';\nimport { isTabTrigger } from './TabTrigger';\nimport { SafeAreaViewSlot, ScreenTrigger, triggersToScreens } from './common';\nimport { useComponent } from './useComponent';\nimport { useRouteNode, useContextKey } from '../Route';\nimport { useRouteInfo } from '../hooks';\nimport { resolveHref } from '../link/href';\nimport { shouldLinkExternally } from '../utils/url';\nimport { NavigatorContext, NavigatorContextValue } from '../views/Navigator';\n\nexport * from './TabContext';\nexport * from './TabList';\nexport * from './TabSlot';\nexport * from './TabTrigger';\n\n/**\n * Options to provide to the Tab Router.\n */\nexport type UseTabsOptions = Omit<\n DefaultNavigatorOptions<\n ParamListBase,\n any,\n TabNavigationState<any>,\n ExpoTabsScreenOptions,\n TabNavigationEventMap,\n any\n >,\n 'children'\n> & {\n backBehavior?: TabRouterOptions['backBehavior'];\n};\n\nexport type TabsProps = ViewProps & {\n /** Forward props to child component and removes the extra <View />. Useful for custom wrappers. */\n asChild?: boolean;\n options?: UseTabsOptions;\n};\n\n/**\n * Root component for the headless tabs.\n *\n * @see useTabsWithChildren - The hook version of this component.\n * @example\n * ```ts\n * <Tabs>\n * <TabSlot />\n * <TabList>\n * <TabTrigger name=\"home\" href=\"/\" />\n * </TabList>\n * </Tabs>\n * ```\n */\nexport function Tabs(props: TabsProps) {\n const { children, asChild, options, ...rest } = props;\n const Comp = asChild ? SafeAreaViewSlot : View;\n\n const { NavigationContent } = useTabsWithChildren({\n // asChild adds an extra layer, so we need to process the child's children\n children: asChild && isValidElement(children) ? children.props.children : children,\n ...options,\n });\n\n return (\n <Comp style={styles.tabsRoot} {...rest}>\n <NavigationContent>{children}</NavigationContent>\n </Comp>\n );\n}\n\nexport type UseTabsWithChildrenOptions = UseTabsOptions & {\n children: ReactNode;\n};\n\nexport type UseTabsWithTriggersOptions = UseTabsOptions & {\n triggers: ScreenTrigger[];\n};\n\n/**\n * Hook version of `<Tabs />`. The returned NavigationContent component should be rendered\n *\n * @see Tabs - The component version of this hook\n * @example\n * ```ts\n * export function MyTabs({ children }) {\n * const { NavigationContent } = useTabsWithChildren({ children })\n * return <NavigationContent />\n * ```\n */\nexport function useTabsWithChildren(options: UseTabsWithChildrenOptions) {\n const { children, ...rest } = options;\n return useTabsWithTriggers({ triggers: parseTriggersFromChildren(children), ...rest });\n}\n\n/**\n * Alternative hook version of `<Tabs />` that uses explicit triggers instead of `children`\n *\n * @see Tabs - The component version of this hook\n * @example\n * ```ts\n * export function MyTabs({ children }) {\n * const { NavigationContent } = useTabsWithChildren({ triggers: [] })\n * return <NavigationContent />\n * }\n * ```\n */\nexport function useTabsWithTriggers(options: UseTabsWithTriggersOptions): TabsContextValue {\n const { triggers, ...rest } = options;\n // Ensure we extend the parent triggers, so we can trigger them as well\n const parentTriggerMap = useContext(TabTriggerMapContext);\n const routeNode = useRouteNode();\n const contextKey = useContextKey();\n const linking = useContext(LinkingContext).options;\n const routeInfo = useRouteInfo();\n\n if (!routeNode || !linking) {\n throw new Error('No RouteNode. This is likely a bug in expo-router.');\n }\n\n const initialRouteName = routeNode.initialRouteName;\n\n const { children, triggerMap } = triggersToScreens(\n triggers,\n routeNode,\n linking,\n initialRouteName,\n parentTriggerMap,\n routeInfo,\n contextKey\n );\n\n const navigatorContext = useNavigationBuilder<\n TabNavigationState<any>,\n ExpoTabRouterOptions,\n TabActionHelpers<ParamListBase>,\n ExpoTabsScreenOptions,\n TabNavigationEventMap\n >(ExpoTabRouter, {\n children,\n ...rest,\n triggerMap,\n id: contextKey,\n initialRouteName,\n });\n\n const {\n state,\n descriptors,\n navigation,\n describe,\n NavigationContent: RNNavigationContent,\n } = navigatorContext;\n\n const navigatorContextValue = useMemo<NavigatorContextValue>(\n () => ({\n ...(navigatorContext as unknown as ReturnType<typeof useNavigationBuilder>),\n contextKey,\n router: ExpoTabRouter,\n }),\n [navigatorContext, contextKey, ExpoTabRouter]\n );\n\n const NavigationContent = useComponent((children: React.ReactNode) => (\n <TabTriggerMapContext.Provider value={triggerMap}>\n <NavigatorContext.Provider value={navigatorContextValue}>\n <RNNavigationContent>{children}</RNNavigationContent>\n </NavigatorContext.Provider>\n </TabTriggerMapContext.Provider>\n )) as TabsContextValue['NavigationContent'];\n\n return { state, descriptors, navigation, NavigationContent, describe };\n}\n\nfunction parseTriggersFromChildren(\n children: ReactNode,\n screenTriggers: ScreenTrigger[] = [],\n isInTabList = false\n) {\n Children.forEach(children, (child) => {\n if (!child || !isValidElement(child) || isTabSlot(child)) {\n return;\n }\n\n if (isFragment(child) && typeof child.props.children !== 'function') {\n return parseTriggersFromChildren(\n child.props.children,\n screenTriggers,\n isInTabList || isTabList(child)\n );\n }\n\n if (isTabList(child) && typeof child.props.children !== 'function') {\n let children = child.props.children;\n\n // <TabList asChild /> adds an extra layer. We need to parse the child's children\n if (child.props.asChild && isValidElement(children)) {\n children = children.props.children;\n }\n\n return parseTriggersFromChildren(children, screenTriggers, isInTabList || isTabList(child));\n }\n\n // We should only process TabTriggers within the TabList. All other components will be ignored\n if (!isInTabList || !isTabTrigger(child)) {\n return;\n }\n\n const { href, name } = child.props;\n\n if (!href) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `<TabTrigger name={${name}}> does not have a 'href' prop. TabTriggers within a <TabList /> are required to have a href.`\n );\n }\n return;\n }\n\n const resolvedHref = resolveHref(href);\n\n if (shouldLinkExternally(resolvedHref)) {\n return screenTriggers.push({\n type: 'external',\n name,\n href: resolvedHref,\n });\n }\n\n if (!name) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `<TabTrigger> does not have a 'name' prop. TabTriggers within a <TabList /> are required to have a name.`\n );\n }\n return;\n }\n\n return screenTriggers.push({ type: 'internal', href: resolvedHref, name });\n });\n\n return screenTriggers;\n}\n\nfunction isFragment(\n child: ReactElement<any>\n): child is ReactElement<ComponentProps<typeof Fragment>> {\n return child.type === Fragment;\n}\n\nconst styles = StyleSheet.create({\n tabsRoot: {\n flex: 1,\n },\n});\n"]}
@@ -7,9 +7,9 @@ import { RouteNode } from '../Route';
7
7
  import { Href } from '../types';
8
8
  export declare const ViewSlot: import("react").ForwardRefExoticComponent<ViewProps & import("react").RefAttributes<View>>;
9
9
  export declare const SafeAreaViewSlot: import("react").ForwardRefExoticComponent<ViewProps & import("react").RefAttributes<SafeAreaView>>;
10
- export type ScreenTrigger<T extends string | object> = {
10
+ export type ScreenTrigger = {
11
11
  type: 'internal';
12
- href: Href<T>;
12
+ href: Href;
13
13
  name: string;
14
14
  } | {
15
15
  type: 'external';
@@ -33,7 +33,7 @@ type TriggerConfig = {
33
33
  export type TriggerMap = Record<string, TriggerConfig & {
34
34
  index: number;
35
35
  }>;
36
- export declare function triggersToScreens(triggers: ScreenTrigger<any>[], layoutRouteNode: RouteNode, linking: LinkingOptions<ParamListBase>, initialRouteName: undefined | string, parentTriggerMap: TriggerMap, routeInfo: UrlObject, contextKey: string): {
36
+ export declare function triggersToScreens(triggers: ScreenTrigger[], layoutRouteNode: RouteNode, linking: LinkingOptions<ParamListBase>, initialRouteName: undefined | string, parentTriggerMap: TriggerMap, routeInfo: UrlObject, contextKey: string): {
37
37
  children: import("react").JSX.Element[];
38
38
  triggerMap: TriggerMap;
39
39
  };