@artsy/palette-mobile 11.0.29 → 11.0.30

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 (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/elements/{Tabs → LegacyTabs}/ContentTabs.d.ts +1 -1
  3. package/dist/elements/{Tabs → LegacyTabs}/ContentTabs.js +2 -2
  4. package/dist/elements/{Tabs → LegacyTabs}/NavigationalTabs.d.ts +1 -1
  5. package/dist/elements/{Tabs → LegacyTabs}/NavigationalTabs.js +2 -2
  6. package/dist/elements/{Tabs → LegacyTabs}/StepTabs.d.ts +1 -1
  7. package/dist/elements/{Tabs → LegacyTabs}/StepTabs.js +2 -2
  8. package/dist/elements/LegacyTabs/index.d.ts +18 -0
  9. package/dist/elements/LegacyTabs/index.js +16 -0
  10. package/dist/elements/Screen/Header.d.ts +1 -0
  11. package/dist/elements/Screen/Header.js +41 -3
  12. package/dist/elements/Screen/index.d.ts +1 -0
  13. package/dist/elements/Screen/index.js +1 -0
  14. package/dist/elements/Tabs/SubTabBar.d.ts +8 -0
  15. package/dist/elements/Tabs/SubTabBar.js +31 -0
  16. package/dist/elements/Tabs/TabFlatList.d.ts +3 -0
  17. package/dist/elements/Tabs/TabFlatList.js +17 -0
  18. package/dist/elements/Tabs/TabScrollView.d.ts +3 -0
  19. package/dist/elements/Tabs/TabScrollView.js +23 -0
  20. package/dist/elements/Tabs/Tabs.d.ts +31 -0
  21. package/dist/elements/Tabs/Tabs.js +29 -0
  22. package/dist/elements/Tabs/TabsContainer.d.ts +7 -0
  23. package/dist/elements/Tabs/TabsContainer.js +35 -0
  24. package/dist/elements/Tabs/TabsContext.d.ts +7 -0
  25. package/dist/elements/Tabs/TabsContext.js +28 -0
  26. package/dist/elements/Tabs/TabsWithHeader.d.ts +12 -0
  27. package/dist/elements/Tabs/TabsWithHeader.js +17 -0
  28. package/dist/elements/Tabs/index.d.ts +1 -18
  29. package/dist/elements/Tabs/index.js +15 -14
  30. package/dist/elements/Tabs/useListenForTabContentScroll.d.ts +1 -0
  31. package/dist/elements/Tabs/useListenForTabContentScroll.js +52 -0
  32. package/dist/elements/index.d.ts +1 -0
  33. package/dist/elements/index.js +1 -0
  34. package/package.json +3 -1
  35. /package/dist/elements/{Tabs → LegacyTabs}/Tab.d.ts +0 -0
  36. /package/dist/elements/{Tabs → LegacyTabs}/Tab.js +0 -0
  37. /package/dist/elements/{Tabs → LegacyTabs}/TabBarContainer.d.ts +0 -0
  38. /package/dist/elements/{Tabs → LegacyTabs}/TabBarContainer.js +0 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # v11.0.30 (Thu Jun 01 2023)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - feat(tabs): Add Tabs component [#104](https://github.com/artsy/palette-mobile/pull/104) ([@damassi](https://github.com/damassi))
6
+
7
+ #### Authors: 1
8
+
9
+ - Christopher Pappas ([@damassi](https://github.com/damassi))
10
+
11
+ ---
12
+
1
13
  # v11.0.29 (Sat May 13 2023)
2
14
 
3
15
  #### 🐛 Bug Fix
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { TabsProps } from "../Tabs";
2
+ import { TabsProps } from "../LegacyTabs";
3
3
  /**
4
4
  * Renders a scrollable list of tabs. Tabs are not evenly spaced across screen
5
5
  */
@@ -4,14 +4,14 @@ exports.ContentTabs = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const TabBarContainer_1 = require("./TabBarContainer");
7
- const Tabs_1 = require("../Tabs");
7
+ const LegacyTabs_1 = require("../LegacyTabs");
8
8
  /**
9
9
  * Renders a scrollable list of tabs. Tabs are not evenly spaced across screen
10
10
  */
11
11
  const ContentTabs = ({ onTabPress, activeTab, tabs }) => {
12
12
  const [tabLayouts, setTabLayouts] = (0, react_1.useState)(tabs.map(() => null));
13
13
  return ((0, jsx_runtime_1.jsx)(TabBarContainer_1.TabBarContainer, { scrollEnabled: true, activeTabIndex: activeTab, tabLayouts: tabLayouts, children: tabs.map(({ label }, index) => {
14
- return ((0, jsx_runtime_1.jsx)(Tabs_1.Tab, { label: label, active: index === activeTab, onLayout: (e) => {
14
+ return ((0, jsx_runtime_1.jsx)(LegacyTabs_1.Tab, { label: label, active: index === activeTab, onLayout: (e) => {
15
15
  const layout = e.nativeEvent.layout;
16
16
  setTabLayouts((layouts) => {
17
17
  const result = layouts.slice(0);
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { TabsProps } from "../Tabs";
2
+ import { TabsProps } from "../LegacyTabs";
3
3
  /**
4
4
  * Renders a list of tabs. Evenly-spaces them across the screen with
5
5
  * each tab label centered on the tab
@@ -6,7 +6,7 @@ const react_1 = require("react");
6
6
  const TabBarContainer_1 = require("./TabBarContainer");
7
7
  const useScreenDimensions_1 = require("../../utils/hooks/useScreenDimensions");
8
8
  const Box_1 = require("../Box");
9
- const Tabs_1 = require("../Tabs");
9
+ const LegacyTabs_1 = require("../LegacyTabs");
10
10
  /**
11
11
  * Renders a list of tabs. Evenly-spaces them across the screen with
12
12
  * each tab label centered on the tab
@@ -16,7 +16,7 @@ const NavigationalTabs = ({ onTabPress, activeTab, tabs }) => {
16
16
  const screenWidth = (0, useScreenDimensions_1.useScreenDimensions)().width;
17
17
  const tabWidth = screenWidth / tabs.length;
18
18
  return ((0, jsx_runtime_1.jsx)(TabBarContainer_1.TabBarContainer, { scrollEnabled: true, activeTabIndex: activeTab, tabLayouts: tabLayouts, children: tabs.map(({ label, superscript }, index) => {
19
- return ((0, jsx_runtime_1.jsx)(Box_1.Box, { minWidth: tabWidth, children: (0, jsx_runtime_1.jsx)(Tabs_1.Tab, { label: label, superscript: superscript, onPress: () => onTabPress(label, index), active: activeTab === index, onLayout: (e) => {
19
+ return ((0, jsx_runtime_1.jsx)(Box_1.Box, { minWidth: tabWidth, children: (0, jsx_runtime_1.jsx)(LegacyTabs_1.Tab, { label: label, superscript: superscript, onPress: () => onTabPress(label, index), active: activeTab === index, onLayout: (e) => {
20
20
  const layout = e.nativeEvent.layout;
21
21
  setTabLayouts((layouts) => {
22
22
  const result = layouts.slice(0);
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { TabsProps } from "../Tabs";
2
+ import { TabsProps } from "../LegacyTabs";
3
3
  /**
4
4
  * Renders a list of tabs. Evenly-spaces them across the screen with
5
5
  * each tab label and chevron evenly spaced
@@ -8,7 +8,7 @@ const TabBarContainer_1 = require("./TabBarContainer");
8
8
  const svgs_1 = require("../../svgs");
9
9
  const useScreenDimensions_1 = require("../../utils/hooks/useScreenDimensions");
10
10
  const Box_1 = require("../Box");
11
- const Tabs_1 = require("../Tabs");
11
+ const LegacyTabs_1 = require("../LegacyTabs");
12
12
  /**
13
13
  * Renders a list of tabs. Evenly-spaces them across the screen with
14
14
  * each tab label and chevron evenly spaced
@@ -30,7 +30,7 @@ const StepTabs = ({ onTabPress, activeTab, tabs }) => {
30
30
  result[index] = layout;
31
31
  return result;
32
32
  });
33
- }, children: [(0, jsx_runtime_1.jsxs)(Box_1.Box, { flexDirection: "row", alignItems: "center", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tab, { label: label, onPress: () => onTabSelect(label, index), active: activeTab === index, style: { paddingHorizontal: 0, paddingLeft: 8, paddingRight: 5 }, onLayout: () => {
33
+ }, children: [(0, jsx_runtime_1.jsxs)(Box_1.Box, { flexDirection: "row", alignItems: "center", children: [(0, jsx_runtime_1.jsx)(LegacyTabs_1.Tab, { label: label, onPress: () => onTabSelect(label, index), active: activeTab === index, style: { paddingHorizontal: 0, paddingLeft: 8, paddingRight: 5 }, onLayout: () => {
34
34
  // noop
35
35
  } }), !!completed && (0, jsx_runtime_1.jsx)(svgs_1.CheckIcon, { fill: "green100", height: 15, width: 15 })] }), (0, jsx_runtime_1.jsx)(svgs_1.ChevronIcon, { fill: "black60", height: 10, width: 10 })] }) }, label + index));
36
36
  }) }));
@@ -0,0 +1,18 @@
1
+ /// <reference types="react" />
2
+ import { ContentTabs } from "./ContentTabs";
3
+ import { NavigationalTabs } from "./NavigationalTabs";
4
+ import { StepTabs } from "./StepTabs";
5
+ import { TabV3Props } from "./Tab";
6
+ export { NavigationalTabs, ContentTabs, StepTabs };
7
+ export declare const Tab: ({ ...props }: TabV3Props) => JSX.Element;
8
+ export declare const TAB_BAR_HEIGHT = 44;
9
+ export type TabsType = Array<{
10
+ label: string;
11
+ superscript?: string;
12
+ completed?: boolean;
13
+ }>;
14
+ export interface TabsProps {
15
+ onTabPress: (tablabel: string, tabIndex: number) => void;
16
+ activeTab: number;
17
+ tabs: TabsType;
18
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TAB_BAR_HEIGHT = exports.Tab = exports.StepTabs = exports.ContentTabs = exports.NavigationalTabs = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const ContentTabs_1 = require("./ContentTabs");
6
+ Object.defineProperty(exports, "ContentTabs", { enumerable: true, get: function () { return ContentTabs_1.ContentTabs; } });
7
+ const NavigationalTabs_1 = require("./NavigationalTabs");
8
+ Object.defineProperty(exports, "NavigationalTabs", { enumerable: true, get: function () { return NavigationalTabs_1.NavigationalTabs; } });
9
+ const StepTabs_1 = require("./StepTabs");
10
+ Object.defineProperty(exports, "StepTabs", { enumerable: true, get: function () { return StepTabs_1.StepTabs; } });
11
+ const Tab_1 = require("./Tab");
12
+ const Tab = ({ ...props }) => {
13
+ return (0, jsx_runtime_1.jsx)(Tab_1.TabV3, { ...props });
14
+ };
15
+ exports.Tab = Tab;
16
+ exports.TAB_BAR_HEIGHT = 44;
@@ -13,4 +13,5 @@ export interface HeaderProps {
13
13
  titleProps?: FlexProps;
14
14
  titleShown?: boolean;
15
15
  }
16
+ export declare const AnimatedTabsHeader: React.FC<HeaderProps>;
16
17
  export declare const Header: React.FC<HeaderProps>;
@@ -1,15 +1,45 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Header = void 0;
26
+ exports.Header = exports.AnimatedTabsHeader = void 0;
4
27
  const jsx_runtime_1 = require("react/jsx-runtime");
28
+ const react_native_reanimated_1 = __importStar(require("react-native-reanimated"));
5
29
  const constants_1 = require("./constants");
6
30
  const constants_2 = require("../../constants");
7
31
  const ArrowLeftIcon_1 = require("../../svgs/ArrowLeftIcon");
8
32
  const Flex_1 = require("../Flex");
9
33
  const Spacer_1 = require("../Spacer");
34
+ const TabsContext_1 = require("../Tabs/TabsContext");
10
35
  const Text_1 = require("../Text");
11
36
  const Touchable_1 = require("../Touchable");
12
- const Header = ({ hideLeftElements, hideRightElements, leftElements, rightElements, onBack, title, hideTitle, titleProps = {}, }) => {
37
+ const AnimatedTabsHeader = (props) => {
38
+ const { currentScrollY } = (0, TabsContext_1.useTabsContext)();
39
+ return (0, jsx_runtime_1.jsx)(exports.Header, { scrollY: currentScrollY, animated: true, ...props });
40
+ };
41
+ exports.AnimatedTabsHeader = AnimatedTabsHeader;
42
+ const Header = ({ animated = false, hideLeftElements, hideRightElements, hideTitle, leftElements, onBack, rightElements, scrollY = 0, title, titleProps = {}, }) => {
13
43
  const Left = () => {
14
44
  if (hideLeftElements) {
15
45
  return null;
@@ -22,7 +52,15 @@ const Header = ({ hideLeftElements, hideRightElements, leftElements, rightElemen
22
52
  if (hideTitle) {
23
53
  return null;
24
54
  }
25
- return ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { flex: 1, ...titleProps, justifySelf: "stretch", children: (0, jsx_runtime_1.jsx)(Text_1.Text, { variant: "md", numberOfLines: 1, children: title }) }));
55
+ if (!animated) {
56
+ return ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { flex: 1, ...titleProps, justifySelf: "stretch", children: (0, jsx_runtime_1.jsx)(Text_1.Text, { variant: "md", numberOfLines: 1, children: title }) }));
57
+ }
58
+ if (scrollY < constants_1.NAVBAR_HEIGHT) {
59
+ return (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flex: 1, flexDirection: "row" });
60
+ }
61
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(react_native_reanimated_1.default.View, { entering: react_native_reanimated_1.FadeInDown.duration(400).easing(react_native_reanimated_1.Easing.out(react_native_reanimated_1.Easing.exp)), exiting: react_native_reanimated_1.FadeOut.duration(400).easing(react_native_reanimated_1.Easing.out(react_native_reanimated_1.Easing.exp)), style: {
62
+ flex: 1,
63
+ }, children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { alignItems: "center", children: (0, jsx_runtime_1.jsx)(Text_1.Text, { variant: "md", numberOfLines: 1, children: title }) }) }) }));
26
64
  };
27
65
  const Right = () => {
28
66
  if (hideRightElements) {
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  export * from "./constants";
3
3
  export declare const Screen: import("react").FC<import("./ScreenBase").ScreenBaseProps> & {
4
+ AnimatedTabsHeader: import("react").FC<import("./Header").HeaderProps>;
4
5
  Background: import("react").FC<{
5
6
  children: import("react").ReactNode;
6
7
  }>;
@@ -25,6 +25,7 @@ const Header_1 = require("./Header");
25
25
  const ScreenBase_1 = require("./ScreenBase");
26
26
  __exportStar(require("./constants"), exports);
27
27
  exports.Screen = Object.assign(ScreenBase_1.ScreenBase, {
28
+ AnimatedTabsHeader: Header_1.AnimatedTabsHeader,
28
29
  Background: Background_1.Background,
29
30
  Body: Body_1.Body,
30
31
  BottomView: BottomView_1.BottomView,
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ /**
3
+ * Use to position content directly below the tab bar, and for it to stick while
4
+ * scrolling in the subview.
5
+ *
6
+ * Useful for views where subcontent has a s
7
+ */
8
+ export declare const SubTabBar: React.FC<React.PropsWithChildren>;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubTabBar = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const moti_1 = require("moti");
6
+ const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
7
+ const react_native_reanimated_1 = require("react-native-reanimated");
8
+ const useSpace_1 = require("../../utils/hooks/useSpace");
9
+ /**
10
+ * Use to position content directly below the tab bar, and for it to stick while
11
+ * scrolling in the subview.
12
+ *
13
+ * Useful for views where subcontent has a s
14
+ */
15
+ const SubTabBar = ({ children }) => {
16
+ const { top } = (0, react_native_collapsible_tab_view_1.useHeaderMeasurements)();
17
+ const scrollY = (0, react_native_collapsible_tab_view_1.useCurrentTabScrollY)();
18
+ const space = (0, useSpace_1.useSpace)();
19
+ const style = (0, react_native_reanimated_1.useAnimatedStyle)(() => {
20
+ "worklet";
21
+ return {
22
+ transform: [
23
+ {
24
+ translateY: scrollY.value + top.value,
25
+ },
26
+ ],
27
+ };
28
+ }, []);
29
+ return (0, jsx_runtime_1.jsx)(moti_1.MotiView, { style: [style, { zIndex: 1, marginHorizontal: -space(2) }], children: children });
30
+ };
31
+ exports.SubTabBar = SubTabBar;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { FlatListProps } from "react-native";
3
+ export declare function TabFlatList<T>(props: FlatListProps<T>): JSX.Element;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TabFlatList = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
6
+ const useListenForTabContentScroll_1 = require("./useListenForTabContentScroll");
7
+ const useSpace_1 = require("../../utils/hooks/useSpace");
8
+ function TabFlatList(props) {
9
+ (0, useListenForTabContentScroll_1.useListenForTabContentScroll)();
10
+ const space = (0, useSpace_1.useSpace)();
11
+ const contentContainerStyle = (props.contentContainerStyle ?? {});
12
+ return ((0, jsx_runtime_1.jsx)(react_native_collapsible_tab_view_1.Tabs.FlatList, { contentContainerStyle: {
13
+ marginHorizontal: space(2),
14
+ ...contentContainerStyle,
15
+ }, ...props }));
16
+ }
17
+ exports.TabFlatList = TabFlatList;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { ScrollViewProps } from "react-native";
3
+ export declare const TabScrollView: React.FC<ScrollViewProps>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TabScrollView = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
6
+ const useListenForTabContentScroll_1 = require("./useListenForTabContentScroll");
7
+ const useSpace_1 = require("../../utils/hooks/useSpace");
8
+ const TabScrollView = (props) => {
9
+ (0, useListenForTabContentScroll_1.useListenForTabContentScroll)();
10
+ const space = (0, useSpace_1.useSpace)();
11
+ const contentContainerStyle = (props.contentContainerStyle ?? {});
12
+ return ((0, jsx_runtime_1.jsx)(react_native_collapsible_tab_view_1.Tabs.ScrollView
13
+ // See: https://github.com/PedroBern/react-native-collapsible-tab-view/issues/158
14
+ // @ts-ignore
15
+ , {
16
+ // See: https://github.com/PedroBern/react-native-collapsible-tab-view/issues/158
17
+ // @ts-ignore
18
+ accessibilityComponentType: undefined, accessibilityTraits: undefined, contentContainerStyle: {
19
+ marginHorizontal: space(2),
20
+ ...contentContainerStyle,
21
+ }, ...props }));
22
+ };
23
+ exports.TabScrollView = TabScrollView;
@@ -0,0 +1,31 @@
1
+ /// <reference types="react" />
2
+ import { useAnimatedTabIndex, useCurrentTabScrollY, useFocusedTab, useHeaderMeasurements } from "react-native-collapsible-tab-view";
3
+ import { TabFlatList } from "./TabFlatList";
4
+ export declare const Tabs: import("react").FC<import("./TabsContainer").TabsContainerProps> & {
5
+ FlatList: typeof TabFlatList;
6
+ Lazy: import("react").FC<{
7
+ cancelLazyFadeIn?: boolean | undefined;
8
+ mountDelayMs?: number | undefined;
9
+ startMounted?: boolean | undefined;
10
+ children: import("react").ReactElement<any, string | ((props: any) => import("react").ReactElement<any, any> | null) | (new (props: any) => import("react").Component<any, any, any>)>;
11
+ }>;
12
+ Provider: import("react").FC<{
13
+ children?: import("react").ReactNode;
14
+ }>;
15
+ ScrollView: import("react").FC<import("react-native").ScrollViewProps>;
16
+ SectionList: <T_1>(p: any) => import("react").ReactElement<any, string | ((props: any) => import("react").ReactElement<any, any> | null) | (new (props: any) => import("react").Component<any, any, any>)>;
17
+ SubTabBar: import("react").FC<{
18
+ children?: import("react").ReactNode;
19
+ }>;
20
+ Tab: typeof import("react-native-collapsible-tab-view").Tab;
21
+ TabsProvider: import("react").FC<{
22
+ children?: import("react").ReactNode;
23
+ }>;
24
+ TabsWithHeader: import("react").FC<import("./TabsWithHeader").TabsWithHeaderProps>;
25
+ useAnimatedTabIndex: typeof useAnimatedTabIndex;
26
+ useCurrentTabScrollY: typeof useCurrentTabScrollY;
27
+ useListenForTabContentScroll: () => void;
28
+ useTabsContext: () => import("./TabsContext").TabsContextProps;
29
+ useFocusedTab: typeof useFocusedTab;
30
+ useHeaderMeasurements: typeof useHeaderMeasurements;
31
+ };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Tabs = void 0;
4
+ const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
5
+ const SubTabBar_1 = require("./SubTabBar");
6
+ const TabFlatList_1 = require("./TabFlatList");
7
+ const TabScrollView_1 = require("./TabScrollView");
8
+ const TabsContainer_1 = require("./TabsContainer");
9
+ const TabsContext_1 = require("./TabsContext");
10
+ const TabsWithHeader_1 = require("./TabsWithHeader");
11
+ const useListenForTabContentScroll_1 = require("./useListenForTabContentScroll");
12
+ exports.Tabs = Object.assign(TabsContainer_1.TabsContainer, {
13
+ FlatList: TabFlatList_1.TabFlatList,
14
+ Lazy: react_native_collapsible_tab_view_1.Tabs.Lazy,
15
+ Provider: TabsContext_1.TabsProvider,
16
+ ScrollView: TabScrollView_1.TabScrollView,
17
+ SectionList: react_native_collapsible_tab_view_1.Tabs.SectionList,
18
+ SubTabBar: SubTabBar_1.SubTabBar,
19
+ Tab: react_native_collapsible_tab_view_1.Tabs.Tab,
20
+ TabsProvider: TabsContext_1.TabsProvider,
21
+ TabsWithHeader: TabsWithHeader_1.TabsWithHeader,
22
+ // Hooks
23
+ useAnimatedTabIndex: react_native_collapsible_tab_view_1.useAnimatedTabIndex,
24
+ useCurrentTabScrollY: react_native_collapsible_tab_view_1.useCurrentTabScrollY,
25
+ useListenForTabContentScroll: useListenForTabContentScroll_1.useListenForTabContentScroll,
26
+ useTabsContext: TabsContext_1.useTabsContext,
27
+ useFocusedTab: react_native_collapsible_tab_view_1.useFocusedTab,
28
+ useHeaderMeasurements: react_native_collapsible_tab_view_1.useHeaderMeasurements,
29
+ });
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { CollapsibleProps } from "react-native-collapsible-tab-view";
3
+ export interface TabsContainerProps extends CollapsibleProps {
4
+ onTabPress?: (tabName: string) => void;
5
+ tabScrollEnabled?: boolean;
6
+ }
7
+ export declare const TabsContainer: React.FC<TabsContainerProps>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TabsContainer = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
6
+ const useColor_1 = require("../../utils/hooks/useColor");
7
+ const useSpace_1 = require("../../utils/hooks/useSpace");
8
+ const TAB_BAR_HEIGHT = 50;
9
+ const TabsContainer = ({ children, initialTabName, renderHeader, tabScrollEnabled = false, onTabPress, ...tabContainerProps }) => {
10
+ const space = (0, useSpace_1.useSpace)();
11
+ const color = (0, useColor_1.useColor)();
12
+ return ((0, jsx_runtime_1.jsx)(react_native_collapsible_tab_view_1.Tabs.Container, { ...tabContainerProps, renderHeader: renderHeader, headerContainerStyle: {
13
+ shadowOpacity: 0,
14
+ shadowRadius: 0,
15
+ elevation: 0,
16
+ backgroundColor: color("background"),
17
+ }, initialTabName: initialTabName, containerStyle: {
18
+ paddingTop: space(2),
19
+ }, renderTabBar: (tabBarProps) => {
20
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(react_native_collapsible_tab_view_1.MaterialTabBar, { ...tabBarProps, scrollEnabled: tabScrollEnabled, onTabPress: (tab) => {
21
+ tabBarProps.onTabPress(tab);
22
+ onTabPress?.(tab);
23
+ }, style: {
24
+ height: TAB_BAR_HEIGHT,
25
+ borderBottomWidth: 1,
26
+ borderColor: color("black30"),
27
+ }, contentContainerStyle: {}, activeColor: color("onBackground"), inactiveColor: color("onBackgroundMedium"), labelStyle: { marginTop: 0 }, tabStyle: {
28
+ marginHorizontal: 10,
29
+ }, indicatorStyle: {
30
+ backgroundColor: color("onBackground"),
31
+ height: 1,
32
+ } }) }));
33
+ }, children: children }));
34
+ };
35
+ exports.TabsContainer = TabsContainer;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ export interface TabsContextProps {
3
+ currentScrollY: number;
4
+ updateCurrentScrollY: (scrollY: number) => void;
5
+ }
6
+ export declare const TabsProvider: React.FC<React.PropsWithChildren>;
7
+ export declare const useTabsContext: () => TabsContextProps;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useTabsContext = exports.TabsProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const TabsContext = (0, react_1.createContext)({
7
+ currentScrollY: 0,
8
+ updateCurrentScrollY: () => { },
9
+ });
10
+ const TabsProvider = ({ children }) => {
11
+ const [currentScrollY, setCurrentScrollY] = (0, react_1.useState)(0);
12
+ const providerValue = {
13
+ currentScrollY,
14
+ updateCurrentScrollY: (scrollY) => {
15
+ setCurrentScrollY(scrollY);
16
+ },
17
+ };
18
+ return (0, jsx_runtime_1.jsx)(TabsContext.Provider, { value: providerValue, children: children });
19
+ };
20
+ exports.TabsProvider = TabsProvider;
21
+ const useTabsContext = () => {
22
+ const context = (0, react_1.useContext)(TabsContext);
23
+ if (!context) {
24
+ throw new Error("useTabsContext must be used within a Tabs.TabsProvider component");
25
+ }
26
+ return context;
27
+ };
28
+ exports.useTabsContext = useTabsContext;
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import { CollapsibleProps } from "react-native-collapsible-tab-view";
3
+ import { TabsContainerProps } from "./TabsContainer";
4
+ import { HeaderProps } from "../Screen/Header";
5
+ export interface TabsWithHeaderProps extends TabsContainerProps {
6
+ title: string;
7
+ BelowTitleHeaderComponent?: () => JSX.Element;
8
+ headerProps?: HeaderProps;
9
+ showLargeHeaderText?: boolean;
10
+ children: CollapsibleProps["children"];
11
+ }
12
+ export declare const TabsWithHeader: React.FC<TabsWithHeaderProps>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TabsWithHeader = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const TabsContainer_1 = require("./TabsContainer");
6
+ const Flex_1 = require("../Flex");
7
+ const Screen_1 = require("../Screen");
8
+ const Text_1 = require("../Text");
9
+ const TabsWithHeader = ({ children, BelowTitleHeaderComponent, headerProps = {}, showLargeHeaderText = true, title, ...rest }) => {
10
+ return ((0, jsx_runtime_1.jsxs)(Screen_1.Screen, { children: [(0, jsx_runtime_1.jsx)(Screen_1.Screen.AnimatedTabsHeader, { title: title, ...headerProps }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.Body, { fullwidth: true, children: (0, jsx_runtime_1.jsx)(TabsContainer_1.TabsContainer, { ...rest, renderHeader: () => {
11
+ if (!showLargeHeaderText || !title) {
12
+ return null;
13
+ }
14
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Flex, { my: 1, pl: 2, justifyContent: "center", alignSelf: "flex-start", children: (0, jsx_runtime_1.jsx)(Text_1.Text, { variant: "lg-display", numberOfLines: 2, children: title }) }), !!BelowTitleHeaderComponent && (0, jsx_runtime_1.jsx)(BelowTitleHeaderComponent, {})] }));
15
+ }, children: children }) })] }));
16
+ };
17
+ exports.TabsWithHeader = TabsWithHeader;
@@ -1,18 +1 @@
1
- /// <reference types="react" />
2
- import { ContentTabs } from "./ContentTabs";
3
- import { NavigationalTabs } from "./NavigationalTabs";
4
- import { StepTabs } from "./StepTabs";
5
- import { TabV3Props } from "./Tab";
6
- export { NavigationalTabs, ContentTabs, StepTabs };
7
- export declare const Tab: ({ ...props }: TabV3Props) => JSX.Element;
8
- export declare const TAB_BAR_HEIGHT = 44;
9
- export type TabsType = Array<{
10
- label: string;
11
- superscript?: string;
12
- completed?: boolean;
13
- }>;
14
- export interface TabsProps {
15
- onTabPress: (tablabel: string, tabIndex: number) => void;
16
- activeTab: number;
17
- tabs: TabsType;
18
- }
1
+ export * from "./Tabs";
@@ -1,16 +1,17 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TAB_BAR_HEIGHT = exports.Tab = exports.StepTabs = exports.ContentTabs = exports.NavigationalTabs = void 0;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const ContentTabs_1 = require("./ContentTabs");
6
- Object.defineProperty(exports, "ContentTabs", { enumerable: true, get: function () { return ContentTabs_1.ContentTabs; } });
7
- const NavigationalTabs_1 = require("./NavigationalTabs");
8
- Object.defineProperty(exports, "NavigationalTabs", { enumerable: true, get: function () { return NavigationalTabs_1.NavigationalTabs; } });
9
- const StepTabs_1 = require("./StepTabs");
10
- Object.defineProperty(exports, "StepTabs", { enumerable: true, get: function () { return StepTabs_1.StepTabs; } });
11
- const Tab_1 = require("./Tab");
12
- const Tab = ({ ...props }) => {
13
- return (0, jsx_runtime_1.jsx)(Tab_1.TabV3, { ...props });
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
14
15
  };
15
- exports.Tab = Tab;
16
- exports.TAB_BAR_HEIGHT = 44;
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Tabs"), exports);
@@ -0,0 +1 @@
1
+ export declare const useListenForTabContentScroll: () => void;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useListenForTabContentScroll = void 0;
4
+ const react_1 = require("react");
5
+ const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
6
+ const react_native_reanimated_1 = require("react-native-reanimated");
7
+ const TabsContext_1 = require("./TabsContext");
8
+ const constants_1 = require("../Screen/constants");
9
+ const useListenForTabContentScroll = () => {
10
+ const scrollY = useAnimatedTabsHeaderScrolling((0, react_native_collapsible_tab_view_1.useCurrentTabScrollY)());
11
+ const { updateCurrentScrollY } = (0, TabsContext_1.useTabsContext)();
12
+ (0, react_1.useEffect)(() => {
13
+ updateCurrentScrollY(scrollY);
14
+ }, [scrollY, updateCurrentScrollY]);
15
+ };
16
+ exports.useListenForTabContentScroll = useListenForTabContentScroll;
17
+ const useAnimatedTabsHeaderScrolling = (scrollY) => {
18
+ const listenForScroll = (0, react_native_reanimated_1.useSharedValue)(true);
19
+ const [currScrollY, setCurrScrollY] = (0, react_1.useState)(scrollY.value);
20
+ // Needed to run on JS thread
21
+ const update = (y) => {
22
+ setCurrScrollY(y);
23
+ };
24
+ (0, react_1.useEffect)(() => {
25
+ const timer = setTimeout(() => {
26
+ listenForScroll.value = false;
27
+ }, 1000);
28
+ return () => {
29
+ clearTimeout(timer);
30
+ };
31
+ }, [listenForScroll]);
32
+ (0, react_native_reanimated_1.useAnimatedReaction)(() => {
33
+ "worklet";
34
+ return [scrollY.value, listenForScroll.value];
35
+ }, ([animatedScrollY, isListeningForScroll], previousScroll) => {
36
+ "worklet";
37
+ const [prevScrollY] = previousScroll ?? [0, false];
38
+ // Hacky way to avoid some weird header behavior.
39
+ // look at HACKS.md for more info.
40
+ const suddenlyScrolled = Math.abs(animatedScrollY - prevScrollY) > constants_1.NAVBAR_HEIGHT;
41
+ if (isListeningForScroll && suddenlyScrolled) {
42
+ return;
43
+ }
44
+ const prevTitleShown = prevScrollY >= constants_1.NAVBAR_HEIGHT;
45
+ const currTitleShown = animatedScrollY >= constants_1.NAVBAR_HEIGHT;
46
+ if (prevTitleShown === currTitleShown) {
47
+ return;
48
+ }
49
+ (0, react_native_reanimated_1.runOnJS)(update)(Math.floor(animatedScrollY));
50
+ }, [scrollY]);
51
+ return currScrollY;
52
+ };
@@ -18,6 +18,7 @@ export * from "./Histogram";
18
18
  export * from "./Input";
19
19
  export * from "./Join";
20
20
  export * from "./LegacyScreen";
21
+ export * from "./LegacyTabs";
21
22
  export * from "./List";
22
23
  export * from "./Message";
23
24
  export * from "./MeasuredView";
@@ -34,6 +34,7 @@ __exportStar(require("./Histogram"), exports);
34
34
  __exportStar(require("./Input"), exports);
35
35
  __exportStar(require("./Join"), exports);
36
36
  __exportStar(require("./LegacyScreen"), exports);
37
+ __exportStar(require("./LegacyTabs"), exports);
37
38
  __exportStar(require("./List"), exports);
38
39
  __exportStar(require("./Message"), exports);
39
40
  __exportStar(require("./MeasuredView"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@artsy/palette-mobile",
3
- "version": "11.0.29",
3
+ "version": "11.0.30",
4
4
  "description": "Artsy's design system for React Native",
5
5
  "scripts": {
6
6
  "android": "react-native run-android",
@@ -38,7 +38,9 @@
38
38
  "@styled-system/theme-get": "^5.1.2",
39
39
  "events": "^3.3.0",
40
40
  "lodash": "^4.17.21",
41
+ "moti": "^0.25.3",
41
42
  "react-nanny": "^2.15.0",
43
+ "react-native-collapsible-tab-view": "^6.1.4",
42
44
  "react-spring": "8.0.23",
43
45
  "styled-system": "^5.1.5"
44
46
  },
File without changes
File without changes