react-native-header-motion 0.1.0

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 (90) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +479 -0
  3. package/lib/module/components/FlatList.js +64 -0
  4. package/lib/module/components/FlatList.js.map +1 -0
  5. package/lib/module/components/Header.js +19 -0
  6. package/lib/module/components/Header.js.map +1 -0
  7. package/lib/module/components/HeaderBase.js +59 -0
  8. package/lib/module/components/HeaderBase.js.map +1 -0
  9. package/lib/module/components/HeaderMotion.js +84 -0
  10. package/lib/module/components/HeaderMotion.js.map +1 -0
  11. package/lib/module/components/ScrollManager.js +39 -0
  12. package/lib/module/components/ScrollManager.js.map +1 -0
  13. package/lib/module/components/ScrollView.js +47 -0
  14. package/lib/module/components/ScrollView.js.map +1 -0
  15. package/lib/module/components/index.js +9 -0
  16. package/lib/module/components/index.js.map +1 -0
  17. package/lib/module/context.js +5 -0
  18. package/lib/module/context.js.map +1 -0
  19. package/lib/module/hooks/index.js +6 -0
  20. package/lib/module/hooks/index.js.map +1 -0
  21. package/lib/module/hooks/useActiveScrollId.js +47 -0
  22. package/lib/module/hooks/useActiveScrollId.js.map +1 -0
  23. package/lib/module/hooks/useMotionProgress.js +58 -0
  24. package/lib/module/hooks/useMotionProgress.js.map +1 -0
  25. package/lib/module/hooks/useScrollManager.js +150 -0
  26. package/lib/module/hooks/useScrollManager.js.map +1 -0
  27. package/lib/module/index.js +42 -0
  28. package/lib/module/index.js.map +1 -0
  29. package/lib/module/package.json +1 -0
  30. package/lib/module/types.js +4 -0
  31. package/lib/module/types.js.map +1 -0
  32. package/lib/module/utils/defaults.js +10 -0
  33. package/lib/module/utils/defaults.js.map +1 -0
  34. package/lib/module/utils/index.js +5 -0
  35. package/lib/module/utils/index.js.map +1 -0
  36. package/lib/module/utils/values.js +11 -0
  37. package/lib/module/utils/values.js.map +1 -0
  38. package/lib/typescript/package.json +1 -0
  39. package/lib/typescript/src/components/FlatList.d.ts +30 -0
  40. package/lib/typescript/src/components/FlatList.d.ts.map +1 -0
  41. package/lib/typescript/src/components/Header.d.ts +19 -0
  42. package/lib/typescript/src/components/Header.d.ts.map +1 -0
  43. package/lib/typescript/src/components/HeaderBase.d.ts +34 -0
  44. package/lib/typescript/src/components/HeaderBase.d.ts.map +1 -0
  45. package/lib/typescript/src/components/HeaderMotion.d.ts +52 -0
  46. package/lib/typescript/src/components/HeaderMotion.d.ts.map +1 -0
  47. package/lib/typescript/src/components/ScrollManager.d.ts +40 -0
  48. package/lib/typescript/src/components/ScrollManager.d.ts.map +1 -0
  49. package/lib/typescript/src/components/ScrollView.d.ts +24 -0
  50. package/lib/typescript/src/components/ScrollView.d.ts.map +1 -0
  51. package/lib/typescript/src/components/index.d.ts +7 -0
  52. package/lib/typescript/src/components/index.d.ts.map +1 -0
  53. package/lib/typescript/src/context.d.ts +14 -0
  54. package/lib/typescript/src/context.d.ts.map +1 -0
  55. package/lib/typescript/src/hooks/index.d.ts +4 -0
  56. package/lib/typescript/src/hooks/index.d.ts.map +1 -0
  57. package/lib/typescript/src/hooks/useActiveScrollId.d.ts +32 -0
  58. package/lib/typescript/src/hooks/useActiveScrollId.d.ts.map +1 -0
  59. package/lib/typescript/src/hooks/useMotionProgress.d.ts +38 -0
  60. package/lib/typescript/src/hooks/useMotionProgress.d.ts.map +1 -0
  61. package/lib/typescript/src/hooks/useScrollManager.d.ts +37 -0
  62. package/lib/typescript/src/hooks/useScrollManager.d.ts.map +1 -0
  63. package/lib/typescript/src/index.d.ts +51 -0
  64. package/lib/typescript/src/index.d.ts.map +1 -0
  65. package/lib/typescript/src/types.d.ts +43 -0
  66. package/lib/typescript/src/types.d.ts.map +1 -0
  67. package/lib/typescript/src/utils/defaults.d.ts +6 -0
  68. package/lib/typescript/src/utils/defaults.d.ts.map +1 -0
  69. package/lib/typescript/src/utils/index.d.ts +3 -0
  70. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  71. package/lib/typescript/src/utils/values.d.ts +3 -0
  72. package/lib/typescript/src/utils/values.d.ts.map +1 -0
  73. package/package.json +164 -0
  74. package/src/components/FlatList.tsx +72 -0
  75. package/src/components/Header.tsx +30 -0
  76. package/src/components/HeaderBase.tsx +51 -0
  77. package/src/components/HeaderMotion.tsx +183 -0
  78. package/src/components/ScrollManager.tsx +58 -0
  79. package/src/components/ScrollView.tsx +58 -0
  80. package/src/components/index.ts +6 -0
  81. package/src/context.ts +20 -0
  82. package/src/hooks/index.ts +3 -0
  83. package/src/hooks/useActiveScrollId.ts +59 -0
  84. package/src/hooks/useMotionProgress.ts +56 -0
  85. package/src/hooks/useScrollManager.ts +186 -0
  86. package/src/index.ts +76 -0
  87. package/src/types.ts +62 -0
  88. package/src/utils/defaults.ts +16 -0
  89. package/src/utils/index.ts +2 -0
  90. package/src/utils/values.ts +6 -0
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useMemo, useState } from 'react';
4
+ import { Extrapolation, interpolate, useAnimatedReaction, useDerivedValue, useSharedValue } from 'react-native-reanimated';
5
+ import { HeaderMotionContext } from "../context.js";
6
+ import { DEFAULT_MEASURE_DYNAMIC, DEFAULT_PROGRESS_THRESHOLD, DEFAULT_SCROLL_ID, getInitialScrollValue } from "../utils/index.js";
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ /**
9
+ * Context provider component for HeaderMotion.
10
+ * Manages header animation state and provides it to child components via context.
11
+ * @template T - The type of scroll ID string
12
+ */
13
+ function HeaderMotionContextProvider({
14
+ progressThreshold = DEFAULT_PROGRESS_THRESHOLD,
15
+ measureDynamic = DEFAULT_MEASURE_DYNAMIC,
16
+ measureDynamicMode = 'mount',
17
+ activeScrollId,
18
+ progressExtrapolation = Extrapolation.CLAMP,
19
+ children
20
+ }) {
21
+ const [dynamicMeasurement, setDynamicMeasurement] = useState(undefined);
22
+ const [originalHeaderHeight, setOriginalHeaderHeight] = useState(0);
23
+ const setOrUpdateDynamicMeasurement = useCallback(e => {
24
+ const measured = measureDynamic(e);
25
+ setDynamicMeasurement(prevMeasurement => {
26
+ if (prevMeasurement !== undefined && measureDynamicMode === 'mount') {
27
+ return prevMeasurement;
28
+ }
29
+ return measured;
30
+ });
31
+ }, [measureDynamicMode, measureDynamic, setDynamicMeasurement]);
32
+ const calculatedProgressThreshold = useMemo(() => {
33
+ if (typeof progressThreshold === 'number') {
34
+ return progressThreshold;
35
+ }
36
+ if (dynamicMeasurement === undefined) {
37
+ return Infinity;
38
+ }
39
+ return progressThreshold(dynamicMeasurement);
40
+ }, [dynamicMeasurement, progressThreshold]);
41
+ const measureTotalHeight = useCallback(e => {
42
+ const measuredValue = e.nativeEvent.layout.height;
43
+ setOriginalHeaderHeight(measuredValue);
44
+ }, [setOriginalHeaderHeight]);
45
+ const scrollValues = useSharedValue({
46
+ [DEFAULT_SCROLL_ID]: getInitialScrollValue()
47
+ });
48
+ useAnimatedReaction(() => activeScrollId?.get(), id => {
49
+ if (!id || scrollValues.get()[id]) {
50
+ return;
51
+ }
52
+ scrollValues.modify(value => {
53
+ value[id] = getInitialScrollValue();
54
+ return value;
55
+ });
56
+ });
57
+ const progress = useDerivedValue(() => {
58
+ const id = activeScrollId?.get() ?? DEFAULT_SCROLL_ID;
59
+ const scrollValue = scrollValues.get()[id];
60
+ if (!scrollValue) {
61
+ return 0;
62
+ }
63
+ const {
64
+ min,
65
+ current
66
+ } = scrollValue;
67
+ return interpolate(current, [min, min + calculatedProgressThreshold], [0, 1], progressExtrapolation);
68
+ });
69
+ const ctxValue = useMemo(() => ({
70
+ progress,
71
+ originalHeaderHeight,
72
+ measureDynamic: setOrUpdateDynamicMeasurement,
73
+ measureTotalHeight,
74
+ progressThreshold: calculatedProgressThreshold,
75
+ scrollValues,
76
+ activeScrollId: activeScrollId
77
+ }), [originalHeaderHeight, progress, measureTotalHeight, setOrUpdateDynamicMeasurement, scrollValues, activeScrollId, calculatedProgressThreshold]);
78
+ return /*#__PURE__*/_jsx(HeaderMotionContext.Provider, {
79
+ value: ctxValue,
80
+ children: children
81
+ });
82
+ }
83
+ export { HeaderMotionContextProvider };
84
+ //# sourceMappingURL=HeaderMotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useMemo","useState","Extrapolation","interpolate","useAnimatedReaction","useDerivedValue","useSharedValue","HeaderMotionContext","DEFAULT_MEASURE_DYNAMIC","DEFAULT_PROGRESS_THRESHOLD","DEFAULT_SCROLL_ID","getInitialScrollValue","jsx","_jsx","HeaderMotionContextProvider","progressThreshold","measureDynamic","measureDynamicMode","activeScrollId","progressExtrapolation","CLAMP","children","dynamicMeasurement","setDynamicMeasurement","undefined","originalHeaderHeight","setOriginalHeaderHeight","setOrUpdateDynamicMeasurement","e","measured","prevMeasurement","calculatedProgressThreshold","Infinity","measureTotalHeight","measuredValue","nativeEvent","layout","height","scrollValues","get","id","modify","value","progress","scrollValue","min","current","ctxValue","Provider"],"sourceRoot":"../../../src","sources":["components/HeaderMotion.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ import { useScrollManager } from "../hooks/index.js";
4
+ /**
5
+ * ScrollManager component that provides scroll tracking functionality for custom scroll implementations. Uses {@link useScrollManager} under the hood.
6
+ * Must be used within a HeaderMotion component.
7
+ *
8
+ * This is useful when you need to use a scroll component that isn't directly supported
9
+ * (like a custom scroll view or third-party list components).
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <HeaderMotion>
14
+ * <HeaderMotion.ScrollManager>
15
+ * {(scrollableProps, { originalHeaderHeight }) => (
16
+ * <CustomScrollView {...scrollableProps}>
17
+ * <View style={{ paddingTop: originalHeaderHeight }}>
18
+ * <Text>Content</Text>
19
+ * </View>
20
+ * </CustomScrollView>
21
+ * )}
22
+ * </HeaderMotion.ScrollManager>
23
+ * </HeaderMotion>
24
+ * ```
25
+ */
26
+ export function HeaderMotionScrollManager({
27
+ children,
28
+ scrollId
29
+ }) {
30
+ if (typeof children !== 'function') {
31
+ throw new Error('HeaderMotion.ScrollManager only accepts render function as the only child.');
32
+ }
33
+ const {
34
+ scrollableProps,
35
+ headerMotionContext
36
+ } = useScrollManager(scrollId);
37
+ return children(scrollableProps, headerMotionContext);
38
+ }
39
+ //# sourceMappingURL=ScrollManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useScrollManager","HeaderMotionScrollManager","children","scrollId","Error","scrollableProps","headerMotionContext"],"sourceRoot":"../../../src","sources":["components/ScrollManager.tsx"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,mBAAU;AAsB3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CAAC;EACxCC,QAAQ;EACRC;AAC8B,CAAC,EAAE;EACjC,IAAI,OAAOD,QAAQ,KAAK,UAAU,EAAE;IAClC,MAAM,IAAIE,KAAK,CACb,4EACF,CAAC;EACH;EAEA,MAAM;IAAEC,eAAe;IAAEC;EAAoB,CAAC,GAAGN,gBAAgB,CAACG,QAAQ,CAAC;EAE3E,OAAOD,QAAQ,CAACG,eAAe,EAAEC,mBAAmB,CAAC;AACvD","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ import Animated from 'react-native-reanimated';
4
+ import { HeaderMotionScrollManager } from "./ScrollManager.js";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ /**
7
+ * Animated ScrollView component that integrates with HeaderMotion.
8
+ * Automatically handles scroll tracking and header animation synchronization.
9
+ * Must be used within a HeaderMotion component.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <HeaderMotion>
14
+ * <HeaderMotion.ScrollView>
15
+ * <MyScrollableContent />
16
+ * </HeaderMotion.ScrollView>
17
+ * </HeaderMotion>
18
+ * ```
19
+ */
20
+ export function HeaderMotionScrollView({
21
+ scrollId,
22
+ children,
23
+ contentContainerStyle,
24
+ ...props
25
+ }) {
26
+ return /*#__PURE__*/_jsx(HeaderMotionScrollManager, {
27
+ scrollId: scrollId,
28
+ children: ({
29
+ onScroll,
30
+ ...scrollViewProps
31
+ }, {
32
+ originalHeaderHeight,
33
+ minHeightContentContainerStyle
34
+ }) => /*#__PURE__*/_jsx(Animated.ScrollView, {
35
+ ...scrollViewProps,
36
+ ...props,
37
+ onScroll: onScroll,
38
+ children: /*#__PURE__*/_jsx(Animated.View, {
39
+ style: [minHeightContentContainerStyle, {
40
+ paddingTop: originalHeaderHeight
41
+ }, contentContainerStyle],
42
+ children: children
43
+ })
44
+ })
45
+ });
46
+ }
47
+ //# sourceMappingURL=ScrollView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Animated","HeaderMotionScrollManager","jsx","_jsx","HeaderMotionScrollView","scrollId","children","contentContainerStyle","props","onScroll","scrollViewProps","originalHeaderHeight","minHeightContentContainerStyle","ScrollView","View","style","paddingTop"],"sourceRoot":"../../../src","sources":["components/ScrollView.tsx"],"mappings":";;AAAA,OAAOA,QAAQ,MAER,yBAAyB;AAChC,SAASC,yBAAyB,QAAQ,oBAAiB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAU5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAAC;EACrCC,QAAQ;EACRC,QAAQ;EACRC,qBAAqB;EACrB,GAAGC;AACwB,CAAC,EAAE;EAC9B,oBACEL,IAAA,CAACF,yBAAyB;IAACI,QAAQ,EAAEA,QAAS;IAAAC,QAAA,EAC3CA,CACC;MAAEG,QAAQ;MAAE,GAAGC;IAAgB,CAAC,EAChC;MAAEC,oBAAoB;MAAEC;IAA+B,CAAC,kBAExDT,IAAA,CAACH,QAAQ,CAACa,UAAU;MAAA,GACdH,eAAe;MAAA,GACfF,KAAK;MACTC,QAAQ,EAAEA,QAAS;MAAAH,QAAA,eAEnBH,IAAA,CAACH,QAAQ,CAACc,IAAI;QACZC,KAAK,EAAE,CACLH,8BAA8B,EAC9B;UAAEI,UAAU,EAAEL;QAAqB,CAAC,EACpCJ,qBAAqB,CACrB;QAAAD,QAAA,EAEDA;MAAQ,CACI;IAAC,CACG;EACtB,CACwB,CAAC;AAEhC","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ export * from "./FlatList.js";
4
+ export * from "./Header.js";
5
+ export * from "./HeaderBase.js";
6
+ export * from "./HeaderMotion.js";
7
+ export * from "./ScrollManager.js";
8
+ export * from "./ScrollView.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["components/index.ts"],"mappings":";;AAAA,cAAc,eAAY;AAC1B,cAAc,aAAU;AACxB,cAAc,iBAAc;AAC5B,cAAc,mBAAgB;AAC9B,cAAc,oBAAiB;AAC/B,cAAc,iBAAc","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import { createContext } from 'react';
4
+ export const HeaderMotionContext = /*#__PURE__*/createContext(null);
5
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","HeaderMotionContext"],"sourceRoot":"../../src","sources":["context.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,OAAO;AAkBrC,OAAO,MAAMC,mBAAmB,gBAC9BD,aAAa,CAAiC,IAAI,CAAC","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ export * from "./useActiveScrollId.js";
4
+ export * from "./useMotionProgress.js";
5
+ export * from "./useScrollManager.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":";;AAAA,cAAc,wBAAqB;AACnC,cAAc,wBAAqB;AACnC,cAAc,uBAAoB","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useMemo, useState } from 'react';
4
+ import { useSharedValue } from 'react-native-reanimated';
5
+ /**
6
+ * Hook to manage active scroll ID for multi-scroll scenarios (e.g. tabs with different scroll views).
7
+ * Returns both a state value and a shared value, along with a setter function.
8
+ *
9
+ * Use this when you have multiple scroll views (like in a tabbed interface) and need to
10
+ * track which one is currently active. Pass the shared value to `HeaderMotion`'s `activeScrollId` prop.
11
+ *
12
+ * @template T - The type of the scroll ID string
13
+ * @param initialActiveScrollId - The initial active scroll ID
14
+ * @returns A tuple containing:
15
+ * - `[0]`: Object with `state` (React state) and `sv` (shared value) for the active scroll ID
16
+ * - `[1]`: Function to set the active scroll ID
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * function TabbedScrollView() {
21
+ * const [activeScroll, setActiveScroll] = useActiveScrollId('tab1');
22
+ *
23
+ * return (
24
+ * <HeaderMotion activeScrollId={activeScroll.sv}>
25
+ * <Tabs onTabChange={setActiveScroll}>
26
+ * <Tab id="tab1" />
27
+ * <Tab id="tab2" />
28
+ * </Tabs>
29
+ * </HeaderMotion>
30
+ * );
31
+ * }
32
+ * ```
33
+ */
34
+ export function useActiveScrollId(initialActiveScrollId) {
35
+ const [activeScrollIdState, setActiveScrollIdState] = useState(initialActiveScrollId);
36
+ const activeScrollIdSv = useSharedValue(initialActiveScrollId);
37
+ const setActiveScrollId = useCallback(newId => {
38
+ setActiveScrollIdState(newId);
39
+ activeScrollIdSv.set(newId);
40
+ }, [setActiveScrollIdState, activeScrollIdSv]);
41
+ const values = useMemo(() => ({
42
+ state: activeScrollIdState,
43
+ sv: activeScrollIdSv
44
+ }), [activeScrollIdState, activeScrollIdSv]);
45
+ return [values, setActiveScrollId];
46
+ }
47
+ //# sourceMappingURL=useActiveScrollId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useMemo","useState","useSharedValue","useActiveScrollId","initialActiveScrollId","activeScrollIdState","setActiveScrollIdState","activeScrollIdSv","setActiveScrollId","newId","set","values","state","sv"],"sourceRoot":"../../../src","sources":["hooks/useActiveScrollId.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACtD,SAASC,cAAc,QAAQ,yBAAyB;AAGxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,qBAAwB,EACyB;EACjD,MAAM,CAACC,mBAAmB,EAAEC,sBAAsB,CAAC,GAAGL,QAAQ,CAC5DG,qBACF,CAAC;EACD,MAAMG,gBAAgB,GAAGL,cAAc,CAAIE,qBAAqB,CAAC;EAEjE,MAAMI,iBAAiB,GAAGT,WAAW,CAClCU,KAAK,IAAK;IACTH,sBAAsB,CAACG,KAAK,CAAC;IAC7BF,gBAAgB,CAACG,GAAG,CAACD,KAAK,CAAC;EAC7B,CAAC,EACD,CAACH,sBAAsB,EAAEC,gBAAgB,CAC3C,CAAC;EAED,MAAMI,MAAM,GAAGX,OAAO,CACpB,OAAO;IACLY,KAAK,EAAEP,mBAAmB;IAC1BQ,EAAE,EAAEN;EACN,CAAC,CAAC,EACF,CAACF,mBAAmB,EAAEE,gBAAgB,CACxC,CAAC;EAED,OAAO,CAACI,MAAM,EAAEH,iBAAiB,CAAC;AACpC","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ import { useContext } from 'react';
4
+ import { HeaderMotionContext } from "../context.js";
5
+ /**
6
+ * Hook to access motion progress values and measuring functions for header animations.
7
+ * Returns the progress value (0-1), threshold, and measurement functions.
8
+ *
9
+ * Must be used within a {@link HeaderMotion} component.
10
+ *
11
+ * @returns Motion progress values and measuring functions:
12
+ * - `progress`: Shared value from 0 to 1
13
+ * - `progressThreshold`: The threshold at which animation completes
14
+ * - `measureTotalHeight`: Function to measure total header height. Should be passed to the `onLayout` prop of the base of a header, to let scrollables account for the total header height
15
+ * - `measureDynamic`: Function to measure a dimension of choice of the animated element of the header - should be passed to the `onLayout` prop of such. If used, can be used for dynamic calculation of the {@link progressThreshold}.
16
+ *
17
+ * @throws Error if used outside of a {@link HeaderMotion} component
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * function MyHeader() {
22
+ * const { progress, progressThreshold, measureTotalHeight, measureDynamic } = useMotionProgress();
23
+ * const dynamicStyle = useAnimatedStyle(() => {
24
+ * const translateY = interpolate(
25
+ * progress.value,
26
+ * [0, 1],
27
+ * [0, -progressThreshold],
28
+ * Extrapolation.CLAMP,
29
+ * )
30
+ * return { transform: [{ translateY }] }
31
+ * })
32
+ * return (
33
+ * <AnimatedHeaderBase onLayout={measureTotalHeight}>
34
+ * <Animated.View onLayout={measureDynamic} style={dynamicStyle} />
35
+ * </AnimatedHeaderBase>
36
+ * )
37
+ * }
38
+ * ```
39
+ */
40
+ export function useMotionProgress() {
41
+ const ctxValue = useContext(HeaderMotionContext);
42
+ if (!ctxValue) {
43
+ throw new Error('useMotionProgress must be used within a <HeaderMotion /> component. If using inside a navigation header, consider using <HeaderMotion.Header /> instead to ensure context access.');
44
+ }
45
+ const {
46
+ progress,
47
+ measureTotalHeight,
48
+ measureDynamic,
49
+ progressThreshold
50
+ } = ctxValue;
51
+ return {
52
+ progress,
53
+ measureTotalHeight,
54
+ measureDynamic,
55
+ progressThreshold
56
+ };
57
+ }
58
+ //# sourceMappingURL=useMotionProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useContext","HeaderMotionContext","useMotionProgress","ctxValue","Error","progress","measureTotalHeight","measureDynamic","progressThreshold"],"sourceRoot":"../../../src","sources":["hooks/useMotionProgress.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,SAASC,mBAAmB,QAAQ,eAAY;AAGhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAmB;EAClD,MAAMC,QAAQ,GAAGH,UAAU,CAACC,mBAAmB,CAAC;EAChD,IAAI,CAACE,QAAQ,EAAE;IACb,MAAM,IAAIC,KAAK,CACb,mLACF,CAAC;EACH;EACA,MAAM;IAAEC,QAAQ;IAAEC,kBAAkB;IAAEC,cAAc;IAAEC;EAAkB,CAAC,GACvEL,QAAQ;EAEV,OAAO;IACLE,QAAQ;IACRC,kBAAkB;IAClBC,cAAc;IACdC;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+
3
+ import { useContext, useCallback, useEffect } from 'react';
4
+ import { measure, scrollTo, useAnimatedReaction, useAnimatedRef, useAnimatedScrollHandler, useAnimatedStyle } from 'react-native-reanimated';
5
+ import { RuntimeKind, scheduleOnUI } from 'react-native-worklets';
6
+ import { HeaderMotionContext } from "../context.js";
7
+ import { DEFAULT_SCROLL_ID, getInitialScrollValue } from "../utils/index.js";
8
+
9
+ /**
10
+ * Hook that manages scroll tracking and synchronization for header animations.
11
+ * Returns props to apply to scrollable components and additional values that help with adjusting styling of the scrollables to header's dimensions.
12
+ *
13
+ * This hook handles:
14
+ * - Scroll position tracking
15
+ * - Synchronization between multiple scroll views (when using multiple scroll IDs)
16
+ * - Content container minimum height calculations for cases where one of the tracked scrollables does not take enough space to reach the progress threshold/
17
+ *
18
+ * Must be used within a HeaderMotion component.
19
+ *
20
+ * @param scrollId - Optional unique identifier for the related scrollable.
21
+ * Use when you have multiple scrollables (e.g., in tabs).
22
+ * @returns Configuration object containing:
23
+ * - `scrollableProps`: Props to apply to scrollable component (onScroll, scrollEventThrottle, ref)
24
+ * - `headerMotionContext`: Header context values (originalHeaderHeight, minHeightContentContainerStyle)
25
+ *
26
+ * @throws Error if used outside of a HeaderMotion component
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * function CustomScrollComponent() {
31
+ * const { scrollableProps, headerMotionContext } = useScrollManager('myScroll');
32
+ *
33
+ * return (
34
+ * <CustomScrollView {...scrollableProps}>
35
+ * <View style={{ paddingTop: headerMotionContext.originalHeaderHeight }}>
36
+ * Content
37
+ * </View>
38
+ * </CustomScrollView>
39
+ * );
40
+ * }
41
+ * ```
42
+ */
43
+ export function useScrollManager(scrollId) {
44
+ const ctxValue = useContext(HeaderMotionContext);
45
+ if (!ctxValue) {
46
+ throw new Error('useScrollManager must be used within a HeaderMotion component');
47
+ }
48
+ const {
49
+ scrollValues,
50
+ progress,
51
+ activeScrollId,
52
+ progressThreshold,
53
+ originalHeaderHeight
54
+ } = ctxValue;
55
+ const id = scrollId ?? DEFAULT_SCROLL_ID;
56
+ const animatedRef = useAnimatedRef(); // TODO: better typing
57
+
58
+ useEffect(() => {
59
+ return () => {
60
+ scheduleOnUI(scrollIdToDelete => {
61
+ scrollValues.modify(value => {
62
+ 'worklet';
63
+
64
+ delete value[scrollIdToDelete];
65
+ return value;
66
+ });
67
+ }, id);
68
+ };
69
+ }, [scrollValues, id]);
70
+ useAnimatedReaction(() => progress.value, (newProgress, oldProgress) => {
71
+ // FUTURE: If really needed for, can use other scroll handlers to only do this either on scroll end or between scroll end and momentum end in onScroll (keep context in shared value)
72
+ // Only sync inactive scroll views when we have multiple tabs being tracked
73
+ const currentActiveScrollId = activeScrollId?.get();
74
+ if (!currentActiveScrollId || id === currentActiveScrollId || oldProgress === null) {
75
+ return;
76
+ }
77
+ if (!scrollValues.get()[id]) {
78
+ scrollValues.modify(value => {
79
+ value[id] = getInitialScrollValue();
80
+ return value;
81
+ });
82
+ }
83
+ let newCur = -1;
84
+ scrollValues.modify(value => {
85
+ let scrollValue = value[id];
86
+ if (!scrollValue) {
87
+ value[id] = getInitialScrollValue();
88
+ scrollValue = value[id];
89
+ }
90
+ const progressDiff = oldProgress - newProgress;
91
+ newCur = scrollValue.current - progressDiff * progressThreshold;
92
+ const newMin = newCur - newProgress * progressThreshold;
93
+ scrollValue.current = newCur;
94
+ scrollValue.min = newMin;
95
+ return value;
96
+ });
97
+ if (newCur >= 0) {
98
+ scrollTo(animatedRef, 0, newCur, false);
99
+ }
100
+ });
101
+ const scrollHandler = useCallback(e => {
102
+ 'worklet';
103
+
104
+ scrollValues.modify(value => {
105
+ if (!value[id]) {
106
+ return value;
107
+ }
108
+ const activeScrollIdValue = activeScrollId?.get();
109
+ if (activeScrollIdValue && activeScrollIdValue !== id) {
110
+ return value;
111
+ }
112
+ const oldCurrent = value[id].current;
113
+ const oldMin = value[id].min;
114
+ const isCollapsed = oldCurrent >= oldMin + progressThreshold - 0.001;
115
+ const newCurrent = e.contentOffset.y;
116
+ value[id].current = newCurrent;
117
+ if (isCollapsed) {
118
+ value[id].min = Math.max(0, newCurrent - progressThreshold);
119
+ }
120
+ return value;
121
+ });
122
+ }, [scrollValues, id, activeScrollId, progressThreshold]);
123
+ const onScroll = useAnimatedScrollHandler(scrollHandler);
124
+ const minHeightContentContainerStyle = useAnimatedStyle(() => {
125
+ if (globalThis.__RUNTIME_KIND === RuntimeKind.ReactNative) {
126
+ return {};
127
+ }
128
+ const measurement = measure(animatedRef);
129
+ if (!measurement) {
130
+ return {};
131
+ }
132
+ return {
133
+ minHeight: measurement.height + progressThreshold
134
+ };
135
+ });
136
+ const scrollableProps = {
137
+ onScroll,
138
+ scrollEventThrottle: 16,
139
+ ref: animatedRef
140
+ };
141
+ const headerMotionContext = {
142
+ originalHeaderHeight,
143
+ minHeightContentContainerStyle
144
+ };
145
+ return {
146
+ scrollableProps,
147
+ headerMotionContext
148
+ };
149
+ }
150
+ //# sourceMappingURL=useScrollManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useContext","useCallback","useEffect","measure","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedScrollHandler","useAnimatedStyle","RuntimeKind","scheduleOnUI","HeaderMotionContext","DEFAULT_SCROLL_ID","getInitialScrollValue","useScrollManager","scrollId","ctxValue","Error","scrollValues","progress","activeScrollId","progressThreshold","originalHeaderHeight","id","animatedRef","scrollIdToDelete","modify","value","newProgress","oldProgress","currentActiveScrollId","get","newCur","scrollValue","progressDiff","current","newMin","min","scrollHandler","e","activeScrollIdValue","oldCurrent","oldMin","isCollapsed","newCurrent","contentOffset","y","Math","max","onScroll","minHeightContentContainerStyle","globalThis","__RUNTIME_KIND","ReactNative","measurement","minHeight","height","scrollableProps","scrollEventThrottle","ref","headerMotionContext"],"sourceRoot":"../../../src","sources":["hooks/useScrollManager.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ import { AnimatedHeaderBase, HeaderBase, HeaderMotionContextProvider, HeaderMotionFlatList, HeaderMotionHeader, HeaderMotionScrollManager, HeaderMotionScrollView } from "./components/index.js";
4
+
5
+ /**
6
+ * Compound component type for HeaderMotion.
7
+ * Provides the main context provider and sub-components for building collapsible headers.
8
+ */
9
+
10
+ /**
11
+ * Main HeaderMotion component.
12
+ * A compound component that provides context for collapsible header animations.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * <HeaderMotion>
17
+ * <HeaderMotion.Header>
18
+ * {(headerProps) => (
19
+ * <Stack.Screen
20
+ * options={{
21
+ * header: () => (
22
+ * <MyAnimatedHeader {...headerProps} />
23
+ * ),
24
+ * }}
25
+ * />
26
+ * )}
27
+ * </HeaderMotion.Header>
28
+ * <HeaderMotion.ScrollView>
29
+ * <MyScrollableContent />
30
+ * </HeaderMotion.ScrollView>
31
+ * </HeaderMotion>
32
+ * ```
33
+ */
34
+ const HeaderMotion = HeaderMotionContextProvider;
35
+ HeaderMotion.Header = HeaderMotionHeader;
36
+ HeaderMotion.ScrollManager = HeaderMotionScrollManager;
37
+ HeaderMotion.ScrollView = HeaderMotionScrollView;
38
+ HeaderMotion.FlatList = HeaderMotionFlatList;
39
+ export default HeaderMotion;
40
+ export * from "./hooks/index.js";
41
+ export { AnimatedHeaderBase, HeaderBase };
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AnimatedHeaderBase","HeaderBase","HeaderMotionContextProvider","HeaderMotionFlatList","HeaderMotionHeader","HeaderMotionScrollManager","HeaderMotionScrollView","HeaderMotion","Header","ScrollManager","ScrollView","FlatList"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SACEA,kBAAkB,EAClBC,UAAU,EACVC,2BAA2B,EAC3BC,oBAAoB,EACpBC,kBAAkB,EAClBC,yBAAyB,EACzBC,sBAAsB,QAMjB,uBAAc;;AAGrB;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,YAAY,GAAGL,2BAAoD;AACzEK,YAAY,CAACC,MAAM,GAAGJ,kBAAkB;AACxCG,YAAY,CAACE,aAAa,GAAGJ,yBAAyB;AACtDE,YAAY,CAACG,UAAU,GAAGJ,sBAAsB;AAChDC,YAAY,CAACI,QAAQ,GAAGR,oBAAoB;AAE5C,eAAeI,YAAY;AAC3B,cAAc,kBAAS;AAEvB,SAASP,kBAAkB,EAAEC,UAAU","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ const DEFAULT_PROGRESS_THRESHOLD = measuredHeaderValue => measuredHeaderValue;
4
+ const DEFAULT_MEASURE_DYNAMIC = e => e.nativeEvent.layout.height;
5
+
6
+ // Symbol doesn't work?
7
+ // const DEFAULT_SCROLL_ID = Symbol("HEADER_MOTION_DEFAULT_SCROLL_ID");
8
+ const DEFAULT_SCROLL_ID = '__HEADER_MOTION_DEFAULT_SCROLL_ID__';
9
+ export { DEFAULT_MEASURE_DYNAMIC, DEFAULT_PROGRESS_THRESHOLD, DEFAULT_SCROLL_ID };
10
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_PROGRESS_THRESHOLD","measuredHeaderValue","DEFAULT_MEASURE_DYNAMIC","e","nativeEvent","layout","height","DEFAULT_SCROLL_ID"],"sourceRoot":"../../../src","sources":["utils/defaults.ts"],"mappings":";;AAEA,MAAMA,0BAA6C,GAAIC,mBAAmB,IACxEA,mBAAmB;AACrB,MAAMC,uBAA8C,GAAIC,CAAC,IACvDA,CAAC,CAACC,WAAW,CAACC,MAAM,CAACC,MAAM;;AAE7B;AACA;AACA,MAAMC,iBAAiB,GAAG,qCAAqC;AAE/D,SACEL,uBAAuB,EACvBF,0BAA0B,EAC1BO,iBAAiB","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export * from "./defaults.js";
4
+ export * from "./values.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;AAAA,cAAc,eAAY;AAC1B,cAAc,aAAU","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ export function getInitialScrollValue() {
4
+ 'worklet';
5
+
6
+ return {
7
+ min: 0,
8
+ current: 0
9
+ };
10
+ }
11
+ //# sourceMappingURL=values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getInitialScrollValue","min","current"],"sourceRoot":"../../../src","sources":["utils/values.ts"],"mappings":";;AAEA,OAAO,SAASA,qBAAqBA,CAAA,EAAgB;EACnD,SAAS;;EACT,OAAO;IAAEC,GAAG,EAAE,CAAC;IAAEC,OAAO,EAAE;EAAE,CAAC;AAC/B","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,30 @@
1
+ import { type ComponentProps } from 'react';
2
+ import Animated from 'react-native-reanimated';
3
+ type AnimatedFlatListProps<T = any> = ComponentProps<typeof Animated.FlatList<T>>;
4
+ export type HeaderMotionFlatListProps<T = any> = AnimatedFlatListProps<T> & {
5
+ /**
6
+ * Optional unique identifier for this scroll view.
7
+ * Use this when you have multiple scroll views (e.g. in tabs) to track them separately.
8
+ */
9
+ scrollId?: string;
10
+ };
11
+ /**
12
+ * Animated FlatList component that integrates with HeaderMotion.
13
+ * Automatically handles scroll tracking and header animation synchronization.
14
+ * Must be used within a HeaderMotion component.
15
+ *
16
+ * @template T - The type of items in the FlatList
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * <HeaderMotion>
21
+ * <HeaderMotion.FlatList
22
+ * data={items}
23
+ * renderItem={({ item }) => <Text>{item}</Text>}
24
+ * />
25
+ * </HeaderMotion>
26
+ * ```
27
+ */
28
+ export declare function HeaderMotionFlatList<T = any>({ scrollId, ...props }: HeaderMotionFlatListProps<T>): import("react/jsx-runtime").JSX.Element;
29
+ export {};
30
+ //# sourceMappingURL=FlatList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlatList.d.ts","sourceRoot":"","sources":["../../../../src/components/FlatList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAqB,MAAM,OAAO,CAAC;AAE3E,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,KAAK,qBAAqB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAClD,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC5B,CAAC;AAEF,MAAM,MAAM,yBAAyB,CAAC,CAAC,GAAG,GAAG,IAAI,qBAAqB,CAAC,CAAC,CAAC,GAAG;IAC1E;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,GAAG,EAAE,EAC5C,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,yBAAyB,CAAC,CAAC,CAAC,2CAuB9B"}