one 1.2.6 → 1.2.8

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 (142) hide show
  1. package/dist/cjs/ui/Slot.cjs +42 -0
  2. package/dist/cjs/ui/Slot.js +27 -0
  3. package/dist/cjs/ui/Slot.js.map +6 -0
  4. package/dist/cjs/ui/Slot.native.js +48 -0
  5. package/dist/cjs/ui/Slot.native.js.map +1 -0
  6. package/dist/cjs/ui/TabContext.cjs +44 -0
  7. package/dist/cjs/ui/TabContext.js +35 -0
  8. package/dist/cjs/ui/TabContext.js.map +6 -0
  9. package/dist/cjs/ui/TabContext.native.js +47 -0
  10. package/dist/cjs/ui/TabContext.native.js.map +1 -0
  11. package/dist/cjs/ui/TabList.cjs +52 -0
  12. package/dist/cjs/ui/TabList.js +38 -0
  13. package/dist/cjs/ui/TabList.js.map +6 -0
  14. package/dist/cjs/ui/TabList.native.js +57 -0
  15. package/dist/cjs/ui/TabList.native.js.map +1 -0
  16. package/dist/cjs/ui/TabRouter.cjs +47 -0
  17. package/dist/cjs/ui/TabRouter.js +41 -0
  18. package/dist/cjs/ui/TabRouter.js.map +6 -0
  19. package/dist/cjs/ui/TabRouter.native.js +57 -0
  20. package/dist/cjs/ui/TabRouter.native.js.map +1 -0
  21. package/dist/cjs/ui/TabSlot.cjs +115 -0
  22. package/dist/cjs/ui/TabSlot.js +91 -0
  23. package/dist/cjs/ui/TabSlot.js.map +6 -0
  24. package/dist/cjs/ui/TabSlot.native.js +120 -0
  25. package/dist/cjs/ui/TabSlot.native.js.map +1 -0
  26. package/dist/cjs/ui/TabTrigger.cjs +151 -0
  27. package/dist/cjs/ui/TabTrigger.js +120 -0
  28. package/dist/cjs/ui/TabTrigger.js.map +6 -0
  29. package/dist/cjs/ui/TabTrigger.native.js +153 -0
  30. package/dist/cjs/ui/TabTrigger.native.js.map +1 -0
  31. package/dist/cjs/ui/Tabs.cjs +175 -0
  32. package/dist/cjs/ui/Tabs.js +121 -0
  33. package/dist/cjs/ui/Tabs.js.map +6 -0
  34. package/dist/cjs/ui/Tabs.native.js +191 -0
  35. package/dist/cjs/ui/Tabs.native.js.map +1 -0
  36. package/dist/cjs/ui/common.cjs +160 -0
  37. package/dist/cjs/ui/common.js +146 -0
  38. package/dist/cjs/ui/common.js.map +6 -0
  39. package/dist/cjs/ui/common.native.js +223 -0
  40. package/dist/cjs/ui/common.native.js.map +1 -0
  41. package/dist/cjs/ui/index.cjs +18 -0
  42. package/dist/cjs/ui/index.js +15 -0
  43. package/dist/cjs/ui/index.js.map +6 -0
  44. package/dist/cjs/ui/index.native.js +21 -0
  45. package/dist/cjs/ui/index.native.js.map +1 -0
  46. package/dist/cjs/ui/useComponent.cjs +46 -0
  47. package/dist/cjs/ui/useComponent.js +37 -0
  48. package/dist/cjs/ui/useComponent.js.map +6 -0
  49. package/dist/cjs/ui/useComponent.native.js +53 -0
  50. package/dist/cjs/ui/useComponent.native.js.map +1 -0
  51. package/dist/esm/ui/Slot.js +17 -0
  52. package/dist/esm/ui/Slot.js.map +6 -0
  53. package/dist/esm/ui/Slot.mjs +19 -0
  54. package/dist/esm/ui/Slot.mjs.map +1 -0
  55. package/dist/esm/ui/Slot.native.js +22 -0
  56. package/dist/esm/ui/Slot.native.js.map +1 -0
  57. package/dist/esm/ui/TabContext.js +19 -0
  58. package/dist/esm/ui/TabContext.js.map +6 -0
  59. package/dist/esm/ui/TabContext.mjs +17 -0
  60. package/dist/esm/ui/TabContext.mjs.map +1 -0
  61. package/dist/esm/ui/TabContext.native.js +17 -0
  62. package/dist/esm/ui/TabContext.native.js.map +1 -0
  63. package/dist/esm/ui/TabList.js +24 -0
  64. package/dist/esm/ui/TabList.js.map +6 -0
  65. package/dist/esm/ui/TabList.mjs +28 -0
  66. package/dist/esm/ui/TabList.mjs.map +1 -0
  67. package/dist/esm/ui/TabList.native.js +30 -0
  68. package/dist/esm/ui/TabList.native.js.map +1 -0
  69. package/dist/esm/ui/TabRouter.js +27 -0
  70. package/dist/esm/ui/TabRouter.js.map +6 -0
  71. package/dist/esm/ui/TabRouter.mjs +24 -0
  72. package/dist/esm/ui/TabRouter.mjs.map +1 -0
  73. package/dist/esm/ui/TabRouter.native.js +31 -0
  74. package/dist/esm/ui/TabRouter.native.js.map +1 -0
  75. package/dist/esm/ui/TabSlot.js +80 -0
  76. package/dist/esm/ui/TabSlot.js.map +6 -0
  77. package/dist/esm/ui/TabSlot.mjs +89 -0
  78. package/dist/esm/ui/TabSlot.mjs.map +1 -0
  79. package/dist/esm/ui/TabSlot.native.js +91 -0
  80. package/dist/esm/ui/TabSlot.native.js.map +1 -0
  81. package/dist/esm/ui/TabTrigger.js +115 -0
  82. package/dist/esm/ui/TabTrigger.js.map +6 -0
  83. package/dist/esm/ui/TabTrigger.mjs +126 -0
  84. package/dist/esm/ui/TabTrigger.mjs.map +1 -0
  85. package/dist/esm/ui/TabTrigger.native.js +125 -0
  86. package/dist/esm/ui/TabTrigger.native.js.map +1 -0
  87. package/dist/esm/ui/Tabs.js +130 -0
  88. package/dist/esm/ui/Tabs.js.map +6 -0
  89. package/dist/esm/ui/Tabs.mjs +149 -0
  90. package/dist/esm/ui/Tabs.mjs.map +1 -0
  91. package/dist/esm/ui/Tabs.native.js +162 -0
  92. package/dist/esm/ui/Tabs.native.js.map +1 -0
  93. package/dist/esm/ui/common.js +133 -0
  94. package/dist/esm/ui/common.js.map +6 -0
  95. package/dist/esm/ui/common.mjs +135 -0
  96. package/dist/esm/ui/common.mjs.map +1 -0
  97. package/dist/esm/ui/common.native.js +195 -0
  98. package/dist/esm/ui/common.native.js.map +1 -0
  99. package/dist/esm/ui/index.js +2 -0
  100. package/dist/esm/ui/index.js.map +6 -0
  101. package/dist/esm/ui/index.mjs +2 -0
  102. package/dist/esm/ui/index.mjs.map +1 -0
  103. package/dist/esm/ui/index.native.js +2 -0
  104. package/dist/esm/ui/index.native.js.map +1 -0
  105. package/dist/esm/ui/useComponent.js +22 -0
  106. package/dist/esm/ui/useComponent.js.map +6 -0
  107. package/dist/esm/ui/useComponent.mjs +23 -0
  108. package/dist/esm/ui/useComponent.mjs.map +1 -0
  109. package/dist/esm/ui/useComponent.native.js +27 -0
  110. package/dist/esm/ui/useComponent.native.js.map +1 -0
  111. package/package.json +18 -9
  112. package/src/ui/README.md +121 -0
  113. package/src/ui/Slot.tsx +34 -0
  114. package/src/ui/TabContext.tsx +115 -0
  115. package/src/ui/TabList.tsx +47 -0
  116. package/src/ui/TabRouter.tsx +79 -0
  117. package/src/ui/TabSlot.tsx +170 -0
  118. package/src/ui/TabTrigger.tsx +282 -0
  119. package/src/ui/Tabs.tsx +313 -0
  120. package/src/ui/common.tsx +277 -0
  121. package/src/ui/index.ts +1 -0
  122. package/src/ui/useComponent.tsx +42 -0
  123. package/types/ui/Slot.d.ts +6 -0
  124. package/types/ui/Slot.d.ts.map +1 -0
  125. package/types/ui/TabContext.d.ts +190 -0
  126. package/types/ui/TabContext.d.ts.map +1 -0
  127. package/types/ui/TabList.d.ts +25 -0
  128. package/types/ui/TabList.d.ts.map +1 -0
  129. package/types/ui/TabRouter.d.ts +103 -0
  130. package/types/ui/TabRouter.d.ts.map +1 -0
  131. package/types/ui/TabSlot.d.ts +73 -0
  132. package/types/ui/TabSlot.d.ts.map +1 -0
  133. package/types/ui/TabTrigger.d.ts +88 -0
  134. package/types/ui/TabTrigger.d.ts.map +1 -0
  135. package/types/ui/Tabs.d.ts +255 -0
  136. package/types/ui/Tabs.d.ts.map +1 -0
  137. package/types/ui/common.d.ts +40 -0
  138. package/types/ui/common.d.ts.map +1 -0
  139. package/types/ui/index.d.ts +2 -0
  140. package/types/ui/index.d.ts.map +1 -0
  141. package/types/ui/useComponent.d.ts +10 -0
  142. package/types/ui/useComponent.d.ts.map +1 -0
@@ -0,0 +1,277 @@
1
+ import type { LinkingOptions, ParamListBase, PartialRoute, Route } from '@react-navigation/native'
2
+
3
+ import type { ExpoTabActionType } from './TabRouter'
4
+ import type { UrlObject } from '../router/getNormalizedStatePath'
5
+ import type { RouteNode } from '../router/Route'
6
+ import { resolveHref } from '../link/href'
7
+ import { sortRoutesWithInitial } from '../router/sortRoutes'
8
+ import type { OneRouter } from '../interfaces/router'
9
+ import { Slot } from './Slot'
10
+
11
+ export const ViewSlot = Slot
12
+
13
+ export type ScreenTrigger =
14
+ | {
15
+ type: 'internal'
16
+ href: OneRouter.Href
17
+ name: string
18
+ }
19
+ | {
20
+ type: 'external'
21
+ name: string
22
+ href: string
23
+ }
24
+
25
+ type JumpToNavigationAction = Extract<ExpoTabActionType, { type: 'JUMP_TO' }>
26
+ type TriggerConfig =
27
+ | {
28
+ type: 'internal'
29
+ name: string
30
+ href: string
31
+ routeNode: RouteNode
32
+ action: JumpToNavigationAction
33
+ }
34
+ | { type: 'external'; name: string; href: string }
35
+
36
+ export type TriggerMap = Record<string, TriggerConfig & { index: number }>
37
+
38
+ function resolveHrefWithSegments(
39
+ href: string,
40
+ routeInfo: UrlObject,
41
+ segmentsWithoutGroups: string[]
42
+ ): string {
43
+ // For relative paths, resolve them relative to the current directory
44
+ if (href.startsWith('./') || href.startsWith('../')) {
45
+ const basePath = '/' + segmentsWithoutGroups.join('/')
46
+ const baseDir = basePath.replace(/\/[^/]*$/, '') || '/'
47
+
48
+ // Resolve the path
49
+ const parts = (baseDir + '/' + href).split('/')
50
+ const resolved: string[] = []
51
+
52
+ for (const part of parts) {
53
+ if (part === '.' || part === '') continue
54
+ if (part === '..') {
55
+ resolved.pop()
56
+ } else {
57
+ resolved.push(part)
58
+ }
59
+ }
60
+
61
+ return '/' + resolved.join('/')
62
+ }
63
+
64
+ return href
65
+ }
66
+
67
+ export function triggersToScreens(
68
+ triggers: ScreenTrigger[],
69
+ layoutRouteNode: RouteNode,
70
+ linking: LinkingOptions<ParamListBase>,
71
+ initialRouteName: undefined | string,
72
+ parentTriggerMap: TriggerMap,
73
+ routeInfo: UrlObject,
74
+ contextKey: string
75
+ ) {
76
+ const configs: TriggerConfig[] = []
77
+
78
+ for (const trigger of triggers) {
79
+ if (trigger.name in parentTriggerMap) {
80
+ const parentTrigger = parentTriggerMap[trigger.name]
81
+ throw new Error(
82
+ `Trigger ${JSON.stringify({
83
+ name: trigger.name,
84
+ href: trigger.href,
85
+ })} has the same name as parent trigger ${JSON.stringify({
86
+ name: parentTrigger.name,
87
+ href: parentTrigger.href,
88
+ })}. Triggers must have unique names.`
89
+ )
90
+ }
91
+
92
+ if (trigger.type === 'external') {
93
+ configs.push(trigger)
94
+ continue
95
+ }
96
+
97
+ let resolvedHref = resolveHref(trigger.href)
98
+
99
+ if (resolvedHref.startsWith('../')) {
100
+ throw new Error('Trigger href cannot link to a parent directory')
101
+ }
102
+
103
+ const segmentsWithoutGroups = contextKey.split('/').filter((segment) => {
104
+ return !(segment.startsWith('(') && segment.endsWith(')'))
105
+ })
106
+
107
+ resolvedHref = resolveHrefWithSegments(resolvedHref, routeInfo, segmentsWithoutGroups)
108
+
109
+ let state = linking.getStateFromPath?.(resolvedHref, linking.config)?.routes[0]
110
+
111
+ if (!state) {
112
+ // This shouldn't occur, as you should get the global +not-found
113
+ console.warn(
114
+ `Unable to find screen for trigger ${JSON.stringify(trigger)}. Does this point to a valid screen?`
115
+ )
116
+ continue
117
+ }
118
+
119
+ let routeState = state
120
+
121
+ if (routeState.name === '+not-found') {
122
+ if (process.env.NODE_ENV !== 'production') {
123
+ console.warn(
124
+ `Tab trigger '${trigger.name}' has the href '${trigger.href}' which points to a +not-found route.`
125
+ )
126
+ }
127
+ continue
128
+ }
129
+
130
+ const targetStateName = layoutRouteNode.route || '__root'
131
+
132
+ // The state object is the current state from the rootNavigator
133
+ // We need to work out the state for just this trigger
134
+ while (state?.state) {
135
+ if (state.name === targetStateName) break
136
+ state = state.state.routes[state.state.index ?? state.state.routes.length - 1]
137
+ }
138
+ routeState = state.state?.routes[state.state.index ?? state.state.routes.length - 1] || state
139
+
140
+ const routeNode = layoutRouteNode.children.find((child) => child.route === routeState?.name)
141
+
142
+ if (!routeNode) {
143
+ console.warn(
144
+ `Unable to find routeNode for trigger ${JSON.stringify(trigger)}. This might be a bug in One router`
145
+ )
146
+ continue
147
+ }
148
+
149
+ const duplicateTrigger =
150
+ trigger.type === 'internal' &&
151
+ configs.find((config): config is Extract<TriggerConfig, { type: 'internal' }> => {
152
+ if (config.type === 'external') {
153
+ return false
154
+ }
155
+
156
+ return config.routeNode.route === routeNode.route
157
+ })
158
+
159
+ if (duplicateTrigger) {
160
+ const duplicateTriggerText = `${JSON.stringify({ name: duplicateTrigger.name, href: duplicateTrigger.href })} and ${JSON.stringify({ name: trigger.name, href: trigger.href })}`
161
+
162
+ throw new Error(
163
+ `A navigator cannot contain multiple trigger components that map to the same sub-segment. Consider adding a shared group and assigning a group to each trigger. Conflicting triggers:\n\t${duplicateTriggerText}.\nBoth triggers map to route ${routeNode.route}.`
164
+ )
165
+ }
166
+
167
+ configs.push({
168
+ ...trigger,
169
+ href: resolvedHref,
170
+ routeNode,
171
+ action: stateToAction(state, layoutRouteNode.route),
172
+ })
173
+ }
174
+
175
+ const sortFn = sortRoutesWithInitial(initialRouteName)
176
+
177
+ const sortedConfigs = configs.sort((a, b) => {
178
+ // External routes should be last. They will eventually be dropped
179
+ if (a.type === 'external' && b.type === 'external') {
180
+ return 0
181
+ } else if (a.type === 'external') {
182
+ return 1
183
+ } else if (b.type === 'external') {
184
+ return -1
185
+ }
186
+
187
+ return sortFn(a.routeNode, b.routeNode)
188
+ })
189
+
190
+ const children: React.JSX.Element[] = []
191
+ const triggerMap: TriggerMap = { ...parentTriggerMap }
192
+
193
+ // Import routeToScreen from One's useScreens
194
+ const { Screen } = require('../router/useScreens')
195
+ const { createGetIdForRoute } = require('../router/useScreens')
196
+
197
+ for (const [index, config] of sortedConfigs.entries()) {
198
+ triggerMap[config.name] = { ...config, index }
199
+
200
+ if (config.type === 'internal') {
201
+ const route = config.routeNode
202
+ children.push(
203
+ <Screen
204
+ getId={createGetIdForRoute(route)}
205
+ name={route.route}
206
+ key={route.route}
207
+ options={(args) => {
208
+ const staticOptions = route.generated ? route.loadRoute()?.getNavOptions : null
209
+ const staticResult =
210
+ typeof staticOptions === 'function' ? staticOptions(args) : staticOptions
211
+ const output = {
212
+ ...staticResult,
213
+ }
214
+
215
+ if (route.generated) {
216
+ output.tabBarButton = () => null
217
+ output.drawerItemStyle = { height: 0, display: 'none' }
218
+ }
219
+
220
+ return output
221
+ }}
222
+ getComponent={() => {
223
+ const { getQualifiedRouteComponent } = require('../router/useScreens')
224
+ return getQualifiedRouteComponent(route)
225
+ }}
226
+ />
227
+ )
228
+ }
229
+ }
230
+ return {
231
+ children,
232
+ triggerMap,
233
+ }
234
+ }
235
+
236
+ export function stateToAction(
237
+ state: PartialRoute<Route<string, object | undefined>> | undefined,
238
+ startAtRoute?: string
239
+ ): JumpToNavigationAction {
240
+ const rootPayload: any = {}
241
+ let payload = rootPayload
242
+
243
+ startAtRoute = startAtRoute === '' ? '__root' : startAtRoute
244
+
245
+ let foundStartingPoint = startAtRoute === undefined || !state?.state
246
+
247
+ while (state) {
248
+ if (foundStartingPoint) {
249
+ if (payload === rootPayload) {
250
+ payload.name = state.name
251
+ } else {
252
+ payload.screen = state.name
253
+ }
254
+ payload.params = state.params ? { ...state.params } : {}
255
+
256
+ state = state.state?.routes[state.state?.routes.length - 1]
257
+
258
+ if (state) {
259
+ payload.params ??= {}
260
+ payload = payload.params
261
+ }
262
+ } else {
263
+ if (state.name === startAtRoute) {
264
+ foundStartingPoint = true
265
+ }
266
+ const nextState = state.state?.routes[state.state?.routes.length - 1]
267
+ if (nextState) {
268
+ state = nextState
269
+ }
270
+ }
271
+ }
272
+
273
+ return {
274
+ type: 'JUMP_TO',
275
+ payload: rootPayload,
276
+ }
277
+ }
@@ -0,0 +1 @@
1
+ export * from './Tabs'
@@ -0,0 +1,42 @@
1
+ import { useRef, forwardRef, useEffect, type JSX } from 'react'
2
+
3
+ /**
4
+ * Copied from @react-navigation/core
5
+ */
6
+ type Render = (children: React.ReactNode) => JSX.Element
7
+
8
+ type Props = {
9
+ render: Render
10
+ children: React.ReactNode
11
+ }
12
+
13
+ const NavigationContent = ({ render, children }: Props) => {
14
+ return render(children)
15
+ }
16
+
17
+ export function useComponent(render: Render) {
18
+ const renderRef = useRef<Render | null>(render)
19
+
20
+ // Normally refs shouldn't be mutated in render
21
+ // But we return a component which will be rendered
22
+ // So it's just for immediate consumption
23
+ renderRef.current = render
24
+
25
+ useEffect(() => {
26
+ renderRef.current = null
27
+ })
28
+
29
+ return useRef(
30
+ forwardRef(({ children }: { children: React.ReactNode }, _ref) => {
31
+ const render = renderRef.current
32
+
33
+ if (render === null) {
34
+ throw new Error(
35
+ 'The returned component must be rendered in the same render phase as the hook.'
36
+ )
37
+ }
38
+
39
+ return <NavigationContent render={render}>{children}</NavigationContent>
40
+ })
41
+ ).current
42
+ }
@@ -0,0 +1,6 @@
1
+ import { type ForwardRefExoticComponent, type Component, type RefAttributes } from 'react';
2
+ import { type ViewProps } from 'react-native';
3
+ export interface Slot<Props = ViewProps, Ref = Component<ViewProps>> extends ForwardRefExoticComponent<Props & RefAttributes<Ref>> {
4
+ }
5
+ export declare const Slot: Slot;
6
+ //# sourceMappingURL=Slot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slot.d.ts","sourceRoot":"","sources":["../../src/ui/Slot.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,OAAO,CAAA;AACd,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAsBzD,MAAM,WAAW,IAAI,CAAC,KAAK,GAAG,SAAS,EAAE,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CACjE,SAAQ,yBAAyB,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;CAAG;AAElE,eAAO,MAAM,IAAI,EAAE,IAA8C,CAAA"}
@@ -0,0 +1,190 @@
1
+ import type { BottomTabNavigationOptions } from '@react-navigation/bottom-tabs';
2
+ import type { DefaultNavigatorOptions, NavigationAction, NavigationProp, ParamListBase, TabActionHelpers, TabNavigationState, TabRouterOptions, useNavigationBuilder } from '@react-navigation/native';
3
+ import type { TriggerMap } from './common';
4
+ export type ExpoTabsProps = ExpoTabsNavigatorOptions;
5
+ export type ExpoTabsNavigatorScreenOptions = {
6
+ detachInactiveScreens?: boolean;
7
+ unmountOnBlur?: boolean;
8
+ freezeOnBlur?: boolean;
9
+ lazy?: boolean;
10
+ };
11
+ export type ExpoTabsNavigatorOptions = DefaultNavigatorOptions<ParamListBase, string | undefined, TabNavigationState<ParamListBase>, ExpoTabsScreenOptions, TabNavigationEventMap, ExpoTabsNavigationProp<ParamListBase>> & Omit<TabRouterOptions, 'initialRouteName'> & ExpoTabsNavigatorScreenOptions;
12
+ export type ExpoTabsNavigationProp<ParamList extends ParamListBase, RouteName extends keyof ParamList = keyof ParamList, NavigatorID extends string | undefined = undefined> = NavigationProp<ParamList, RouteName, NavigatorID, TabNavigationState<ParamListBase>, ExpoTabsScreenOptions, TabNavigationEventMap>;
13
+ export type ExpoTabsScreenOptions = Pick<BottomTabNavigationOptions, 'title' | 'lazy' | 'freezeOnBlur'> & {
14
+ params?: object;
15
+ title: string;
16
+ action: NavigationAction;
17
+ };
18
+ export type TabNavigationEventMap = {
19
+ /**
20
+ * Event which fires on tapping on the tab in the tab bar.
21
+ */
22
+ tabPress: {
23
+ data: undefined;
24
+ canPreventDefault: true;
25
+ };
26
+ /**
27
+ * Event which fires on long press on the tab in the tab bar.
28
+ */
29
+ tabLongPress: {
30
+ data: undefined;
31
+ };
32
+ };
33
+ /**
34
+ * The React Navigation custom navigator.
35
+ *
36
+ * @see [`useNavigationBuilder`](https://reactnavigation.org/docs/custom-navigators/#usenavigationbuilder) hook from React Navigation for more information.
37
+ */
38
+ export type TabsContextValue = ReturnType<typeof useNavigationBuilder<TabNavigationState<any>, TabRouterOptions, TabActionHelpers<ParamListBase>, ExpoTabsNavigatorScreenOptions, TabNavigationEventMap>>;
39
+ export type TabContextValue = TabsDescriptor['options'];
40
+ export declare const TabContext: import("react").Context<ExpoTabsNavigatorScreenOptions>;
41
+ /**
42
+ * @hidden
43
+ */
44
+ export declare const TabTriggerMapContext: import("react").Context<TriggerMap>;
45
+ /**
46
+ * @hidden
47
+ */
48
+ export declare const TabsDescriptorsContext: import("react").Context<Record<string, import("@react-navigation/core").Descriptor<ExpoTabsNavigatorScreenOptions, Omit<{
49
+ dispatch(action: Readonly<{
50
+ type: string;
51
+ payload?: object;
52
+ source?: string;
53
+ target?: string;
54
+ }> | ((state: Readonly<TabNavigationState<any>>) => Readonly<{
55
+ type: string;
56
+ payload?: object;
57
+ source?: string;
58
+ target?: string;
59
+ }>)): void;
60
+ navigate<RouteName extends string>(...args: RouteName extends unknown ? [screen: RouteName, params?: object | undefined, options?: {
61
+ merge?: boolean;
62
+ pop?: boolean;
63
+ } | undefined] : never): void;
64
+ navigate<RouteName extends string>(options: RouteName extends unknown ? {
65
+ name: RouteName;
66
+ params: object | undefined;
67
+ path?: string;
68
+ merge?: boolean;
69
+ pop?: boolean;
70
+ } : never): void;
71
+ navigateDeprecated<RouteName extends string>(...args: RouteName extends unknown ? [screen: RouteName, params?: object | undefined] : never): void;
72
+ navigateDeprecated<RouteName extends string>(options: RouteName extends unknown ? {
73
+ name: RouteName;
74
+ params: object | undefined;
75
+ merge?: boolean;
76
+ } : never): void;
77
+ preload<RouteName extends string>(...args: RouteName extends unknown ? [screen: RouteName, params?: object | undefined] : never): void;
78
+ reset(state: TabNavigationState<any> | import("@react-navigation/routers").PartialState<TabNavigationState<any>>): void;
79
+ goBack(): void;
80
+ isFocused(): boolean;
81
+ canGoBack(): boolean;
82
+ getId(): string | undefined;
83
+ getParent<T = import("@react-navigation/core").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string): T;
84
+ getState(): TabNavigationState<any>;
85
+ } & import("@react-navigation/core").PrivateValueStore<[ParamListBase, unknown, unknown]>, "getParent"> & {
86
+ getParent<T = NavigationProp<ParamListBase, string, undefined, Readonly<{
87
+ key: string;
88
+ index: number;
89
+ routeNames: string[];
90
+ history?: unknown[];
91
+ routes: import("@react-navigation/routers").NavigationRoute<ParamListBase, string>[];
92
+ type: string;
93
+ stale: false;
94
+ }>, {}, {}> | undefined>(id?: string | undefined): T;
95
+ setOptions(options: Partial<ExpoTabsNavigatorScreenOptions>): void;
96
+ } & {
97
+ setParams(params: Partial<object | undefined>): void;
98
+ replaceParams(params: object | undefined): void;
99
+ } & import("@react-navigation/core").EventConsumer<TabNavigationEventMap & import("@react-navigation/core").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/core").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/core").RouteProp<ParamListBase, string>>>>;
100
+ /**
101
+ * @hidden
102
+ */
103
+ export declare const TabsNavigatorContext: import("react").Context<({
104
+ dispatch(action: Readonly<{
105
+ type: string;
106
+ payload?: object;
107
+ source?: string;
108
+ target?: string;
109
+ }> | ((state: Readonly<Readonly<{
110
+ key: string;
111
+ index: number;
112
+ routeNames: string[];
113
+ history?: unknown[];
114
+ routes: import("@react-navigation/routers").NavigationRoute<ParamListBase, string>[];
115
+ type: string;
116
+ stale: false;
117
+ }>>) => Readonly<{
118
+ type: string;
119
+ payload?: object;
120
+ source? /**
121
+ * Event which fires on long press on the tab in the tab bar.
122
+ */: string;
123
+ target?: string;
124
+ }>)): void;
125
+ navigate<RouteName extends string>(...args: RouteName extends unknown ? [screen: RouteName, params?: object | undefined, options?: {
126
+ merge?: boolean;
127
+ pop?: boolean;
128
+ } | undefined] : never): void;
129
+ navigate<RouteName extends string>(options: RouteName extends unknown ? {
130
+ name: RouteName;
131
+ params: object | undefined;
132
+ path?: string;
133
+ merge?: boolean;
134
+ pop?: boolean;
135
+ } : never): void;
136
+ navigateDeprecated<RouteName extends string>(...args: RouteName extends unknown ? [screen: RouteName, params
137
+ /**
138
+ * @hidden
139
+ */
140
+ ? /**
141
+ * @hidden
142
+ */: object | undefined] : never): void;
143
+ navigateDeprecated<RouteName extends string>(options: RouteName extends unknown ? {
144
+ name: RouteName;
145
+ params: object | undefined;
146
+ merge?: boolean;
147
+ } : never): void;
148
+ preload<RouteName extends string>(...args: RouteName extends unknown ? [screen: RouteName, params?: object | undefined] : never): void;
149
+ reset(state: Readonly<{
150
+ key: string;
151
+ index: number;
152
+ routeNames: string[];
153
+ history?: unknown[];
154
+ routes: import("@react-navigation/routers").NavigationRoute<ParamListBase, string>[];
155
+ type: string;
156
+ stale: false;
157
+ }> | import("@react-navigation/routers").PartialState<Readonly<{
158
+ key: string;
159
+ index: number;
160
+ routeNames: string[];
161
+ history?: unknown[];
162
+ routes: import("@react-navigation/routers").NavigationRoute<ParamListBase, string>[];
163
+ type: string;
164
+ stale: false;
165
+ }>>): void;
166
+ goBack(): void;
167
+ isFocused(): boolean;
168
+ canGoBack(): boolean;
169
+ getId(): string | undefined;
170
+ getParent<T = import("@react-navigation/core").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string): T;
171
+ getState(): Readonly<{
172
+ key: string;
173
+ index: number;
174
+ routeNames: string[];
175
+ history?: unknown[];
176
+ routes: import("@react-navigation/routers").NavigationRoute<ParamListBase, string>[];
177
+ type: string;
178
+ stale: false;
179
+ }>;
180
+ } & import("@react-navigation/core").PrivateValueStore<[ParamListBase, unknown, unknown]> & import("@react-navigation/core").EventEmitter<TabNavigationEventMap> & {
181
+ setParams(params: Partial<object | undefined>): void;
182
+ replaceParams(params: object | undefined): void;
183
+ } & TabActionHelpers<ParamListBase>) | null>;
184
+ /**
185
+ * @hidden
186
+ */
187
+ export declare const TabsStateContext: import("react").Context<TabNavigationState<any>>;
188
+ export type Route = TabNavigationState<ParamListBase>['routes'][number];
189
+ export type TabsDescriptor = TabsContextValue['descriptors'][number];
190
+ //# sourceMappingURL=TabContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabContext.d.ts","sourceRoot":"","sources":["../../src/ui/TabContext.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ReactElement, ComponentProps } from 'react';
2
+ import { type ViewProps } from 'react-native';
3
+ export type TabListProps = ViewProps & {
4
+ /** Forward props to child component and removes the extra `<View>`. Useful for custom wrappers. */
5
+ asChild?: boolean;
6
+ };
7
+ /**
8
+ * Wrapper component for `TabTriggers`. `TabTriggers` within the `TabList` define the tabs.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <Tabs>
13
+ * <TabSlot />
14
+ * <TabList>
15
+ * <TabTrigger name="home" href="/" />
16
+ * </TabList>
17
+ * </Tabs>
18
+ * ```
19
+ */
20
+ export declare function TabList({ asChild, style, ...props }: TabListProps): import("react/jsx-runtime").JSX.Element;
21
+ /**
22
+ * @hidden
23
+ */
24
+ export declare function isTabList(child: ReactElement<any>): child is ReactElement<ComponentProps<typeof TabList>>;
25
+ //# sourceMappingURL=TabList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabList.d.ts","sourceRoot":"","sources":["../../src/ui/TabList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AACzD,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAI/D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG;IACrC,mGAAmG;IACnG,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,2CAGjE;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,GACvB,KAAK,IAAI,YAAY,CAAC,cAAc,CAAC,OAAO,OAAO,CAAC,CAAC,CAEvD"}
@@ -0,0 +1,103 @@
1
+ import { type CommonNavigationAction, type ParamListBase, type Router, type TabActionType as RNTabActionType, type TabNavigationState, type TabRouterOptions as RNTabRouterOptions } from '@react-navigation/native';
2
+ import type { TriggerMap } from './common';
3
+ export type ExpoTabRouterOptions = RNTabRouterOptions & {
4
+ triggerMap: TriggerMap;
5
+ };
6
+ export type ExpoTabActionType = RNTabActionType | CommonNavigationAction | {
7
+ type: 'JUMP_TO';
8
+ source?: string;
9
+ target?: string;
10
+ payload: {
11
+ name: string;
12
+ resetOnFocus?: boolean;
13
+ params?: object;
14
+ };
15
+ };
16
+ export declare function ExpoTabRouter(options: ExpoTabRouterOptions): Router<TabNavigationState<ParamListBase>, {
17
+ type: "GO_BACK";
18
+ source?: string;
19
+ target?: string;
20
+ } | {
21
+ type: "NAVIGATE";
22
+ payload: {
23
+ name: string;
24
+ params?: object;
25
+ path?: string;
26
+ merge?: boolean;
27
+ pop?: boolean;
28
+ };
29
+ source?: string;
30
+ target?: string;
31
+ } | {
32
+ type: "NAVIGATE_DEPRECATED";
33
+ payload: {
34
+ name: string;
35
+ params?: object;
36
+ merge?: boolean;
37
+ };
38
+ source?: string;
39
+ target?: string;
40
+ } | {
41
+ type: "RESET";
42
+ payload: (Readonly<{
43
+ key: string;
44
+ index: number;
45
+ routeNames: string[];
46
+ history?: unknown[];
47
+ routes: import("@react-navigation/routers").NavigationRoute<ParamListBase, string>[];
48
+ type: string;
49
+ stale: false;
50
+ }> | import("@react-navigation/routers").PartialState<Readonly<{
51
+ key: string;
52
+ index: number;
53
+ routeNames: string[];
54
+ history?: unknown[];
55
+ routes: import("@react-navigation/routers").NavigationRoute<ParamListBase, string>[];
56
+ type: string;
57
+ stale: false;
58
+ }>> | (Omit<Readonly<{
59
+ key: string;
60
+ index: number;
61
+ routeNames: string[];
62
+ history?: unknown[];
63
+ routes: import("@react-navigation/routers").NavigationRoute<ParamListBase, string>[];
64
+ type: string;
65
+ stale: false;
66
+ }>, "routes"> & {
67
+ routes: Omit<import("@react-navigation/routers").Route<string>, "key">[];
68
+ })) | undefined;
69
+ source?: string;
70
+ target?: string;
71
+ } | {
72
+ type: "SET_PARAMS";
73
+ payload: {
74
+ params?: object;
75
+ };
76
+ source?: string;
77
+ target?: string;
78
+ } | {
79
+ type: "REPLACE_PARAMS";
80
+ payload: {
81
+ params?: object;
82
+ };
83
+ source?: string;
84
+ target?: string;
85
+ } | {
86
+ type: "PRELOAD";
87
+ payload: {
88
+ name: string;
89
+ params?: object;
90
+ };
91
+ source?: string;
92
+ target?: string;
93
+ } | RNTabActionType | {
94
+ type: "JUMP_TO";
95
+ source?: string;
96
+ target?: string;
97
+ payload: {
98
+ name: string;
99
+ resetOnFocus?: boolean;
100
+ params?: object;
101
+ };
102
+ }>;
103
+ //# sourceMappingURL=TabRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabRouter.d.ts","sourceRoot":"","sources":["../../src/ui/TabRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAElB,KAAK,MAAM,EACX,KAAK,aAAa,IAAI,eAAe,EACrC,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,IAAI,kBAAkB,EAC5C,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,GAAG;IACtD,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,sBAAsB,GACtB;IACE,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,CAAA;AAEL,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;;;;;;cAdvC,CAAC;YACV,CAAC;aACG,CAAC;WAEV,CAAA;;;;;;;;cAUO,CAAC;aAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAS7B,CAAA;;;;;;;cAI+B,CAAC;;;;;;;;cAIjC,CAAL;;;;;UA3BS,SAAS;aACN,MAAM;aACN,MAAM;aACN;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB;GAmDN"}