related-ui-components 2.1.4 → 2.1.5

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,241 @@
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
+ }) => {
42
+ const {
43
+ theme
44
+ } = useTheme();
45
+ const N_original = originalData.length;
46
+ const virtualData = useMemo(() => createVirtualData(originalData), [originalData]);
47
+ const activeIndex = useSharedValue(N_original > 0 ? N_original : 0);
48
+ const gestureTranslateX = useSharedValue(0);
49
+ const contextX = useSharedValue(0);
50
+ useEffect(() => {
51
+ activeIndex.value = N_original > 0 ? N_original : 0;
52
+ gestureTranslateX.value = 0;
53
+ }, [N_original, activeIndex, gestureTranslateX]);
54
+
55
+ // Worklet to handle the loop reset
56
+ const handleLoopReset = () => {
57
+ "worklet";
58
+
59
+ if (N_original === 0) return;
60
+ const currentValue = Math.round(activeIndex.value);
61
+
62
+ // If in the "next" segment (indices >= 2*N_original)
63
+ if (currentValue >= N_original * 2) {
64
+ activeIndex.value = currentValue - N_original;
65
+ }
66
+ // If in the "prev" segment (indices < N_original)
67
+ else if (currentValue < N_original) {
68
+ activeIndex.value = currentValue + N_original;
69
+ }
70
+ };
71
+ const panGesture = Gesture.Pan().onBegin(() => {
72
+ contextX.value = gestureTranslateX.value;
73
+ }).onUpdate(event => {
74
+ gestureTranslateX.value = event.translationX;
75
+ }).onEnd(event => {
76
+ if (virtualData.length === 0) return;
77
+ const threshold = cardWidth / 3;
78
+ let newTargetVirtualIndex = activeIndex.value;
79
+ if (event.translationX < -threshold) {
80
+ newTargetVirtualIndex = activeIndex.value + 1;
81
+ } else if (event.translationX > threshold) {
82
+ newTargetVirtualIndex = activeIndex.value - 1;
83
+ }
84
+
85
+ // Clamp to virtual data bounds
86
+ newTargetVirtualIndex = Math.max(0, Math.min(newTargetVirtualIndex, virtualData.length - 1));
87
+ activeIndex.value = withSpring(newTargetVirtualIndex, SPRING_CONFIG, finished => {
88
+ "worklet";
89
+
90
+ if (finished) {
91
+ handleLoopReset();
92
+ }
93
+ });
94
+ gestureTranslateX.value = withSpring(0, SPRING_CONFIG);
95
+ contextX.value = 0;
96
+ });
97
+ const activeDotIndex = useDerivedValue(() => {
98
+ if (N_original === 0) return 0;
99
+ const currentVal = Math.round(activeIndex.value);
100
+ return (currentVal % N_original + N_original) % N_original;
101
+ });
102
+ if (virtualData.length === 0) {
103
+ return /*#__PURE__*/_jsx(View, {
104
+ style: [styles.container, {
105
+ height: cardHeight + 60
106
+ }],
107
+ children: /*#__PURE__*/_jsx(Text, {
108
+ style: styles.emptyText,
109
+ children: "No items to display"
110
+ })
111
+ });
112
+ }
113
+ return /*#__PURE__*/_jsxs(View, {
114
+ style: [styles.container, {
115
+ height: cardHeight + 60
116
+ }],
117
+ children: [/*#__PURE__*/_jsx(GestureDetector, {
118
+ gesture: panGesture,
119
+ children: /*#__PURE__*/_jsx(Animated.View, {
120
+ style: [styles.cardContainer, {
121
+ height: cardHeight
122
+ }],
123
+ children: virtualData.map((item, index) => {
124
+ const animatedStyle = useAnimatedStyle(() => {
125
+ const currentCardDragOffset = gestureTranslateX.value / cardWidth;
126
+ const displayOffset = index - (activeIndex.value - currentCardDragOffset);
127
+ const scale = interpolate(displayOffset, [-1, 0, 1], [SIDE_CARD_SCALE_FACTOR, ACTIVE_CARD_SCALE, SIDE_CARD_SCALE_FACTOR], Extrapolation.CLAMP);
128
+ const translateX = interpolate(displayOffset, [-1, 0, 1], [-SIDE_CARD_TRANSLATE_X, 0, SIDE_CARD_TRANSLATE_X], Extrapolation.CLAMP);
129
+ const opacity = interpolate(Math.abs(displayOffset), [0, 1, 2, 2.75], [1, 1, 0.6, 0], Extrapolation.CLAMP);
130
+ const snappedDisplayOffset = index - Math.round(activeIndex.value);
131
+ const zIndex = virtualData.length - Math.abs(snappedDisplayOffset);
132
+ return {
133
+ transform: [{
134
+ translateX
135
+ }, {
136
+ scale
137
+ }],
138
+ opacity,
139
+ zIndex
140
+ };
141
+ });
142
+ return /*#__PURE__*/_jsxs(Animated.View, {
143
+ style: [styles.card, {
144
+ width: cardWidth,
145
+ height: cardHeight
146
+ }, animatedStyle],
147
+ children: [/*#__PURE__*/_jsx(Image, {
148
+ source: {
149
+ uri: item.image
150
+ },
151
+ style: styles.cardImage
152
+ }), item.title && /*#__PURE__*/_jsx(View, {
153
+ style: styles.titleContainer,
154
+ children: /*#__PURE__*/_jsx(Text, {
155
+ style: styles.cardTitle,
156
+ children: item.title
157
+ })
158
+ })]
159
+ }, item.uniqueId);
160
+ })
161
+ })
162
+ }), N_original > 0 && /*#__PURE__*/_jsx(View, {
163
+ style: styles.paginationContainer,
164
+ children: originalData.map((_, i) => {
165
+ const isActiveDot = useDerivedValue(() => {
166
+ return activeDotIndex.value === i;
167
+ });
168
+ const dotStyle = useAnimatedStyle(() => {
169
+ return {
170
+ width: withSpring(isActiveDot.value ? 24 : 8, SPRING_CONFIG),
171
+ height: 8,
172
+ borderRadius: 4,
173
+ backgroundColor: isActiveDot.value ? theme.primary : "#FFFFFF",
174
+ marginHorizontal: 4
175
+ };
176
+ });
177
+ return /*#__PURE__*/_jsx(Animated.View, {
178
+ style: dotStyle
179
+ }, `dot-${i}`);
180
+ })
181
+ })]
182
+ });
183
+ };
184
+ const styles = StyleSheet.create({
185
+ container: {
186
+ alignItems: "center",
187
+ justifyContent: "center",
188
+ backgroundColor: "#212121"
189
+ },
190
+ cardContainer: {
191
+ width: SCREEN_WIDTH,
192
+ alignItems: "center",
193
+ justifyContent: "center"
194
+ },
195
+ card: {
196
+ position: "absolute",
197
+ borderRadius: 16,
198
+ backgroundColor: "white",
199
+ shadowColor: "#000",
200
+ shadowOffset: {
201
+ width: 0,
202
+ height: 4
203
+ },
204
+ shadowOpacity: 0.3,
205
+ shadowRadius: 6,
206
+ elevation: 8,
207
+ overflow: "hidden"
208
+ },
209
+ cardImage: {
210
+ width: "100%",
211
+ height: "100%",
212
+ resizeMode: "cover"
213
+ },
214
+ titleContainer: {
215
+ position: "absolute",
216
+ bottom: 10,
217
+ left: 10,
218
+ right: 10,
219
+ backgroundColor: "rgba(0,0,0,0.5)",
220
+ padding: 8,
221
+ borderRadius: 8
222
+ },
223
+ cardTitle: {
224
+ color: "white",
225
+ fontSize: 16,
226
+ fontWeight: "bold"
227
+ },
228
+ paginationContainer: {
229
+ flexDirection: "row",
230
+ justifyContent: "center",
231
+ alignItems: "center",
232
+ marginTop: 20,
233
+ marginBottom: 10
234
+ },
235
+ emptyText: {
236
+ color: "#FFFFFF",
237
+ fontSize: 16
238
+ }
239
+ });
240
+ export default CarouselCardStack;
241
+ //# 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","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","backgroundColor","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,14 @@
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
+ }
12
+ declare const CarouselCardStack: React.FC<CarouselCardStackProps>;
13
+ export default CarouselCardStack;
14
+ //# 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;CACpB;AAuBD,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAsLvD,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.5",
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,304 @@
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
+ }
44
+
45
+ const createVirtualData = (
46
+ originalData: CarouselItemOriginal[]
47
+ ): CarouselItemVirtual[] => {
48
+ if (!originalData || originalData.length === 0) return [];
49
+
50
+ const prefixItems = (
51
+ items: CarouselItemOriginal[],
52
+ segmentPrefix: string
53
+ ): CarouselItemVirtual[] =>
54
+ items.map((item, idx) => ({
55
+ ...item,
56
+ uniqueId: `${segmentPrefix}-${item.id}-${idx}`,
57
+ }));
58
+
59
+ const prevSegment = prefixItems(originalData, "prev");
60
+ const currSegment = prefixItems(originalData, "curr");
61
+ const nextSegment = prefixItems(originalData, "next");
62
+
63
+ return [...prevSegment, ...currSegment, ...nextSegment];
64
+ };
65
+
66
+ const CarouselCardStack: React.FC<CarouselCardStackProps> = ({
67
+ data: originalData,
68
+ cardHeight = CARD_HEIGHT,
69
+ cardWidth = CARD_WIDTH,
70
+ }) => {
71
+ const { theme } = useTheme();
72
+
73
+ const N_original = originalData.length;
74
+
75
+ const virtualData = useMemo(
76
+ () => createVirtualData(originalData),
77
+ [originalData]
78
+ );
79
+
80
+ const activeIndex = useSharedValue(N_original > 0 ? N_original : 0);
81
+ const gestureTranslateX = useSharedValue(0);
82
+ const contextX = useSharedValue(0);
83
+
84
+ useEffect(() => {
85
+ activeIndex.value = N_original > 0 ? N_original : 0;
86
+ gestureTranslateX.value = 0;
87
+ }, [N_original, activeIndex, gestureTranslateX]);
88
+
89
+ // Worklet to handle the loop reset
90
+ const handleLoopReset = () => {
91
+ "worklet";
92
+ if (N_original === 0) return;
93
+
94
+ const currentValue = Math.round(activeIndex.value);
95
+
96
+ // If in the "next" segment (indices >= 2*N_original)
97
+ if (currentValue >= N_original * 2) {
98
+ activeIndex.value = currentValue - N_original;
99
+ }
100
+ // If in the "prev" segment (indices < N_original)
101
+ else if (currentValue < N_original) {
102
+ activeIndex.value = currentValue + N_original;
103
+ }
104
+ };
105
+
106
+ const panGesture = Gesture.Pan()
107
+ .onBegin(() => {
108
+ contextX.value = gestureTranslateX.value;
109
+ })
110
+ .onUpdate((event) => {
111
+ gestureTranslateX.value = event.translationX;
112
+ })
113
+ .onEnd((event) => {
114
+ if (virtualData.length === 0) return;
115
+
116
+ const threshold = cardWidth / 3;
117
+ let newTargetVirtualIndex = activeIndex.value;
118
+
119
+ if (event.translationX < -threshold) {
120
+ newTargetVirtualIndex = activeIndex.value + 1;
121
+ } else if (event.translationX > threshold) {
122
+ newTargetVirtualIndex = activeIndex.value - 1;
123
+ }
124
+
125
+ // Clamp to virtual data bounds
126
+ newTargetVirtualIndex = Math.max(
127
+ 0,
128
+ Math.min(newTargetVirtualIndex, virtualData.length - 1)
129
+ );
130
+
131
+ activeIndex.value = withSpring(
132
+ newTargetVirtualIndex,
133
+ SPRING_CONFIG,
134
+ (finished) => {
135
+ "worklet";
136
+ if (finished) {
137
+ handleLoopReset();
138
+ }
139
+ }
140
+ );
141
+ gestureTranslateX.value = withSpring(0, SPRING_CONFIG);
142
+ contextX.value = 0;
143
+ });
144
+
145
+ const activeDotIndex = useDerivedValue(() => {
146
+ if (N_original === 0) return 0;
147
+ const currentVal = Math.round(activeIndex.value);
148
+ return ((currentVal % N_original) + N_original) % N_original;
149
+ });
150
+
151
+ if (virtualData.length === 0) {
152
+ return (
153
+ <View style={[styles.container, { height: cardHeight + 60 }]}>
154
+ <Text style={styles.emptyText}>No items to display</Text>
155
+ </View>
156
+ );
157
+ }
158
+
159
+ return (
160
+ <View style={[styles.container, { height: cardHeight + 60 }]}>
161
+ <GestureDetector gesture={panGesture}>
162
+ <Animated.View style={[styles.cardContainer, { height: cardHeight }]}>
163
+ {virtualData.map((item, index) => {
164
+ const animatedStyle = useAnimatedStyle(() => {
165
+ const currentCardDragOffset = gestureTranslateX.value / cardWidth;
166
+ const displayOffset =
167
+ index - (activeIndex.value - currentCardDragOffset);
168
+
169
+ const scale = interpolate(
170
+ displayOffset,
171
+ [-1, 0, 1],
172
+ [
173
+ SIDE_CARD_SCALE_FACTOR,
174
+ ACTIVE_CARD_SCALE,
175
+ SIDE_CARD_SCALE_FACTOR,
176
+ ],
177
+ Extrapolation.CLAMP
178
+ );
179
+
180
+ const translateX = interpolate(
181
+ displayOffset,
182
+ [-1, 0, 1],
183
+ [-SIDE_CARD_TRANSLATE_X, 0, SIDE_CARD_TRANSLATE_X],
184
+ Extrapolation.CLAMP
185
+ );
186
+
187
+ const opacity = interpolate(
188
+ Math.abs(displayOffset),
189
+ [0, 1, 2, 2.75],
190
+ [1, 1, 0.6, 0],
191
+ Extrapolation.CLAMP
192
+ );
193
+
194
+ const snappedDisplayOffset =
195
+ index - Math.round(activeIndex.value);
196
+ const zIndex =
197
+ virtualData.length - Math.abs(snappedDisplayOffset);
198
+
199
+ return {
200
+ transform: [{ translateX }, { scale }],
201
+ opacity,
202
+ zIndex,
203
+ };
204
+ });
205
+
206
+ return (
207
+ <Animated.View
208
+ key={item.uniqueId}
209
+ style={[
210
+ styles.card,
211
+ { width: cardWidth, height: cardHeight },
212
+ animatedStyle,
213
+ ]}
214
+ >
215
+ <Image source={{ uri: item.image }} style={styles.cardImage} />
216
+ {item.title && (
217
+ <View style={styles.titleContainer}>
218
+ <Text style={styles.cardTitle}>{item.title}</Text>
219
+ </View>
220
+ )}
221
+ </Animated.View>
222
+ );
223
+ })}
224
+ </Animated.View>
225
+ </GestureDetector>
226
+
227
+ {N_original > 0 && (
228
+ <View style={styles.paginationContainer}>
229
+ {originalData.map((_, i) => {
230
+ const isActiveDot = useDerivedValue(() => {
231
+ return activeDotIndex.value === i;
232
+ });
233
+ const dotStyle = useAnimatedStyle(() => {
234
+ return {
235
+ width: withSpring(isActiveDot.value ? 24 : 8, SPRING_CONFIG),
236
+ height: 8,
237
+ borderRadius: 4,
238
+ backgroundColor: isActiveDot.value ? theme.primary : "#FFFFFF",
239
+ marginHorizontal: 4,
240
+ };
241
+ });
242
+ return <Animated.View key={`dot-${i}`} style={dotStyle} />;
243
+ })}
244
+ </View>
245
+ )}
246
+ </View>
247
+ );
248
+ };
249
+
250
+ const styles = StyleSheet.create({
251
+ container: {
252
+ alignItems: "center",
253
+ justifyContent: "center",
254
+ backgroundColor: "#212121",
255
+ },
256
+ cardContainer: {
257
+ width: SCREEN_WIDTH,
258
+ alignItems: "center",
259
+ justifyContent: "center",
260
+ },
261
+ card: {
262
+ position: "absolute",
263
+ borderRadius: 16,
264
+ backgroundColor: "white",
265
+ shadowColor: "#000",
266
+ shadowOffset: { width: 0, height: 4 },
267
+ shadowOpacity: 0.3,
268
+ shadowRadius: 6,
269
+ elevation: 8,
270
+ overflow: "hidden",
271
+ },
272
+ cardImage: {
273
+ width: "100%",
274
+ height: "100%",
275
+ resizeMode: "cover",
276
+ },
277
+ titleContainer: {
278
+ position: "absolute",
279
+ bottom: 10,
280
+ left: 10,
281
+ right: 10,
282
+ backgroundColor: "rgba(0,0,0,0.5)",
283
+ padding: 8,
284
+ borderRadius: 8,
285
+ },
286
+ cardTitle: {
287
+ color: "white",
288
+ fontSize: 16,
289
+ fontWeight: "bold",
290
+ },
291
+ paginationContainer: {
292
+ flexDirection: "row",
293
+ justifyContent: "center",
294
+ alignItems: "center",
295
+ marginTop: 20,
296
+ marginBottom: 10,
297
+ },
298
+ emptyText: {
299
+ color: "#FFFFFF",
300
+ fontSize: 16,
301
+ },
302
+ });
303
+
304
+ 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";