related-ui-components 2.0.7 → 2.0.8
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.
|
@@ -1,111 +1,126 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
// src/components/Card/Card.tsx
|
|
3
4
|
import React from "react";
|
|
4
|
-
import { View, TouchableOpacity, StyleSheet, ImageBackground
|
|
5
|
+
import { View, TouchableOpacity, StyleSheet, ImageBackground
|
|
6
|
+
// Import LayoutChangeEvent
|
|
7
|
+
} from "react-native";
|
|
8
|
+
// Assuming types.ts defines CardProps
|
|
5
9
|
import { useTheme } from "../../theme/ThemeContext.js";
|
|
6
10
|
import { LinearGradient } from "expo-linear-gradient";
|
|
7
|
-
|
|
11
|
+
|
|
12
|
+
// Extend CardProps to include onLayout
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
14
|
const Card = ({
|
|
9
15
|
children,
|
|
10
16
|
style,
|
|
11
17
|
onPress,
|
|
18
|
+
onLayout,
|
|
19
|
+
// Destructure onLayout
|
|
12
20
|
disabled = false,
|
|
13
|
-
elevation
|
|
21
|
+
// elevation, // Not used in your current styles
|
|
14
22
|
testID,
|
|
15
|
-
variant,
|
|
23
|
+
// variant, // Not used
|
|
16
24
|
backgroundColor,
|
|
17
|
-
borderColor,
|
|
25
|
+
// borderColor, // Not used
|
|
18
26
|
borderRadius = 8,
|
|
19
27
|
backgroundImage,
|
|
20
28
|
gradient
|
|
21
|
-
// margin,
|
|
22
|
-
// padding,
|
|
23
29
|
}) => {
|
|
24
30
|
const {
|
|
25
31
|
theme
|
|
26
32
|
} = useTheme();
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}, style, backgroundImage && {
|
|
37
|
-
backgroundColor: "transparent"
|
|
38
|
-
}];
|
|
33
|
+
const cardRootStyle = [styles.card, {
|
|
34
|
+
borderRadius
|
|
35
|
+
},
|
|
36
|
+
// If there's a background image, card background should be transparent
|
|
37
|
+
// so the image is visible. Otherwise, use provided backgroundColor or theme.
|
|
38
|
+
{
|
|
39
|
+
backgroundColor: backgroundImage ? "transparent" : backgroundColor || theme.background
|
|
40
|
+
}, disabled && styles.disabled, style // This will include the width and calculated height from SelaDealCard
|
|
41
|
+
];
|
|
39
42
|
const renderCardContent = () => {
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
// The children (SelaDealCard's overlayContainer) are rendered on top of
|
|
44
|
+
// the ImageBackground or Gradient.
|
|
45
|
+
return children;
|
|
46
|
+
};
|
|
47
|
+
if (onPress) {
|
|
48
|
+
return /*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
49
|
+
style: cardRootStyle,
|
|
50
|
+
onPress: onPress,
|
|
51
|
+
onLayout: onLayout // Apply onLayout here
|
|
52
|
+
,
|
|
53
|
+
disabled: disabled,
|
|
54
|
+
testID: testID,
|
|
55
|
+
activeOpacity: 0.9,
|
|
56
|
+
accessibilityRole: "button",
|
|
57
|
+
children: [backgroundImage && /*#__PURE__*/_jsx(ImageBackground, {
|
|
42
58
|
source: backgroundImage.source,
|
|
43
|
-
style: [
|
|
59
|
+
style: [StyleSheet.absoluteFillObject, backgroundImage.style] // Fills parent
|
|
60
|
+
,
|
|
44
61
|
imageStyle: [{
|
|
45
62
|
borderRadius
|
|
46
63
|
}, backgroundImage.imageStyle],
|
|
47
64
|
resizeMode: backgroundImage.resizeMode || "cover",
|
|
48
|
-
blurRadius: backgroundImage.blurRadius
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
children: children
|
|
54
|
-
})
|
|
55
|
-
});
|
|
56
|
-
} else if (gradient) {
|
|
57
|
-
return /*#__PURE__*/_jsx(LinearGradient, {
|
|
65
|
+
blurRadius: backgroundImage.blurRadius
|
|
66
|
+
}), gradient && !backgroundImage &&
|
|
67
|
+
/*#__PURE__*/
|
|
68
|
+
// Render gradient if no image and gradient exists
|
|
69
|
+
_jsx(LinearGradient, {
|
|
58
70
|
colors: gradient.colors,
|
|
59
71
|
start: gradient.start,
|
|
60
72
|
end: gradient.end,
|
|
61
|
-
style: [
|
|
73
|
+
style: [StyleSheet.absoluteFillObject,
|
|
74
|
+
// Gradient also fills
|
|
75
|
+
{
|
|
62
76
|
borderRadius
|
|
63
|
-
}, gradient.style]
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
if (onPress) {
|
|
71
|
-
return /*#__PURE__*/_jsx(TouchableOpacity, {
|
|
72
|
-
style: cardStyle,
|
|
73
|
-
onPress: onPress,
|
|
74
|
-
disabled: disabled,
|
|
75
|
-
testID: testID,
|
|
76
|
-
activeOpacity: 0.9,
|
|
77
|
-
accessibilityRole: "button",
|
|
78
|
-
accessibilityLabel: "Card",
|
|
79
|
-
children: renderCardContent()
|
|
77
|
+
}, gradient.style]
|
|
78
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
79
|
+
style: styles.contentWrapper,
|
|
80
|
+
children: renderCardContent()
|
|
81
|
+
})]
|
|
80
82
|
});
|
|
81
83
|
}
|
|
82
|
-
return /*#__PURE__*/
|
|
83
|
-
style:
|
|
84
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
85
|
+
style: cardRootStyle,
|
|
84
86
|
testID: testID,
|
|
85
|
-
|
|
87
|
+
onLayout: onLayout,
|
|
88
|
+
children: [backgroundImage && /*#__PURE__*/_jsx(ImageBackground, {
|
|
89
|
+
source: backgroundImage.source,
|
|
90
|
+
style: [StyleSheet.absoluteFillObject, backgroundImage.style],
|
|
91
|
+
imageStyle: [{
|
|
92
|
+
borderRadius
|
|
93
|
+
}, backgroundImage.imageStyle],
|
|
94
|
+
resizeMode: backgroundImage.resizeMode || "cover",
|
|
95
|
+
blurRadius: backgroundImage.blurRadius
|
|
96
|
+
}), gradient && !backgroundImage && /*#__PURE__*/_jsx(LinearGradient, {
|
|
97
|
+
colors: gradient.colors,
|
|
98
|
+
start: gradient.start,
|
|
99
|
+
end: gradient.end,
|
|
100
|
+
style: [StyleSheet.absoluteFillObject, {
|
|
101
|
+
borderRadius
|
|
102
|
+
}, gradient.style]
|
|
103
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
104
|
+
style: styles.contentWrapper,
|
|
105
|
+
children: renderCardContent()
|
|
106
|
+
})]
|
|
86
107
|
});
|
|
87
108
|
};
|
|
88
109
|
const styles = StyleSheet.create({
|
|
89
110
|
card: {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
},
|
|
94
|
-
backgroundImage: {
|
|
95
|
-
width: "100%",
|
|
96
|
-
height: "100%"
|
|
111
|
+
overflow: "hidden",
|
|
112
|
+
// Important for absoluteFillObject with borderRadius
|
|
113
|
+
position: "relative" // For absolute positioning context
|
|
97
114
|
},
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
backgroundColor: "transparent"
|
|
115
|
+
disabled: {
|
|
116
|
+
opacity: 0.6
|
|
101
117
|
},
|
|
102
|
-
|
|
118
|
+
contentWrapper: {
|
|
119
|
+
// Ensures content is layered above background/gradient
|
|
103
120
|
flex: 1,
|
|
104
|
-
|
|
105
|
-
height: "100%",
|
|
106
|
-
justifyContent: "flex-start",
|
|
107
|
-
alignItems: "flex-start"
|
|
121
|
+
backgroundColor: "transparent" // Content wrapper itself is transparent
|
|
108
122
|
}
|
|
123
|
+
// No specific styles for backgroundImage or gradient here as they use absoluteFillObject
|
|
109
124
|
});
|
|
110
125
|
export default Card;
|
|
111
126
|
//# sourceMappingURL=Card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","View","TouchableOpacity","StyleSheet","ImageBackground","useTheme","LinearGradient","jsx","_jsx","Card","children","style","onPress","
|
|
1
|
+
{"version":3,"names":["React","View","TouchableOpacity","StyleSheet","ImageBackground","useTheme","LinearGradient","jsx","_jsx","jsxs","_jsxs","Card","children","style","onPress","onLayout","disabled","testID","backgroundColor","borderRadius","backgroundImage","gradient","theme","cardRootStyle","styles","card","background","renderCardContent","activeOpacity","accessibilityRole","source","absoluteFillObject","imageStyle","resizeMode","blurRadius","colors","start","end","contentWrapper","create","overflow","position","opacity","flex"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/Card/Card.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { LayoutChangeEvent } from "react-native";
|
|
3
|
+
import { CardProps as OriginalCardProps } from "./types";
|
|
4
|
+
interface CardProps extends OriginalCardProps {
|
|
5
|
+
onLayout?: (event: LayoutChangeEvent) => void;
|
|
6
|
+
}
|
|
3
7
|
declare const Card: React.FC<CardProps>;
|
|
4
8
|
export default Card;
|
|
5
9
|
//# sourceMappingURL=Card.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../../../src/components/Card/Card.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../../../src/components/Card/Card.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAKL,iBAAiB,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAKzD,UAAU,SAAU,SAAQ,iBAAiB;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC/C;AAED,QAAA,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAoG7B,CAAC;AAiBF,eAAe,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,139 +1,136 @@
|
|
|
1
|
+
// src/components/Card/Card.tsx
|
|
1
2
|
import React from "react";
|
|
2
3
|
import {
|
|
3
4
|
View,
|
|
4
5
|
TouchableOpacity,
|
|
5
6
|
StyleSheet,
|
|
6
|
-
Platform,
|
|
7
7
|
ImageBackground,
|
|
8
|
+
LayoutChangeEvent, // Import LayoutChangeEvent
|
|
8
9
|
} from "react-native";
|
|
9
|
-
import { CardProps } from "./types";
|
|
10
|
+
import { CardProps as OriginalCardProps } from "./types"; // Assuming types.ts defines CardProps
|
|
10
11
|
import { useTheme } from "../../theme/ThemeContext";
|
|
11
12
|
import { LinearGradient } from "expo-linear-gradient";
|
|
12
13
|
|
|
14
|
+
// Extend CardProps to include onLayout
|
|
15
|
+
interface CardProps extends OriginalCardProps {
|
|
16
|
+
onLayout?: (event: LayoutChangeEvent) => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
13
19
|
const Card: React.FC<CardProps> = ({
|
|
14
20
|
children,
|
|
15
21
|
style,
|
|
16
22
|
onPress,
|
|
23
|
+
onLayout, // Destructure onLayout
|
|
17
24
|
disabled = false,
|
|
18
|
-
elevation
|
|
25
|
+
// elevation, // Not used in your current styles
|
|
19
26
|
testID,
|
|
20
|
-
variant,
|
|
27
|
+
// variant, // Not used
|
|
21
28
|
backgroundColor,
|
|
22
|
-
borderColor,
|
|
29
|
+
// borderColor, // Not used
|
|
23
30
|
borderRadius = 8,
|
|
24
31
|
backgroundImage,
|
|
25
|
-
gradient
|
|
26
|
-
// margin,
|
|
27
|
-
// padding,
|
|
32
|
+
gradient,
|
|
28
33
|
}) => {
|
|
29
|
-
const {theme} = useTheme();
|
|
30
|
-
|
|
31
|
-
const getCardStyle = () => {
|
|
32
|
-
const baseStyle: any = {
|
|
33
|
-
backgroundColor: backgroundColor || theme.background,
|
|
34
|
-
borderRadius,
|
|
35
|
-
};
|
|
34
|
+
const { theme } = useTheme();
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const cardStyle = [
|
|
36
|
+
const cardRootStyle = [
|
|
41
37
|
styles.card,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
{ borderRadius },
|
|
39
|
+
// If there's a background image, card background should be transparent
|
|
40
|
+
// so the image is visible. Otherwise, use provided backgroundColor or theme.
|
|
41
|
+
{
|
|
42
|
+
backgroundColor: backgroundImage
|
|
43
|
+
? "transparent"
|
|
44
|
+
: backgroundColor || theme.background,
|
|
45
|
+
},
|
|
46
|
+
disabled && styles.disabled,
|
|
47
|
+
style, // This will include the width and calculated height from SelaDealCard
|
|
46
48
|
];
|
|
47
49
|
|
|
48
50
|
const renderCardContent = () => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
source={backgroundImage.source}
|
|
53
|
-
style={[styles.backgroundImage, backgroundImage.style]}
|
|
54
|
-
imageStyle={[{ borderRadius }, backgroundImage.imageStyle]}
|
|
55
|
-
resizeMode={backgroundImage.resizeMode || "cover"}
|
|
56
|
-
blurRadius={backgroundImage.blurRadius}
|
|
57
|
-
>
|
|
58
|
-
<View
|
|
59
|
-
style={[
|
|
60
|
-
styles.imageContentContainer,
|
|
61
|
-
{
|
|
62
|
-
opacity:
|
|
63
|
-
backgroundImage.opacity !== undefined
|
|
64
|
-
? backgroundImage.opacity
|
|
65
|
-
: 1,
|
|
66
|
-
},
|
|
67
|
-
]}
|
|
68
|
-
>
|
|
69
|
-
{children}
|
|
70
|
-
</View>
|
|
71
|
-
</ImageBackground>
|
|
72
|
-
);
|
|
73
|
-
} else if (gradient) {
|
|
74
|
-
return (
|
|
75
|
-
<LinearGradient
|
|
76
|
-
colors={gradient.colors as any}
|
|
77
|
-
start={gradient.start}
|
|
78
|
-
end={gradient.end}
|
|
79
|
-
style={[
|
|
80
|
-
styles.gradient,
|
|
81
|
-
{ borderRadius },
|
|
82
|
-
gradient.style,
|
|
83
|
-
]}
|
|
84
|
-
>
|
|
85
|
-
{children}
|
|
86
|
-
</LinearGradient>
|
|
87
|
-
);
|
|
88
|
-
} else {
|
|
89
|
-
return children;
|
|
90
|
-
}
|
|
51
|
+
// The children (SelaDealCard's overlayContainer) are rendered on top of
|
|
52
|
+
// the ImageBackground or Gradient.
|
|
53
|
+
return children;
|
|
91
54
|
};
|
|
92
55
|
|
|
93
56
|
if (onPress) {
|
|
94
57
|
return (
|
|
95
58
|
<TouchableOpacity
|
|
96
|
-
style={
|
|
59
|
+
style={cardRootStyle}
|
|
97
60
|
onPress={onPress}
|
|
61
|
+
onLayout={onLayout} // Apply onLayout here
|
|
98
62
|
disabled={disabled}
|
|
99
63
|
testID={testID}
|
|
100
64
|
activeOpacity={0.9}
|
|
101
65
|
accessibilityRole="button"
|
|
102
|
-
accessibilityLabel={"Card"}
|
|
103
66
|
>
|
|
104
|
-
{
|
|
67
|
+
{backgroundImage && (
|
|
68
|
+
<ImageBackground
|
|
69
|
+
source={backgroundImage.source}
|
|
70
|
+
style={[StyleSheet.absoluteFillObject, backgroundImage.style]} // Fills parent
|
|
71
|
+
imageStyle={[{ borderRadius }, backgroundImage.imageStyle]}
|
|
72
|
+
resizeMode={backgroundImage.resizeMode || "cover"}
|
|
73
|
+
blurRadius={backgroundImage.blurRadius}
|
|
74
|
+
/>
|
|
75
|
+
)}
|
|
76
|
+
{gradient && !backgroundImage && ( // Render gradient if no image and gradient exists
|
|
77
|
+
<LinearGradient
|
|
78
|
+
colors={gradient.colors as any}
|
|
79
|
+
start={gradient.start}
|
|
80
|
+
end={gradient.end}
|
|
81
|
+
style={[
|
|
82
|
+
StyleSheet.absoluteFillObject, // Gradient also fills
|
|
83
|
+
{ borderRadius },
|
|
84
|
+
gradient.style,
|
|
85
|
+
]}
|
|
86
|
+
/>
|
|
87
|
+
)}
|
|
88
|
+
<View style={styles.contentWrapper}>{renderCardContent()}</View>
|
|
105
89
|
</TouchableOpacity>
|
|
106
90
|
);
|
|
107
91
|
}
|
|
108
92
|
|
|
109
93
|
return (
|
|
110
|
-
<View style={
|
|
111
|
-
{
|
|
94
|
+
<View style={cardRootStyle} testID={testID} onLayout={onLayout}>
|
|
95
|
+
{backgroundImage && (
|
|
96
|
+
<ImageBackground
|
|
97
|
+
source={backgroundImage.source}
|
|
98
|
+
style={[StyleSheet.absoluteFillObject, backgroundImage.style]}
|
|
99
|
+
imageStyle={[{ borderRadius }, backgroundImage.imageStyle]}
|
|
100
|
+
resizeMode={backgroundImage.resizeMode || "cover"}
|
|
101
|
+
blurRadius={backgroundImage.blurRadius}
|
|
102
|
+
/>
|
|
103
|
+
)}
|
|
104
|
+
{gradient && !backgroundImage && (
|
|
105
|
+
<LinearGradient
|
|
106
|
+
colors={gradient.colors as any}
|
|
107
|
+
start={gradient.start}
|
|
108
|
+
end={gradient.end}
|
|
109
|
+
style={[
|
|
110
|
+
StyleSheet.absoluteFillObject,
|
|
111
|
+
{ borderRadius },
|
|
112
|
+
gradient.style,
|
|
113
|
+
]}
|
|
114
|
+
/>
|
|
115
|
+
)}
|
|
116
|
+
<View style={styles.contentWrapper}>{renderCardContent()}</View>
|
|
112
117
|
</View>
|
|
113
118
|
);
|
|
114
119
|
};
|
|
115
120
|
|
|
116
121
|
const styles = StyleSheet.create({
|
|
117
122
|
card: {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
display: "flex",
|
|
123
|
+
overflow: "hidden", // Important for absoluteFillObject with borderRadius
|
|
124
|
+
position: "relative", // For absolute positioning context
|
|
121
125
|
},
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
height: "100%",
|
|
125
|
-
},
|
|
126
|
-
imageContentContainer: {
|
|
127
|
-
flex: 1,
|
|
128
|
-
backgroundColor: "transparent",
|
|
126
|
+
disabled: {
|
|
127
|
+
opacity: 0.6,
|
|
129
128
|
},
|
|
130
|
-
|
|
129
|
+
contentWrapper: { // Ensures content is layered above background/gradient
|
|
131
130
|
flex: 1,
|
|
132
|
-
|
|
133
|
-
height: "100%",
|
|
134
|
-
justifyContent: "flex-start",
|
|
135
|
-
alignItems: "flex-start",
|
|
131
|
+
backgroundColor: "transparent", // Content wrapper itself is transparent
|
|
136
132
|
},
|
|
133
|
+
// No specific styles for backgroundImage or gradient here as they use absoluteFillObject
|
|
137
134
|
});
|
|
138
135
|
|
|
139
|
-
export default Card;
|
|
136
|
+
export default Card;
|