@amazon-devices/react-navigation__react-native-tab-view 7.0.1759135970 → 8.0.9000000000-rn-83

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 (127) hide show
  1. package/README.md +2 -646
  2. package/SystemBundles/adbcd18d13758315355457809fdb5587894f9f3c2c9838769a5a47bf860685c8.bundle +8564 -0
  3. package/SystemBundles/adbcd18d13758315355457809fdb5587894f9f3c2c9838769a5a47bf860685c8.map +3217 -0
  4. package/SystemModules/amzn__react-navigation__react-native-tab-view-8.modules.txt +12 -0
  5. package/SystemModules/amzn__react-navigation__react-native-tab-view-8.private.modules.txt +63 -0
  6. package/SystemModules/keplerscript-system-bundle-config.json +4 -4
  7. package/kepler-compatibility.json +2 -2
  8. package/lib/module/Pager.android.js +3 -1
  9. package/lib/module/Pager.android.js.map +1 -1
  10. package/lib/module/Pager.ios.js +3 -1
  11. package/lib/module/Pager.ios.js.map +1 -1
  12. package/lib/module/Pager.js +3 -1
  13. package/lib/module/Pager.js.map +1 -1
  14. package/lib/module/PagerViewAdapter.js +29 -22
  15. package/lib/module/PagerViewAdapter.js.map +1 -1
  16. package/lib/module/PanResponderAdapter.js +46 -32
  17. package/lib/module/PanResponderAdapter.js.map +1 -1
  18. package/lib/module/PlatformPressable.js +38 -12
  19. package/lib/module/PlatformPressable.js.map +1 -1
  20. package/lib/module/SceneMap.js +7 -4
  21. package/lib/module/SceneMap.js.map +1 -1
  22. package/lib/module/SceneView.js +16 -14
  23. package/lib/module/SceneView.js.map +1 -1
  24. package/lib/module/TabBar.js +232 -156
  25. package/lib/module/TabBar.js.map +1 -1
  26. package/lib/module/TabBarIndicator.js +47 -26
  27. package/lib/module/TabBarIndicator.js.map +1 -1
  28. package/lib/module/TabBarItem.js +106 -107
  29. package/lib/module/TabBarItem.js.map +1 -1
  30. package/lib/module/TabBarItemLabel.js +33 -0
  31. package/lib/module/TabBarItemLabel.js.map +1 -0
  32. package/lib/module/TabView.js +91 -63
  33. package/lib/module/TabView.js.map +1 -1
  34. package/lib/module/index.js +7 -5
  35. package/lib/module/index.js.map +1 -1
  36. package/lib/module/package.json +1 -0
  37. package/lib/module/types.js +2 -0
  38. package/lib/module/types.js.map +1 -1
  39. package/lib/module/useAnimatedValue.js +4 -2
  40. package/lib/module/useAnimatedValue.js.map +1 -1
  41. package/lib/typescript/package.json +1 -0
  42. package/lib/typescript/src/Pager.android.d.ts +1 -1
  43. package/lib/typescript/src/Pager.android.d.ts.map +1 -1
  44. package/lib/typescript/src/Pager.d.ts +1 -1
  45. package/lib/typescript/src/Pager.d.ts.map +1 -1
  46. package/lib/typescript/src/Pager.ios.d.ts +1 -1
  47. package/lib/typescript/src/Pager.ios.d.ts.map +1 -1
  48. package/lib/typescript/src/PagerViewAdapter.d.ts +4 -1
  49. package/lib/typescript/src/PagerViewAdapter.d.ts.map +1 -1
  50. package/lib/typescript/src/PanResponderAdapter.d.ts +4 -1
  51. package/lib/typescript/src/PanResponderAdapter.d.ts.map +1 -1
  52. package/lib/typescript/src/PlatformPressable.d.ts +6 -8
  53. package/lib/typescript/src/PlatformPressable.d.ts.map +1 -1
  54. package/lib/typescript/src/SceneMap.d.ts +2 -2
  55. package/lib/typescript/src/SceneMap.d.ts.map +1 -1
  56. package/lib/typescript/src/SceneView.d.ts +2 -2
  57. package/lib/typescript/src/SceneView.d.ts.map +1 -1
  58. package/lib/typescript/src/TabBar.d.ts +7 -19
  59. package/lib/typescript/src/TabBar.d.ts.map +1 -1
  60. package/lib/typescript/src/TabBarIndicator.d.ts +8 -6
  61. package/lib/typescript/src/TabBarIndicator.d.ts.map +1 -1
  62. package/lib/typescript/src/TabBarItem.d.ts +4 -22
  63. package/lib/typescript/src/TabBarItem.d.ts.map +1 -1
  64. package/lib/typescript/src/TabBarItemLabel.d.ts +11 -0
  65. package/lib/typescript/src/TabBarItemLabel.d.ts.map +1 -0
  66. package/lib/typescript/src/TabView.d.ts +14 -8
  67. package/lib/typescript/src/TabView.d.ts.map +1 -1
  68. package/lib/typescript/src/index.d.ts +6 -6
  69. package/lib/typescript/src/index.d.ts.map +1 -1
  70. package/lib/typescript/src/types.d.ts +29 -1
  71. package/lib/typescript/src/types.d.ts.map +1 -1
  72. package/lib/typescript/src/useAnimatedValue.d.ts +1 -1
  73. package/lib/typescript/src/useAnimatedValue.d.ts.map +1 -1
  74. package/oss-attribution/attribution.txt +0 -0
  75. package/oss-attribution/licenseInfos.json +1 -0
  76. package/package.json +93 -1
  77. package/src/Pager.android.tsx +1 -1
  78. package/src/Pager.ios.tsx +1 -1
  79. package/src/Pager.tsx +1 -1
  80. package/src/PagerViewAdapter.tsx +26 -21
  81. package/src/PanResponderAdapter.tsx +32 -28
  82. package/src/PlatformPressable.tsx +59 -10
  83. package/src/SceneMap.tsx +3 -3
  84. package/src/SceneView.tsx +6 -7
  85. package/src/TabBar.tsx +282 -193
  86. package/src/TabBarIndicator.tsx +65 -28
  87. package/src/TabBarItem.tsx +119 -130
  88. package/src/TabBarItemLabel.tsx +42 -0
  89. package/src/TabView.tsx +59 -16
  90. package/src/index.tsx +11 -6
  91. package/src/types.tsx +29 -1
  92. package/src/useAnimatedValue.tsx +2 -2
  93. package/SystemBundles/0c296a88d0023a3995e190db70259767d1ef39c9da6cd47f3d76cd128687f1f6.bundle +0 -14497
  94. package/SystemBundles/0c296a88d0023a3995e190db70259767d1ef39c9da6cd47f3d76cd128687f1f6.map +0 -1
  95. package/SystemModules/amzn__react-navigation__react-native-tab-view-7.modules.txt +0 -41
  96. package/SystemModules/amzn__react-navigation__react-native-tab-view-7.private.modules.txt +0 -98
  97. package/THIRD_PARTY_NOTICES.txt +0 -24
  98. package/lib/commonjs/Pager.android.js +0 -14
  99. package/lib/commonjs/Pager.android.js.map +0 -1
  100. package/lib/commonjs/Pager.ios.js +0 -14
  101. package/lib/commonjs/Pager.ios.js.map +0 -1
  102. package/lib/commonjs/Pager.js +0 -14
  103. package/lib/commonjs/Pager.js.map +0 -1
  104. package/lib/commonjs/PagerViewAdapter.js +0 -132
  105. package/lib/commonjs/PagerViewAdapter.js.map +0 -1
  106. package/lib/commonjs/PanResponderAdapter.js +0 -204
  107. package/lib/commonjs/PanResponderAdapter.js.map +0 -1
  108. package/lib/commonjs/PlatformPressable.js +0 -43
  109. package/lib/commonjs/PlatformPressable.js.map +0 -1
  110. package/lib/commonjs/SceneMap.js +0 -29
  111. package/lib/commonjs/SceneMap.js.map +0 -1
  112. package/lib/commonjs/SceneView.js +0 -78
  113. package/lib/commonjs/SceneView.js.map +0 -1
  114. package/lib/commonjs/TabBar.js +0 -405
  115. package/lib/commonjs/TabBar.js.map +0 -1
  116. package/lib/commonjs/TabBarIndicator.js +0 -110
  117. package/lib/commonjs/TabBarIndicator.js.map +0 -1
  118. package/lib/commonjs/TabBarItem.js +0 -227
  119. package/lib/commonjs/TabBarItem.js.map +0 -1
  120. package/lib/commonjs/TabView.js +0 -122
  121. package/lib/commonjs/TabView.js.map +0 -1
  122. package/lib/commonjs/index.js +0 -42
  123. package/lib/commonjs/index.js.map +0 -1
  124. package/lib/commonjs/types.js +0 -6
  125. package/lib/commonjs/types.js.map +0 -1
  126. package/lib/commonjs/useAnimatedValue.js +0 -18
  127. package/lib/commonjs/useAnimatedValue.js.map +0 -1
@@ -1,17 +1,18 @@
1
1
  import * as React from 'react';
2
- import { StyleProp, ViewStyle } from 'react-native';
3
- import type { Layout, NavigationState, PagerProps, Route, SceneRendererProps } from './types';
4
- export type Props<T extends Route> = PagerProps & {
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ import type { Layout, LocaleDirection, NavigationState, PagerProps, Route, SceneRendererProps, TabDescriptor } from './types';
4
+ export type Props<T extends Route> = Omit<PagerProps, 'layoutDirection'> & {
5
5
  onIndexChange: (index: number) => void;
6
+ onTabSelect?: (props: {
7
+ index: number;
8
+ }) => void;
6
9
  navigationState: NavigationState<T>;
7
- renderScene: (props: SceneRendererProps & {
8
- route: T;
9
- }) => React.ReactNode;
10
10
  renderLazyPlaceholder?: (props: {
11
11
  route: T;
12
12
  }) => React.ReactNode;
13
13
  renderTabBar?: (props: SceneRendererProps & {
14
14
  navigationState: NavigationState<T>;
15
+ options: Record<string, TabDescriptor<T>> | undefined;
15
16
  }) => React.ReactNode;
16
17
  tabBarPosition?: 'top' | 'bottom';
17
18
  initialLayout?: Partial<Layout>;
@@ -19,9 +20,14 @@ export type Props<T extends Route> = PagerProps & {
19
20
  route: T;
20
21
  }) => boolean) | boolean;
21
22
  lazyPreloadDistance?: number;
22
- sceneContainerStyle?: StyleProp<ViewStyle>;
23
+ direction?: LocaleDirection;
23
24
  pagerStyle?: StyleProp<ViewStyle>;
24
25
  style?: StyleProp<ViewStyle>;
26
+ renderScene: (props: SceneRendererProps & {
27
+ route: T;
28
+ }) => React.ReactNode;
29
+ options?: Record<string, TabDescriptor<T>>;
30
+ commonOptions?: TabDescriptor<T>;
25
31
  };
26
- export default function TabView<T extends Route>({ onIndexChange, navigationState, renderScene, initialLayout, keyboardDismissMode, lazy, lazyPreloadDistance, onSwipeStart, onSwipeEnd, renderLazyPlaceholder, renderTabBar, sceneContainerStyle, pagerStyle, style, swipeEnabled, tabBarPosition, animationEnabled, overScrollMode, }: Props<T>): JSX.Element;
32
+ export declare function TabView<T extends Route>({ onIndexChange, onTabSelect, navigationState, renderScene, initialLayout, keyboardDismissMode, lazy, lazyPreloadDistance, onSwipeStart, onSwipeEnd, renderLazyPlaceholder, renderTabBar, pagerStyle, style, direction, swipeEnabled, tabBarPosition, animationEnabled, overScrollMode, options: sceneOptions, commonOptions, }: Props<T>): import("react/jsx-runtime").JSX.Element;
27
33
  //# sourceMappingURL=TabView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TabView.d.ts","sourceRoot":"","sources":["../../../src/TabView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAEL,SAAS,EAGT,SAAS,EACV,MAAM,cAAc,CAAC;AAKtB,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,UAAU,EACV,KAAK,EACL,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,KAAK,IAAI,UAAU,GAAG;IAChD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,kBAAkB,GAAG;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3E,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IACjE,YAAY,CAAC,EAAE,CACb,KAAK,EAAE,kBAAkB,GAAG;QAAE,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;KAAE,KAChE,KAAK,CAAC,SAAS,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,OAAO,CAAC;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,CAAC,SAAS,KAAK,EAAE,EAC/C,aAAa,EACb,eAAe,EACf,WAAW,EACX,aAAa,EACb,mBAA4B,EAC5B,IAAY,EACZ,mBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,qBAAkC,EAClC,YAA+C,EAC/C,mBAAmB,EACnB,UAAU,EACV,KAAK,EACL,YAAmB,EACnB,cAAsB,EACtB,gBAAuB,EACvB,cAAc,GACf,EAAE,KAAK,CAAC,CAAC,CAAC,eA2FV"}
1
+ {"version":3,"file":"TabView.d.ts","sourceRoot":"","sources":["../../../src/TabView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAIL,KAAK,SAAS,EAGd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAKtB,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,eAAe,EACf,UAAU,EACV,KAAK,EACL,kBAAkB,EAClB,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,GAAG;IACzE,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACjD,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IACjE,YAAY,CAAC,EAAE,CACb,KAAK,EAAE,kBAAkB,GAAG;QAC1B,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;KACvD,KACE,KAAK,CAAC,SAAS,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,OAAO,CAAC;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,WAAW,EAAE,CAAC,KAAK,EAAE,kBAAkB,GAAG;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAIF,wBAAgB,OAAO,CAAC,CAAC,SAAS,KAAK,EAAE,EACvC,aAAa,EACb,WAAW,EACX,eAAe,EACf,WAAW,EACX,aAAa,EACb,mBAA4B,EAC5B,IAAY,EACZ,mBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,qBAAoD,EAEpD,YAA+C,EAC/C,UAAU,EACV,KAAK,EACL,SAA4D,EAC5D,YAAmB,EACnB,cAAsB,EACtB,gBAAuB,EACvB,cAAc,EACd,OAAO,EAAE,YAAY,EACrB,aAAa,GACd,EAAE,KAAK,CAAC,CAAC,CAAC,2CAsHV"}
@@ -1,11 +1,11 @@
1
- export { default as SceneMap } from './SceneMap';
1
+ export { SceneMap } from './SceneMap';
2
2
  export type { Props as TabBarProps } from './TabBar';
3
- export { default as TabBar } from './TabBar';
3
+ export { TabBar } from './TabBar';
4
4
  export type { Props as TabBarIndicatorProps } from './TabBarIndicator';
5
- export { default as TabBarIndicator } from './TabBarIndicator';
5
+ export { TabBarIndicator } from './TabBarIndicator';
6
6
  export type { Props as TabBarItemProps } from './TabBarItem';
7
- export { default as TabBarItem } from './TabBarItem';
7
+ export { TabBarItem } from './TabBarItem';
8
8
  export type { Props as TabViewProps } from './TabView';
9
- export { default as TabView } from './TabView';
10
- export type { NavigationState, Route, SceneRendererProps } from './types';
9
+ export { TabView } from './TabView';
10
+ export type { NavigationState, Route, SceneRendererProps, TabDescriptor, } from './types';
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,KAAK,IAAI,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,KAAK,IAAI,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,eAAe,EACf,KAAK,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,SAAS,CAAC"}
@@ -1,5 +1,33 @@
1
- import type { Animated } from 'react-native';
1
+ import type { Animated, StyleProp, TextStyle, ViewStyle } from 'react-native';
2
2
  import type { PagerViewProps } from 'react-native-pager-view';
3
+ export type TabDescriptor<T extends Route> = {
4
+ accessibilityLabel?: string;
5
+ accessible?: boolean;
6
+ testID?: string;
7
+ labelText?: string;
8
+ labelAllowFontScaling?: boolean;
9
+ href?: string;
10
+ label?: (props: {
11
+ route: T;
12
+ labelText?: string;
13
+ focused: boolean;
14
+ color: string;
15
+ allowFontScaling?: boolean;
16
+ style?: StyleProp<TextStyle>;
17
+ }) => React.ReactNode;
18
+ labelStyle?: StyleProp<TextStyle>;
19
+ icon?: (props: {
20
+ route: T;
21
+ focused: boolean;
22
+ color: string;
23
+ size: number;
24
+ }) => React.ReactNode;
25
+ badge?: (props: {
26
+ route: T;
27
+ }) => React.ReactElement;
28
+ sceneStyle?: StyleProp<ViewStyle>;
29
+ };
30
+ export type LocaleDirection = 'ltr' | 'rtl';
3
31
  export type Route = {
4
32
  key: string;
5
33
  icon?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,MAAM,KAAK,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,IAAI,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,KAAK,IAAI;IACnC,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,KAAK,IAAI;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,EAAE,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,IAAI,CAC3B,cAAc,EACZ,aAAa,GACb,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,0BAA0B,GAC1B,qBAAqB,GACrB,UAAU,CACb,GAAG;IACF,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.tsx"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { Animated } from 'react-native';
2
- export default function useAnimatedValue(initialValue: number): Animated.Value;
2
+ export declare function useAnimatedValue(initialValue: number): Animated.Value;
3
3
  //# sourceMappingURL=useAnimatedValue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAnimatedValue.d.ts","sourceRoot":"","sources":["../../../src/useAnimatedValue.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,YAAY,EAAE,MAAM,kBAQ5D"}
1
+ {"version":3,"file":"useAnimatedValue.d.ts","sourceRoot":"","sources":["../../../src/useAnimatedValue.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAOzB,QAAQ,CAAC,KAAK,CACzC"}
File without changes
@@ -0,0 +1 @@
1
+ {}
package/package.json CHANGED
@@ -1 +1,93 @@
1
- {"name": "@amazon-devices/react-navigation__react-native-tab-view", "description": "Tab view component for React Native", "version": "7.0.1759135970", "keywords": ["react-native-component", "react-component", "react-native", "ios", "android", "tab", "swipe", "scrollable", "coverflow"], "license": "See license in LICENSE", "repository": {"type": "git", "url": "https://github.com/react-navigation/react-navigation.git", "directory": "packages/react-native-tab-view"}, "bugs": {"url": "https://github.com/react-navigation/react-navigation/issues"}, "homepage": "https://github.com/react-navigation/react-navigation/tree/main/packages/react-native-tab-view#readme", "main": "lib/commonjs/index.js", "react-native": "src/index.tsx", "source": "src/index.tsx", "module": "lib/module/index.js", "types": "lib/typescript/src/index.d.ts", "files": ["src", "lib", "!**/__tests__", "kepler-compatibility.json", "SystemModules", "SystemBundles", "THIRD_PARTY_NOTICES.txt", "kepler-transformed-package-info.json"], "sideEffects": false, "kepler": {"temporary-alias-for-package": {"name": "@react-navigation/react-native-tab-view", "version": "3.4.4"}}, "scripts": {"clean": "del lib"}, "dependencies": {"use-latest-callback": "0.1.6"}, "devDependencies": {"del-cli": "5.0.0", "react": "17.0.2", "react-native": "0.72.0", "@types/react": "17.0.2", "react-native-builder-bob": "0.20.4", "react-native-pager-view": "6.1.2", "typescript": "4.9.4"}, "peerDependencies": {"@amazon-devices/react-navigation__native": "^7.0.0", "react": "*", "react-native": "*", "react-native-pager-view": "*"}, "react-native-builder-bob": {"source": "src", "output": "lib", "targets": ["commonjs", "module", ["typescript", {"project": "tsconfig.build.json"}]]}}
1
+ {
2
+ "name": "@amazon-devices/react-navigation__react-native-tab-view",
3
+ "description": "Tab view component for React Native",
4
+ "version": "8.0.9000000000-rn-83",
5
+ "keywords": [
6
+ "react-native-component",
7
+ "react-component",
8
+ "react-native",
9
+ "ios",
10
+ "android",
11
+ "tab",
12
+ "swipe",
13
+ "scrollable",
14
+ "coverflow"
15
+ ],
16
+ "license": "See license in LICENSE",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/react-navigation/react-navigation.git",
20
+ "directory": "packages/react-native-tab-view"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/react-navigation/react-navigation/issues"
24
+ },
25
+ "homepage": "https://reactnavigation.org/docs/tab-view/",
26
+ "main": "./lib/module/index.js",
27
+ "types": "./lib/typescript/src/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "source": "./src/index.tsx",
31
+ "types": "./lib/typescript/src/index.d.ts",
32
+ "default": "./lib/module/index.js"
33
+ },
34
+ "./package.json": "./package.json"
35
+ },
36
+ "files": [
37
+ "src",
38
+ "lib",
39
+ "!**/__tests__",
40
+ "kepler-compatibility.json",
41
+ "SystemModules",
42
+ "SystemBundles",
43
+ "oss-attribution",
44
+ "kepler-transformed-package-info.json"
45
+ ],
46
+ "sideEffects": false,
47
+ "kepler": {
48
+ "temporary-alias-for-package": {
49
+ "name": "@react-navigation/react-native-tab-view",
50
+ "version": "4.0.5"
51
+ }
52
+ },
53
+ "scripts": {
54
+ "clean": "del lib"
55
+ },
56
+ "dependencies": {
57
+ "use-latest-callback": "^0.2.4"
58
+ },
59
+ "devDependencies": {
60
+ "@jest/globals": "^30.0.0",
61
+ "@testing-library/react-native": "^13.2.0",
62
+ "del-cli": "^6.0.0",
63
+ "react": "19.0.0",
64
+ "react-native": "0.79.3",
65
+ "react-native-builder-bob": "^0.40.12",
66
+ "react-native-pager-view": "6.8.1",
67
+ "react-test-renderer": "19.0.0",
68
+ "typescript": "^5.8.3"
69
+ },
70
+ "peerDependencies": {
71
+ "react": ">= 18.2.0",
72
+ "react-native": "*",
73
+ "react-native-pager-view": ">= 6.0.0"
74
+ },
75
+ "react-native-builder-bob": {
76
+ "source": "src",
77
+ "output": "lib",
78
+ "targets": [
79
+ [
80
+ "module",
81
+ {
82
+ "esm": true
83
+ }
84
+ ],
85
+ [
86
+ "typescript",
87
+ {
88
+ "project": "tsconfig.build.json"
89
+ }
90
+ ]
91
+ ]
92
+ }
93
+ }
@@ -1 +1 @@
1
- export { default } from './PagerViewAdapter';
1
+ export { PagerViewAdapter as Pager } from './PagerViewAdapter';
package/src/Pager.ios.tsx CHANGED
@@ -1 +1 @@
1
- export { default } from './PagerViewAdapter';
1
+ export { PagerViewAdapter as Pager } from './PagerViewAdapter';
package/src/Pager.tsx CHANGED
@@ -1 +1 @@
1
- export { default } from './PanResponderAdapter';
1
+ export { PanResponderAdapter as Pager } from './PanResponderAdapter';
@@ -1,8 +1,9 @@
1
1
  import * as React from 'react';
2
- import { Animated, Keyboard, StyleSheet } from 'react-native';
2
+ import { Animated, Keyboard, Platform, StyleSheet } from 'react-native';
3
3
  import ViewPager, {
4
- PageScrollStateChangedNativeEvent,
4
+ type PageScrollStateChangedNativeEvent,
5
5
  } from 'react-native-pager-view';
6
+ import useLatestCallback from 'use-latest-callback';
6
7
 
7
8
  import type {
8
9
  EventEmitterProps,
@@ -11,12 +12,13 @@ import type {
11
12
  PagerProps,
12
13
  Route,
13
14
  } from './types';
14
- import useAnimatedValue from './useAnimatedValue';
15
+ import { useAnimatedValue } from './useAnimatedValue';
15
16
 
16
17
  const AnimatedViewPager = Animated.createAnimatedComponent(ViewPager);
17
18
 
18
19
  type Props<T extends Route> = PagerProps & {
19
20
  onIndexChange: (index: number) => void;
21
+ onTabSelect?: (props: { index: number }) => void;
20
22
  navigationState: NavigationState<T>;
21
23
  children: (
22
24
  props: EventEmitterProps & {
@@ -33,11 +35,14 @@ type Props<T extends Route> = PagerProps & {
33
35
  ) => React.ReactElement;
34
36
  };
35
37
 
36
- export default function PagerViewAdapter<T extends Route>({
38
+ const useNativeDriver = Platform.OS !== 'web';
39
+
40
+ export function PagerViewAdapter<T extends Route>({
37
41
  keyboardDismissMode = 'auto',
38
42
  swipeEnabled = true,
39
43
  navigationState,
40
44
  onIndexChange,
45
+ onTabSelect,
41
46
  onSwipeStart,
42
47
  onSwipeEnd,
43
48
  children,
@@ -60,21 +65,20 @@ export default function PagerViewAdapter<T extends Route>({
60
65
  navigationStateRef.current = navigationState;
61
66
  });
62
67
 
63
- const jumpTo = React.useCallback(
64
- (key: string) => {
65
- const index = navigationStateRef.current.routes.findIndex(
66
- (route: { key: string }) => route.key === key
67
- );
68
+ const jumpTo = useLatestCallback((key: string) => {
69
+ const index = navigationStateRef.current.routes.findIndex(
70
+ (route: { key: string }) => route.key === key
71
+ );
68
72
 
69
- if (animationEnabled) {
70
- pagerRef.current?.setPage(index);
71
- } else {
72
- pagerRef.current?.setPageWithoutAnimation(index);
73
- position.setValue(index);
74
- }
75
- },
76
- [animationEnabled, position]
77
- );
73
+ if (animationEnabled) {
74
+ pagerRef.current?.setPage(index);
75
+ } else {
76
+ pagerRef.current?.setPageWithoutAnimation(index);
77
+ position.setValue(index);
78
+ }
79
+
80
+ onIndexChange(index);
81
+ });
78
82
 
79
83
  React.useEffect(() => {
80
84
  if (keyboardDismissMode === 'auto') {
@@ -118,7 +122,7 @@ export default function PagerViewAdapter<T extends Route>({
118
122
  }
119
123
  };
120
124
 
121
- const addEnterListener = React.useCallback((listener: Listener) => {
125
+ const addEnterListener = useLatestCallback((listener: Listener) => {
122
126
  listenersRef.current.push(listener);
123
127
 
124
128
  return () => {
@@ -128,7 +132,7 @@ export default function PagerViewAdapter<T extends Route>({
128
132
  listenersRef.current.splice(index, 1);
129
133
  }
130
134
  };
131
- }, []);
135
+ });
132
136
 
133
137
  const memoizedPosition = React.useMemo(
134
138
  () => Animated.add(position, offset),
@@ -157,12 +161,13 @@ export default function PagerViewAdapter<T extends Route>({
157
161
  },
158
162
  },
159
163
  ],
160
- { useNativeDriver: true }
164
+ { useNativeDriver }
161
165
  )}
162
166
  onPageSelected={(e) => {
163
167
  const index = e.nativeEvent.position;
164
168
  indexRef.current = index;
165
169
  onIndexChange(index);
170
+ onTabSelect?.({ index });
166
171
  }}
167
172
  onPageScrollStateChanged={onPageScrollStateChanged}
168
173
  scrollEnabled={swipeEnabled}
@@ -1,14 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import {
3
3
  Animated,
4
- GestureResponderEvent,
5
- I18nManager,
4
+ type GestureResponderEvent,
6
5
  Keyboard,
7
6
  PanResponder,
8
- PanResponderGestureState,
7
+ type PanResponderGestureState,
9
8
  StyleSheet,
10
9
  View,
11
10
  } from 'react-native';
11
+ import useLatestCallback from 'use-latest-callback';
12
12
 
13
13
  import type {
14
14
  EventEmitterProps,
@@ -18,11 +18,12 @@ import type {
18
18
  PagerProps,
19
19
  Route,
20
20
  } from './types';
21
- import useAnimatedValue from './useAnimatedValue';
21
+ import { useAnimatedValue } from './useAnimatedValue';
22
22
 
23
23
  type Props<T extends Route> = PagerProps & {
24
24
  layout: Layout;
25
25
  onIndexChange: (index: number) => void;
26
+ onTabSelect?: (props: { index: number }) => void;
26
27
  navigationState: NavigationState<T>;
27
28
  children: (
28
29
  props: EventEmitterProps & {
@@ -49,17 +50,19 @@ const DefaultTransitionSpec = {
49
50
  overshootClamping: true,
50
51
  };
51
52
 
52
- export default function PanResponderAdapter<T extends Route>({
53
+ export function PanResponderAdapter<T extends Route>({
53
54
  layout,
54
55
  keyboardDismissMode = 'auto',
55
56
  swipeEnabled = true,
56
57
  navigationState,
57
58
  onIndexChange,
59
+ onTabSelect,
58
60
  onSwipeStart,
59
61
  onSwipeEnd,
60
62
  children,
61
63
  style,
62
64
  animationEnabled = false,
65
+ layoutDirection = 'ltr',
63
66
  }: Props<T>) {
64
67
  const { routes, index } = navigationState;
65
68
 
@@ -70,14 +73,14 @@ export default function PanResponderAdapter<T extends Route>({
70
73
  const navigationStateRef = React.useRef(navigationState);
71
74
  const layoutRef = React.useRef(layout);
72
75
  const onIndexChangeRef = React.useRef(onIndexChange);
73
-
76
+ const onTabSelectRef = React.useRef(onTabSelect);
74
77
  const currentIndexRef = React.useRef(index);
75
- const pendingIndexRef = React.useRef<number>();
78
+ const pendingIndexRef = React.useRef<number>(undefined);
76
79
 
77
80
  const swipeVelocityThreshold = 0.15;
78
81
  const swipeDistanceThreshold = layout.width / 1.75;
79
82
 
80
- const jumpToIndex = React.useCallback(
83
+ const jumpToIndex = useLatestCallback(
81
84
  (index: number, animate = animationEnabled) => {
82
85
  const offset = -index * layoutRef.current.width;
83
86
 
@@ -93,6 +96,7 @@ export default function PanResponderAdapter<T extends Route>({
93
96
  ]).start(({ finished }) => {
94
97
  if (finished) {
95
98
  onIndexChangeRef.current(index);
99
+ onTabSelectRef.current?.({ index });
96
100
  pendingIndexRef.current = undefined;
97
101
  }
98
102
  });
@@ -100,16 +104,17 @@ export default function PanResponderAdapter<T extends Route>({
100
104
  } else {
101
105
  panX.setValue(offset);
102
106
  onIndexChangeRef.current(index);
107
+ onTabSelectRef.current?.({ index });
103
108
  pendingIndexRef.current = undefined;
104
109
  }
105
- },
106
- [animationEnabled, panX]
110
+ }
107
111
  );
108
112
 
109
113
  React.useEffect(() => {
110
114
  navigationStateRef.current = navigationState;
111
115
  layoutRef.current = layout;
112
116
  onIndexChangeRef.current = onIndexChange;
117
+ onTabSelectRef.current = onTabSelect;
113
118
  });
114
119
 
115
120
  React.useEffect(() => {
@@ -147,7 +152,8 @@ export default function PanResponderAdapter<T extends Route>({
147
152
  return false;
148
153
  }
149
154
 
150
- const diffX = I18nManager.isRTL ? -gestureState.dx : gestureState.dx;
155
+ const diffX =
156
+ layoutDirection === 'rtl' ? -gestureState.dx : gestureState.dx;
151
157
 
152
158
  return (
153
159
  isMovingHorizontally(event, gestureState) &&
@@ -172,7 +178,8 @@ export default function PanResponderAdapter<T extends Route>({
172
178
  _: GestureResponderEvent,
173
179
  gestureState: PanResponderGestureState
174
180
  ) => {
175
- const diffX = I18nManager.isRTL ? -gestureState.dx : gestureState.dx;
181
+ const diffX =
182
+ layoutDirection === 'rtl' ? -gestureState.dx : gestureState.dx;
176
183
 
177
184
  if (
178
185
  // swiping left
@@ -222,7 +229,7 @@ export default function PanResponderAdapter<T extends Route>({
222
229
  Math.min(
223
230
  Math.max(
224
231
  0,
225
- I18nManager.isRTL
232
+ layoutDirection === 'rtl'
226
233
  ? currentIndex + gestureState.dx / Math.abs(gestureState.dx)
227
234
  : currentIndex - gestureState.dx / Math.abs(gestureState.dx)
228
235
  ),
@@ -240,8 +247,7 @@ export default function PanResponderAdapter<T extends Route>({
240
247
  jumpToIndex(nextIndex, true);
241
248
  };
242
249
 
243
- // TODO: use the listeners
244
- const addEnterListener = React.useCallback((listener: Listener) => {
250
+ const addEnterListener = useLatestCallback((listener: Listener) => {
245
251
  listenersRef.current.push(listener);
246
252
 
247
253
  return () => {
@@ -251,18 +257,16 @@ export default function PanResponderAdapter<T extends Route>({
251
257
  listenersRef.current.splice(index, 1);
252
258
  }
253
259
  };
254
- }, []);
260
+ });
255
261
 
256
- const jumpTo = React.useCallback(
257
- (key: string) => {
258
- const index = navigationStateRef.current.routes.findIndex(
259
- (route: { key: string }) => route.key === key
260
- );
262
+ const jumpTo = useLatestCallback((key: string) => {
263
+ const index = navigationStateRef.current.routes.findIndex(
264
+ (route: { key: string }) => route.key === key
265
+ );
261
266
 
262
- jumpToIndex(index);
263
- },
264
- [jumpToIndex]
265
- );
267
+ jumpToIndex(index);
268
+ onIndexChange(index);
269
+ });
266
270
 
267
271
  const panResponder = PanResponder.create({
268
272
  onMoveShouldSetPanResponder: canMoveScreen,
@@ -281,7 +285,7 @@ export default function PanResponderAdapter<T extends Route>({
281
285
  outputRange: [-maxTranslate, 0],
282
286
  extrapolate: 'clamp',
283
287
  }),
284
- I18nManager.isRTL ? -1 : 1
288
+ layoutDirection === 'rtl' ? -1 : 1
285
289
  );
286
290
 
287
291
  const position = React.useMemo(
@@ -318,8 +322,8 @@ export default function PanResponderAdapter<T extends Route>({
318
322
  layout.width
319
323
  ? { width: layout.width }
320
324
  : focused
321
- ? StyleSheet.absoluteFill
322
- : null
325
+ ? StyleSheet.absoluteFill
326
+ : null
323
327
  }
324
328
  >
325
329
  {focused || layout.width ? child : null}
@@ -1,9 +1,18 @@
1
1
  import * as React from 'react';
2
- import { Platform, Pressable, PressableProps } from 'react-native';
2
+ import {
3
+ type GestureResponderEvent,
4
+ Platform,
5
+ Pressable,
6
+ type PressableProps,
7
+ } from 'react-native';
3
8
 
4
- export type Props = PressableProps & {
9
+ export type Props = Omit<PressableProps, 'onPress'> & {
10
+ href?: string;
5
11
  pressColor?: string;
6
12
  pressOpacity?: number;
13
+ onPress?: (
14
+ e: React.MouseEvent<HTMLAnchorElement, MouseEvent> | GestureResponderEvent
15
+ ) => void;
7
16
  children: React.ReactNode;
8
17
  };
9
18
 
@@ -12,30 +21,70 @@ const ANDROID_SUPPORTS_RIPPLE =
12
21
  Platform.OS === 'android' && Platform.Version >= ANDROID_VERSION_LOLLIPOP;
13
22
 
14
23
  /**
15
- * PlatformPressable provides an abstraction on top of TouchableNativeFeedback and
16
- * TouchableOpacity to handle platform differences.
17
- *
18
- * On Android, you can pass the props of TouchableNativeFeedback.
19
- * On other platforms, you can pass the props of TouchableOpacity.
24
+ * PlatformPressable provides an abstraction on top of Pressable to handle platform differences.
20
25
  */
21
- export default function PlatformPressable({
26
+ export function PlatformPressable({
27
+ disabled,
22
28
  android_ripple,
23
29
  pressColor = 'rgba(0, 0, 0, .32)',
24
30
  pressOpacity,
25
31
  style,
32
+ onPress,
26
33
  ...rest
27
34
  }: Props) {
35
+ const handlePress = (
36
+ e: React.MouseEvent<HTMLAnchorElement, MouseEvent> | GestureResponderEvent
37
+ ) => {
38
+ if (Platform.OS === 'web' && rest.href !== null) {
39
+ // ignore clicks with modifier keys
40
+ const hasModifierKey =
41
+ ('metaKey' in e && e.metaKey) ||
42
+ ('altKey' in e && e.altKey) ||
43
+ ('ctrlKey' in e && e.ctrlKey) ||
44
+ ('shiftKey' in e && e.shiftKey);
45
+
46
+ // only handle left clicks
47
+ const isLeftClick =
48
+ 'button' in e ? e.button == null || e.button === 0 : true;
49
+
50
+ // let browser handle "target=_blank" etc.
51
+ const isSelfTarget =
52
+ e.currentTarget && 'target' in e.currentTarget
53
+ ? [undefined, null, '', 'self'].includes(e.currentTarget.target)
54
+ : true;
55
+
56
+ if (!hasModifierKey && isLeftClick && isSelfTarget) {
57
+ e.preventDefault();
58
+ // call `onPress` only when browser default is prevented
59
+ // this prevents app from handling the click when a link is being opened
60
+ onPress?.(e);
61
+ }
62
+ } else {
63
+ onPress?.(e);
64
+ }
65
+ };
66
+
28
67
  return (
29
68
  <Pressable
30
69
  android_ripple={
31
- ANDROID_SUPPORTS_RIPPLE
70
+ ANDROID_SUPPORTS_RIPPLE && !disabled
32
71
  ? { color: pressColor, ...android_ripple }
33
72
  : undefined
34
73
  }
35
74
  style={({ pressed }) => [
36
- { opacity: pressed && !ANDROID_SUPPORTS_RIPPLE ? pressOpacity : 1 },
75
+ {
76
+ cursor:
77
+ (Platform.OS === 'web' || Platform.OS === 'ios') && !disabled
78
+ ? // Pointer cursor on web
79
+ // Hover effect on iPad and visionOS
80
+ 'pointer'
81
+ : 'auto',
82
+ opacity:
83
+ !ANDROID_SUPPORTS_RIPPLE && pressed && !disabled ? pressOpacity : 1,
84
+ } as const,
37
85
  typeof style === 'function' ? style({ pressed }) : style,
38
86
  ]}
87
+ onPress={disabled ? undefined : handlePress}
39
88
  {...rest}
40
89
  />
41
90
  );
package/src/SceneMap.tsx CHANGED
@@ -15,9 +15,9 @@ const SceneComponent = React.memo(
15
15
  }
16
16
  );
17
17
 
18
- export default function SceneMap<T extends any>(scenes: {
19
- [key: string]: React.ComponentType<T>;
20
- }) {
18
+ SceneComponent.displayName = 'SceneComponent';
19
+
20
+ export function SceneMap<T>(scenes: { [key: string]: React.ComponentType<T> }) {
21
21
  return ({ route, jumpTo, position }: SceneProps) => (
22
22
  <SceneComponent
23
23
  key={route.key}