related-ui-components 2.1.3 → 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.
Files changed (26) hide show
  1. package/lib/module/app.js +55 -40
  2. package/lib/module/app.js.map +1 -1
  3. package/lib/module/components/Card/templates/SelaDealCard.js +17 -3
  4. package/lib/module/components/Card/templates/SelaDealCard.js.map +1 -1
  5. package/lib/module/components/CarouselCardStack/CarouselCardStack.js +241 -0
  6. package/lib/module/components/CarouselCardStack/CarouselCardStack.js.map +1 -0
  7. package/lib/module/components/CarouselCardStack/index.js +5 -0
  8. package/lib/module/components/CarouselCardStack/index.js.map +1 -0
  9. package/lib/module/components/index.js +1 -0
  10. package/lib/module/components/index.js.map +1 -1
  11. package/lib/typescript/src/app.d.ts +2 -2
  12. package/lib/typescript/src/app.d.ts.map +1 -1
  13. package/lib/typescript/src/components/Card/templates/SelaDealCard.d.ts +1 -0
  14. package/lib/typescript/src/components/Card/templates/SelaDealCard.d.ts.map +1 -1
  15. package/lib/typescript/src/components/CarouselCardStack/CarouselCardStack.d.ts +14 -0
  16. package/lib/typescript/src/components/CarouselCardStack/CarouselCardStack.d.ts.map +1 -0
  17. package/lib/typescript/src/components/CarouselCardStack/index.d.ts +3 -0
  18. package/lib/typescript/src/components/CarouselCardStack/index.d.ts.map +1 -0
  19. package/lib/typescript/src/components/index.d.ts +1 -0
  20. package/lib/typescript/src/components/index.d.ts.map +1 -1
  21. package/package.json +3 -2
  22. package/src/app.tsx +53 -30
  23. package/src/components/Card/templates/SelaDealCard.tsx +29 -8
  24. package/src/components/CarouselCardStack/CarouselCardStack.tsx +304 -0
  25. package/src/components/CarouselCardStack/index.ts +2 -0
  26. package/src/components/index.ts +2 -1
package/lib/module/app.js CHANGED
@@ -1,48 +1,63 @@
1
1
  "use strict";
2
2
 
3
- import React, { useEffect } from "react";
4
- import { I18nManager, 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
- }, []);
3
+ import React from "react";
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: true,
29
- providerName: "Altanfeethi",
30
- providerNameStyle: {
31
- color: "yellow"
32
- } // Specific style for provider name
33
- ,
34
- description: "1 Year Membership",
35
- descriptionStyle: {
36
- color: "white"
37
- },
38
- price: "20,000 pts",
39
- onPress: () => console.log("Horizontal Sela Card Pressed"),
40
- width: 177 // Example width
41
- // 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
42
49
  })
43
- })
50
+ })]
44
51
  })
45
52
  });
46
53
  };
47
- 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;
48
63
  //# sourceMappingURL=app.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","I18nManager","SafeAreaView","SelaDealCard","RelatedProvider","jsx","_jsx","Fragment","_Fragment","MyScreen","allowRTL","forceRTL","children","style","padding","variant","backgroundImage","uri","label","lockOverlay","providerName","providerNameStyle","color","description","descriptionStyle","price","onPress","console","log","width"],"sourceRoot":"..\\..\\src","sources":["app.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAkB,OAAO;AAClD,SAASC,WAAW,EAAEC,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;EACrBT,SAAS,CAAC,MAAM;IACdC,WAAW,CAACS,QAAQ,CAAC,IAAI,CAAC;IAC1BT,WAAW,CAACU,QAAQ,CAAC,IAAI,CAAC;EAC5B,CAAC,EAAE,EAAE,CAAC;EACN,oBACEL,IAAA,CAAAE,SAAA;IAAAI,QAAA,eACEN,IAAA,CAACF,eAAe;MAAAQ,QAAA,eACdN,IAAA,CAACJ,YAAY;QAACW,KAAK,EAAE;UAAEC,OAAO,EAAE;QAAG,CAAE;QAAAF,QAAA,eACnCN,IAAA,CAACH,YAAY;UACXY,OAAO,EAAC;UACR;UAAA;UACAC,eAAe,EAAE;YACfC,GAAG,EAAE;UACP,CAAE,CAAC;UAAA;UACHC,KAAK,EAAC,OAAO;UACbC,WAAW;UACXC,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,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,eAAepB,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":[]}
@@ -7,6 +7,7 @@ import Card from "../Card.js"; // Adjust path to your Card component
7
7
  import { useTheme } from "../../../theme/ThemeContext.js"; // Adjust path
8
8
 
9
9
  import { LockOverlay } from "../../LockOverlay/index.js";
10
+ import { BlurView } from "expo-blur";
10
11
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
12
  const SelaDealCard = ({
12
13
  variant,
@@ -30,7 +31,8 @@ const SelaDealCard = ({
30
31
  // Default based on images
31
32
  darkOverlayEnabled = true,
32
33
  darkOverlayColor = "rgba(0, 0, 0, 0.3)",
33
- lockOverlay = false
34
+ lockOverlay = false,
35
+ priceContainerBlur
34
36
  }) => {
35
37
  const {
36
38
  theme,
@@ -130,12 +132,23 @@ const SelaDealCard = ({
130
132
  style: descriptionTextStyle,
131
133
  children: description
132
134
  })]
133
- }), price && /*#__PURE__*/_jsx(View, {
135
+ }), price && priceContainerBlur && /*#__PURE__*/_jsx(BlurView, {
136
+ experimentalBlurMethod: "dimezisBlurView",
137
+ intensity: priceContainerBlur,
138
+ tint: "dark",
134
139
  style: finalPriceContainerStyle,
135
140
  children: /*#__PURE__*/_jsx(Text, {
136
141
  style: finalPriceStyle,
137
142
  children: price
138
143
  })
144
+ }), price && !priceContainerBlur && /*#__PURE__*/_jsx(View, {
145
+ style: [finalPriceContainerStyle, {
146
+ backgroundColor: theme.primary
147
+ }],
148
+ children: /*#__PURE__*/_jsx(Text, {
149
+ style: finalPriceStyle,
150
+ children: price
151
+ })
139
152
  })]
140
153
  })]
141
154
  })]
@@ -176,7 +189,8 @@ const getStyles = (theme, isRTL) => StyleSheet.create({
176
189
  paddingVertical: 8,
177
190
  paddingHorizontal: 16,
178
191
  borderRadius: 10,
179
- backgroundColor: theme.primary
192
+ overflow: "hidden"
193
+ // backgroundColor: theme.primary,
180
194
  },
181
195
  priceTextBase: {
182
196
  fontSize: 16,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useState","View","Text","StyleSheet","Image","Card","useTheme","LockOverlay","jsx","_jsx","jsxs","_jsxs","SelaDealCard","variant","backgroundImage","label","labelStyle","labelContainerStyle","providerName","providerNameStyle","description","descriptionStyle","price","priceStyle","priceContainerStyle","onPress","style","width","height","isRTL","propIsRTL","borderRadius","darkOverlayEnabled","darkOverlayColor","lockOverlay","theme","themeIsRTL","undefined","styles","getStyles","dynamicHeight","setDynamicHeight","uri","getSize","imgWidth","imgHeight","aspectRatio","finalLabelContainerStyle","labelContainerBase","finalLabelStyle","labelTextBase","finalPriceContainerStyle","priceContainerBase","priceContainerHorizontal","priceContainerVertical","finalPriceStyle","priceTextBase","providerTextStyle","providerNameBase","color","onSurface","textAlign","descriptionTextStyle","descriptionBase","cardBase","source","resizeMode","children","absoluteFill","backgroundColor","visible","contentPosition","iconSize","text","overlayOpacity","overlayContainer","topSection","alignItems","bottomContentHorizontal","textBlockHorizontal","bottomContentVertical","textBlockVertical","create","overflow","position","flex","padding","justifyContent","paddingVertical","paddingHorizontal","background","fontWeight","fontSize","onBackground","marginBottom","secondary","helper","primary","onPrimary","flexDirection","marginRight","alignSelf"],"sourceRoot":"..\\..\\..\\..\\..\\src","sources":["components/Card/templates/SelaDealCard.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useState","View","Text","StyleSheet","Image","Card","useTheme","LockOverlay","BlurView","jsx","_jsx","jsxs","_jsxs","SelaDealCard","variant","backgroundImage","label","labelStyle","labelContainerStyle","providerName","providerNameStyle","description","descriptionStyle","price","priceStyle","priceContainerStyle","onPress","style","width","height","isRTL","propIsRTL","borderRadius","darkOverlayEnabled","darkOverlayColor","lockOverlay","priceContainerBlur","theme","themeIsRTL","undefined","styles","getStyles","dynamicHeight","setDynamicHeight","uri","getSize","imgWidth","imgHeight","aspectRatio","finalLabelContainerStyle","labelContainerBase","finalLabelStyle","labelTextBase","finalPriceContainerStyle","priceContainerBase","priceContainerHorizontal","priceContainerVertical","finalPriceStyle","priceTextBase","providerTextStyle","providerNameBase","color","onSurface","textAlign","descriptionTextStyle","descriptionBase","cardBase","source","resizeMode","children","absoluteFill","backgroundColor","visible","contentPosition","iconSize","text","overlayOpacity","overlayContainer","topSection","alignItems","bottomContentHorizontal","textBlockHorizontal","bottomContentVertical","textBlockVertical","experimentalBlurMethod","intensity","tint","primary","create","overflow","position","flex","padding","justifyContent","paddingVertical","paddingHorizontal","background","fontWeight","fontSize","onBackground","marginBottom","secondary","helper","onPrimary","flexDirection","marginRight","alignSelf"],"sourceRoot":"..\\..\\..\\..\\..\\src","sources":["components/Card/templates/SelaDealCard.tsx"],"mappings":"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","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,yBA8Bb,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"}
@@ -22,6 +22,7 @@ interface SelaDealCardProps {
22
22
  contentColor?: string;
23
23
  labelBackgroundColor?: string;
24
24
  labelTextColor?: string;
25
+ priceContainerBlur?: number;
25
26
  priceBackgroundColor?: string;
26
27
  priceTextColor?: string;
27
28
  darkOverlayEnabled?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"SelaDealCard.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Card/templates/SelaDealCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAEL,SAAS,EACT,SAAS,EAGT,SAAS,EACT,cAAc,EAGd,cAAc,EACf,MAAM,cAAc,CAAC;AAMtB,UAAU,iBAAiB;IACzB,OAAO,EAAE,YAAY,GAAG,UAAU,CAAC;IACnC,eAAe,EAAE,cAAc,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,mBAAmB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,mBAAmB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAqK7C,CAAC;AAkEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"SelaDealCard.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Card/templates/SelaDealCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAEL,SAAS,EACT,SAAS,EAGT,SAAS,EACT,cAAc,EAGd,cAAc,EACf,MAAM,cAAc,CAAC;AAOtB,UAAU,iBAAiB;IACzB,OAAO,EAAE,YAAY,GAAG,UAAU,CAAC;IACnC,eAAe,EAAE,cAAc,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,mBAAmB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,mBAAmB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAuL7C,CAAC;AAmEF,eAAe,YAAY,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.3",
3
+ "version": "2.1.5",
4
4
  "main": "./src/index.ts",
5
5
  "scripts": {
6
6
  "start": "expo start",
@@ -29,7 +29,8 @@
29
29
  "react-native-gesture-handler": "~2.24.0",
30
30
  "react-native-qrcode-svg": "^6.3.15",
31
31
  "react-native-reanimated": "~3.17.4",
32
- "react-native-svg": "15.11.2"
32
+ "react-native-svg": "15.11.2",
33
+ "expo-blur": "~14.1.4"
33
34
  },
34
35
  "devDependencies": {
35
36
  "@babel/core": "^7.25.2",
package/src/app.tsx CHANGED
@@ -1,38 +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
- price="20,000 pts"
28
- onPress={() => console.log("Horizontal Sela Card Pressed")}
29
- width={177} // Example width
30
- // height={180} // Example height
31
- />
43
+ <GestureHandlerRootView style={{ flex: 1 }}>
44
+ <StatusBar barStyle="light-content" />
45
+ <SafeAreaView style={styles.appContainer}>
46
+ <CarouselCardStack data={DUMMY_DATA} />
32
47
  </SafeAreaView>
33
- </RelatedProvider>
48
+ </GestureHandlerRootView>
34
49
  </>
35
50
  );
36
51
  };
37
52
 
38
- 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;
@@ -16,6 +16,7 @@ import Card from "../Card"; // Adjust path to your Card component
16
16
  import { useTheme } from "../../../theme/ThemeContext"; // Adjust path
17
17
  import { ThemeType } from "../../../theme";
18
18
  import { LockOverlay } from "../../LockOverlay";
19
+ import { BlurView } from "expo-blur";
19
20
 
20
21
  interface SelaDealCardProps {
21
22
  variant: "horizontal" | "vertical";
@@ -39,6 +40,7 @@ interface SelaDealCardProps {
39
40
  contentColor?: string; // For text like providerName, description on the image
40
41
  labelBackgroundColor?: string;
41
42
  labelTextColor?: string;
43
+ priceContainerBlur?: number;
42
44
  priceBackgroundColor?: string;
43
45
  priceTextColor?: string;
44
46
  darkOverlayEnabled?: boolean; // New prop
@@ -68,6 +70,7 @@ const SelaDealCard: React.FC<SelaDealCardProps> = ({
68
70
  darkOverlayEnabled = true,
69
71
  darkOverlayColor = "rgba(0, 0, 0, 0.3)",
70
72
  lockOverlay = false,
73
+ priceContainerBlur,
71
74
  }) => {
72
75
  const { theme, isRTL: themeIsRTL } = useTheme();
73
76
  const isRTL = propIsRTL !== undefined ? propIsRTL : themeIsRTL;
@@ -133,7 +136,11 @@ const SelaDealCard: React.FC<SelaDealCardProps> = ({
133
136
  return (
134
137
  <Card
135
138
  onPress={onPress}
136
- style={[styles.cardBase, { borderRadius, width, height: dynamicHeight || height }, style]}
139
+ style={[
140
+ styles.cardBase,
141
+ { borderRadius, width, height: dynamicHeight || height },
142
+ style,
143
+ ]}
137
144
  backgroundImage={{
138
145
  source: backgroundImage,
139
146
  resizeMode: "cover",
@@ -151,9 +158,7 @@ const SelaDealCard: React.FC<SelaDealCardProps> = ({
151
158
 
152
159
  <LockOverlay
153
160
  visible={lockOverlay}
154
- contentPosition={
155
- isRTL ? "top-left" : "top-right"
156
- }
161
+ contentPosition={isRTL ? "top-left" : "top-right"}
157
162
  iconSize={24}
158
163
  text={""}
159
164
  overlayOpacity={0.4}
@@ -164,7 +169,7 @@ const SelaDealCard: React.FC<SelaDealCardProps> = ({
164
169
  style={[
165
170
  styles.topSection,
166
171
  {
167
- alignItems: "flex-start"
172
+ alignItems: "flex-start",
168
173
  },
169
174
  ]}
170
175
  >
@@ -201,8 +206,23 @@ const SelaDealCard: React.FC<SelaDealCardProps> = ({
201
206
  <Text style={descriptionTextStyle}>{description}</Text>
202
207
  )}
203
208
  </View>
204
- {price && (
205
- <View style={finalPriceContainerStyle}>
209
+ {price && priceContainerBlur && (
210
+ <BlurView
211
+ experimentalBlurMethod="dimezisBlurView"
212
+ intensity={priceContainerBlur}
213
+ tint="dark"
214
+ style={finalPriceContainerStyle}
215
+ >
216
+ <Text style={finalPriceStyle}>{price}</Text>
217
+ </BlurView>
218
+ )}
219
+ {price && !priceContainerBlur && (
220
+ <View
221
+ style={[
222
+ finalPriceContainerStyle,
223
+ { backgroundColor: theme.primary },
224
+ ]}
225
+ >
206
226
  <Text style={finalPriceStyle}>{price}</Text>
207
227
  </View>
208
228
  )}
@@ -249,7 +269,8 @@ const getStyles = (theme: ThemeType, isRTL: boolean) =>
249
269
  paddingVertical: 8,
250
270
  paddingHorizontal: 16,
251
271
  borderRadius: 10,
252
- backgroundColor: theme.primary,
272
+ overflow: "hidden",
273
+ // backgroundColor: theme.primary,
253
274
  },
254
275
  priceTextBase: {
255
276
  fontSize: 16,
@@ -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";