react-native-molecules 0.5.0-beta.1 → 0.5.0-beta.11
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/README.md +87 -0
- package/components/Accordion/index.tsx +1 -6
- package/components/Accordion/utils.ts +17 -14
- package/components/ActivityIndicator/ActivityIndicator.tsx +12 -20
- package/components/ActivityIndicator/index.tsx +1 -5
- package/components/Appbar/index.tsx +1 -4
- package/components/Appbar/utils.ts +33 -21
- package/components/Avatar/index.tsx +1 -5
- package/components/Avatar/utils.ts +2 -6
- package/components/Backdrop/Backdrop.tsx +2 -2
- package/components/Backdrop/index.tsx +1 -5
- package/components/Backdrop/utils.ts +5 -6
- package/components/Badge/index.tsx +1 -5
- package/components/Badge/utils.ts +2 -6
- package/components/Button/Button.tsx +211 -264
- package/components/Button/index.tsx +9 -7
- package/components/Button/types.ts +16 -2
- package/components/Button/utils.ts +231 -210
- package/components/Card/Card.tsx +8 -4
- package/components/Card/CardContent.tsx +5 -4
- package/components/Card/CardHeader.tsx +5 -3
- package/components/Card/CardMedia.tsx +5 -3
- package/components/Card/CardTypography.tsx +5 -3
- package/components/Card/index.tsx +1 -5
- package/components/Card/utils.ts +5 -6
- package/components/Checkbox/Checkbox.tsx +1 -0
- package/components/Checkbox/CheckboxBase.ios.tsx +1 -0
- package/components/Checkbox/CheckboxBase.tsx +24 -128
- package/components/Checkbox/index.tsx +1 -5
- package/components/Checkbox/utils.ts +6 -31
- package/components/Chip/Chip.tsx +40 -52
- package/components/Chip/index.tsx +1 -5
- package/components/Chip/utils.ts +5 -13
- package/components/DatePickerDocked/index.tsx +1 -5
- package/components/DatePickerDocked/utils.ts +21 -19
- package/components/DatePickerInline/index.tsx +1 -5
- package/components/DatePickerInline/utils.ts +41 -28
- package/components/DatePickerInput/DatePickerInput.tsx +4 -2
- package/components/DatePickerInput/DatePickerInputWithoutModal.tsx +0 -4
- package/components/DatePickerInput/index.tsx +1 -5
- package/components/DatePickerInput/types.ts +1 -3
- package/components/DatePickerInput/utils.ts +5 -6
- package/components/DatePickerModal/CalendarEdit.tsx +10 -9
- package/components/DatePickerModal/DatePickerModalHeader.tsx +1 -1
- package/components/DatePickerModal/index.tsx +1 -5
- package/components/DatePickerModal/utils.ts +17 -16
- package/components/DateTimePicker/index.tsx +1 -5
- package/components/DateTimePicker/utils.ts +5 -6
- package/components/Dialog/index.tsx +1 -5
- package/components/Dialog/utils.ts +22 -16
- package/components/Drawer/Collapsible/utils.ts +13 -13
- package/components/Drawer/Drawer.tsx +2 -3
- package/components/Drawer/DrawerContent.tsx +5 -3
- package/components/Drawer/DrawerFooter.tsx +5 -4
- package/components/Drawer/DrawerHeader.tsx +5 -4
- package/components/Drawer/DrawerItem.tsx +5 -3
- package/components/Drawer/DrawerItemGroup.tsx +5 -4
- package/components/Drawer/index.tsx +1 -5
- package/components/Drawer/utils.ts +7 -7
- package/components/ElementGroup/ElementGroup.tsx +16 -14
- package/components/ElementGroup/index.tsx +1 -5
- package/components/ElementGroup/utils.ts +5 -6
- package/components/FAB/index.tsx +1 -5
- package/components/FAB/utils.ts +2 -6
- package/components/FilePicker/FilePicker.tsx +47 -76
- package/components/FilePicker/index.tsx +1 -5
- package/components/FilePicker/utils.ts +5 -6
- package/components/HelperText/HelperText.tsx +0 -35
- package/components/HelperText/index.tsx +1 -5
- package/components/HelperText/utils.ts +5 -7
- package/components/HorizontalDivider/HorizontalDivider.tsx +5 -3
- package/components/HorizontalDivider/index.tsx +1 -5
- package/components/Icon/CrossFadeIcon.tsx +3 -5
- package/components/Icon/Icon.tsx +2 -4
- package/components/Icon/iconFactory.tsx +3 -3
- package/components/Icon/index.tsx +2 -6
- package/components/Icon/types.ts +17 -6
- package/components/IconButton/IconButton.tsx +45 -58
- package/components/IconButton/index.tsx +1 -5
- package/components/IconButton/utils.ts +153 -49
- package/components/If/index.tsx +1 -5
- package/components/InputAddon/index.tsx +1 -5
- package/components/InputAddon/utils.ts +5 -6
- package/components/Link/index.tsx +1 -5
- package/components/Link/utils.ts +2 -6
- package/components/ListItem/index.tsx +1 -5
- package/components/ListItem/utils.ts +13 -11
- package/components/LoadingIndicator/LoadingIndicator.tsx +253 -0
- package/components/LoadingIndicator/LoadingIndicator.web.tsx +136 -0
- package/components/LoadingIndicator/index.tsx +13 -0
- package/components/LoadingIndicator/utils.ts +117 -0
- package/components/Menu/index.tsx +1 -5
- package/components/Menu/utils.ts +6 -8
- package/components/Modal/index.tsx +1 -5
- package/components/Modal/utils.ts +2 -6
- package/components/NavigationRail/NavigationRailHeader.tsx +1 -1
- package/components/NavigationRail/index.tsx +1 -5
- package/components/NavigationRail/utils.ts +21 -17
- package/components/NavigationStack/index.tsx +1 -5
- package/components/NavigationStack/utils.tsx +7 -1
- package/components/Portal/index.tsx +1 -5
- package/components/RadioButton/index.ts +1 -5
- package/components/RadioButton/utils.ts +9 -8
- package/components/Rating/index.tsx +1 -5
- package/components/Rating/utils.ts +6 -8
- package/components/Select/Select.tsx +369 -507
- package/components/Select/index.ts +7 -14
- package/components/Select/types.ts +2 -4
- package/components/Select/utils.ts +215 -0
- package/components/Slot/Slot.tsx +244 -0
- package/components/Slot/compose-refs.tsx +60 -0
- package/components/Slot/index.tsx +8 -0
- package/components/StateLayer/index.tsx +1 -5
- package/components/StateLayer/utils.ts +5 -6
- package/components/Surface/Surface.android.tsx +34 -8
- package/components/Surface/Surface.ios.tsx +36 -29
- package/components/Surface/Surface.tsx +31 -4
- package/components/Surface/index.tsx +1 -5
- package/components/Surface/utils.ts +49 -36
- package/components/Switch/Switch.tsx +8 -2
- package/components/Switch/index.tsx +1 -5
- package/components/Switch/utils.ts +2 -6
- package/components/Tabs/TabItem.tsx +35 -58
- package/components/Tabs/TabLabel.tsx +5 -9
- package/components/Tabs/Tabs.tsx +154 -149
- package/components/Tabs/index.tsx +1 -5
- package/components/Tabs/utils.ts +25 -12
- package/components/Text/Text.tsx +2 -8
- package/components/TextInput/TextInput.tsx +655 -571
- package/components/TextInput/index.tsx +19 -7
- package/components/TextInput/types.ts +76 -27
- package/components/TextInput/utils.ts +232 -159
- package/components/TextInputWithMask/index.tsx +1 -5
- package/components/TimePicker/AmPmSwitcher.tsx +1 -1
- package/components/TimePicker/index.tsx +1 -5
- package/components/TimePicker/utils.ts +29 -21
- package/components/TimePickerField/TimePickerField.tsx +7 -5
- package/components/TimePickerField/index.tsx +1 -5
- package/components/TimePickerField/utils.ts +5 -6
- package/components/TimePickerModal/TimePickerModal.tsx +6 -2
- package/components/TimePickerModal/index.tsx +1 -5
- package/components/TimePickerModal/utils.ts +5 -6
- package/components/Tooltip/TooltipTrigger.tsx +25 -16
- package/components/Tooltip/index.tsx +1 -5
- package/components/Tooltip/utils.ts +5 -6
- package/components/TouchableRipple/TouchableRipple.native.tsx +50 -14
- package/components/TouchableRipple/TouchableRipple.tsx +137 -47
- package/components/TouchableRipple/index.tsx +1 -5
- package/components/TouchableRipple/utils.ts +5 -6
- package/components/VerticalDivider/VerticalDivider.tsx +9 -8
- package/components/VerticalDivider/index.tsx +1 -5
- package/core/componentsRegistry.ts +31 -19
- package/hocs/withPortal.tsx +1 -1
- package/hooks/index.tsx +0 -5
- package/hooks/useControlledValue.tsx +20 -4
- package/hooks/useSubcomponents.tsx +63 -31
- package/hooks/useWhatHasUpdated.tsx +48 -0
- package/package.json +12 -15
- package/shortcuts-manager/ShortcutsManager/ShortcutsManager.tsx +5 -2
- package/styles/shadow.ts +2 -1
- package/styles/themes/LightTheme.tsx +1 -1
- package/utils/extractPropertiesFromStyles.ts +25 -0
- package/utils/lodash.ts +77 -6
- package/utils/repository.ts +2 -52
- package/hooks/useSearchable.tsx +0 -74
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import TimePickerDefault from './TimePicker';
|
|
3
3
|
|
|
4
|
-
registerMoleculesComponents({
|
|
5
|
-
TimePicker: TimePickerDefault,
|
|
6
|
-
});
|
|
7
|
-
|
|
8
4
|
export const TimePicker = getRegisteredComponentWithFallback('TimePicker', TimePickerDefault);
|
|
9
5
|
|
|
10
6
|
export type { Props as TimePickerProps } from './TimePicker';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native-unistyles';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { getRegisteredComponentStylesWithFallback } from '../../core';
|
|
4
4
|
import { circleSize } from './timeUtils';
|
|
5
5
|
|
|
6
6
|
const timePickerStylesDefault = StyleSheet.create(theme => ({
|
|
@@ -263,23 +263,31 @@ const timePickerAmPmSwitcherStylesDefault = StyleSheet.create(theme => ({
|
|
|
263
263
|
},
|
|
264
264
|
}));
|
|
265
265
|
|
|
266
|
-
|
|
267
|
-
TimePicker
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
export const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
export const
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
266
|
+
export const timePickerStyles = getRegisteredComponentStylesWithFallback(
|
|
267
|
+
'TimePicker',
|
|
268
|
+
timePickerStylesDefault,
|
|
269
|
+
);
|
|
270
|
+
export const timePickerInputsStyles = getRegisteredComponentStylesWithFallback(
|
|
271
|
+
'TimePicker_Inputs',
|
|
272
|
+
timePickerInputsStylesDefault,
|
|
273
|
+
);
|
|
274
|
+
export const timePickerInputStyles = getRegisteredComponentStylesWithFallback(
|
|
275
|
+
'TimePicker_Input',
|
|
276
|
+
timePickerInputStylesDefault,
|
|
277
|
+
);
|
|
278
|
+
export const timePickerClockStyles = getRegisteredComponentStylesWithFallback(
|
|
279
|
+
'TimePicker_Clock',
|
|
280
|
+
timePickerClockStylesDefault,
|
|
281
|
+
);
|
|
282
|
+
export const timePickerClockHoursStyles = getRegisteredComponentStylesWithFallback(
|
|
283
|
+
'TimePicker_ClockHours',
|
|
284
|
+
timePickerClockHoursStylesDefault,
|
|
285
|
+
);
|
|
286
|
+
export const timePickerClockMinutesStyles = getRegisteredComponentStylesWithFallback(
|
|
287
|
+
'TimePicker_ClockMinutes',
|
|
288
|
+
timePickerClockMinutesStylesDefault,
|
|
289
|
+
);
|
|
290
|
+
export const timePickerAmPmSwitcherStyles = getRegisteredComponentStylesWithFallback(
|
|
291
|
+
'TimePicker_AmPmSwitcher',
|
|
292
|
+
timePickerAmPmSwitcherStylesDefault,
|
|
293
|
+
);
|
|
@@ -26,10 +26,11 @@ const TimePickerField = (
|
|
|
26
26
|
withModal = true,
|
|
27
27
|
style,
|
|
28
28
|
onBlur: onBlurProp,
|
|
29
|
-
modalProps
|
|
30
|
-
iconButtonProps
|
|
29
|
+
modalProps,
|
|
30
|
+
iconButtonProps,
|
|
31
31
|
disabled,
|
|
32
32
|
onFocus: onFocusProp,
|
|
33
|
+
children,
|
|
33
34
|
...rest
|
|
34
35
|
}: Props,
|
|
35
36
|
ref: any,
|
|
@@ -143,9 +144,10 @@ const TimePickerField = (
|
|
|
143
144
|
onFocus={onFocus}
|
|
144
145
|
onChangeText={onChangeText}
|
|
145
146
|
style={componentStyles}
|
|
146
|
-
onBlur={onBlur}
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
onBlur={onBlur}>
|
|
148
|
+
<TextInput.Right>{rightElement}</TextInput.Right>
|
|
149
|
+
{children}
|
|
150
|
+
</TextInput>
|
|
149
151
|
);
|
|
150
152
|
};
|
|
151
153
|
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import TimePickerFieldDefault from './TimePickerField';
|
|
3
3
|
|
|
4
|
-
registerMoleculesComponents({
|
|
5
|
-
TimePickerField: TimePickerFieldDefault,
|
|
6
|
-
});
|
|
7
|
-
|
|
8
4
|
export const TimePickerField = getRegisteredComponentWithFallback(
|
|
9
5
|
'TimePickerField',
|
|
10
6
|
TimePickerFieldDefault,
|
|
@@ -5,17 +5,16 @@ export declare type MaskItem = string | RegExp | [RegExp];
|
|
|
5
5
|
export declare type MaskArray = Array<MaskItem>;
|
|
6
6
|
export declare type Mask = MaskArray | ((value?: string) => MaskArray);
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { getRegisteredComponentStylesWithFallback } from '../../core';
|
|
9
9
|
|
|
10
10
|
const timepickerFieldStylesDefault = StyleSheet.create({
|
|
11
11
|
root: {},
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
TimePickerField
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export const styles = getRegisteredMoleculesComponentStyles('TimePickerField');
|
|
14
|
+
export const styles = getRegisteredComponentStylesWithFallback(
|
|
15
|
+
'TimePickerField',
|
|
16
|
+
timepickerFieldStylesDefault,
|
|
17
|
+
);
|
|
19
18
|
|
|
20
19
|
export const timeMask24Hour: Mask = (text: string = '') => {
|
|
21
20
|
const cleanTime = text.replace(/\D+/g, '');
|
|
@@ -103,8 +103,12 @@ export function TimePickerModal({
|
|
|
103
103
|
accessibilityLabel="toggle keyboard"
|
|
104
104
|
/>
|
|
105
105
|
<View style={styles.fill} />
|
|
106
|
-
<Button onPress={onClose}>
|
|
107
|
-
|
|
106
|
+
<Button onPress={onClose}>
|
|
107
|
+
<Button.Text>{cancelLabel}</Button.Text>
|
|
108
|
+
</Button>
|
|
109
|
+
<Button onPress={onConfirm}>
|
|
110
|
+
<Button.Text>{confirmLabel}</Button.Text>
|
|
111
|
+
</Button>
|
|
108
112
|
</View>
|
|
109
113
|
</KeyboardAvoidingView>
|
|
110
114
|
</Modal>
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import TimePickerModalDefault from './TimePickerModal';
|
|
3
3
|
|
|
4
|
-
registerMoleculesComponents({
|
|
5
|
-
TimePickerModal: TimePickerModalDefault,
|
|
6
|
-
});
|
|
7
|
-
|
|
8
4
|
export const TimePickerModal = getRegisteredComponentWithFallback(
|
|
9
5
|
'TimePickerModal',
|
|
10
6
|
TimePickerModalDefault,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native-unistyles';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { getRegisteredComponentStylesWithFallback } from '../../core';
|
|
4
4
|
|
|
5
5
|
const timepickerModalStylesDefault = StyleSheet.create(theme => ({
|
|
6
6
|
keyboardView: {
|
|
@@ -41,8 +41,7 @@ const timepickerModalStylesDefault = StyleSheet.create(theme => ({
|
|
|
41
41
|
fill: { flex: 1 },
|
|
42
42
|
}));
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
TimePickerModal
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
export const styles = getRegisteredMoleculesComponentStyles('TimePickerModal');
|
|
44
|
+
export const styles = getRegisteredComponentStylesWithFallback(
|
|
45
|
+
'TimePickerModal',
|
|
46
|
+
timepickerModalStylesDefault,
|
|
47
|
+
);
|
|
@@ -30,27 +30,36 @@ const TooltipTrigger = memo(({ children }: { children: ReactElement }) => {
|
|
|
30
30
|
() => triggerRef?.current,
|
|
31
31
|
);
|
|
32
32
|
|
|
33
|
-
const onPress = useCallback(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
const onPress = useCallback(
|
|
34
|
+
(e: unknown) => {
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
children?.props?.onPress?.(e);
|
|
37
|
+
},
|
|
38
|
+
[children?.props],
|
|
39
|
+
);
|
|
37
40
|
|
|
38
|
-
const onLongPress = useCallback(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
const onLongPress = useCallback(
|
|
42
|
+
(e: unknown) => {
|
|
43
|
+
// @ts-ignore
|
|
44
|
+
children?.props?.onLongPress?.(e);
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
if (isWeb) return;
|
|
47
|
+
onOpen();
|
|
48
|
+
},
|
|
49
|
+
[children?.props, isWeb, onOpen],
|
|
50
|
+
);
|
|
45
51
|
|
|
46
|
-
const onPressOut = useCallback(
|
|
47
|
-
|
|
52
|
+
const onPressOut = useCallback(
|
|
53
|
+
(e: unknown) => {
|
|
54
|
+
// @ts-ignore
|
|
48
55
|
|
|
49
|
-
|
|
56
|
+
children?.props?.onPressOut?.(e);
|
|
50
57
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
58
|
+
if (isWeb) return;
|
|
59
|
+
onClose();
|
|
60
|
+
},
|
|
61
|
+
[children?.props, isWeb, onClose],
|
|
62
|
+
);
|
|
54
63
|
|
|
55
64
|
const onHoverIn = useCallback(() => {
|
|
56
65
|
// @ts-ignore
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import TooltipComponent from './Tooltip';
|
|
3
3
|
import TooltipContent from './TooltipContent';
|
|
4
4
|
import TooltipTrigger from './TooltipTrigger';
|
|
@@ -8,10 +8,6 @@ export const TooltipDefault = Object.assign(TooltipComponent, {
|
|
|
8
8
|
Content: TooltipContent,
|
|
9
9
|
});
|
|
10
10
|
|
|
11
|
-
registerMoleculesComponents({
|
|
12
|
-
Tooltip: TooltipDefault,
|
|
13
|
-
});
|
|
14
|
-
|
|
15
11
|
export const Tooltip = getRegisteredComponentWithFallback('Tooltip', TooltipDefault);
|
|
16
12
|
|
|
17
13
|
export type { Props as TooltipProps } from './Tooltip';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native-unistyles';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { getRegisteredComponentStylesWithFallback } from '../../core';
|
|
4
4
|
|
|
5
5
|
const tooltipStylesDefault = StyleSheet.create(theme => ({
|
|
6
6
|
content: {
|
|
@@ -14,8 +14,7 @@ const tooltipStylesDefault = StyleSheet.create(theme => ({
|
|
|
14
14
|
},
|
|
15
15
|
}));
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
Tooltip
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export const tooltipStyles = getRegisteredMoleculesComponentStyles('Tooltip');
|
|
17
|
+
export const tooltipStyles = getRegisteredComponentStylesWithFallback(
|
|
18
|
+
'Tooltip',
|
|
19
|
+
tooltipStylesDefault,
|
|
20
|
+
);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type ComponentProps, forwardRef, memo, type ReactNode, useMemo } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
type BackgroundPropType,
|
|
4
4
|
Platform,
|
|
@@ -7,25 +7,44 @@ import {
|
|
|
7
7
|
StyleSheet,
|
|
8
8
|
TouchableNativeFeedback,
|
|
9
9
|
TouchableWithoutFeedback,
|
|
10
|
-
View,
|
|
11
10
|
type ViewStyle,
|
|
12
11
|
} from 'react-native';
|
|
13
|
-
import { withUnistyles } from 'react-native-unistyles';
|
|
14
12
|
|
|
13
|
+
import { extractPropertiesFromStyles } from '../../utils/extractPropertiesFromStyles';
|
|
14
|
+
import { Slot } from '../Slot';
|
|
15
15
|
import { touchableRippleStyles } from './utils';
|
|
16
16
|
|
|
17
17
|
const ANDROID_VERSION_LOLLIPOP = 21;
|
|
18
18
|
const ANDROID_VERSION_PIE = 28;
|
|
19
19
|
|
|
20
|
-
type Props =
|
|
20
|
+
type Props = ComponentProps<typeof TouchableWithoutFeedback> & {
|
|
21
21
|
borderless?: boolean;
|
|
22
22
|
background?: BackgroundPropType;
|
|
23
23
|
disabled?: boolean;
|
|
24
24
|
onPress?: () => void | null;
|
|
25
25
|
rippleColor?: string;
|
|
26
26
|
underlayColor?: string;
|
|
27
|
-
children:
|
|
27
|
+
children: ReactNode;
|
|
28
28
|
style?: StyleProp<ViewStyle>;
|
|
29
|
+
/**
|
|
30
|
+
* When `true`, the component will not render a wrapper element. Instead, it will
|
|
31
|
+
* merge its props (styles, event handlers, ref) onto its immediate child element.
|
|
32
|
+
* This follows the Radix UI "Slot" pattern for flexible component composition.
|
|
33
|
+
*
|
|
34
|
+
* @note On Android, the native ripple effect will NOT work when `asChild` is `true`
|
|
35
|
+
* because `TouchableNativeFeedback` requires a View wrapper. Only press events will work.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <TouchableRipple asChild onPress={handlePress}>
|
|
40
|
+
* <View><Text>Custom pressable</Text></View>
|
|
41
|
+
* </TouchableRipple>
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @note When `asChild` is `true`, only a single child element is allowed.
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
asChild?: boolean;
|
|
29
48
|
};
|
|
30
49
|
|
|
31
50
|
const TouchableRipple = (
|
|
@@ -37,17 +56,22 @@ const TouchableRipple = (
|
|
|
37
56
|
rippleColor: rippleColorProp,
|
|
38
57
|
underlayColor: underlayColorProp,
|
|
39
58
|
children,
|
|
59
|
+
asChild = false,
|
|
40
60
|
...rest
|
|
41
61
|
}: Props,
|
|
42
62
|
ref: any,
|
|
43
63
|
) => {
|
|
44
|
-
const disabled = disabledProp
|
|
64
|
+
const disabled = disabledProp;
|
|
45
65
|
|
|
46
66
|
const componentStyles = touchableRippleStyles;
|
|
47
67
|
|
|
48
68
|
const { rippleColor, underlayColor, containerStyle } = useMemo(() => {
|
|
69
|
+
const { rippleColor: _rippleColor } = extractPropertiesFromStyles(
|
|
70
|
+
[componentStyles.root, style],
|
|
71
|
+
['rippleColor'],
|
|
72
|
+
);
|
|
49
73
|
return {
|
|
50
|
-
rippleColor: rippleColorProp,
|
|
74
|
+
rippleColor: rippleColorProp || _rippleColor,
|
|
51
75
|
underlayColor: underlayColorProp || rippleColorProp,
|
|
52
76
|
containerStyle: [borderless && styles.borderless, componentStyles.root, style],
|
|
53
77
|
};
|
|
@@ -58,6 +82,21 @@ const TouchableRipple = (
|
|
|
58
82
|
const useForeground =
|
|
59
83
|
Platform.OS === 'android' && Platform.Version >= ANDROID_VERSION_PIE && borderless;
|
|
60
84
|
|
|
85
|
+
if (asChild) {
|
|
86
|
+
// When asChild is true, use Slot to merge props with the child
|
|
87
|
+
// Note: TouchableNativeFeedback ripple won't work with asChild since it requires a View wrapper
|
|
88
|
+
return (
|
|
89
|
+
<Slot
|
|
90
|
+
{...rest}
|
|
91
|
+
style={containerStyle}
|
|
92
|
+
ref={ref}
|
|
93
|
+
onPress={rest.onPress}
|
|
94
|
+
disabled={disabled}>
|
|
95
|
+
{children}
|
|
96
|
+
</Slot>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
61
100
|
if (TouchableRipple.supported) {
|
|
62
101
|
return (
|
|
63
102
|
<TouchableNativeFeedback
|
|
@@ -65,12 +104,13 @@ const TouchableRipple = (
|
|
|
65
104
|
ref={ref}
|
|
66
105
|
disabled={disabled}
|
|
67
106
|
useForeground={useForeground}
|
|
107
|
+
style={containerStyle}
|
|
68
108
|
background={
|
|
69
109
|
background != null
|
|
70
110
|
? background
|
|
71
111
|
: TouchableNativeFeedback.Ripple(rippleColor!, borderless)
|
|
72
112
|
}>
|
|
73
|
-
|
|
113
|
+
<>{children}</>
|
|
74
114
|
</TouchableNativeFeedback>
|
|
75
115
|
);
|
|
76
116
|
}
|
|
@@ -84,7 +124,7 @@ const TouchableRipple = (
|
|
|
84
124
|
containerStyle,
|
|
85
125
|
pressed && { backgroundColor: underlayColor },
|
|
86
126
|
]}>
|
|
87
|
-
{
|
|
127
|
+
{children}
|
|
88
128
|
</Pressable>
|
|
89
129
|
);
|
|
90
130
|
};
|
|
@@ -98,8 +138,4 @@ const styles = StyleSheet.create({
|
|
|
98
138
|
TouchableRipple.supported =
|
|
99
139
|
Platform.OS === 'android' && Platform.Version >= ANDROID_VERSION_LOLLIPOP;
|
|
100
140
|
|
|
101
|
-
export default memo(
|
|
102
|
-
withUnistyles(forwardRef(TouchableRipple), theme => ({
|
|
103
|
-
rippleColor: theme.colors.onSurfaceRipple,
|
|
104
|
-
})),
|
|
105
|
-
);
|
|
141
|
+
export default memo(forwardRef(TouchableRipple));
|