react-native-molecules 0.5.0-beta.0 → 0.5.0-beta.10
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/AccordionItem.tsx +3 -2
- package/components/Accordion/AccordionItemContent.tsx +1 -0
- package/components/Accordion/AccordionItemHeader.tsx +6 -5
- package/components/Accordion/index.tsx +8 -14
- 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 -212
- 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 +1 -0
- package/components/Checkbox/index.tsx +1 -5
- package/components/Checkbox/utils.ts +6 -6
- 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/index.tsx +2 -6
- package/components/DatePickerInput/utils.ts +5 -6
- 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 +3 -7
- package/components/FilePicker/index.tsx +1 -5
- package/components/FilePicker/utils.ts +5 -6
- 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 +3 -14
- 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 +15 -26
- 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 +7 -9
- 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/NavigationRailItem.tsx +2 -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 +5 -10
- package/components/RadioButton/utils.ts +9 -8
- package/components/Rating/RatingItem.tsx +2 -1
- package/components/Rating/index.tsx +1 -5
- package/components/Rating/utils.ts +6 -8
- package/components/Select/Select.tsx +360 -501
- 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/Tabs.tsx +14 -13
- package/components/Tabs/index.tsx +1 -5
- package/components/Tabs/utils.ts +10 -10
- package/components/Text/Text.tsx +2 -8
- package/components/TextInput/TextInput.tsx +5 -4
- package/components/TextInput/index.tsx +1 -5
- package/components/TextInput/utils.ts +8 -15
- 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/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 +5 -9
- package/components/Tooltip/utils.ts +5 -6
- package/components/TouchableRipple/TouchableRipple.native.tsx +49 -13
- package/components/TouchableRipple/TouchableRipple.tsx +136 -46
- 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 -1
- package/hooks/useControlledValue.tsx +20 -4
- package/hooks/useSubcomponents.tsx +56 -22
- package/hooks/useWhatHasUpdated.tsx +48 -0
- package/package.json +10 -13
- package/shortcuts-manager/ShortcutsManager/ShortcutsManager.tsx +5 -2
- package/shortcuts-manager/ShortcutsManager/utils.tsx +3 -2
- package/shortcuts-manager/useShortcut/index.tsx +1 -1
- package/shortcuts-manager/useShortcut/useShortcut.tsx +1 -1
- 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/utils/tokenStylesParser.ts +3 -1
- package/hooks/useBreakpoints.tsx +0 -7
|
@@ -3,8 +3,12 @@ import { Animated, type StyleProp, View, type ViewStyle } from 'react-native';
|
|
|
3
3
|
import { useUnistyles } from 'react-native-unistyles';
|
|
4
4
|
|
|
5
5
|
import type { MD3Elevation } from '../../types/theme';
|
|
6
|
+
import { extractPropertiesFromStyles } from '../../utils/extractPropertiesFromStyles';
|
|
7
|
+
import { Slot } from '../Slot';
|
|
6
8
|
import { BackgroundContextWrapper } from './BackgroundContextWrapper';
|
|
7
|
-
import { defaultStyles,
|
|
9
|
+
import { defaultStyles, getCombinedShadowStyle } from './utils';
|
|
10
|
+
|
|
11
|
+
const AnimatedView = Animated.createAnimatedComponent(View);
|
|
8
12
|
|
|
9
13
|
export type Props = ComponentPropsWithRef<typeof View> & {
|
|
10
14
|
/**
|
|
@@ -26,6 +30,23 @@ export type Props = ComponentPropsWithRef<typeof View> & {
|
|
|
26
30
|
* TestID used for testing purposes
|
|
27
31
|
*/
|
|
28
32
|
testID?: string;
|
|
33
|
+
/**
|
|
34
|
+
* When `true`, the component will not render a wrapper element. Instead, it will
|
|
35
|
+
* merge its props (styles, elevation shadow, ref) onto its immediate child element.
|
|
36
|
+
* This follows the Radix UI "Slot" pattern for flexible component composition.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```tsx
|
|
40
|
+
* // With asChild - merges elevation styles onto the child
|
|
41
|
+
* <Surface asChild elevation={2}>
|
|
42
|
+
* <Card><Text>Content</Text></Card>
|
|
43
|
+
* </Surface>
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @note When `asChild` is `true`, only a single child element is allowed.
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
asChild?: boolean;
|
|
29
50
|
};
|
|
30
51
|
|
|
31
52
|
/**
|
|
@@ -70,52 +91,38 @@ export type Props = ComponentPropsWithRef<typeof View> & {
|
|
|
70
91
|
* });
|
|
71
92
|
* ```
|
|
72
93
|
*/
|
|
73
|
-
const Surface = (
|
|
94
|
+
const Surface = (
|
|
95
|
+
{ elevation = 1, style, children, testID, asChild = false, ...props }: Props,
|
|
96
|
+
ref: any,
|
|
97
|
+
) => {
|
|
74
98
|
const { theme } = useUnistyles();
|
|
75
99
|
const backgroundColor = (() => {
|
|
76
100
|
// @ts-ignore
|
|
77
101
|
return theme.colors.elevation?.[`level${elevation}`];
|
|
78
102
|
})();
|
|
79
103
|
|
|
80
|
-
const { surfaceBackground,
|
|
81
|
-
const { position, alignSelf, top, left, right, bottom, borderRadius } = extractProperties(
|
|
82
|
-
[defaultStyles.root as ViewStyle, style],
|
|
83
|
-
['position', 'alignSelf', 'top', 'left', 'right', 'bottom', 'borderRadius'],
|
|
84
|
-
);
|
|
85
|
-
const absoluteStyle = { position, alignSelf, top, right, bottom, left };
|
|
86
|
-
|
|
104
|
+
const { surfaceBackground, combinedStyle } = useMemo(() => {
|
|
87
105
|
return {
|
|
88
|
-
surfaceBackground:
|
|
106
|
+
surfaceBackground: extractPropertiesFromStyles(
|
|
89
107
|
[defaultStyles.root as ViewStyle, style],
|
|
90
108
|
['backgroundColor'],
|
|
91
109
|
).backgroundColor,
|
|
92
|
-
|
|
93
|
-
{ backgroundColor
|
|
110
|
+
combinedStyle: [
|
|
111
|
+
{ backgroundColor },
|
|
112
|
+
getCombinedShadowStyle(elevation),
|
|
94
113
|
defaultStyles.root,
|
|
95
114
|
style,
|
|
96
|
-
{
|
|
97
|
-
position: undefined,
|
|
98
|
-
alignSelf: undefined,
|
|
99
|
-
top: undefined,
|
|
100
|
-
left: undefined,
|
|
101
|
-
right: undefined,
|
|
102
|
-
bottom: undefined,
|
|
103
|
-
},
|
|
104
115
|
],
|
|
105
|
-
layer0Style: [getStyleForShadowLayer(0, elevation), absoluteStyle, { borderRadius }],
|
|
106
|
-
layer1Style: [getStyleForShadowLayer(1, elevation), { borderRadius }],
|
|
107
116
|
};
|
|
108
117
|
}, [backgroundColor, elevation, style]);
|
|
109
118
|
|
|
119
|
+
const Component = asChild ? Slot : AnimatedView;
|
|
120
|
+
|
|
110
121
|
return (
|
|
111
122
|
<BackgroundContextWrapper backgroundColor={surfaceBackground}>
|
|
112
|
-
<
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
{children}
|
|
116
|
-
</View>
|
|
117
|
-
</View>
|
|
118
|
-
</View>
|
|
123
|
+
<Component ref={ref} {...props} testID={testID} style={combinedStyle}>
|
|
124
|
+
{children}
|
|
125
|
+
</Component>
|
|
119
126
|
</BackgroundContextWrapper>
|
|
120
127
|
);
|
|
121
128
|
};
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { forwardRef, memo, type ReactNode, useMemo } from 'react';
|
|
2
|
-
import { type StyleProp, View, type ViewProps, type ViewStyle } from 'react-native';
|
|
2
|
+
import { Animated, type StyleProp, View, type ViewProps, type ViewStyle } from 'react-native';
|
|
3
3
|
|
|
4
4
|
import shadow from '../../styles/shadow';
|
|
5
5
|
import type { MD3Elevation } from '../../types/theme';
|
|
6
|
+
import { Slot } from '../Slot';
|
|
6
7
|
import { BackgroundContextWrapper } from './BackgroundContextWrapper';
|
|
7
8
|
import { defaultStyles } from './utils';
|
|
8
9
|
|
|
10
|
+
const AnimatedView = Animated.createAnimatedComponent(View);
|
|
11
|
+
|
|
9
12
|
export type Props = ViewProps & {
|
|
10
13
|
/**
|
|
11
14
|
* Content of the `Surface`.
|
|
@@ -18,11 +21,33 @@ export type Props = ViewProps & {
|
|
|
18
21
|
* TestID used for testing purposes
|
|
19
22
|
*/
|
|
20
23
|
testID?: string;
|
|
24
|
+
/**
|
|
25
|
+
* When `true`, the component will not render a wrapper element. Instead, it will
|
|
26
|
+
* merge its props (styles, elevation shadow, ref) onto its immediate child element.
|
|
27
|
+
* This follows the Radix UI "Slot" pattern for flexible component composition.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* // Without asChild - renders an AnimatedView wrapper
|
|
32
|
+
* <Surface elevation={2}>
|
|
33
|
+
* <Card><Text>Content</Text></Card>
|
|
34
|
+
* </Surface>
|
|
35
|
+
*
|
|
36
|
+
* // With asChild - merges elevation styles onto the child
|
|
37
|
+
* <Surface asChild elevation={2}>
|
|
38
|
+
* <Card><Text>Content</Text></Card>
|
|
39
|
+
* </Surface>
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @note When `asChild` is `true`, only a single child element is allowed.
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
asChild?: boolean;
|
|
21
46
|
};
|
|
22
47
|
|
|
23
48
|
// for Web
|
|
24
49
|
const Surface = (
|
|
25
|
-
{ elevation = 1, style, children, testID, backgroundColor, ...props }: Props,
|
|
50
|
+
{ elevation = 1, style, children, testID, backgroundColor, asChild = false, ...props }: Props,
|
|
26
51
|
ref: any,
|
|
27
52
|
) => {
|
|
28
53
|
const { surfaceStyle } = useMemo(() => {
|
|
@@ -36,11 +61,13 @@ const Surface = (
|
|
|
36
61
|
};
|
|
37
62
|
}, [backgroundColor, elevation, style]);
|
|
38
63
|
|
|
64
|
+
const Component = asChild ? Slot : AnimatedView;
|
|
65
|
+
|
|
39
66
|
return (
|
|
40
67
|
<BackgroundContextWrapper backgroundColor={backgroundColor!}>
|
|
41
|
-
<
|
|
68
|
+
<Component ref={ref} {...props} testID={testID} style={surfaceStyle}>
|
|
42
69
|
{children}
|
|
43
|
-
</
|
|
70
|
+
</Component>
|
|
44
71
|
</BackgroundContextWrapper>
|
|
45
72
|
);
|
|
46
73
|
};
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import SurfaceDefault from './Surface';
|
|
3
3
|
|
|
4
|
-
registerMoleculesComponents({
|
|
5
|
-
Surface: SurfaceDefault,
|
|
6
|
-
});
|
|
7
|
-
|
|
8
4
|
export const Surface = getRegisteredComponentWithFallback('Surface', SurfaceDefault);
|
|
9
5
|
|
|
10
6
|
export * from './BackgroundContextWrapper';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Animated } from 'react-native';
|
|
2
2
|
import { StyleSheet } from 'react-native-unistyles';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { getRegisteredComponentStylesWithFallback } from '../../core';
|
|
5
5
|
import { inputRange } from '../../styles/shadow';
|
|
6
6
|
|
|
7
7
|
const defaultStylesDefault = StyleSheet.create(theme => ({
|
|
@@ -10,35 +10,10 @@ const defaultStylesDefault = StyleSheet.create(theme => ({
|
|
|
10
10
|
},
|
|
11
11
|
}));
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
Surface
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export const defaultStyles = getRegisteredMoleculesComponentStyles('Surface');
|
|
18
|
-
|
|
19
|
-
// TODO - abstract this
|
|
20
|
-
export function extractProperties(
|
|
21
|
-
_objectsArray: Record<string, any>,
|
|
22
|
-
propertiesToExtract: string[],
|
|
23
|
-
) {
|
|
24
|
-
const extracted: Record<string, any> = {};
|
|
25
|
-
|
|
26
|
-
const objectsArray = _objectsArray.flat();
|
|
27
|
-
|
|
28
|
-
for (let i = objectsArray.length - 1; i >= 0; i--) {
|
|
29
|
-
const obj = objectsArray[i];
|
|
30
|
-
|
|
31
|
-
for (const prop of propertiesToExtract) {
|
|
32
|
-
if (!obj) continue;
|
|
33
|
-
if (prop in obj) {
|
|
34
|
-
// @ts-ignore
|
|
35
|
-
extracted[prop] = obj[prop];
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return extracted;
|
|
41
|
-
}
|
|
13
|
+
export const defaultStyles = getRegisteredComponentStylesWithFallback(
|
|
14
|
+
'Surface',
|
|
15
|
+
defaultStylesDefault,
|
|
16
|
+
);
|
|
42
17
|
|
|
43
18
|
const _shadowColor = '#000';
|
|
44
19
|
|
|
@@ -97,10 +72,48 @@ export const getStyleForShadowLayer = (
|
|
|
97
72
|
};
|
|
98
73
|
};
|
|
99
74
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
) => {
|
|
105
|
-
|
|
75
|
+
/**
|
|
76
|
+
* Combines the two shadow layers into a single shadow style.
|
|
77
|
+
* This approximates the two-layer shadow effect using a single shadow.
|
|
78
|
+
*/
|
|
79
|
+
export const getCombinedShadowStyle = (elevation: number, shadowColor = _shadowColor) => {
|
|
80
|
+
if (elevation === 0) {
|
|
81
|
+
return {
|
|
82
|
+
shadowColor,
|
|
83
|
+
shadowOpacity: 0,
|
|
84
|
+
shadowOffset: { width: 0, height: 0 },
|
|
85
|
+
shadowRadius: 0,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const layer0 = iOSShadowOutputRanges[0];
|
|
90
|
+
const layer1 = iOSShadowOutputRanges[1];
|
|
91
|
+
|
|
92
|
+
// Use the larger shadow offset (from layer 0)
|
|
93
|
+
const shadowOffsetHeight = layer0.height[elevation];
|
|
94
|
+
|
|
95
|
+
// Use the larger shadow radius (from layer 0)
|
|
96
|
+
const shadowRadius = layer0.shadowRadius[elevation];
|
|
97
|
+
|
|
98
|
+
// Combine opacities (additive, capped at 1.0)
|
|
99
|
+
// This approximates the visual effect of two overlapping shadows
|
|
100
|
+
const shadowOpacity = Math.min(1.0, layer0.shadowOpacity + layer1.shadowOpacity);
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
shadowColor,
|
|
104
|
+
shadowOpacity,
|
|
105
|
+
shadowOffset: {
|
|
106
|
+
width: 0,
|
|
107
|
+
height: shadowOffsetHeight,
|
|
108
|
+
},
|
|
109
|
+
shadowRadius,
|
|
110
|
+
};
|
|
106
111
|
};
|
|
112
|
+
|
|
113
|
+
// export const getElevationAndroid = (
|
|
114
|
+
// elevation: number,
|
|
115
|
+
// _inputRange: number[],
|
|
116
|
+
// elevationLevel: number[],
|
|
117
|
+
// ) => {
|
|
118
|
+
// return elevationLevel[elevation];
|
|
119
|
+
// };
|
|
@@ -70,6 +70,7 @@ const Switch = (
|
|
|
70
70
|
ref,
|
|
71
71
|
actionsToListen: ['focus', 'hover', 'press'],
|
|
72
72
|
});
|
|
73
|
+
const isFirstRender = useRef(true);
|
|
73
74
|
|
|
74
75
|
const [value, onChange] = useControlledValue({
|
|
75
76
|
value: valueProp,
|
|
@@ -98,8 +99,8 @@ const Switch = (
|
|
|
98
99
|
state,
|
|
99
100
|
});
|
|
100
101
|
|
|
101
|
-
const toggleMarginAnimation = useRef(new Animated.Value(value ?
|
|
102
|
-
const toggleSizeAnimation = useRef(new Animated.Value(value ?
|
|
102
|
+
const toggleMarginAnimation = useRef(new Animated.Value(value ? 1 : 0)).current;
|
|
103
|
+
const toggleSizeAnimation = useRef(new Animated.Value(value ? 1 : 0)).current;
|
|
103
104
|
|
|
104
105
|
const thumbPosition = toggleMarginAnimation.interpolate({
|
|
105
106
|
inputRange: [0, 1],
|
|
@@ -130,6 +131,11 @@ const Switch = (
|
|
|
130
131
|
});
|
|
131
132
|
|
|
132
133
|
useEffect(() => {
|
|
134
|
+
if (isFirstRender.current) {
|
|
135
|
+
isFirstRender.current = false;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
133
139
|
Animated.timing(toggleMarginAnimation, {
|
|
134
140
|
toValue: value ? 1 : 0,
|
|
135
141
|
duration: 300,
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import SwitchDefault from './Switch';
|
|
3
3
|
|
|
4
|
-
registerMoleculesComponents({
|
|
5
|
-
Switch: SwitchDefault,
|
|
6
|
-
});
|
|
7
|
-
|
|
8
4
|
export const Switch = getRegisteredComponentWithFallback('Switch', SwitchDefault);
|
|
9
5
|
|
|
10
6
|
export { type Props as SwitchProps } from './Switch';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet, useUnistyles } from 'react-native-unistyles';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { getRegisteredComponentStylesWithFallback } from '../../core';
|
|
4
4
|
|
|
5
5
|
type States =
|
|
6
6
|
| 'selected'
|
|
@@ -276,8 +276,4 @@ const switchStylesDefault = StyleSheet.create(theme => ({
|
|
|
276
276
|
},
|
|
277
277
|
}));
|
|
278
278
|
|
|
279
|
-
|
|
280
|
-
Switch: switchStylesDefault,
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
export const switchStyles = getRegisteredMoleculesComponentStyles('Switch');
|
|
279
|
+
export const switchStyles = getRegisteredComponentStylesWithFallback('Switch', switchStylesDefault);
|
package/components/Tabs/Tabs.tsx
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Children,
|
|
3
3
|
cloneElement,
|
|
4
|
-
FC,
|
|
4
|
+
type FC,
|
|
5
5
|
isValidElement,
|
|
6
6
|
memo,
|
|
7
|
-
ReactElement,
|
|
7
|
+
type ReactElement,
|
|
8
8
|
useCallback,
|
|
9
9
|
useEffect,
|
|
10
10
|
useMemo,
|
|
@@ -13,20 +13,21 @@ import {
|
|
|
13
13
|
} from 'react';
|
|
14
14
|
import {
|
|
15
15
|
Animated,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
type LayoutChangeEvent,
|
|
17
|
+
type NativeScrollEvent,
|
|
18
|
+
type NativeSyntheticEvent,
|
|
19
19
|
ScrollView as RNScrollView,
|
|
20
|
-
LayoutChangeEvent,
|
|
21
|
-
NativeSyntheticEvent,
|
|
22
|
-
NativeScrollEvent,
|
|
23
|
-
View,
|
|
24
20
|
ScrollView,
|
|
21
|
+
type StyleProp,
|
|
22
|
+
View,
|
|
23
|
+
type ViewProps,
|
|
24
|
+
type ViewStyle,
|
|
25
25
|
} from 'react-native';
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
import { useControlledValue } from '../../hooks';
|
|
28
28
|
import { noop } from '../../utils/lodash';
|
|
29
29
|
import { HorizontalDivider, type HorizontalDividerProps } from '../HorizontalDivider';
|
|
30
|
+
import type { TabItemProps } from './TabItem';
|
|
30
31
|
import { tabsStyles } from './utils';
|
|
31
32
|
|
|
32
33
|
export type TabsProps = ViewProps & {
|
|
@@ -100,7 +101,7 @@ export const TabBase = ({
|
|
|
100
101
|
const nameToIndexMap = useMemo(
|
|
101
102
|
() =>
|
|
102
103
|
validChildren.reduce((acc, child, currentIndex) => {
|
|
103
|
-
acc[(child as ReactElement).props?.name] = currentIndex;
|
|
104
|
+
acc[(child as ReactElement<TabItemProps>).props?.name] = currentIndex;
|
|
104
105
|
|
|
105
106
|
return acc;
|
|
106
107
|
}, {} as Record<string, number>),
|
|
@@ -110,7 +111,7 @@ export const TabBase = ({
|
|
|
110
111
|
const [value, onChange] = useControlledValue({
|
|
111
112
|
value: valueProp,
|
|
112
113
|
onChange: onChangeProp,
|
|
113
|
-
defaultValue: defaultValue || (validChildren[0] as ReactElement)?.props?.name,
|
|
114
|
+
defaultValue: defaultValue || (validChildren[0] as ReactElement<TabItemProps>)?.props?.name,
|
|
114
115
|
});
|
|
115
116
|
|
|
116
117
|
const valueIndex = nameToIndexMap[value];
|
|
@@ -311,7 +312,7 @@ export const TabBase = ({
|
|
|
311
312
|
style={itemsContainerStyle}>
|
|
312
313
|
{validChildren.map((child, index) => (
|
|
313
314
|
<ChildItem
|
|
314
|
-
key={(child as ReactElement).props?.name}
|
|
315
|
+
key={(child as ReactElement<TabItemProps>).props?.name}
|
|
315
316
|
testID={testID && `${testID}--tab-item`}
|
|
316
317
|
index={index}
|
|
317
318
|
value={value}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import type { TabItemProps } from './TabItem';
|
|
3
3
|
import { default as TabItem } from './TabItem';
|
|
4
4
|
import type { TabLabelProps } from './TabLabel';
|
|
@@ -11,10 +11,6 @@ export const TabsDefault = Object.assign(TabBase, {
|
|
|
11
11
|
Label: TabLabel,
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
-
registerMoleculesComponents({
|
|
15
|
-
Tabs: TabsDefault,
|
|
16
|
-
});
|
|
17
|
-
|
|
18
14
|
export const Tabs = getRegisteredComponentWithFallback('Tabs', TabsDefault);
|
|
19
15
|
|
|
20
16
|
export type { TabItemProps, TabLabelProps, TabsProps };
|
package/components/Tabs/utils.ts
CHANGED
|
@@ -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 tabsStylesDefault = StyleSheet.create(theme => ({
|
|
6
6
|
root: {
|
|
@@ -113,14 +113,14 @@ const tabsLabelStylesDefault = StyleSheet.create(theme => ({
|
|
|
113
113
|
},
|
|
114
114
|
}));
|
|
115
115
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
Tabs_Item
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
116
|
+
export const tabsStyles = getRegisteredComponentStylesWithFallback('Tabs', tabsStylesDefault);
|
|
117
|
+
export const tabsItemStyles = getRegisteredComponentStylesWithFallback(
|
|
118
|
+
'Tabs_Item',
|
|
119
|
+
tabsItemStylesDefault,
|
|
120
|
+
);
|
|
121
|
+
export const tabsLabelStyles = getRegisteredComponentStylesWithFallback(
|
|
122
|
+
'Tabs_Label',
|
|
123
|
+
tabsLabelStylesDefault,
|
|
124
|
+
);
|
|
125
125
|
|
|
126
126
|
export type States = 'hovered' | 'active' | 'activeAndHovered' | 'disabled';
|
package/components/Text/Text.tsx
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native-unistyles';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
getRegisteredComponentStylesWithFallback,
|
|
4
5
|
getRegisteredComponentWithFallback,
|
|
5
|
-
getRegisteredMoleculesComponentStyles,
|
|
6
|
-
registerComponentStyles,
|
|
7
|
-
registerMoleculesComponent,
|
|
8
6
|
} from '../../core';
|
|
9
7
|
import { textFactory } from './textFactory';
|
|
10
8
|
|
|
@@ -12,12 +10,8 @@ const defaultStyles = StyleSheet.create(theme => ({
|
|
|
12
10
|
root: { color: theme.colors.onSurface, ...theme.typescale.bodyMedium },
|
|
13
11
|
}));
|
|
14
12
|
|
|
15
|
-
registerComponentStyles('Text', defaultStyles);
|
|
16
|
-
|
|
17
13
|
const TextDefault = textFactory(
|
|
18
|
-
(
|
|
14
|
+
getRegisteredComponentStylesWithFallback('Text', defaultStyles) as any,
|
|
19
15
|
);
|
|
20
16
|
|
|
21
|
-
registerMoleculesComponent('Text', TextDefault);
|
|
22
|
-
|
|
23
17
|
export default getRegisteredComponentWithFallback('Text', TextDefault);
|
|
@@ -3,7 +3,7 @@ import React, {
|
|
|
3
3
|
memo,
|
|
4
4
|
type PropsWithoutRef,
|
|
5
5
|
type ReactNode,
|
|
6
|
-
type
|
|
6
|
+
type Ref,
|
|
7
7
|
useCallback,
|
|
8
8
|
useContext,
|
|
9
9
|
useEffect,
|
|
@@ -50,7 +50,7 @@ type Element = ReactNode | ((props: ElementProps) => ReactNode);
|
|
|
50
50
|
|
|
51
51
|
export type Props = Omit<TextInputProps, 'ref'> &
|
|
52
52
|
WithElements<Element> & {
|
|
53
|
-
ref?:
|
|
53
|
+
ref?: Ref<NativeTextInput | null>;
|
|
54
54
|
/**
|
|
55
55
|
* Variant of the TextInput.
|
|
56
56
|
* - `flat` - flat input with an underline.
|
|
@@ -194,8 +194,8 @@ const DefaultComponent = (props: RenderProps) => <NativeTextInput {...props} />;
|
|
|
194
194
|
const TextInput = forwardRef<TextInputHandles, Props>(
|
|
195
195
|
(
|
|
196
196
|
{
|
|
197
|
-
variant = '
|
|
198
|
-
size = '
|
|
197
|
+
variant = 'outlined',
|
|
198
|
+
size = 'sm',
|
|
199
199
|
disabled = false,
|
|
200
200
|
error: errorProp = false,
|
|
201
201
|
multiline = false,
|
|
@@ -432,6 +432,7 @@ const TextInput = forwardRef<TextInputHandles, Props>(
|
|
|
432
432
|
};
|
|
433
433
|
}, [onBlurRef]);
|
|
434
434
|
|
|
435
|
+
// @ts-ignore // TODO - fix this
|
|
435
436
|
const componentStyles = styles.root;
|
|
436
437
|
|
|
437
438
|
const labelWidth = labelLayout.width;
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import TextInputDefault from './TextInput';
|
|
3
3
|
|
|
4
|
-
registerMoleculesComponents({
|
|
5
|
-
TextInput: TextInputDefault,
|
|
6
|
-
});
|
|
7
|
-
|
|
8
4
|
export const TextInput = getRegisteredComponentWithFallback('TextInput', TextInputDefault);
|
|
9
5
|
|
|
10
6
|
export {
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native-unistyles';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
registerComponentsStyles,
|
|
7
|
-
registerComponentUtils,
|
|
4
|
+
getRegisteredComponentStylesWithFallback,
|
|
5
|
+
getRegisteredComponentUtilsWithFallback,
|
|
8
6
|
} from '../../core';
|
|
9
7
|
|
|
10
8
|
export type States =
|
|
@@ -37,12 +35,11 @@ const getInputMinHeightDefault = (variant: string, size: string) => {
|
|
|
37
35
|
}
|
|
38
36
|
};
|
|
39
37
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
getRegisteredComponentUtils('TextInput').getInputMinHeight ?? getInputMinHeightDefault;
|
|
38
|
+
export const getInputMinHeight = getRegisteredComponentUtilsWithFallback(
|
|
39
|
+
'TextInput',
|
|
40
|
+
getInputMinHeightDefault,
|
|
41
|
+
'getInputMinHeight',
|
|
42
|
+
);
|
|
46
43
|
|
|
47
44
|
const textInputStylesDefault = StyleSheet.create(theme => ({
|
|
48
45
|
root: {
|
|
@@ -530,11 +527,7 @@ const textInputStylesDefault = StyleSheet.create(theme => ({
|
|
|
530
527
|
},
|
|
531
528
|
}));
|
|
532
529
|
|
|
533
|
-
|
|
534
|
-
TextInput: textInputStylesDefault,
|
|
535
|
-
});
|
|
536
|
-
|
|
537
|
-
export const styles = getRegisteredMoleculesComponentStyles('TextInput');
|
|
530
|
+
export const styles = getRegisteredComponentStylesWithFallback('TextInput', textInputStylesDefault);
|
|
538
531
|
|
|
539
532
|
export const inputLabelStyles = StyleSheet.create({
|
|
540
533
|
labelContainer: {
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { getRegisteredComponentWithFallback
|
|
1
|
+
import { getRegisteredComponentWithFallback } from '../../core';
|
|
2
2
|
import TextInputWithMaskDefault from './TextInputMask';
|
|
3
3
|
|
|
4
|
-
registerMoleculesComponents({
|
|
5
|
-
TextInputWithMask: TextInputWithMaskDefault,
|
|
6
|
-
});
|
|
7
|
-
|
|
8
4
|
export const TextInputWithMask = getRegisteredComponentWithFallback(
|
|
9
5
|
'TextInputWithMask',
|
|
10
6
|
TextInputWithMaskDefault,
|
|
@@ -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';
|