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.
- package/LICENSE +20 -0
- package/README.md +479 -0
- package/lib/module/components/FlatList.js +64 -0
- package/lib/module/components/FlatList.js.map +1 -0
- package/lib/module/components/Header.js +19 -0
- package/lib/module/components/Header.js.map +1 -0
- package/lib/module/components/HeaderBase.js +59 -0
- package/lib/module/components/HeaderBase.js.map +1 -0
- package/lib/module/components/HeaderMotion.js +84 -0
- package/lib/module/components/HeaderMotion.js.map +1 -0
- package/lib/module/components/ScrollManager.js +39 -0
- package/lib/module/components/ScrollManager.js.map +1 -0
- package/lib/module/components/ScrollView.js +47 -0
- package/lib/module/components/ScrollView.js.map +1 -0
- package/lib/module/components/index.js +9 -0
- package/lib/module/components/index.js.map +1 -0
- package/lib/module/context.js +5 -0
- package/lib/module/context.js.map +1 -0
- package/lib/module/hooks/index.js +6 -0
- package/lib/module/hooks/index.js.map +1 -0
- package/lib/module/hooks/useActiveScrollId.js +47 -0
- package/lib/module/hooks/useActiveScrollId.js.map +1 -0
- package/lib/module/hooks/useMotionProgress.js +58 -0
- package/lib/module/hooks/useMotionProgress.js.map +1 -0
- package/lib/module/hooks/useScrollManager.js +150 -0
- package/lib/module/hooks/useScrollManager.js.map +1 -0
- package/lib/module/index.js +42 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/defaults.js +10 -0
- package/lib/module/utils/defaults.js.map +1 -0
- package/lib/module/utils/index.js +5 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/values.js +11 -0
- package/lib/module/utils/values.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/components/FlatList.d.ts +30 -0
- package/lib/typescript/src/components/FlatList.d.ts.map +1 -0
- package/lib/typescript/src/components/Header.d.ts +19 -0
- package/lib/typescript/src/components/Header.d.ts.map +1 -0
- package/lib/typescript/src/components/HeaderBase.d.ts +34 -0
- package/lib/typescript/src/components/HeaderBase.d.ts.map +1 -0
- package/lib/typescript/src/components/HeaderMotion.d.ts +52 -0
- package/lib/typescript/src/components/HeaderMotion.d.ts.map +1 -0
- package/lib/typescript/src/components/ScrollManager.d.ts +40 -0
- package/lib/typescript/src/components/ScrollManager.d.ts.map +1 -0
- package/lib/typescript/src/components/ScrollView.d.ts +24 -0
- package/lib/typescript/src/components/ScrollView.d.ts.map +1 -0
- package/lib/typescript/src/components/index.d.ts +7 -0
- package/lib/typescript/src/components/index.d.ts.map +1 -0
- package/lib/typescript/src/context.d.ts +14 -0
- package/lib/typescript/src/context.d.ts.map +1 -0
- package/lib/typescript/src/hooks/index.d.ts +4 -0
- package/lib/typescript/src/hooks/index.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useActiveScrollId.d.ts +32 -0
- package/lib/typescript/src/hooks/useActiveScrollId.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useMotionProgress.d.ts +38 -0
- package/lib/typescript/src/hooks/useMotionProgress.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useScrollManager.d.ts +37 -0
- package/lib/typescript/src/hooks/useScrollManager.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +51 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +43 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/defaults.d.ts +6 -0
- package/lib/typescript/src/utils/defaults.d.ts.map +1 -0
- package/lib/typescript/src/utils/index.d.ts +3 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/values.d.ts +3 -0
- package/lib/typescript/src/utils/values.d.ts.map +1 -0
- package/package.json +164 -0
- package/src/components/FlatList.tsx +72 -0
- package/src/components/Header.tsx +30 -0
- package/src/components/HeaderBase.tsx +51 -0
- package/src/components/HeaderMotion.tsx +183 -0
- package/src/components/ScrollManager.tsx +58 -0
- package/src/components/ScrollView.tsx +58 -0
- package/src/components/index.ts +6 -0
- package/src/context.ts +20 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useActiveScrollId.ts +59 -0
- package/src/hooks/useMotionProgress.ts +56 -0
- package/src/hooks/useScrollManager.ts +186 -0
- package/src/index.ts +76 -0
- package/src/types.ts +62 -0
- package/src/utils/defaults.ts +16 -0
- package/src/utils/index.ts +2 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;AAAA,cAAc,eAAY;AAC1B,cAAc,aAAU","ignoreList":[]}
|
|
@@ -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"}
|