related-ui-components 2.1.4 → 2.1.6

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/lib/module/app.js CHANGED
@@ -1,50 +1,63 @@
1
1
  "use strict";
2
2
 
3
3
  import React from "react";
4
- import { SafeAreaView } from "react-native";
5
- import { SelaDealCard } from "./components/index.js";
6
- import { RelatedProvider } from "./theme/index.js";
7
- import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
8
- const MyScreen = () => {
9
- // useEffect(() => {
10
- // I18nManager.allowRTL(true);
11
- // I18nManager.forceRTL(true);
12
- // }, []);
4
+ import { SafeAreaView, StyleSheet, StatusBar } from "react-native";
5
+ import CarouselCardStack from "./components/CarouselCardStack/CarouselCardStack.js"; // Adjust path as needed
6
+ import { GestureHandlerRootView } from "react-native-gesture-handler";
7
+
8
+ // Sample data - replace with your actual image URLs
9
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
10
+ const DUMMY_DATA = [{
11
+ id: "1",
12
+ image: "https://images.pexels.com/photos/3354648/pexels-photo-3354648.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
13
+ title: "Mountain Lake"
14
+ },
15
+ // {
16
+ // id: "2",
17
+ // image:
18
+ // "https://images.pexels.com/photos/163273/sunrise-speedboat-ocean-water-163273.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
19
+ // title: "Sunset Cruise",
20
+ // },
21
+ {
22
+ id: "3",
23
+ image: "https://images.pexels.com/photos/1430677/pexels-photo-1430677.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
24
+ title: "Ocean Horizon"
25
+ }, {
26
+ id: "4",
27
+ image: "https://images.pexels.com/photos/2387793/pexels-photo-2387793.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
28
+ title: "Forest Trail"
29
+ }
30
+ // {
31
+ // id: "5",
32
+ // image:
33
+ // "https://images.pexels.com/photos/302804/pexels-photo-302804.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
34
+ // title: "City Lights",
35
+ // },
36
+ ];
37
+ const App = () => {
13
38
  return /*#__PURE__*/_jsx(_Fragment, {
14
- children: /*#__PURE__*/_jsx(RelatedProvider, {
15
- children: /*#__PURE__*/_jsx(SafeAreaView, {
16
- style: {
17
- padding: 50
18
- },
19
- children: /*#__PURE__*/_jsx(SelaDealCard, {
20
- variant: "vertical"
21
- // isRTL
22
- ,
23
- backgroundImage: {
24
- uri: "https://picsum.photos/seed/lounge/600/700"
25
- } // Your image for the horizontal card
26
- ,
27
- label: "Offer"
28
- // lockOverlay
29
- ,
30
- providerName: "Altanfeethi",
31
- providerNameStyle: {
32
- color: "yellow"
33
- } // Specific style for provider name
34
- ,
35
- description: "1 Year Membership",
36
- descriptionStyle: {
37
- color: "white"
38
- },
39
- priceContainerBlur: 90,
40
- price: "20,000 pts",
41
- onPress: () => console.log("Horizontal Sela Card Pressed"),
42
- width: 177 // Example width
43
- // height={180} // Example height
39
+ children: /*#__PURE__*/_jsxs(GestureHandlerRootView, {
40
+ style: {
41
+ flex: 1
42
+ },
43
+ children: [/*#__PURE__*/_jsx(StatusBar, {
44
+ barStyle: "light-content"
45
+ }), /*#__PURE__*/_jsx(SafeAreaView, {
46
+ style: styles.appContainer,
47
+ children: /*#__PURE__*/_jsx(CarouselCardStack, {
48
+ data: DUMMY_DATA
44
49
  })
45
- })
50
+ })]
46
51
  })
47
52
  });
48
53
  };
49
- export default MyScreen;
54
+ const styles = StyleSheet.create({
55
+ appContainer: {
56
+ flex: 1,
57
+ backgroundColor: "#212121",
58
+ // Match carousel background or choose another
59
+ justifyContent: "center" // Center the carousel vertically if it's the main content
60
+ }
61
+ });
62
+ export default App;
50
63
  //# sourceMappingURL=app.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","SafeAreaView","SelaDealCard","RelatedProvider","jsx","_jsx","Fragment","_Fragment","MyScreen","children","style","padding","variant","backgroundImage","uri","label","providerName","providerNameStyle","color","description","descriptionStyle","priceContainerBlur","price","onPress","console","log","width"],"sourceRoot":"..\\..\\src","sources":["app.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAA+B,OAAO;AAClD,SAAsBC,YAAY,QAAc,cAAc;AAC9D,SAASC,YAAY,QAAQ,uBAAc;AAC3C,SAASC,eAAe,QAAQ,kBAAS;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA;AAE1C,MAAMC,QAAQ,GAAGA,CAAA,KAAM;EACrB;EACA;EACA;EACA;EACA,oBACEH,IAAA,CAAAE,SAAA;IAAAE,QAAA,eACEJ,IAAA,CAACF,eAAe;MAAAM,QAAA,eACdJ,IAAA,CAACJ,YAAY;QAACS,KAAK,EAAE;UAAEC,OAAO,EAAE;QAAG,CAAE;QAAAF,QAAA,eACnCJ,IAAA,CAACH,YAAY;UACXU,OAAO,EAAC;UACR;UAAA;UACAC,eAAe,EAAE;YACfC,GAAG,EAAE;UACP,CAAE,CAAC;UAAA;UACHC,KAAK,EAAC;UACN;UAAA;UACAC,YAAY,EAAC,aAAa;UAC1BC,iBAAiB,EAAE;YAAEC,KAAK,EAAE;UAAS,CAAE,CAAC;UAAA;UACxCC,WAAW,EAAC,mBAAmB;UAC/BC,gBAAgB,EAAE;YAAEF,KAAK,EAAE;UAAQ,CAAE;UACrCG,kBAAkB,EAAE,EAAG;UACvBC,KAAK,EAAC,YAAY;UAClBC,OAAO,EAAEA,CAAA,KAAMC,OAAO,CAACC,GAAG,CAAC,8BAA8B,CAAE;UAC3DC,KAAK,EAAE,GAAI,CAAC;UACZ;QAAA,CACD;MAAC,CACU;IAAC,CACA;EAAC,CAClB,CAAC;AAEP,CAAC;AAED,eAAelB,QAAQ","ignoreList":[]}
1
+ {"version":3,"names":["React","SafeAreaView","StyleSheet","StatusBar","CarouselCardStack","GestureHandlerRootView","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","DUMMY_DATA","id","image","title","App","children","style","flex","barStyle","styles","appContainer","data","create","backgroundColor","justifyContent"],"sourceRoot":"..\\..\\src","sources":["app.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,YAAY,EAAEC,UAAU,EAAEC,SAAS,QAAQ,cAAc;AAClE,OAAOC,iBAAiB,MAAM,qDAAkD,CAAC,CAAC;AAClF,SAASC,sBAAsB,QAAQ,8BAA8B;;AAErE;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA,EAAAC,QAAA,IAAAC,SAAA;AACA,MAAMC,UAAU,GAAG,CACjB;EACEC,EAAE,EAAE,GAAG;EACPC,KAAK,EACH,iHAAiH;EACnHC,KAAK,EAAE;AACT,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;EACEF,EAAE,EAAE,GAAG;EACPC,KAAK,EACH,iHAAiH;EACnHC,KAAK,EAAE;AACT,CAAC,EACD;EACEF,EAAE,EAAE,GAAG;EACPC,KAAK,EACH,iHAAiH;EACnHC,KAAK,EAAE;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,CACD;AAED,MAAMC,GAAG,GAAGA,CAAA,KAAM;EAChB,oBACET,IAAA,CAAAI,SAAA;IAAAM,QAAA,eACER,KAAA,CAACJ,sBAAsB;MAACa,KAAK,EAAE;QAAEC,IAAI,EAAE;MAAE,CAAE;MAAAF,QAAA,gBACzCV,IAAA,CAACJ,SAAS;QAACiB,QAAQ,EAAC;MAAe,CAAE,CAAC,eACtCb,IAAA,CAACN,YAAY;QAACiB,KAAK,EAAEG,MAAM,CAACC,YAAa;QAAAL,QAAA,eACvCV,IAAA,CAACH,iBAAiB;UAACmB,IAAI,EAAEX;QAAW,CAAE;MAAC,CAC3B,CAAC;IAAA,CACO;EAAC,CACzB,CAAC;AAEP,CAAC;AAED,MAAMS,MAAM,GAAGnB,UAAU,CAACsB,MAAM,CAAC;EAC/BF,YAAY,EAAE;IACZH,IAAI,EAAE,CAAC;IACPM,eAAe,EAAE,SAAS;IAAE;IAC5BC,cAAc,EAAE,QAAQ,CAAE;EAC5B;AACF,CAAC,CAAC;AAEF,eAAeV,GAAG","ignoreList":[]}
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+
3
+ import React, { useEffect, useMemo } from "react";
4
+ import { View, StyleSheet, Image, Dimensions, Text } from "react-native";
5
+ import { Gesture, GestureDetector } from "react-native-gesture-handler";
6
+ import Animated, { useSharedValue, useAnimatedStyle, withSpring, interpolate, useDerivedValue, Extrapolation } from "react-native-reanimated";
7
+ import { useTheme } from "../../theme/index.js";
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ const {
10
+ width: SCREEN_WIDTH
11
+ } = Dimensions.get("window");
12
+ const CARD_WIDTH_FACTOR = 0.5;
13
+ const CARD_ASPECT_RATIO = 1.35;
14
+ const SIDE_CARD_SCALE_FACTOR = 0.85;
15
+ const CARD_WIDTH = SCREEN_WIDTH * CARD_WIDTH_FACTOR;
16
+ const CARD_HEIGHT = CARD_WIDTH * CARD_ASPECT_RATIO;
17
+ const MAX_X_FACTOR = 0.5 / CARD_WIDTH_FACTOR - SIDE_CARD_SCALE_FACTOR / 2;
18
+ const SIDE_CARD_TRANSLATE_X_FACTOR = Math.min(0.32, MAX_X_FACTOR);
19
+ const SIDE_CARD_TRANSLATE_X = CARD_WIDTH * SIDE_CARD_TRANSLATE_X_FACTOR;
20
+ const ACTIVE_CARD_SCALE = 1.0;
21
+ const SPRING_CONFIG = {
22
+ damping: 18,
23
+ stiffness: 120,
24
+ mass: 0.6
25
+ };
26
+ const createVirtualData = originalData => {
27
+ if (!originalData || originalData.length === 0) return [];
28
+ const prefixItems = (items, segmentPrefix) => items.map((item, idx) => ({
29
+ ...item,
30
+ uniqueId: `${segmentPrefix}-${item.id}-${idx}`
31
+ }));
32
+ const prevSegment = prefixItems(originalData, "prev");
33
+ const currSegment = prefixItems(originalData, "curr");
34
+ const nextSegment = prefixItems(originalData, "next");
35
+ return [...prevSegment, ...currSegment, ...nextSegment];
36
+ };
37
+ const CarouselCardStack = ({
38
+ data: originalData,
39
+ cardHeight = CARD_HEIGHT,
40
+ cardWidth = CARD_WIDTH,
41
+ backgroundColor = "transparent"
42
+ }) => {
43
+ const {
44
+ theme
45
+ } = useTheme();
46
+ const N_original = originalData.length;
47
+ const virtualData = useMemo(() => createVirtualData(originalData), [originalData]);
48
+ const activeIndex = useSharedValue(N_original > 0 ? N_original : 0);
49
+ const gestureTranslateX = useSharedValue(0);
50
+ const contextX = useSharedValue(0);
51
+ useEffect(() => {
52
+ activeIndex.value = N_original > 0 ? N_original : 0;
53
+ gestureTranslateX.value = 0;
54
+ }, [N_original, activeIndex, gestureTranslateX]);
55
+
56
+ // Worklet to handle the loop reset
57
+ const handleLoopReset = () => {
58
+ "worklet";
59
+
60
+ if (N_original === 0) return;
61
+ const currentValue = Math.round(activeIndex.value);
62
+
63
+ // If in the "next" segment (indices >= 2*N_original)
64
+ if (currentValue >= N_original * 2) {
65
+ activeIndex.value = currentValue - N_original;
66
+ }
67
+ // If in the "prev" segment (indices < N_original)
68
+ else if (currentValue < N_original) {
69
+ activeIndex.value = currentValue + N_original;
70
+ }
71
+ };
72
+ const panGesture = Gesture.Pan().onBegin(() => {
73
+ contextX.value = gestureTranslateX.value;
74
+ }).onUpdate(event => {
75
+ gestureTranslateX.value = event.translationX;
76
+ }).onEnd(event => {
77
+ if (virtualData.length === 0) return;
78
+ const threshold = cardWidth / 3;
79
+ let newTargetVirtualIndex = activeIndex.value;
80
+ if (event.translationX < -threshold) {
81
+ newTargetVirtualIndex = activeIndex.value + 1;
82
+ } else if (event.translationX > threshold) {
83
+ newTargetVirtualIndex = activeIndex.value - 1;
84
+ }
85
+
86
+ // Clamp to virtual data bounds
87
+ newTargetVirtualIndex = Math.max(0, Math.min(newTargetVirtualIndex, virtualData.length - 1));
88
+ activeIndex.value = withSpring(newTargetVirtualIndex, SPRING_CONFIG, finished => {
89
+ "worklet";
90
+
91
+ if (finished) {
92
+ handleLoopReset();
93
+ }
94
+ });
95
+ gestureTranslateX.value = withSpring(0, SPRING_CONFIG);
96
+ contextX.value = 0;
97
+ });
98
+ const activeDotIndex = useDerivedValue(() => {
99
+ if (N_original === 0) return 0;
100
+ const currentVal = Math.round(activeIndex.value);
101
+ return (currentVal % N_original + N_original) % N_original;
102
+ });
103
+ if (virtualData.length === 0) {
104
+ return /*#__PURE__*/_jsx(View, {
105
+ style: [styles.container, {
106
+ height: cardHeight + 60
107
+ }],
108
+ children: /*#__PURE__*/_jsx(Text, {
109
+ style: styles.emptyText,
110
+ children: "No items to display"
111
+ })
112
+ });
113
+ }
114
+ return /*#__PURE__*/_jsxs(View, {
115
+ style: [styles.container, {
116
+ height: cardHeight + 60,
117
+ backgroundColor: backgroundColor
118
+ }],
119
+ children: [/*#__PURE__*/_jsx(GestureDetector, {
120
+ gesture: panGesture,
121
+ children: /*#__PURE__*/_jsx(Animated.View, {
122
+ style: [styles.cardContainer, {
123
+ height: cardHeight
124
+ }],
125
+ children: virtualData.map((item, index) => {
126
+ const animatedStyle = useAnimatedStyle(() => {
127
+ const currentCardDragOffset = gestureTranslateX.value / cardWidth;
128
+ const displayOffset = index - (activeIndex.value - currentCardDragOffset);
129
+ const scale = interpolate(displayOffset, [-1, 0, 1], [SIDE_CARD_SCALE_FACTOR, ACTIVE_CARD_SCALE, SIDE_CARD_SCALE_FACTOR], Extrapolation.CLAMP);
130
+ const translateX = interpolate(displayOffset, [-1, 0, 1], [-SIDE_CARD_TRANSLATE_X, 0, SIDE_CARD_TRANSLATE_X], Extrapolation.CLAMP);
131
+ const opacity = interpolate(Math.abs(displayOffset), [0, 1, 2, 2.75], [1, 1, 0.6, 0], Extrapolation.CLAMP);
132
+ const snappedDisplayOffset = index - Math.round(activeIndex.value);
133
+ const zIndex = virtualData.length - Math.abs(snappedDisplayOffset);
134
+ return {
135
+ transform: [{
136
+ translateX
137
+ }, {
138
+ scale
139
+ }],
140
+ opacity,
141
+ zIndex
142
+ };
143
+ });
144
+ return /*#__PURE__*/_jsxs(Animated.View, {
145
+ style: [styles.card, {
146
+ width: cardWidth,
147
+ height: cardHeight
148
+ }, animatedStyle],
149
+ children: [/*#__PURE__*/_jsx(Image, {
150
+ source: {
151
+ uri: item.image
152
+ },
153
+ style: styles.cardImage
154
+ }), item.title && /*#__PURE__*/_jsx(View, {
155
+ style: styles.titleContainer,
156
+ children: /*#__PURE__*/_jsx(Text, {
157
+ style: styles.cardTitle,
158
+ children: item.title
159
+ })
160
+ })]
161
+ }, item.uniqueId);
162
+ })
163
+ })
164
+ }), N_original > 0 && /*#__PURE__*/_jsx(View, {
165
+ style: styles.paginationContainer,
166
+ children: originalData.map((_, i) => {
167
+ const isActiveDot = useDerivedValue(() => {
168
+ return activeDotIndex.value === i;
169
+ });
170
+ const dotStyle = useAnimatedStyle(() => {
171
+ return {
172
+ width: withSpring(isActiveDot.value ? 24 : 8, SPRING_CONFIG),
173
+ height: 8,
174
+ borderRadius: 4,
175
+ backgroundColor: isActiveDot.value ? theme.primary : "#FFFFFF",
176
+ marginHorizontal: 4
177
+ };
178
+ });
179
+ return /*#__PURE__*/_jsx(Animated.View, {
180
+ style: dotStyle
181
+ }, `dot-${i}`);
182
+ })
183
+ })]
184
+ });
185
+ };
186
+ const styles = StyleSheet.create({
187
+ container: {
188
+ alignItems: "center",
189
+ justifyContent: "center",
190
+ backgroundColor: "transparent"
191
+ },
192
+ cardContainer: {
193
+ width: SCREEN_WIDTH,
194
+ alignItems: "center",
195
+ justifyContent: "center"
196
+ },
197
+ card: {
198
+ position: "absolute",
199
+ borderRadius: 16,
200
+ backgroundColor: "white",
201
+ shadowColor: "#000",
202
+ shadowOffset: {
203
+ width: 0,
204
+ height: 4
205
+ },
206
+ shadowOpacity: 0.3,
207
+ shadowRadius: 6,
208
+ elevation: 8,
209
+ overflow: "hidden"
210
+ },
211
+ cardImage: {
212
+ width: "100%",
213
+ height: "100%",
214
+ resizeMode: "cover"
215
+ },
216
+ titleContainer: {
217
+ position: "absolute",
218
+ bottom: 10,
219
+ left: 10,
220
+ right: 10,
221
+ backgroundColor: "rgba(0,0,0,0.5)",
222
+ padding: 8,
223
+ borderRadius: 8
224
+ },
225
+ cardTitle: {
226
+ color: "white",
227
+ fontSize: 16,
228
+ fontWeight: "bold"
229
+ },
230
+ paginationContainer: {
231
+ flexDirection: "row",
232
+ justifyContent: "center",
233
+ alignItems: "center",
234
+ marginTop: 20,
235
+ marginBottom: 10
236
+ },
237
+ emptyText: {
238
+ color: "#FFFFFF",
239
+ fontSize: 16
240
+ }
241
+ });
242
+ export default CarouselCardStack;
243
+ //# sourceMappingURL=CarouselCardStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useEffect","useMemo","View","StyleSheet","Image","Dimensions","Text","Gesture","GestureDetector","Animated","useSharedValue","useAnimatedStyle","withSpring","interpolate","useDerivedValue","Extrapolation","useTheme","jsx","_jsx","jsxs","_jsxs","width","SCREEN_WIDTH","get","CARD_WIDTH_FACTOR","CARD_ASPECT_RATIO","SIDE_CARD_SCALE_FACTOR","CARD_WIDTH","CARD_HEIGHT","MAX_X_FACTOR","SIDE_CARD_TRANSLATE_X_FACTOR","Math","min","SIDE_CARD_TRANSLATE_X","ACTIVE_CARD_SCALE","SPRING_CONFIG","damping","stiffness","mass","createVirtualData","originalData","length","prefixItems","items","segmentPrefix","map","item","idx","uniqueId","id","prevSegment","currSegment","nextSegment","CarouselCardStack","data","cardHeight","cardWidth","backgroundColor","theme","N_original","virtualData","activeIndex","gestureTranslateX","contextX","value","handleLoopReset","currentValue","round","panGesture","Pan","onBegin","onUpdate","event","translationX","onEnd","threshold","newTargetVirtualIndex","max","finished","activeDotIndex","currentVal","style","styles","container","height","children","emptyText","gesture","cardContainer","index","animatedStyle","currentCardDragOffset","displayOffset","scale","CLAMP","translateX","opacity","abs","snappedDisplayOffset","zIndex","transform","card","source","uri","image","cardImage","title","titleContainer","cardTitle","paginationContainer","_","i","isActiveDot","dotStyle","borderRadius","primary","marginHorizontal","create","alignItems","justifyContent","position","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation","overflow","resizeMode","bottom","left","right","padding","color","fontSize","fontWeight","flexDirection","marginTop","marginBottom"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/CarouselCardStack/CarouselCardStack.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export { default as CarouselCardStack } from "./CarouselCardStack.js";
4
+ export * from "./CarouselCardStack.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["default","CarouselCardStack"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/CarouselCardStack/index.ts"],"mappings":";;AAAA,SAASA,OAAO,IAAIC,iBAAiB,QAAQ,wBAAqB;AAClE,cAAc,wBAAqB","ignoreList":[]}
@@ -19,4 +19,5 @@ export * from "./RedeemedVoucher/index.js";
19
19
  export * from "./Button/index.js";
20
20
  export * from "./Skeleton/index.js";
21
21
  export * from "./CustomIcon/index.js";
22
+ export * from "./CarouselCardStack/index.js";
22
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"..\\..\\..\\src","sources":["components/index.ts"],"mappings":";;AAAA,cAAc,iBAAQ;AACtB,cAAc,wBAAe;AAC7B,cAAe,mBAAU;AACzB,cAAc,mBAAU;AACxB,cAAc,sBAAa;AAC3B,cAAc,oBAAW;AACzB,cAAc,kBAAS;AACvB,cAAc,wBAAe;AAC7B,cAAc,kBAAS;AACvB,cAAc,6BAAoB;AAClC,cAAc,wBAAe;AAC7B,cAAc,0BAAiB;AAC/B,cAAc,kBAAS;AACvB,cAAc,sBAAa;AAC3B,cAAc,oBAAW;AACzB,cAAc,4BAAmB;AACjC,cAAc,mBAAU;AACxB,cAAc,qBAAY;AAC1B,cAAc,uBAAc","ignoreList":[]}
1
+ {"version":3,"names":[],"sourceRoot":"..\\..\\..\\src","sources":["components/index.ts"],"mappings":";;AAAA,cAAc,iBAAQ;AACtB,cAAc,wBAAe;AAC7B,cAAe,mBAAU;AACzB,cAAc,mBAAU;AACxB,cAAc,sBAAa;AAC3B,cAAc,oBAAW;AACzB,cAAc,kBAAS;AACvB,cAAc,wBAAe;AAC7B,cAAc,kBAAS;AACvB,cAAc,6BAAoB;AAClC,cAAc,wBAAe;AAC7B,cAAc,0BAAiB;AAC/B,cAAc,kBAAS;AACvB,cAAc,sBAAa;AAC3B,cAAc,oBAAW;AACzB,cAAc,4BAAmB;AACjC,cAAc,mBAAU;AACxB,cAAc,qBAAY;AAC1B,cAAc,uBAAc;AAC5B,cAAc,8BAAqB","ignoreList":[]}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- declare const MyScreen: () => React.JSX.Element;
3
- export default MyScreen;
2
+ declare const App: () => React.JSX.Element;
3
+ export default App;
4
4
  //# sourceMappingURL=app.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,QAAA,MAAM,QAAQ,yBA+Bb,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAuC1B,QAAA,MAAM,GAAG,yBAWR,CAAC;AAUF,eAAe,GAAG,CAAC"}
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ interface CarouselItemOriginal {
3
+ id: string;
4
+ image: string;
5
+ title?: string;
6
+ }
7
+ interface CarouselCardStackProps {
8
+ data: CarouselItemOriginal[];
9
+ cardHeight?: number;
10
+ cardWidth?: number;
11
+ backgroundColor?: string;
12
+ }
13
+ declare const CarouselCardStack: React.FC<CarouselCardStackProps>;
14
+ export default CarouselCardStack;
15
+ //# sourceMappingURL=CarouselCardStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CarouselCardStack.d.ts","sourceRoot":"","sources":["../../../../../src/components/CarouselCardStack/CarouselCardStack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AA4B5D,UAAU,oBAAoB;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,UAAU,sBAAsB;IAC9B,IAAI,EAAE,oBAAoB,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAG,MAAM,CAAC;CAC3B;AAuBD,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAuLvD,CAAC;AAwDF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as CarouselCardStack } from "./CarouselCardStack";
2
+ export * from "./CarouselCardStack";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/CarouselCardStack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,cAAc,qBAAqB,CAAC"}
@@ -17,4 +17,5 @@ export * from "./RedeemedVoucher";
17
17
  export * from "./Button";
18
18
  export * from "./Skeleton";
19
19
  export * from "./CustomIcon";
20
+ export * from "./CarouselCardStack";
20
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAe,UAAU,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAe,UAAU,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "related-ui-components",
3
- "version": "2.1.4",
3
+ "version": "2.1.6",
4
4
  "main": "./src/index.ts",
5
5
  "scripts": {
6
6
  "start": "expo start",
package/src/app.tsx CHANGED
@@ -1,39 +1,61 @@
1
- import React, { useEffect, useState } from "react";
2
- import { I18nManager, SafeAreaView, Text } from "react-native";
3
- import { SelaDealCard } from "./components";
4
- import { RelatedProvider } from "./theme";
1
+ import React from "react";
2
+ import { SafeAreaView, StyleSheet, StatusBar } from "react-native";
3
+ import CarouselCardStack from "./components/CarouselCardStack/CarouselCardStack"; // Adjust path as needed
4
+ import { GestureHandlerRootView } from "react-native-gesture-handler";
5
5
 
6
- const MyScreen = () => {
7
- // useEffect(() => {
8
- // I18nManager.allowRTL(true);
9
- // I18nManager.forceRTL(true);
10
- // }, []);
6
+ // Sample data - replace with your actual image URLs
7
+ const DUMMY_DATA = [
8
+ {
9
+ id: "1",
10
+ image:
11
+ "https://images.pexels.com/photos/3354648/pexels-photo-3354648.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
12
+ title: "Mountain Lake",
13
+ },
14
+ // {
15
+ // id: "2",
16
+ // image:
17
+ // "https://images.pexels.com/photos/163273/sunrise-speedboat-ocean-water-163273.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
18
+ // title: "Sunset Cruise",
19
+ // },
20
+ {
21
+ id: "3",
22
+ image:
23
+ "https://images.pexels.com/photos/1430677/pexels-photo-1430677.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
24
+ title: "Ocean Horizon",
25
+ },
26
+ {
27
+ id: "4",
28
+ image:
29
+ "https://images.pexels.com/photos/2387793/pexels-photo-2387793.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
30
+ title: "Forest Trail",
31
+ },
32
+ // {
33
+ // id: "5",
34
+ // image:
35
+ // "https://images.pexels.com/photos/302804/pexels-photo-302804.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
36
+ // title: "City Lights",
37
+ // },
38
+ ];
39
+
40
+ const App = () => {
11
41
  return (
12
42
  <>
13
- <RelatedProvider>
14
- <SafeAreaView style={{ padding: 50 }}>
15
- <SelaDealCard
16
- variant="vertical"
17
- // isRTL
18
- backgroundImage={{
19
- uri: "https://picsum.photos/seed/lounge/600/700",
20
- }} // Your image for the horizontal card
21
- label="Offer"
22
- // lockOverlay
23
- providerName="Altanfeethi"
24
- providerNameStyle={{ color: "yellow" }} // Specific style for provider name
25
- description="1 Year Membership"
26
- descriptionStyle={{ color: "white" }}
27
- priceContainerBlur={90}
28
- price="20,000 pts"
29
- onPress={() => console.log("Horizontal Sela Card Pressed")}
30
- width={177} // Example width
31
- // height={180} // Example height
32
- />
43
+ <GestureHandlerRootView style={{ flex: 1 }}>
44
+ <StatusBar barStyle="light-content" />
45
+ <SafeAreaView style={styles.appContainer}>
46
+ <CarouselCardStack data={DUMMY_DATA} />
33
47
  </SafeAreaView>
34
- </RelatedProvider>
48
+ </GestureHandlerRootView>
35
49
  </>
36
50
  );
37
51
  };
38
52
 
39
- export default MyScreen;
53
+ const styles = StyleSheet.create({
54
+ appContainer: {
55
+ flex: 1,
56
+ backgroundColor: "#212121", // Match carousel background or choose another
57
+ justifyContent: "center", // Center the carousel vertically if it's the main content
58
+ },
59
+ });
60
+
61
+ export default App;
@@ -0,0 +1,306 @@
1
+ import React, { useState, useEffect, useMemo } from "react";
2
+ import { View, StyleSheet, Image, Dimensions, Text } from "react-native";
3
+ import { Gesture, GestureDetector } from "react-native-gesture-handler";
4
+ import Animated, {
5
+ useSharedValue,
6
+ useAnimatedStyle,
7
+ withSpring,
8
+ interpolate,
9
+ Extrapolate,
10
+ useDerivedValue,
11
+ runOnJS,
12
+ Extrapolation,
13
+ } from "react-native-reanimated";
14
+ import { useTheme } from "../../theme";
15
+
16
+ const { width: SCREEN_WIDTH } = Dimensions.get("window");
17
+
18
+ const CARD_WIDTH_FACTOR = 0.5;
19
+ const CARD_ASPECT_RATIO = 1.35;
20
+ const SIDE_CARD_SCALE_FACTOR = 0.85;
21
+ const CARD_WIDTH = SCREEN_WIDTH * CARD_WIDTH_FACTOR;
22
+ const CARD_HEIGHT = CARD_WIDTH * CARD_ASPECT_RATIO;
23
+ const MAX_X_FACTOR = 0.5 / CARD_WIDTH_FACTOR - SIDE_CARD_SCALE_FACTOR / 2;
24
+ const SIDE_CARD_TRANSLATE_X_FACTOR = Math.min(0.32, MAX_X_FACTOR);
25
+ const SIDE_CARD_TRANSLATE_X = CARD_WIDTH * SIDE_CARD_TRANSLATE_X_FACTOR;
26
+ const ACTIVE_CARD_SCALE = 1.0;
27
+ const SPRING_CONFIG = { damping: 18, stiffness: 120, mass: 0.6 };
28
+
29
+ interface CarouselItemOriginal {
30
+ id: string;
31
+ image: string;
32
+ title?: string;
33
+ }
34
+
35
+ interface CarouselItemVirtual extends CarouselItemOriginal {
36
+ uniqueId: string;
37
+ }
38
+
39
+ interface CarouselCardStackProps {
40
+ data: CarouselItemOriginal[];
41
+ cardHeight?: number;
42
+ cardWidth?: number;
43
+ backgroundColor? : string;
44
+ }
45
+
46
+ const createVirtualData = (
47
+ originalData: CarouselItemOriginal[]
48
+ ): CarouselItemVirtual[] => {
49
+ if (!originalData || originalData.length === 0) return [];
50
+
51
+ const prefixItems = (
52
+ items: CarouselItemOriginal[],
53
+ segmentPrefix: string
54
+ ): CarouselItemVirtual[] =>
55
+ items.map((item, idx) => ({
56
+ ...item,
57
+ uniqueId: `${segmentPrefix}-${item.id}-${idx}`,
58
+ }));
59
+
60
+ const prevSegment = prefixItems(originalData, "prev");
61
+ const currSegment = prefixItems(originalData, "curr");
62
+ const nextSegment = prefixItems(originalData, "next");
63
+
64
+ return [...prevSegment, ...currSegment, ...nextSegment];
65
+ };
66
+
67
+ const CarouselCardStack: React.FC<CarouselCardStackProps> = ({
68
+ data: originalData,
69
+ cardHeight = CARD_HEIGHT,
70
+ cardWidth = CARD_WIDTH,
71
+ backgroundColor = "transparent"
72
+ }) => {
73
+ const { theme } = useTheme();
74
+
75
+ const N_original = originalData.length;
76
+
77
+ const virtualData = useMemo(
78
+ () => createVirtualData(originalData),
79
+ [originalData]
80
+ );
81
+
82
+ const activeIndex = useSharedValue(N_original > 0 ? N_original : 0);
83
+ const gestureTranslateX = useSharedValue(0);
84
+ const contextX = useSharedValue(0);
85
+
86
+ useEffect(() => {
87
+ activeIndex.value = N_original > 0 ? N_original : 0;
88
+ gestureTranslateX.value = 0;
89
+ }, [N_original, activeIndex, gestureTranslateX]);
90
+
91
+ // Worklet to handle the loop reset
92
+ const handleLoopReset = () => {
93
+ "worklet";
94
+ if (N_original === 0) return;
95
+
96
+ const currentValue = Math.round(activeIndex.value);
97
+
98
+ // If in the "next" segment (indices >= 2*N_original)
99
+ if (currentValue >= N_original * 2) {
100
+ activeIndex.value = currentValue - N_original;
101
+ }
102
+ // If in the "prev" segment (indices < N_original)
103
+ else if (currentValue < N_original) {
104
+ activeIndex.value = currentValue + N_original;
105
+ }
106
+ };
107
+
108
+ const panGesture = Gesture.Pan()
109
+ .onBegin(() => {
110
+ contextX.value = gestureTranslateX.value;
111
+ })
112
+ .onUpdate((event) => {
113
+ gestureTranslateX.value = event.translationX;
114
+ })
115
+ .onEnd((event) => {
116
+ if (virtualData.length === 0) return;
117
+
118
+ const threshold = cardWidth / 3;
119
+ let newTargetVirtualIndex = activeIndex.value;
120
+
121
+ if (event.translationX < -threshold) {
122
+ newTargetVirtualIndex = activeIndex.value + 1;
123
+ } else if (event.translationX > threshold) {
124
+ newTargetVirtualIndex = activeIndex.value - 1;
125
+ }
126
+
127
+ // Clamp to virtual data bounds
128
+ newTargetVirtualIndex = Math.max(
129
+ 0,
130
+ Math.min(newTargetVirtualIndex, virtualData.length - 1)
131
+ );
132
+
133
+ activeIndex.value = withSpring(
134
+ newTargetVirtualIndex,
135
+ SPRING_CONFIG,
136
+ (finished) => {
137
+ "worklet";
138
+ if (finished) {
139
+ handleLoopReset();
140
+ }
141
+ }
142
+ );
143
+ gestureTranslateX.value = withSpring(0, SPRING_CONFIG);
144
+ contextX.value = 0;
145
+ });
146
+
147
+ const activeDotIndex = useDerivedValue(() => {
148
+ if (N_original === 0) return 0;
149
+ const currentVal = Math.round(activeIndex.value);
150
+ return ((currentVal % N_original) + N_original) % N_original;
151
+ });
152
+
153
+ if (virtualData.length === 0) {
154
+ return (
155
+ <View style={[styles.container, { height: cardHeight + 60 }]}>
156
+ <Text style={styles.emptyText}>No items to display</Text>
157
+ </View>
158
+ );
159
+ }
160
+
161
+ return (
162
+ <View style={[styles.container, { height: cardHeight + 60, backgroundColor: backgroundColor}]}>
163
+ <GestureDetector gesture={panGesture}>
164
+ <Animated.View style={[styles.cardContainer, { height: cardHeight }]}>
165
+ {virtualData.map((item, index) => {
166
+ const animatedStyle = useAnimatedStyle(() => {
167
+ const currentCardDragOffset = gestureTranslateX.value / cardWidth;
168
+ const displayOffset =
169
+ index - (activeIndex.value - currentCardDragOffset);
170
+
171
+ const scale = interpolate(
172
+ displayOffset,
173
+ [-1, 0, 1],
174
+ [
175
+ SIDE_CARD_SCALE_FACTOR,
176
+ ACTIVE_CARD_SCALE,
177
+ SIDE_CARD_SCALE_FACTOR,
178
+ ],
179
+ Extrapolation.CLAMP
180
+ );
181
+
182
+ const translateX = interpolate(
183
+ displayOffset,
184
+ [-1, 0, 1],
185
+ [-SIDE_CARD_TRANSLATE_X, 0, SIDE_CARD_TRANSLATE_X],
186
+ Extrapolation.CLAMP
187
+ );
188
+
189
+ const opacity = interpolate(
190
+ Math.abs(displayOffset),
191
+ [0, 1, 2, 2.75],
192
+ [1, 1, 0.6, 0],
193
+ Extrapolation.CLAMP
194
+ );
195
+
196
+ const snappedDisplayOffset =
197
+ index - Math.round(activeIndex.value);
198
+ const zIndex =
199
+ virtualData.length - Math.abs(snappedDisplayOffset);
200
+
201
+ return {
202
+ transform: [{ translateX }, { scale }],
203
+ opacity,
204
+ zIndex,
205
+ };
206
+ });
207
+
208
+ return (
209
+ <Animated.View
210
+ key={item.uniqueId}
211
+ style={[
212
+ styles.card,
213
+ { width: cardWidth, height: cardHeight },
214
+ animatedStyle,
215
+ ]}
216
+ >
217
+ <Image source={{ uri: item.image }} style={styles.cardImage} />
218
+ {item.title && (
219
+ <View style={styles.titleContainer}>
220
+ <Text style={styles.cardTitle}>{item.title}</Text>
221
+ </View>
222
+ )}
223
+ </Animated.View>
224
+ );
225
+ })}
226
+ </Animated.View>
227
+ </GestureDetector>
228
+
229
+ {N_original > 0 && (
230
+ <View style={styles.paginationContainer}>
231
+ {originalData.map((_, i) => {
232
+ const isActiveDot = useDerivedValue(() => {
233
+ return activeDotIndex.value === i;
234
+ });
235
+ const dotStyle = useAnimatedStyle(() => {
236
+ return {
237
+ width: withSpring(isActiveDot.value ? 24 : 8, SPRING_CONFIG),
238
+ height: 8,
239
+ borderRadius: 4,
240
+ backgroundColor: isActiveDot.value ? theme.primary : "#FFFFFF",
241
+ marginHorizontal: 4,
242
+ };
243
+ });
244
+ return <Animated.View key={`dot-${i}`} style={dotStyle} />;
245
+ })}
246
+ </View>
247
+ )}
248
+ </View>
249
+ );
250
+ };
251
+
252
+ const styles = StyleSheet.create({
253
+ container: {
254
+ alignItems: "center",
255
+ justifyContent: "center",
256
+ backgroundColor: "transparent",
257
+ },
258
+ cardContainer: {
259
+ width: SCREEN_WIDTH,
260
+ alignItems: "center",
261
+ justifyContent: "center",
262
+ },
263
+ card: {
264
+ position: "absolute",
265
+ borderRadius: 16,
266
+ backgroundColor: "white",
267
+ shadowColor: "#000",
268
+ shadowOffset: { width: 0, height: 4 },
269
+ shadowOpacity: 0.3,
270
+ shadowRadius: 6,
271
+ elevation: 8,
272
+ overflow: "hidden",
273
+ },
274
+ cardImage: {
275
+ width: "100%",
276
+ height: "100%",
277
+ resizeMode: "cover",
278
+ },
279
+ titleContainer: {
280
+ position: "absolute",
281
+ bottom: 10,
282
+ left: 10,
283
+ right: 10,
284
+ backgroundColor: "rgba(0,0,0,0.5)",
285
+ padding: 8,
286
+ borderRadius: 8,
287
+ },
288
+ cardTitle: {
289
+ color: "white",
290
+ fontSize: 16,
291
+ fontWeight: "bold",
292
+ },
293
+ paginationContainer: {
294
+ flexDirection: "row",
295
+ justifyContent: "center",
296
+ alignItems: "center",
297
+ marginTop: 20,
298
+ marginBottom: 10,
299
+ },
300
+ emptyText: {
301
+ color: "#FFFFFF",
302
+ fontSize: 16,
303
+ },
304
+ });
305
+
306
+ export default CarouselCardStack;
@@ -0,0 +1,2 @@
1
+ export { default as CarouselCardStack } from "./CarouselCardStack";
2
+ export * from "./CarouselCardStack";
@@ -16,4 +16,5 @@ export * from "./Marquee";
16
16
  export * from "./RedeemedVoucher";
17
17
  export * from "./Button";
18
18
  export * from "./Skeleton";
19
- export * from "./CustomIcon"
19
+ export * from "./CustomIcon"
20
+ export * from "./CarouselCardStack";