@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.
- package/CHANGELOG.md +12 -0
- package/dist/elements/{Tabs → LegacyTabs}/ContentTabs.d.ts +1 -1
- package/dist/elements/{Tabs → LegacyTabs}/ContentTabs.js +2 -2
- package/dist/elements/{Tabs → LegacyTabs}/NavigationalTabs.d.ts +1 -1
- package/dist/elements/{Tabs → LegacyTabs}/NavigationalTabs.js +2 -2
- package/dist/elements/{Tabs → LegacyTabs}/StepTabs.d.ts +1 -1
- package/dist/elements/{Tabs → LegacyTabs}/StepTabs.js +2 -2
- package/dist/elements/LegacyTabs/index.d.ts +18 -0
- package/dist/elements/LegacyTabs/index.js +16 -0
- package/dist/elements/Screen/Header.d.ts +1 -0
- package/dist/elements/Screen/Header.js +41 -3
- package/dist/elements/Screen/index.d.ts +1 -0
- package/dist/elements/Screen/index.js +1 -0
- package/dist/elements/Tabs/SubTabBar.d.ts +8 -0
- package/dist/elements/Tabs/SubTabBar.js +31 -0
- package/dist/elements/Tabs/TabFlatList.d.ts +3 -0
- package/dist/elements/Tabs/TabFlatList.js +17 -0
- package/dist/elements/Tabs/TabScrollView.d.ts +3 -0
- package/dist/elements/Tabs/TabScrollView.js +23 -0
- package/dist/elements/Tabs/Tabs.d.ts +31 -0
- package/dist/elements/Tabs/Tabs.js +29 -0
- package/dist/elements/Tabs/TabsContainer.d.ts +7 -0
- package/dist/elements/Tabs/TabsContainer.js +35 -0
- package/dist/elements/Tabs/TabsContext.d.ts +7 -0
- package/dist/elements/Tabs/TabsContext.js +28 -0
- package/dist/elements/Tabs/TabsWithHeader.d.ts +12 -0
- package/dist/elements/Tabs/TabsWithHeader.js +17 -0
- package/dist/elements/Tabs/index.d.ts +1 -18
- package/dist/elements/Tabs/index.js +15 -14
- package/dist/elements/Tabs/useListenForTabContentScroll.d.ts +1 -0
- package/dist/elements/Tabs/useListenForTabContentScroll.js +52 -0
- package/dist/elements/index.d.ts +1 -0
- package/dist/elements/index.js +1 -0
- package/package.json +3 -1
- /package/dist/elements/{Tabs → LegacyTabs}/Tab.d.ts +0 -0
- /package/dist/elements/{Tabs → LegacyTabs}/Tab.js +0 -0
- /package/dist/elements/{Tabs → LegacyTabs}/TabBarContainer.d.ts +0 -0
- /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
|
|
@@ -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
|
|
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)(
|
|
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);
|
|
@@ -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
|
|
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)(
|
|
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);
|
|
@@ -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
|
|
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)(
|
|
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;
|
|
@@ -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
|
|
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
|
-
|
|
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,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,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
|
-
|
|
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.
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Object.defineProperty(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
16
|
-
exports
|
|
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
|
+
};
|
package/dist/elements/index.d.ts
CHANGED
package/dist/elements/index.js
CHANGED
|
@@ -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.
|
|
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
|
|
File without changes
|
|
File without changes
|