@cyberkaidev/ui 0.1.1 → 0.1.3
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/components/Chips.js +1 -3
- package/lib/module/components/Chips.js.map +1 -1
- package/lib/module/components/RippleEffect.js +40 -39
- package/lib/module/components/RippleEffect.js.map +1 -1
- package/lib/typescript/src/components/Chips.d.ts.map +1 -1
- package/lib/typescript/src/components/RippleEffect.d.ts +6 -3
- package/lib/typescript/src/components/RippleEffect.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/Chips.tsx +1 -2
- package/src/components/RippleEffect.tsx +57 -48
|
@@ -14,8 +14,7 @@ export function Chips({
|
|
|
14
14
|
testID
|
|
15
15
|
}) {
|
|
16
16
|
const {
|
|
17
|
-
colors
|
|
18
|
-
borderRadius
|
|
17
|
+
colors
|
|
19
18
|
} = useTheme();
|
|
20
19
|
const styles = useThemedStyles(makeStyles);
|
|
21
20
|
const isInteractive = typeof onPress === 'function';
|
|
@@ -57,7 +56,6 @@ export function Chips({
|
|
|
57
56
|
}) => /*#__PURE__*/_jsx(Button, {
|
|
58
57
|
testID: `chip-${String(key)}`,
|
|
59
58
|
disabled: !isInteractive || disabled,
|
|
60
|
-
rippleContainerBorderRadius: Number(borderRadius.radius_20),
|
|
61
59
|
style: [styles.button, schemeButton[scheme], disabled ? styles.dimmed : null],
|
|
62
60
|
onPress: () => onPress?.(key),
|
|
63
61
|
children: prefix == null ? /*#__PURE__*/_jsx(Text, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ScrollView","StyleSheet","View","useTheme","useThemedStyles","Text","Button","jsx","_jsx","jsxs","_jsxs","Chips","data","marginB","marginT","onPress","testID","colors","
|
|
1
|
+
{"version":3,"names":["ScrollView","StyleSheet","View","useTheme","useThemedStyles","Text","Button","jsx","_jsx","jsxs","_jsxs","Chips","data","marginB","marginT","onPress","testID","colors","styles","makeStyles","isInteractive","schemeButton","surface","borderColor","border","backgroundColor","on_surface","primary","schemeTextColor","text","style","container","marginTop","marginBottom","children","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","content","map","key","label","disabled","prefix","scheme","String","button","dimmed","color","row","t","create","width","gap","spaces","l","paddingHorizontal","pageSpacing","m","paddingVertical","vertical","xs","borderRadius","radius_20","borderWidth","borderStyle","flexDirection","alignItems","overflow","marginRight","s","opacity"],"sourceRoot":"../../../src","sources":["components/Chips.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,6 +9,13 @@ const RELEASE_GROW_DURATION = 150;
|
|
|
9
9
|
const RELEASE_FADE_DURATION = 250;
|
|
10
10
|
const PRESS_FADE_IN_DURATION = 75;
|
|
11
11
|
|
|
12
|
+
// The ripple animations run on the JS driver on purpose. On the New
|
|
13
|
+
// Architecture a native-driven animation started in the same tick the
|
|
14
|
+
// `Animated.View` is created has no native view to bind to yet, so it never
|
|
15
|
+
// plays — which is why the ripple showed on RN 0.83 but not on 0.86+.
|
|
16
|
+
const USE_NATIVE_DRIVER = false;
|
|
17
|
+
const toFinite = (value, fallback) => Number.isFinite(value) ? value : fallback;
|
|
18
|
+
|
|
12
19
|
/** Wraps a child and paints a touch ripple at the press location. */
|
|
13
20
|
export function RippleEffect({
|
|
14
21
|
children,
|
|
@@ -21,6 +28,7 @@ export function RippleEffect({
|
|
|
21
28
|
rippleSequential = false,
|
|
22
29
|
rippleFades = true,
|
|
23
30
|
disabled = false,
|
|
31
|
+
style,
|
|
24
32
|
onLayout,
|
|
25
33
|
onPressIn,
|
|
26
34
|
onPressOut,
|
|
@@ -53,17 +61,19 @@ export function RippleEffect({
|
|
|
53
61
|
const w2 = 0.5 * layout.width;
|
|
54
62
|
const h2 = 0.5 * layout.height;
|
|
55
63
|
|
|
56
|
-
// Fall back to the center when the gesture carries no coordinates
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
// Fall back to the center when the gesture carries no coordinates, and
|
|
65
|
+
// clamp to the pressable's box — some setups report press coordinates
|
|
66
|
+
// relative to the wrong ancestor, which would push the circle off-screen
|
|
67
|
+
// where `overflow: 'hidden'` clips it away entirely.
|
|
68
|
+
const centered = rippleCentered || !event?.nativeEvent;
|
|
69
|
+
const clampX = value => layout.width > 0 ? Math.min(Math.max(value, 0), layout.width) : value;
|
|
70
|
+
const clampY = value => layout.height > 0 ? Math.min(Math.max(value, 0), layout.height) : value;
|
|
71
|
+
const locationX = centered ? w2 : clampX(toFinite(event.nativeEvent.locationX, w2));
|
|
72
|
+
const locationY = centered ? h2 : clampY(toFinite(event.nativeEvent.locationY, h2));
|
|
64
73
|
const offsetX = Math.abs(w2 - locationX);
|
|
65
74
|
const offsetY = Math.abs(h2 - locationY);
|
|
66
|
-
const
|
|
75
|
+
const computedRadius = rippleSize > 0 ? 0.5 * rippleSize : Math.sqrt((w2 + offsetX) ** 2 + (h2 + offsetY) ** 2);
|
|
76
|
+
const radius = Number.isFinite(computedRadius) && computedRadius > 0 ? computedRadius : Math.max(w2, h2, CIRCLE_RADIUS);
|
|
67
77
|
const ripple = {
|
|
68
78
|
unique: uniqueRef.current++,
|
|
69
79
|
locationX,
|
|
@@ -74,13 +84,19 @@ export function RippleEffect({
|
|
|
74
84
|
};
|
|
75
85
|
ripplesRef.current.set(ripple.unique, ripple);
|
|
76
86
|
activeRippleRef.current = ripple.unique;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
87
|
+
Animated.timing(ripple.scale, {
|
|
88
|
+
toValue: 1,
|
|
89
|
+
duration: rippleDuration,
|
|
90
|
+
easing: Easing.out(Easing.ease),
|
|
91
|
+
useNativeDriver: USE_NATIVE_DRIVER
|
|
92
|
+
}).start();
|
|
93
|
+
Animated.timing(ripple.opacity, {
|
|
94
|
+
toValue: rippleOpacity,
|
|
95
|
+
duration: Math.min(rippleDuration, PRESS_FADE_IN_DURATION),
|
|
96
|
+
useNativeDriver: USE_NATIVE_DRIVER
|
|
97
|
+
}).start();
|
|
82
98
|
setRippleIds(current => current.concat(ripple.unique));
|
|
83
|
-
}, [layout.width, layout.height, onPressIn, rippleCentered, rippleSequential, rippleSize]);
|
|
99
|
+
}, [layout.width, layout.height, onPressIn, rippleCentered, rippleDuration, rippleOpacity, rippleSequential, rippleSize]);
|
|
84
100
|
const handlePressOut = React.useCallback(event => {
|
|
85
101
|
onPressOut?.(event);
|
|
86
102
|
const releasedUnique = activeRippleRef.current;
|
|
@@ -99,11 +115,11 @@ export function RippleEffect({
|
|
|
99
115
|
Animated.parallel([Animated.timing(ripple.scale, {
|
|
100
116
|
toValue: 1,
|
|
101
117
|
duration: RELEASE_GROW_DURATION,
|
|
102
|
-
useNativeDriver:
|
|
118
|
+
useNativeDriver: USE_NATIVE_DRIVER
|
|
103
119
|
}), Animated.timing(ripple.opacity, {
|
|
104
120
|
toValue: 0,
|
|
105
121
|
duration: RELEASE_FADE_DURATION,
|
|
106
|
-
useNativeDriver:
|
|
122
|
+
useNativeDriver: USE_NATIVE_DRIVER
|
|
107
123
|
})]).start(removeRipple);
|
|
108
124
|
}, [onPressOut, rippleFades]);
|
|
109
125
|
return /*#__PURE__*/_jsxs(Pressable, {
|
|
@@ -112,7 +128,11 @@ export function RippleEffect({
|
|
|
112
128
|
onLayout: handleLayout,
|
|
113
129
|
onPressIn: handlePressIn,
|
|
114
130
|
onPressOut: handlePressOut,
|
|
115
|
-
children: [
|
|
131
|
+
children: [/*#__PURE__*/_jsx(View, {
|
|
132
|
+
style: style,
|
|
133
|
+
children: children
|
|
134
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
135
|
+
collapsable: false,
|
|
116
136
|
pointerEvents: "none",
|
|
117
137
|
style: [styles.container, {
|
|
118
138
|
borderRadius: rippleContainerBorderRadius
|
|
@@ -122,9 +142,7 @@ export function RippleEffect({
|
|
|
122
142
|
if (!ripple) return null;
|
|
123
143
|
return /*#__PURE__*/_jsx(RippleCircle, {
|
|
124
144
|
ripple: ripple,
|
|
125
|
-
color: color
|
|
126
|
-
duration: rippleDuration,
|
|
127
|
-
toOpacity: rippleOpacity
|
|
145
|
+
color: color
|
|
128
146
|
}, id);
|
|
129
147
|
})
|
|
130
148
|
})]
|
|
@@ -132,9 +150,7 @@ export function RippleEffect({
|
|
|
132
150
|
}
|
|
133
151
|
function RippleCircleComponent({
|
|
134
152
|
ripple,
|
|
135
|
-
color
|
|
136
|
-
duration,
|
|
137
|
-
toOpacity
|
|
153
|
+
color
|
|
138
154
|
}) {
|
|
139
155
|
const {
|
|
140
156
|
locationX,
|
|
@@ -143,21 +159,6 @@ function RippleCircleComponent({
|
|
|
143
159
|
scale,
|
|
144
160
|
opacity
|
|
145
161
|
} = ripple;
|
|
146
|
-
React.useEffect(() => {
|
|
147
|
-
Animated.timing(scale, {
|
|
148
|
-
toValue: 1,
|
|
149
|
-
duration,
|
|
150
|
-
easing: Easing.out(Easing.ease),
|
|
151
|
-
useNativeDriver: true
|
|
152
|
-
}).start();
|
|
153
|
-
Animated.timing(opacity, {
|
|
154
|
-
toValue: toOpacity,
|
|
155
|
-
duration: Math.min(duration, PRESS_FADE_IN_DURATION),
|
|
156
|
-
useNativeDriver: true
|
|
157
|
-
}).start();
|
|
158
|
-
// Entrance runs exactly once, when the ripple view mounts.
|
|
159
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
160
|
-
}, []);
|
|
161
162
|
const rippleStyle = {
|
|
162
163
|
top: locationY - CIRCLE_RADIUS,
|
|
163
164
|
[I18nManager.isRTL ? 'right' : 'left']: locationX - CIRCLE_RADIUS,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Animated","Easing","I18nManager","Pressable","StyleSheet","View","useColors","jsx","_jsx","jsxs","_jsxs","CIRCLE_RADIUS","RELEASE_GROW_DURATION","RELEASE_FADE_DURATION","PRESS_FADE_IN_DURATION","RippleEffect","children","rippleColor","rippleOpacity","rippleDuration","rippleSize","rippleContainerBorderRadius","rippleCentered","rippleSequential","rippleFades","disabled","onLayout","onPressIn","onPressOut","pressableProps","colors","color","text","layout","setLayout","useState","width","height","rippleIds","setRippleIds","ripplesRef","useRef","Map","activeRippleRef","uniqueRef","handleLayout","event","nativeEvent","handlePressIn","useCallback","current","size","w2","h2","
|
|
1
|
+
{"version":3,"names":["React","Animated","Easing","I18nManager","Pressable","StyleSheet","View","useColors","jsx","_jsx","jsxs","_jsxs","CIRCLE_RADIUS","RELEASE_GROW_DURATION","RELEASE_FADE_DURATION","PRESS_FADE_IN_DURATION","USE_NATIVE_DRIVER","toFinite","value","fallback","Number","isFinite","RippleEffect","children","rippleColor","rippleOpacity","rippleDuration","rippleSize","rippleContainerBorderRadius","rippleCentered","rippleSequential","rippleFades","disabled","style","onLayout","onPressIn","onPressOut","pressableProps","colors","color","text","layout","setLayout","useState","width","height","rippleIds","setRippleIds","ripplesRef","useRef","Map","activeRippleRef","uniqueRef","handleLayout","event","nativeEvent","handlePressIn","useCallback","current","size","w2","h2","centered","clampX","Math","min","max","clampY","locationX","locationY","offsetX","abs","offsetY","computedRadius","sqrt","radius","ripple","unique","scale","Value","opacity","set","timing","toValue","duration","easing","out","ease","useNativeDriver","start","concat","handlePressOut","releasedUnique","get","removeRipple","delete","filter","id","parallel","collapsable","pointerEvents","styles","container","borderRadius","map","RippleCircle","RippleCircleComponent","rippleStyle","top","isRTL","backgroundColor","transform","interpolate","inputRange","outputRange","circle","memo","create","absoluteFillObject","overflow","position"],"sourceRoot":"../../../src","sources":["components/RippleEffect.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,QAAQ,EACRC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,UAAU,EACVC,IAAI,QACC,cAAc;AASrB,SAASC,SAAS,QAAQ,qBAAkB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AA2B7C,MAAMC,aAAa,GAAG,EAAE;AACxB,MAAMC,qBAAqB,GAAG,GAAG;AACjC,MAAMC,qBAAqB,GAAG,GAAG;AACjC,MAAMC,sBAAsB,GAAG,EAAE;;AAEjC;AACA;AACA;AACA;AACA,MAAMC,iBAAiB,GAAG,KAAK;AAE/B,MAAMC,QAAQ,GAAGA,CAACC,KAAa,EAAEC,QAAgB,KAC/CC,MAAM,CAACC,QAAQ,CAACH,KAAK,CAAC,GAAGA,KAAK,GAAGC,QAAQ;;AAE3C;AACA,OAAO,SAASG,YAAYA,CAAC;EAC3BC,QAAQ;EACRC,WAAW;EACXC,aAAa,GAAG,GAAG;EACnBC,cAAc,GAAG,GAAG;EACpBC,UAAU,GAAG,CAAC;EACdC,2BAA2B,GAAG,CAAC;EAC/BC,cAAc,GAAG,KAAK;EACtBC,gBAAgB,GAAG,KAAK;EACxBC,WAAW,GAAG,IAAI;EAClBC,QAAQ,GAAG,KAAK;EAChBC,KAAK;EACLC,QAAQ;EACRC,SAAS;EACTC,UAAU;EACV,GAAGC;AACE,CAAC,EAAE;EACR,MAAMC,MAAM,GAAG/B,SAAS,CAAC,CAAC;EAC1B,MAAMgC,KAAK,GAAGf,WAAW,IAAIc,MAAM,CAACE,IAAI;EAExC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAG1C,KAAK,CAAC2C,QAAQ,CAAC;IAAEC,KAAK,EAAE,CAAC;IAAEC,MAAM,EAAE;EAAE,CAAC,CAAC;EACnE,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAG/C,KAAK,CAAC2C,QAAQ,CAAW,EAAE,CAAC;EAC9D,MAAMK,UAAU,GAAGhD,KAAK,CAACiD,MAAM,CAAC,IAAIC,GAAG,CAAyB,CAAC,CAAC;EAClE,MAAMC,eAAe,GAAGnD,KAAK,CAACiD,MAAM,CAAgB,IAAI,CAAC;EACzD,MAAMG,SAAS,GAAGpD,KAAK,CAACiD,MAAM,CAAC,CAAC,CAAC;EAEjC,MAAMI,YAAY,GAAIC,KAAwB,IAAK;IACjD,MAAM;MAAEV,KAAK;MAAEC;IAAO,CAAC,GAAGS,KAAK,CAACC,WAAW,CAACd,MAAM;IAClDC,SAAS,CAAC;MAAEE,KAAK;MAAEC;IAAO,CAAC,CAAC;IAC5BX,QAAQ,GAAGoB,KAAK,CAAC;EACnB,CAAC;EAED,MAAME,aAAa,GAAGxD,KAAK,CAACyD,WAAW,CACpCH,KAA4B,IAAK;IAChCnB,SAAS,GAAGmB,KAAK,CAAC;IAElB,IAAIxB,gBAAgB,IAAIkB,UAAU,CAACU,OAAO,CAACC,IAAI,EAAE;IAEjD,MAAMC,EAAE,GAAG,GAAG,GAAGnB,MAAM,CAACG,KAAK;IAC7B,MAAMiB,EAAE,GAAG,GAAG,GAAGpB,MAAM,CAACI,MAAM;;IAE9B;IACA;IACA;IACA;IACA,MAAMiB,QAAQ,GAAGjC,cAAc,IAAI,CAACyB,KAAK,EAAEC,WAAW;IACtD,MAAMQ,MAAM,GAAI7C,KAAa,IAC3BuB,MAAM,CAACG,KAAK,GAAG,CAAC,GAAGoB,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAAChD,KAAK,EAAE,CAAC,CAAC,EAAEuB,MAAM,CAACG,KAAK,CAAC,GAAG1B,KAAK;IACvE,MAAMiD,MAAM,GAAIjD,KAAa,IAC3BuB,MAAM,CAACI,MAAM,GAAG,CAAC,GAAGmB,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAAChD,KAAK,EAAE,CAAC,CAAC,EAAEuB,MAAM,CAACI,MAAM,CAAC,GAAG3B,KAAK;IACzE,MAAMkD,SAAS,GAAGN,QAAQ,GACtBF,EAAE,GACFG,MAAM,CAAC9C,QAAQ,CAACqC,KAAK,CAACC,WAAW,CAACa,SAAS,EAAER,EAAE,CAAC,CAAC;IACrD,MAAMS,SAAS,GAAGP,QAAQ,GACtBD,EAAE,GACFM,MAAM,CAAClD,QAAQ,CAACqC,KAAK,CAACC,WAAW,CAACc,SAAS,EAAER,EAAE,CAAC,CAAC;IAErD,MAAMS,OAAO,GAAGN,IAAI,CAACO,GAAG,CAACX,EAAE,GAAGQ,SAAS,CAAC;IACxC,MAAMI,OAAO,GAAGR,IAAI,CAACO,GAAG,CAACV,EAAE,GAAGQ,SAAS,CAAC;IAExC,MAAMI,cAAc,GAClB9C,UAAU,GAAG,CAAC,GACV,GAAG,GAAGA,UAAU,GAChBqC,IAAI,CAACU,IAAI,CAAC,CAACd,EAAE,GAAGU,OAAO,KAAK,CAAC,GAAG,CAACT,EAAE,GAAGW,OAAO,KAAK,CAAC,CAAC;IAC1D,MAAMG,MAAM,GACVvD,MAAM,CAACC,QAAQ,CAACoD,cAAc,CAAC,IAAIA,cAAc,GAAG,CAAC,GACjDA,cAAc,GACdT,IAAI,CAACE,GAAG,CAACN,EAAE,EAAEC,EAAE,EAAEjD,aAAa,CAAC;IAErC,MAAMgE,MAAsB,GAAG;MAC7BC,MAAM,EAAEzB,SAAS,CAACM,OAAO,EAAE;MAC3BU,SAAS;MACTC,SAAS;MACTM,MAAM;MACNG,KAAK,EAAE,IAAI7E,QAAQ,CAAC8E,KAAK,CAAC,CAAC,CAAC;MAC5BC,OAAO,EAAE,IAAI/E,QAAQ,CAAC8E,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED/B,UAAU,CAACU,OAAO,CAACuB,GAAG,CAACL,MAAM,CAACC,MAAM,EAAED,MAAM,CAAC;IAC7CzB,eAAe,CAACO,OAAO,GAAGkB,MAAM,CAACC,MAAM;IAEvC5E,QAAQ,CAACiF,MAAM,CAACN,MAAM,CAACE,KAAK,EAAE;MAC5BK,OAAO,EAAE,CAAC;MACVC,QAAQ,EAAE1D,cAAc;MACxB2D,MAAM,EAAEnF,MAAM,CAACoF,GAAG,CAACpF,MAAM,CAACqF,IAAI,CAAC;MAC/BC,eAAe,EAAExE;IACnB,CAAC,CAAC,CAACyE,KAAK,CAAC,CAAC;IAEVxF,QAAQ,CAACiF,MAAM,CAACN,MAAM,CAACI,OAAO,EAAE;MAC9BG,OAAO,EAAE1D,aAAa;MACtB2D,QAAQ,EAAEpB,IAAI,CAACC,GAAG,CAACvC,cAAc,EAAEX,sBAAsB,CAAC;MAC1DyE,eAAe,EAAExE;IACnB,CAAC,CAAC,CAACyE,KAAK,CAAC,CAAC;IAEV1C,YAAY,CAAEW,OAAO,IAAKA,OAAO,CAACgC,MAAM,CAACd,MAAM,CAACC,MAAM,CAAC,CAAC;EAC1D,CAAC,EACD,CACEpC,MAAM,CAACG,KAAK,EACZH,MAAM,CAACI,MAAM,EACbV,SAAS,EACTN,cAAc,EACdH,cAAc,EACdD,aAAa,EACbK,gBAAgB,EAChBH,UAAU,CAEd,CAAC;EAED,MAAMgE,cAAc,GAAG3F,KAAK,CAACyD,WAAW,CACrCH,KAA4B,IAAK;IAChClB,UAAU,GAAGkB,KAAK,CAAC;IAEnB,MAAMsC,cAAc,GAAGzC,eAAe,CAACO,OAAO;IAC9CP,eAAe,CAACO,OAAO,GAAG,IAAI;IAC9B,IAAIkC,cAAc,KAAK,IAAI,EAAE;IAE7B,MAAMhB,MAAM,GAAG5B,UAAU,CAACU,OAAO,CAACmC,GAAG,CAACD,cAAc,CAAC;IACrD,IAAI,CAAChB,MAAM,EAAE;IAEb,MAAMkB,YAAY,GAAGA,CAAA,KAAM;MACzB9C,UAAU,CAACU,OAAO,CAACqC,MAAM,CAACH,cAAc,CAAC;MACzC7C,YAAY,CAAEW,OAAO,IACnBA,OAAO,CAACsC,MAAM,CAAEC,EAAE,IAAKA,EAAE,KAAKL,cAAc,CAC9C,CAAC;IACH,CAAC;IAED,IAAI,CAAC7D,WAAW,EAAE;MAChB+D,YAAY,CAAC,CAAC;MACd;IACF;IAEA7F,QAAQ,CAACiG,QAAQ,CAAC,CAChBjG,QAAQ,CAACiF,MAAM,CAACN,MAAM,CAACE,KAAK,EAAE;MAC5BK,OAAO,EAAE,CAAC;MACVC,QAAQ,EAAEvE,qBAAqB;MAC/B2E,eAAe,EAAExE;IACnB,CAAC,CAAC,EACFf,QAAQ,CAACiF,MAAM,CAACN,MAAM,CAACI,OAAO,EAAE;MAC9BG,OAAO,EAAE,CAAC;MACVC,QAAQ,EAAEtE,qBAAqB;MAC/B0E,eAAe,EAAExE;IACnB,CAAC,CAAC,CACH,CAAC,CAACyE,KAAK,CAACK,YAAY,CAAC;EACxB,CAAC,EACD,CAAC1D,UAAU,EAAEL,WAAW,CAC1B,CAAC;EAED,oBACEpB,KAAA,CAACP,SAAS;IAAA,GACJiC,cAAc;IAClBL,QAAQ,EAAEA,QAAS;IACnBE,QAAQ,EAAEmB,YAAa;IACvBlB,SAAS,EAAEqB,aAAc;IACzBpB,UAAU,EAAEuD,cAAe;IAAApE,QAAA,gBAE3Bd,IAAA,CAACH,IAAI;MAAC2B,KAAK,EAAEA,KAAM;MAAAV,QAAA,EAAEA;IAAQ,CAAO,CAAC,eACrCd,IAAA,CAACH,IAAI;MACH6F,WAAW,EAAE,KAAM;MACnBC,aAAa,EAAC,MAAM;MACpBnE,KAAK,EAAE,CACLoE,MAAM,CAACC,SAAS,EAChB;QAAEC,YAAY,EAAE3E;MAA4B,CAAC,CAC7C;MAAAL,QAAA,EAEDuB,SAAS,CAAC0D,GAAG,CAAEP,EAAE,IAAK;QACrB,MAAMrB,MAAM,GAAG5B,UAAU,CAACU,OAAO,CAACmC,GAAG,CAACI,EAAE,CAAC;QACzC,IAAI,CAACrB,MAAM,EAAE,OAAO,IAAI;QACxB,oBAAOnE,IAAA,CAACgG,YAAY;UAAU7B,MAAM,EAAEA,MAAO;UAACrC,KAAK,EAAEA;QAAM,GAAjC0D,EAAmC,CAAC;MAChE,CAAC;IAAC,CACE,CAAC;EAAA,CACE,CAAC;AAEhB;AAOA,SAASS,qBAAqBA,CAAC;EAAE9B,MAAM;EAAErC;AAAyB,CAAC,EAAE;EACnE,MAAM;IAAE6B,SAAS;IAAEC,SAAS;IAAEM,MAAM;IAAEG,KAAK;IAAEE;EAAQ,CAAC,GAAGJ,MAAM;EAE/D,MAAM+B,WAAW,GAAG;IAClBC,GAAG,EAAEvC,SAAS,GAAGzD,aAAa;IAC9B,CAACT,WAAW,CAAC0G,KAAK,GAAG,OAAO,GAAG,MAAM,GAAGzC,SAAS,GAAGxD,aAAa;IACjEkG,eAAe,EAAEvE,KAAK;IACtByC,OAAO;IACP+B,SAAS,EAAE,CACT;MACEjC,KAAK,EAAEA,KAAK,CAACkC,WAAW,CAAC;QACvBC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClBC,WAAW,EAAE,CAAC,GAAG,GAAGtG,aAAa,EAAE+D,MAAM,GAAG/D,aAAa;MAC3D,CAAC;IACH,CAAC;EAEL,CAAC;EAED,oBAAOH,IAAA,CAACR,QAAQ,CAACK,IAAI;IAAC2B,KAAK,EAAE,CAACoE,MAAM,CAACc,MAAM,EAAER,WAAW;EAAE,CAAE,CAAC;AAC/D;AAEA,MAAMF,YAAY,gBAAGzG,KAAK,CAACoH,IAAI,CAACV,qBAAqB,CAAC;AAEtD,MAAML,MAAM,GAAGhG,UAAU,CAACgH,MAAM,CAAC;EAC/Bf,SAAS,EAAE;IACT,GAAGjG,UAAU,CAACiH,kBAAkB;IAChCC,QAAQ,EAAE;EACZ,CAAC;EACDJ,MAAM,EAAE;IACNvE,KAAK,EAAEhC,aAAa,GAAG,CAAC;IACxBiC,MAAM,EAAEjC,aAAa,GAAG,CAAC;IACzB2F,YAAY,EAAE3F,aAAa;IAC3B2G,QAAQ,EAAE,QAAQ;IAClBC,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chips.d.ts","sourceRoot":"","sources":["../../../../src/components/Chips.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,KAAK,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAEvD,KAAK,QAAQ,CAAC,IAAI,IAAI;IACpB,GAAG,EAAE,IAAI,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,KAAK,KAAK,CAAC,IAAI,IAAI;IACjB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACvB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,sDAAsD;AACtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,EAC1B,IAAI,EACJ,OAAW,EACX,OAAW,EACX,OAAO,EACP,MAAM,GACP,EAAE,KAAK,CAAC,IAAI,CAAC,+
|
|
1
|
+
{"version":3,"file":"Chips.d.ts","sourceRoot":"","sources":["../../../../src/components/Chips.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,KAAK,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAEvD,KAAK,QAAQ,CAAC,IAAI,IAAI;IACpB,GAAG,EAAE,IAAI,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,KAAK,KAAK,CAAC,IAAI,IAAI;IACjB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACvB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,sDAAsD;AACtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,EAC1B,IAAI,EACJ,OAAW,EACX,OAAW,EACX,OAAO,EACP,MAAM,GACP,EAAE,KAAK,CAAC,IAAI,CAAC,+BA6Db"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { PressableProps } from 'react-native';
|
|
3
|
-
type Props = PressableProps & {
|
|
2
|
+
import type { PressableProps, StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
type Props = Omit<PressableProps, 'style'> & {
|
|
4
4
|
children: React.ReactNode;
|
|
5
|
+
/** Applied to an inner wrapper around `children`, not to the pressable, so
|
|
6
|
+
* the ripple layer can never take part in the caller's flex layout. */
|
|
7
|
+
style?: StyleProp<ViewStyle>;
|
|
5
8
|
/** Ripple color. Default: theme `text`. */
|
|
6
9
|
rippleColor?: string;
|
|
7
10
|
rippleOpacity?: number;
|
|
@@ -13,6 +16,6 @@ type Props = PressableProps & {
|
|
|
13
16
|
rippleFades?: boolean;
|
|
14
17
|
};
|
|
15
18
|
/** Wraps a child and paints a touch ripple at the press location. */
|
|
16
|
-
export declare function RippleEffect({ children, rippleColor, rippleOpacity, rippleDuration, rippleSize, rippleContainerBorderRadius, rippleCentered, rippleSequential, rippleFades, disabled, onLayout, onPressIn, onPressOut, ...pressableProps }: Props): React.JSX.Element;
|
|
19
|
+
export declare function RippleEffect({ children, rippleColor, rippleOpacity, rippleDuration, rippleSize, rippleContainerBorderRadius, rippleCentered, rippleSequential, rippleFades, disabled, style, onLayout, onPressIn, onPressOut, ...pressableProps }: Props): React.JSX.Element;
|
|
17
20
|
export {};
|
|
18
21
|
//# sourceMappingURL=RippleEffect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RippleEffect.d.ts","sourceRoot":"","sources":["../../../../src/components/RippleEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAGV,cAAc,
|
|
1
|
+
{"version":3,"file":"RippleEffect.d.ts","sourceRoot":"","sources":["../../../../src/components/RippleEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAGV,cAAc,EACd,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAatB,KAAK,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG;IAC3C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;4EACwE;IACxE,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAgBF,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EACX,aAAmB,EACnB,cAAoB,EACpB,UAAc,EACd,2BAA+B,EAC/B,cAAsB,EACtB,gBAAwB,EACxB,WAAkB,EAClB,QAAgB,EAChB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,GAAG,cAAc,EAClB,EAAE,KAAK,qBA4JP"}
|
package/package.json
CHANGED
package/src/components/Chips.tsx
CHANGED
|
@@ -35,7 +35,7 @@ export function Chips<Item>({
|
|
|
35
35
|
onPress,
|
|
36
36
|
testID,
|
|
37
37
|
}: Props<Item>) {
|
|
38
|
-
const { colors
|
|
38
|
+
const { colors } = useTheme();
|
|
39
39
|
const styles = useThemedStyles(makeStyles);
|
|
40
40
|
const isInteractive = typeof onPress === 'function';
|
|
41
41
|
|
|
@@ -72,7 +72,6 @@ export function Chips<Item>({
|
|
|
72
72
|
testID={`chip-${String(key)}`}
|
|
73
73
|
key={String(key)}
|
|
74
74
|
disabled={!isInteractive || disabled}
|
|
75
|
-
rippleContainerBorderRadius={Number(borderRadius.radius_20)}
|
|
76
75
|
style={[
|
|
77
76
|
styles.button,
|
|
78
77
|
schemeButton[scheme],
|
|
@@ -11,6 +11,8 @@ import type {
|
|
|
11
11
|
GestureResponderEvent,
|
|
12
12
|
LayoutChangeEvent,
|
|
13
13
|
PressableProps,
|
|
14
|
+
StyleProp,
|
|
15
|
+
ViewStyle,
|
|
14
16
|
} from 'react-native';
|
|
15
17
|
|
|
16
18
|
import { useColors } from '../ThemeProvider';
|
|
@@ -24,8 +26,11 @@ type RippleItemType = {
|
|
|
24
26
|
opacity: Animated.Value;
|
|
25
27
|
};
|
|
26
28
|
|
|
27
|
-
type Props = PressableProps & {
|
|
29
|
+
type Props = Omit<PressableProps, 'style'> & {
|
|
28
30
|
children: React.ReactNode;
|
|
31
|
+
/** Applied to an inner wrapper around `children`, not to the pressable, so
|
|
32
|
+
* the ripple layer can never take part in the caller's flex layout. */
|
|
33
|
+
style?: StyleProp<ViewStyle>;
|
|
29
34
|
/** Ripple color. Default: theme `text`. */
|
|
30
35
|
rippleColor?: string;
|
|
31
36
|
rippleOpacity?: number;
|
|
@@ -42,6 +47,15 @@ const RELEASE_GROW_DURATION = 150;
|
|
|
42
47
|
const RELEASE_FADE_DURATION = 250;
|
|
43
48
|
const PRESS_FADE_IN_DURATION = 75;
|
|
44
49
|
|
|
50
|
+
// The ripple animations run on the JS driver on purpose. On the New
|
|
51
|
+
// Architecture a native-driven animation started in the same tick the
|
|
52
|
+
// `Animated.View` is created has no native view to bind to yet, so it never
|
|
53
|
+
// plays — which is why the ripple showed on RN 0.83 but not on 0.86+.
|
|
54
|
+
const USE_NATIVE_DRIVER = false;
|
|
55
|
+
|
|
56
|
+
const toFinite = (value: number, fallback: number) =>
|
|
57
|
+
Number.isFinite(value) ? value : fallback;
|
|
58
|
+
|
|
45
59
|
/** Wraps a child and paints a touch ripple at the press location. */
|
|
46
60
|
export function RippleEffect({
|
|
47
61
|
children,
|
|
@@ -54,6 +68,7 @@ export function RippleEffect({
|
|
|
54
68
|
rippleSequential = false,
|
|
55
69
|
rippleFades = true,
|
|
56
70
|
disabled = false,
|
|
71
|
+
style,
|
|
57
72
|
onLayout,
|
|
58
73
|
onPressIn,
|
|
59
74
|
onPressOut,
|
|
@@ -83,19 +98,33 @@ export function RippleEffect({
|
|
|
83
98
|
const w2 = 0.5 * layout.width;
|
|
84
99
|
const h2 = 0.5 * layout.height;
|
|
85
100
|
|
|
86
|
-
// Fall back to the center when the gesture carries no coordinates
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
101
|
+
// Fall back to the center when the gesture carries no coordinates, and
|
|
102
|
+
// clamp to the pressable's box — some setups report press coordinates
|
|
103
|
+
// relative to the wrong ancestor, which would push the circle off-screen
|
|
104
|
+
// where `overflow: 'hidden'` clips it away entirely.
|
|
105
|
+
const centered = rippleCentered || !event?.nativeEvent;
|
|
106
|
+
const clampX = (value: number) =>
|
|
107
|
+
layout.width > 0 ? Math.min(Math.max(value, 0), layout.width) : value;
|
|
108
|
+
const clampY = (value: number) =>
|
|
109
|
+
layout.height > 0 ? Math.min(Math.max(value, 0), layout.height) : value;
|
|
110
|
+
const locationX = centered
|
|
111
|
+
? w2
|
|
112
|
+
: clampX(toFinite(event.nativeEvent.locationX, w2));
|
|
113
|
+
const locationY = centered
|
|
114
|
+
? h2
|
|
115
|
+
: clampY(toFinite(event.nativeEvent.locationY, h2));
|
|
91
116
|
|
|
92
117
|
const offsetX = Math.abs(w2 - locationX);
|
|
93
118
|
const offsetY = Math.abs(h2 - locationY);
|
|
94
119
|
|
|
95
|
-
const
|
|
120
|
+
const computedRadius =
|
|
96
121
|
rippleSize > 0
|
|
97
122
|
? 0.5 * rippleSize
|
|
98
123
|
: Math.sqrt((w2 + offsetX) ** 2 + (h2 + offsetY) ** 2);
|
|
124
|
+
const radius =
|
|
125
|
+
Number.isFinite(computedRadius) && computedRadius > 0
|
|
126
|
+
? computedRadius
|
|
127
|
+
: Math.max(w2, h2, CIRCLE_RADIUS);
|
|
99
128
|
|
|
100
129
|
const ripple: RippleItemType = {
|
|
101
130
|
unique: uniqueRef.current++,
|
|
@@ -109,10 +138,19 @@ export function RippleEffect({
|
|
|
109
138
|
ripplesRef.current.set(ripple.unique, ripple);
|
|
110
139
|
activeRippleRef.current = ripple.unique;
|
|
111
140
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
141
|
+
Animated.timing(ripple.scale, {
|
|
142
|
+
toValue: 1,
|
|
143
|
+
duration: rippleDuration,
|
|
144
|
+
easing: Easing.out(Easing.ease),
|
|
145
|
+
useNativeDriver: USE_NATIVE_DRIVER,
|
|
146
|
+
}).start();
|
|
147
|
+
|
|
148
|
+
Animated.timing(ripple.opacity, {
|
|
149
|
+
toValue: rippleOpacity,
|
|
150
|
+
duration: Math.min(rippleDuration, PRESS_FADE_IN_DURATION),
|
|
151
|
+
useNativeDriver: USE_NATIVE_DRIVER,
|
|
152
|
+
}).start();
|
|
153
|
+
|
|
116
154
|
setRippleIds((current) => current.concat(ripple.unique));
|
|
117
155
|
},
|
|
118
156
|
[
|
|
@@ -120,6 +158,8 @@ export function RippleEffect({
|
|
|
120
158
|
layout.height,
|
|
121
159
|
onPressIn,
|
|
122
160
|
rippleCentered,
|
|
161
|
+
rippleDuration,
|
|
162
|
+
rippleOpacity,
|
|
123
163
|
rippleSequential,
|
|
124
164
|
rippleSize,
|
|
125
165
|
]
|
|
@@ -152,12 +192,12 @@ export function RippleEffect({
|
|
|
152
192
|
Animated.timing(ripple.scale, {
|
|
153
193
|
toValue: 1,
|
|
154
194
|
duration: RELEASE_GROW_DURATION,
|
|
155
|
-
useNativeDriver:
|
|
195
|
+
useNativeDriver: USE_NATIVE_DRIVER,
|
|
156
196
|
}),
|
|
157
197
|
Animated.timing(ripple.opacity, {
|
|
158
198
|
toValue: 0,
|
|
159
199
|
duration: RELEASE_FADE_DURATION,
|
|
160
|
-
useNativeDriver:
|
|
200
|
+
useNativeDriver: USE_NATIVE_DRIVER,
|
|
161
201
|
}),
|
|
162
202
|
]).start(removeRipple);
|
|
163
203
|
},
|
|
@@ -172,8 +212,9 @@ export function RippleEffect({
|
|
|
172
212
|
onPressIn={handlePressIn}
|
|
173
213
|
onPressOut={handlePressOut}
|
|
174
214
|
>
|
|
175
|
-
{children}
|
|
215
|
+
<View style={style}>{children}</View>
|
|
176
216
|
<View
|
|
217
|
+
collapsable={false}
|
|
177
218
|
pointerEvents="none"
|
|
178
219
|
style={[
|
|
179
220
|
styles.container,
|
|
@@ -183,15 +224,7 @@ export function RippleEffect({
|
|
|
183
224
|
{rippleIds.map((id) => {
|
|
184
225
|
const ripple = ripplesRef.current.get(id);
|
|
185
226
|
if (!ripple) return null;
|
|
186
|
-
return
|
|
187
|
-
<RippleCircle
|
|
188
|
-
key={id}
|
|
189
|
-
ripple={ripple}
|
|
190
|
-
color={color}
|
|
191
|
-
duration={rippleDuration}
|
|
192
|
-
toOpacity={rippleOpacity}
|
|
193
|
-
/>
|
|
194
|
-
);
|
|
227
|
+
return <RippleCircle key={id} ripple={ripple} color={color} />;
|
|
195
228
|
})}
|
|
196
229
|
</View>
|
|
197
230
|
</Pressable>
|
|
@@ -201,35 +234,11 @@ export function RippleEffect({
|
|
|
201
234
|
type RippleCircleProps = {
|
|
202
235
|
ripple: RippleItemType;
|
|
203
236
|
color: string;
|
|
204
|
-
duration: number;
|
|
205
|
-
toOpacity: number;
|
|
206
237
|
};
|
|
207
238
|
|
|
208
|
-
function RippleCircleComponent({
|
|
209
|
-
ripple,
|
|
210
|
-
color,
|
|
211
|
-
duration,
|
|
212
|
-
toOpacity,
|
|
213
|
-
}: RippleCircleProps) {
|
|
239
|
+
function RippleCircleComponent({ ripple, color }: RippleCircleProps) {
|
|
214
240
|
const { locationX, locationY, radius, scale, opacity } = ripple;
|
|
215
241
|
|
|
216
|
-
React.useEffect(() => {
|
|
217
|
-
Animated.timing(scale, {
|
|
218
|
-
toValue: 1,
|
|
219
|
-
duration,
|
|
220
|
-
easing: Easing.out(Easing.ease),
|
|
221
|
-
useNativeDriver: true,
|
|
222
|
-
}).start();
|
|
223
|
-
|
|
224
|
-
Animated.timing(opacity, {
|
|
225
|
-
toValue: toOpacity,
|
|
226
|
-
duration: Math.min(duration, PRESS_FADE_IN_DURATION),
|
|
227
|
-
useNativeDriver: true,
|
|
228
|
-
}).start();
|
|
229
|
-
// Entrance runs exactly once, when the ripple view mounts.
|
|
230
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
231
|
-
}, []);
|
|
232
|
-
|
|
233
242
|
const rippleStyle = {
|
|
234
243
|
top: locationY - CIRCLE_RADIUS,
|
|
235
244
|
[I18nManager.isRTL ? 'right' : 'left']: locationX - CIRCLE_RADIUS,
|