@artsy/palette-mobile 11.0.38 → 11.0.40

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 (32) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/elements/Screen/Header.d.ts +1 -1
  3. package/dist/elements/Screen/Header.js +5 -5
  4. package/dist/elements/Screen/Screen.stories.d.ts +1 -0
  5. package/dist/elements/Screen/Screen.stories.js +14 -0
  6. package/dist/elements/Screen/ScreenBase.d.ts +2 -1
  7. package/dist/elements/Screen/ScreenBase.js +3 -2
  8. package/dist/elements/Screen/ScreenFlatList.d.ts +3 -0
  9. package/dist/elements/Screen/ScreenFlatList.js +22 -0
  10. package/dist/elements/Screen/ScreenScrollContext.d.ts +7 -0
  11. package/dist/elements/Screen/ScreenScrollContext.js +28 -0
  12. package/dist/elements/Screen/ScreenScrollView.d.ts +3 -0
  13. package/dist/elements/Screen/ScreenScrollView.js +22 -0
  14. package/dist/elements/Screen/hooks/useAnimatedHeaderScrolling.d.ts +2 -0
  15. package/dist/elements/{Tabs/useListenForTabContentScroll.js → Screen/hooks/useAnimatedHeaderScrolling.js} +4 -13
  16. package/dist/elements/Screen/hooks/useListenForScreenScroll.d.ts +3 -0
  17. package/dist/elements/Screen/hooks/useListenForScreenScroll.js +25 -0
  18. package/dist/elements/Screen/index.d.ts +8 -1
  19. package/dist/elements/Screen/index.js +9 -1
  20. package/dist/elements/Tabs/TabFlatList.js +1 -1
  21. package/dist/elements/Tabs/TabScrollView.js +1 -1
  22. package/dist/elements/Tabs/Tabs.d.ts +0 -7
  23. package/dist/elements/Tabs/Tabs.js +1 -5
  24. package/dist/elements/Tabs/Tabs.stories.js +4 -3
  25. package/dist/elements/Tabs/TabsContainer.js +1 -0
  26. package/dist/elements/Tabs/TabsWithHeader.js +1 -1
  27. package/dist/elements/Tabs/hooks/useListenForTabContentScroll.js +15 -0
  28. package/dist/storybook/decorators.js +2 -1
  29. package/package.json +1 -1
  30. package/dist/elements/Tabs/TabsContext.d.ts +0 -7
  31. package/dist/elements/Tabs/TabsContext.js +0 -28
  32. /package/dist/elements/Tabs/{useListenForTabContentScroll.d.ts → hooks/useListenForTabContentScroll.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ # v11.0.40 (Fri Jun 09 2023)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - feat(screen): Add scroll tracking support for animated headers [#114](https://github.com/artsy/palette-mobile/pull/114) ([@damassi](https://github.com/damassi))
6
+
7
+ #### Authors: 1
8
+
9
+ - Christopher Pappas ([@damassi](https://github.com/damassi))
10
+
11
+ ---
12
+
13
+ # v11.0.39 (Thu Jun 08 2023)
14
+
15
+ #### 🐛 Bug Fix
16
+
17
+ - fix(tabs): ensure border overlaps [#112](https://github.com/artsy/palette-mobile/pull/112) ([@damassi](https://github.com/damassi))
18
+
19
+ #### Authors: 1
20
+
21
+ - Christopher Pappas ([@damassi](https://github.com/damassi))
22
+
23
+ ---
24
+
1
25
  # v11.0.38 (Thu Jun 08 2023)
2
26
 
3
27
  #### ⚠️ Pushed to `main`
@@ -13,5 +13,5 @@ export interface HeaderProps {
13
13
  titleProps?: FlexProps;
14
14
  titleShown?: boolean;
15
15
  }
16
- export declare const AnimatedTabsHeader: React.FC<HeaderProps>;
16
+ export declare const AnimatedHeader: React.FC<HeaderProps>;
17
17
  export declare const Header: React.FC<HeaderProps>;
@@ -23,22 +23,22 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.Header = exports.AnimatedTabsHeader = void 0;
26
+ exports.Header = exports.AnimatedHeader = void 0;
27
27
  const jsx_runtime_1 = require("react/jsx-runtime");
28
28
  const react_native_reanimated_1 = __importStar(require("react-native-reanimated"));
29
+ const ScreenScrollContext_1 = require("./ScreenScrollContext");
29
30
  const constants_1 = require("./constants");
30
31
  const constants_2 = require("../../constants");
31
32
  const ArrowLeftIcon_1 = require("../../svgs/ArrowLeftIcon");
32
33
  const Flex_1 = require("../Flex");
33
34
  const Spacer_1 = require("../Spacer");
34
- const TabsContext_1 = require("../Tabs/TabsContext");
35
35
  const Text_1 = require("../Text");
36
36
  const Touchable_1 = require("../Touchable");
37
- const AnimatedTabsHeader = (props) => {
38
- const { currentScrollY } = (0, TabsContext_1.useTabsContext)();
37
+ const AnimatedHeader = (props) => {
38
+ const { currentScrollY } = (0, ScreenScrollContext_1.useScreenScrollContext)();
39
39
  return (0, jsx_runtime_1.jsx)(exports.Header, { scrollY: currentScrollY, animated: true, ...props });
40
40
  };
41
- exports.AnimatedTabsHeader = AnimatedTabsHeader;
41
+ exports.AnimatedHeader = AnimatedHeader;
42
42
  const Header = ({ animated = false, hideLeftElements, hideRightElements, hideTitle, leftElements, onBack, rightElements, scrollY = 0, title, titleProps = {}, }) => {
43
43
  const Left = () => {
44
44
  if (hideLeftElements) {
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const react_native_1 = require("@storybook/react-native");
5
+ const Flex_1 = require("../Flex");
6
+ const Screen_1 = require("../Screen");
7
+ const Text_1 = require("../Text");
8
+ (0, react_native_1.storiesOf)("Screen", module)
9
+ .add("With Header and BottomView", () => ((0, jsx_runtime_1.jsxs)(Screen_1.Screen, { children: [(0, jsx_runtime_1.jsx)(Screen_1.Screen.Header, { title: "Title" }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.Body, { scroll: true, children: Array.from({ length: 5 }).map((_, i) => ((0, jsx_runtime_1.jsx)(Text_1.Text, { my: 1, children: "\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\"" }, i))) }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.BottomView, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { backgroundColor: "black30", height: 100, width: "100%", children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Footer" }) }) })] })))
10
+ .add("ScrollView With AnimatedHeader", () => ((0, jsx_runtime_1.jsxs)(Screen_1.Screen, { children: [(0, jsx_runtime_1.jsx)(Screen_1.Screen.AnimatedHeader, { title: "Title" }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.Body, { children: (0, jsx_runtime_1.jsxs)(Screen_1.Screen.ScrollView, { children: [(0, jsx_runtime_1.jsx)(Text_1.Text, { variant: "lg-display", children: "Title" }), Array.from({ length: 5 }).map((_, i) => ((0, jsx_runtime_1.jsx)(Text_1.Text, { my: 1, children: "\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\"" }, i)))] }) }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.BottomView, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { backgroundColor: "black30", height: 100, width: "100%", children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Footer" }) }) })] })))
11
+ .add("FlatList With AnimatedHeader", () => ((0, jsx_runtime_1.jsxs)(Screen_1.Screen, { children: [(0, jsx_runtime_1.jsx)(Screen_1.Screen.AnimatedHeader, { title: "Title" }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.Body, { children: (0, jsx_runtime_1.jsx)(Screen_1.Screen.FlatList, { ListHeaderComponent: () => (0, jsx_runtime_1.jsx)(Text_1.Text, { variant: "lg-display", children: "Title" }), data: Array.from({ length: 50 }).map((_, i) => "Item " + i), renderItem: ({ item, index }) => {
12
+ return ((0, jsx_runtime_1.jsx)(Text_1.Text, { my: 1, children: item }, index));
13
+ } }) }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.BottomView, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { backgroundColor: "black30", height: 100, width: "100%", children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Footer" }) }) })] })))
14
+ .add("Fullwidth", () => ((0, jsx_runtime_1.jsxs)(Screen_1.Screen, { children: [(0, jsx_runtime_1.jsx)(Screen_1.Screen.Header, { title: "Title" }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.Body, { fullwidth: true, children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\"" }) })] })));
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
- export interface ScreenBaseProps {
2
+ import { FlexProps } from "../Flex";
3
+ export interface ScreenBaseProps extends FlexProps {
3
4
  children: React.ReactNode;
4
5
  safeArea?: boolean;
5
6
  }
@@ -3,10 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ScreenBase = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_native_safe_area_context_1 = require("react-native-safe-area-context");
6
+ const ScreenScrollContext_1 = require("./ScreenScrollContext");
6
7
  const Flex_1 = require("../Flex");
7
- const ScreenBase = ({ children, safeArea = true }) => {
8
+ const ScreenBase = ({ children, safeArea = true, ...flexProps }) => {
8
9
  const insets = (0, react_native_safe_area_context_1.useSafeAreaInsets)();
9
- return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flex: 1, backgroundColor: "background", mt: safeArea ? insets.top : 0, children: [children, (0, jsx_runtime_1.jsx)(SafeAreaCover, { safeArea: true })] }));
10
+ return ((0, jsx_runtime_1.jsx)(ScreenScrollContext_1.ScreenScrollContextProvider, { children: (0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flex: 1, backgroundColor: "background", mt: safeArea ? insets.top : 0, ...flexProps, children: [children, (0, jsx_runtime_1.jsx)(SafeAreaCover, { safeArea: true })] }) }));
10
11
  };
11
12
  exports.ScreenBase = ScreenBase;
12
13
  const SafeAreaCover = ({ safeArea }) => {
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { FlatListProps } from "react-native";
3
+ export declare function ScreenFlatList<T>(props: FlatListProps<T>): JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ScreenFlatList = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const lodash_1 = require("lodash");
9
+ const react_native_reanimated_1 = __importDefault(require("react-native-reanimated"));
10
+ const useListenForScreenScroll_1 = require("./hooks/useListenForScreenScroll");
11
+ function ScreenFlatList(props) {
12
+ const { scrollHandler } = (0, useListenForScreenScroll_1.useListenForScreenScroll)();
13
+ let handleScroll;
14
+ if (props.onScroll) {
15
+ handleScroll = (0, lodash_1.flowRight)(scrollHandler, props.onScroll);
16
+ }
17
+ else {
18
+ handleScroll = scrollHandler;
19
+ }
20
+ return (0, jsx_runtime_1.jsx)(react_native_reanimated_1.default.FlatList, { ...props, onScroll: handleScroll });
21
+ }
22
+ exports.ScreenFlatList = ScreenFlatList;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ export interface ScreenScrollContextProps {
3
+ currentScrollY: number;
4
+ updateCurrentScrollY: (scrollY: number) => void;
5
+ }
6
+ export declare const ScreenScrollContextProvider: React.FC<React.PropsWithChildren>;
7
+ export declare const useScreenScrollContext: () => ScreenScrollContextProps;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useScreenScrollContext = exports.ScreenScrollContextProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const ScreenScrollContext = (0, react_1.createContext)({
7
+ currentScrollY: 0,
8
+ updateCurrentScrollY: () => { },
9
+ });
10
+ const ScreenScrollContextProvider = ({ 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)(ScreenScrollContext.Provider, { value: providerValue, children: children }));
19
+ };
20
+ exports.ScreenScrollContextProvider = ScreenScrollContextProvider;
21
+ const useScreenScrollContext = () => {
22
+ const context = (0, react_1.useContext)(ScreenScrollContext);
23
+ if (!context) {
24
+ throw new Error("useScreenScrollContext must be used within a Screen.ScreenScrollContextProvider component");
25
+ }
26
+ return context;
27
+ };
28
+ exports.useScreenScrollContext = useScreenScrollContext;
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import { ScrollViewProps } from "react-native";
3
+ export declare const ScreenScrollView: React.FC<ScrollViewProps>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ScreenScrollView = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const lodash_1 = require("lodash");
9
+ const react_native_reanimated_1 = __importDefault(require("react-native-reanimated"));
10
+ const useListenForScreenScroll_1 = require("./hooks/useListenForScreenScroll");
11
+ const ScreenScrollView = (props) => {
12
+ const { scrollHandler } = (0, useListenForScreenScroll_1.useListenForScreenScroll)();
13
+ let handleScroll;
14
+ if (props.onScroll) {
15
+ handleScroll = (0, lodash_1.flowRight)(scrollHandler, props.onScroll);
16
+ }
17
+ else {
18
+ handleScroll = scrollHandler;
19
+ }
20
+ return (0, jsx_runtime_1.jsx)(react_native_reanimated_1.default.ScrollView, { ...props, onScroll: handleScroll, scrollEventThrottle: 16 });
21
+ };
22
+ exports.ScreenScrollView = ScreenScrollView;
@@ -0,0 +1,2 @@
1
+ import { SharedValue } from "react-native-reanimated";
2
+ export declare const useAnimatedHeaderScrolling: (scrollY: SharedValue<number>) => number;
@@ -1,20 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useListenForTabContentScroll = void 0;
3
+ exports.useAnimatedHeaderScrolling = void 0;
4
4
  const react_1 = require("react");
5
- const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
6
5
  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) => {
6
+ const constants_1 = require("../constants");
7
+ const useAnimatedHeaderScrolling = (scrollY) => {
18
8
  const listenForScroll = (0, react_native_reanimated_1.useSharedValue)(true);
19
9
  const [currScrollY, setCurrScrollY] = (0, react_1.useState)(scrollY.value);
20
10
  // Needed to run on JS thread
@@ -50,3 +40,4 @@ const useAnimatedTabsHeaderScrolling = (scrollY) => {
50
40
  }, [scrollY]);
51
41
  return currScrollY;
52
42
  };
43
+ exports.useAnimatedHeaderScrolling = useAnimatedHeaderScrolling;
@@ -0,0 +1,3 @@
1
+ export declare const useListenForScreenScroll: () => {
2
+ scrollHandler: (event: import("react-native").NativeSyntheticEvent<import("react-native").NativeScrollEvent>) => void;
3
+ };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useListenForScreenScroll = void 0;
4
+ const react_1 = require("react");
5
+ const react_native_reanimated_1 = require("react-native-reanimated");
6
+ const useAnimatedHeaderScrolling_1 = require("./useAnimatedHeaderScrolling");
7
+ const ScreenScrollContext_1 = require("../ScreenScrollContext");
8
+ const useListenForScreenScroll = () => {
9
+ const { updateCurrentScrollY } = (0, ScreenScrollContext_1.useScreenScrollContext)();
10
+ const animatedScrollY = (0, react_native_reanimated_1.useSharedValue)(0);
11
+ const scrollY = (0, useAnimatedHeaderScrolling_1.useAnimatedHeaderScrolling)(animatedScrollY);
12
+ const scrollHandler = (0, react_native_reanimated_1.useAnimatedScrollHandler)({
13
+ onScroll: (event) => {
14
+ "worklet";
15
+ animatedScrollY.value = event.contentOffset.y;
16
+ },
17
+ });
18
+ (0, react_1.useEffect)(() => {
19
+ updateCurrentScrollY(scrollY);
20
+ }, [scrollY, updateCurrentScrollY]);
21
+ return {
22
+ scrollHandler,
23
+ };
24
+ };
25
+ exports.useListenForScreenScroll = useListenForScreenScroll;
@@ -1,14 +1,21 @@
1
1
  /// <reference types="react" />
2
+ import { ScreenFlatList } from "./ScreenFlatList";
2
3
  export * from "./constants";
3
4
  export declare const Screen: import("react").FC<import("./ScreenBase").ScreenBaseProps> & {
4
- AnimatedTabsHeader: import("react").FC<import("./Header").HeaderProps>;
5
+ AnimatedHeader: import("react").FC<import("./Header").HeaderProps>;
5
6
  Background: import("react").FC<{
6
7
  children: import("react").ReactNode;
7
8
  }>;
8
9
  Body: import("react").FC<import("./Body").BodyProps>;
9
10
  BottomView: import("react").FC<import("./BottomView").BottomViewProps>;
11
+ FlatList: typeof ScreenFlatList;
10
12
  FloatingHeader: ({ onBack, rightElements }: import("./FloatingHeader").FloatingHeaderProps) => JSX.Element;
11
13
  FullWidthDivider: import("react").FC<import("..").BoxProps>;
12
14
  FullWidthItem: import("react").FC<import("..").BoxProps>;
13
15
  Header: import("react").FC<import("./Header").HeaderProps>;
16
+ ScreenScrollContextProvider: import("react").FC<{
17
+ children?: import("react").ReactNode;
18
+ }>;
19
+ ScrollView: import("react").FC<import("react-native").ScrollViewProps>;
20
+ useScreenScrollContext: () => import("./ScreenScrollContext").ScreenScrollContextProps;
14
21
  };
@@ -23,14 +23,22 @@ const FullWidthDivider_1 = require("./FullWidthDivider");
23
23
  const FullWidthItem_1 = require("./FullWidthItem");
24
24
  const Header_1 = require("./Header");
25
25
  const ScreenBase_1 = require("./ScreenBase");
26
+ const ScreenFlatList_1 = require("./ScreenFlatList");
27
+ const ScreenScrollContext_1 = require("./ScreenScrollContext");
28
+ const ScreenScrollView_1 = require("./ScreenScrollView");
26
29
  __exportStar(require("./constants"), exports);
27
30
  exports.Screen = Object.assign(ScreenBase_1.ScreenBase, {
28
- AnimatedTabsHeader: Header_1.AnimatedTabsHeader,
31
+ AnimatedHeader: Header_1.AnimatedHeader,
29
32
  Background: Background_1.Background,
30
33
  Body: Body_1.Body,
31
34
  BottomView: BottomView_1.BottomView,
35
+ FlatList: ScreenFlatList_1.ScreenFlatList,
32
36
  FloatingHeader: FloatingHeader_1.FloatingHeader,
33
37
  FullWidthDivider: FullWidthDivider_1.FullWidthDivider,
34
38
  FullWidthItem: FullWidthItem_1.FullWidthItem,
35
39
  Header: Header_1.Header,
40
+ ScreenScrollContextProvider: ScreenScrollContext_1.ScreenScrollContextProvider,
41
+ ScrollView: ScreenScrollView_1.ScreenScrollView,
42
+ // Hooks
43
+ useScreenScrollContext: ScreenScrollContext_1.useScreenScrollContext,
36
44
  });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TabFlatList = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
6
- const useListenForTabContentScroll_1 = require("./useListenForTabContentScroll");
6
+ const useListenForTabContentScroll_1 = require("./hooks/useListenForTabContentScroll");
7
7
  const useSpace_1 = require("../../utils/hooks/useSpace");
8
8
  function TabFlatList(props) {
9
9
  (0, useListenForTabContentScroll_1.useListenForTabContentScroll)();
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TabScrollView = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_native_collapsible_tab_view_1 = require("react-native-collapsible-tab-view");
6
- const useListenForTabContentScroll_1 = require("./useListenForTabContentScroll");
6
+ const useListenForTabContentScroll_1 = require("./hooks/useListenForTabContentScroll");
7
7
  const useSpace_1 = require("../../utils/hooks/useSpace");
8
8
  const TabScrollView = (props) => {
9
9
  (0, useListenForTabContentScroll_1.useListenForTabContentScroll)();
@@ -9,23 +9,16 @@ export declare const Tabs: import("react").FC<import("./TabsContainer").TabsCont
9
9
  startMounted?: boolean | undefined;
10
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
11
  }>;
12
- Provider: import("react").FC<{
13
- children?: import("react").ReactNode;
14
- }>;
15
12
  ScrollView: import("react").FC<import("react-native").ScrollViewProps>;
16
13
  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
14
  SubTabBar: import("react").FC<{
18
15
  children?: import("react").ReactNode;
19
16
  }>;
20
17
  Tab: typeof import("react-native-collapsible-tab-view").Tab;
21
- TabsProvider: import("react").FC<{
22
- children?: import("react").ReactNode;
23
- }>;
24
18
  TabsWithHeader: import("react").FC<import("./TabsWithHeader").TabsWithHeaderProps>;
25
19
  useAnimatedTabIndex: typeof useAnimatedTabIndex;
26
20
  useCurrentTabScrollY: typeof useCurrentTabScrollY;
27
21
  useListenForTabContentScroll: () => void;
28
- useTabsContext: () => import("./TabsContext").TabsContextProps;
29
22
  useFocusedTab: typeof useFocusedTab;
30
23
  useHeaderMeasurements: typeof useHeaderMeasurements;
31
24
  };
@@ -6,24 +6,20 @@ const SubTabBar_1 = require("./SubTabBar");
6
6
  const TabFlatList_1 = require("./TabFlatList");
7
7
  const TabScrollView_1 = require("./TabScrollView");
8
8
  const TabsContainer_1 = require("./TabsContainer");
9
- const TabsContext_1 = require("./TabsContext");
10
9
  const TabsWithHeader_1 = require("./TabsWithHeader");
11
- const useListenForTabContentScroll_1 = require("./useListenForTabContentScroll");
10
+ const useListenForTabContentScroll_1 = require("./hooks/useListenForTabContentScroll");
12
11
  exports.Tabs = Object.assign(TabsContainer_1.TabsContainer, {
13
12
  FlatList: TabFlatList_1.TabFlatList,
14
13
  Lazy: react_native_collapsible_tab_view_1.Tabs.Lazy,
15
- Provider: TabsContext_1.TabsProvider,
16
14
  ScrollView: TabScrollView_1.TabScrollView,
17
15
  SectionList: react_native_collapsible_tab_view_1.Tabs.SectionList,
18
16
  SubTabBar: SubTabBar_1.SubTabBar,
19
17
  Tab: react_native_collapsible_tab_view_1.Tabs.Tab,
20
- TabsProvider: TabsContext_1.TabsProvider,
21
18
  TabsWithHeader: TabsWithHeader_1.TabsWithHeader,
22
19
  // Hooks
23
20
  useAnimatedTabIndex: react_native_collapsible_tab_view_1.useAnimatedTabIndex,
24
21
  useCurrentTabScrollY: react_native_collapsible_tab_view_1.useCurrentTabScrollY,
25
22
  useListenForTabContentScroll: useListenForTabContentScroll_1.useListenForTabContentScroll,
26
- useTabsContext: TabsContext_1.useTabsContext,
27
23
  useFocusedTab: react_native_collapsible_tab_view_1.useFocusedTab,
28
24
  useHeaderMeasurements: react_native_collapsible_tab_view_1.useHeaderMeasurements,
29
25
  });
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const jsx_runtime_1 = require("react/jsx-runtime");
4
4
  const react_native_1 = require("@storybook/react-native");
5
5
  const Tabs_1 = require("./Tabs");
6
- const Flex_1 = require("../Flex");
6
+ const Screen_1 = require("../Screen");
7
7
  const Text_1 = require("../Text");
8
8
  (0, react_native_1.storiesOf)("Tabs", module)
9
- .add("Simple Tabs", () => ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { alignSelf: "center", mt: "200px", alignItems: "center", flexWrap: "wrap", children: (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "Tab 1", label: "Tab 1", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Tab 1 content" }) }) }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "Tab 2", label: "Tab 2", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Tab 2 content" }) }) })] }) })))
10
- .add("Tabs with Indicator", () => ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { alignSelf: "center", mt: "200px", flexWrap: "wrap", children: (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { indicators: [{ tabName: "tab1", Component: () => (0, jsx_runtime_1.jsx)(Text_1.Text, { textAlign: "right", children: "hi" }) }], children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "tab1", label: "Tab 1", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Tab 1 content" }) }) }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "tab2", label: "Tab 2", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Tab 2 content" }) }) })] }) })));
9
+ .add("Simple Tabs", () => ((0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "Tab 1", label: "Tab 1", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Tab 1 content" }) }) }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "Tab 2", label: "Tab 2", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Tab 2 content" }) }) })] })))
10
+ .add("Tabs with Indicator", () => ((0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { indicators: [{ tabName: "tab1", Component: () => (0, jsx_runtime_1.jsx)(Text_1.Text, { textAlign: "right", children: "hi" }) }], children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "tab1", label: "Tab 1", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Tab 1 content" }) }) }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "tab2", label: "Tab 2", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: (0, jsx_runtime_1.jsx)(Text_1.Text, { children: "Tab 2 content" }) }) })] })))
11
+ .add("Tabs with AnimatedHeader", () => ((0, jsx_runtime_1.jsxs)(Screen_1.Screen, { children: [(0, jsx_runtime_1.jsx)(Screen_1.Screen.AnimatedHeader, { title: "Title" }), (0, jsx_runtime_1.jsx)(Screen_1.Screen.Body, { fullwidth: true, children: (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "tab1", label: "Tab 1", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: Array.from({ length: 5 }).map((_, i) => ((0, jsx_runtime_1.jsx)(Text_1.Text, { my: 1, children: "\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\"" }, i))) }) }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { name: "tab2", label: "Tab 2", children: (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.ScrollView, { children: Array.from({ length: 5 }).map((_, i) => ((0, jsx_runtime_1.jsx)(Text_1.Text, { my: 1, children: "\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\"" }, i))) }) })] }) })] })));
@@ -34,6 +34,7 @@ const TabsContainer = ({ children, indicators = [], initialTabName, renderHeader
34
34
  }, contentContainerStyle: {}, activeColor: color("onBackground"), inactiveColor: color("onBackgroundMedium"), labelStyle: { marginTop: 0 }, indicatorStyle: {
35
35
  backgroundColor: color("onBackground"),
36
36
  height: 1,
37
+ bottom: -1,
37
38
  } }) }));
38
39
  }, children: children }));
39
40
  };
@@ -7,7 +7,7 @@ const Flex_1 = require("../Flex");
7
7
  const Screen_1 = require("../Screen");
8
8
  const Text_1 = require("../Text");
9
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: () => {
10
+ return ((0, jsx_runtime_1.jsxs)(Screen_1.Screen, { children: [(0, jsx_runtime_1.jsx)(Screen_1.Screen.AnimatedHeader, { 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
11
  if (!showLargeHeaderText || !title) {
12
12
  return null;
13
13
  }
@@ -0,0 +1,15 @@
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 ScreenScrollContext_1 = require("../../Screen/ScreenScrollContext");
7
+ const useAnimatedHeaderScrolling_1 = require("../../Screen/hooks/useAnimatedHeaderScrolling");
8
+ const useListenForTabContentScroll = () => {
9
+ const scrollY = (0, useAnimatedHeaderScrolling_1.useAnimatedHeaderScrolling)((0, react_native_collapsible_tab_view_1.useCurrentTabScrollY)());
10
+ const { updateCurrentScrollY } = (0, ScreenScrollContext_1.useScreenScrollContext)();
11
+ (0, react_1.useEffect)(() => {
12
+ updateCurrentScrollY(scrollY);
13
+ }, [scrollY, updateCurrentScrollY]);
14
+ };
15
+ exports.useListenForTabContentScroll = useListenForTabContentScroll;
@@ -10,6 +10,7 @@ const jotai_1 = require("jotai");
10
10
  const utils_1 = require("jotai/utils");
11
11
  const react_1 = require("react");
12
12
  const react_native_1 = require("react-native");
13
+ const react_native_safe_area_context_1 = require("react-native-safe-area-context");
13
14
  const Theme_1 = require("../Theme");
14
15
  const Flex_1 = require("../elements/Flex");
15
16
  const Text_1 = require("../elements/Text");
@@ -30,6 +31,6 @@ const useDarkModeSwitcher = (story) => {
30
31
  }, []);
31
32
  const isDarkMode = mode === "dark" || (mode === "system" && systemMode === "dark");
32
33
  const theme = isDarkMode ? "v3dark" : "v3light";
33
- return ((0, jsx_runtime_1.jsx)(Theme_1.Theme, { theme: theme, children: (0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flex: 1, backgroundColor: "background", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "row", justifyContent: "space-around", children: [(0, jsx_runtime_1.jsxs)(Text_1.Text, { color: "orange", children: ["Dark mode: ", mode, " ", mode === "system" && "(" + systemMode + ")"] }), (0, jsx_runtime_1.jsx)(Text_1.LinkText, { color: "orange", onPress: () => setMode("light"), children: "light" }), (0, jsx_runtime_1.jsx)(Text_1.LinkText, { color: "orange", onPress: () => setMode("dark"), children: "dark" }), (0, jsx_runtime_1.jsx)(Text_1.LinkText, { color: "orange", onPress: () => setMode("system"), children: "system" })] }), story()] }) }));
34
+ return ((0, jsx_runtime_1.jsx)(react_native_safe_area_context_1.SafeAreaProvider, { children: (0, jsx_runtime_1.jsx)(Theme_1.Theme, { theme: theme, children: (0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flex: 1, backgroundColor: "background", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "row", justifyContent: "space-around", children: [(0, jsx_runtime_1.jsxs)(Text_1.Text, { color: "orange", children: ["Dark mode: ", mode, " ", mode === "system" && "(" + systemMode + ")"] }), (0, jsx_runtime_1.jsx)(Text_1.LinkText, { color: "orange", onPress: () => setMode("light"), children: "light" }), (0, jsx_runtime_1.jsx)(Text_1.LinkText, { color: "orange", onPress: () => setMode("dark"), children: "dark" }), (0, jsx_runtime_1.jsx)(Text_1.LinkText, { color: "orange", onPress: () => setMode("system"), children: "system" })] }), story()] }) }) }));
34
35
  };
35
36
  exports.useDarkModeSwitcher = useDarkModeSwitcher;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@artsy/palette-mobile",
3
- "version": "11.0.38",
3
+ "version": "11.0.40",
4
4
  "description": "Artsy's design system for React Native",
5
5
  "scripts": {
6
6
  "android": "react-native run-android",
@@ -1,7 +0,0 @@
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;
@@ -1,28 +0,0 @@
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;