@momo-kits/foundation 0.74.2-react-native.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/Application/BottomTab.tsx +120 -0
  2. package/Application/Components.tsx +534 -0
  3. package/Application/ModalScreen.tsx +268 -0
  4. package/Application/Navigation.ts +50 -0
  5. package/Application/NavigationContainer.tsx +120 -0
  6. package/Application/Navigator.ts +131 -0
  7. package/Application/StackScreen.tsx +71 -0
  8. package/Application/index.ts +41 -0
  9. package/Application/types.ts +216 -0
  10. package/Application/utils.tsx +151 -0
  11. package/Assets/DotAnimation.json +256 -0
  12. package/Assets/SpinnerAnimation.json +1027 -0
  13. package/Assets/icon.json +4031 -0
  14. package/Assets/icon_bank.json +506 -0
  15. package/Assets/language.json +202 -0
  16. package/Badge/Badge.tsx +56 -0
  17. package/Badge/BadgeDot.tsx +11 -0
  18. package/Badge/BadgeRibbon.tsx +125 -0
  19. package/Badge/Shape.tsx +29 -0
  20. package/Badge/index.tsx +7 -0
  21. package/Badge/styles.ts +58 -0
  22. package/Badge/types.ts +63 -0
  23. package/Button/index.tsx +310 -0
  24. package/Button/styles.ts +60 -0
  25. package/CheckBox/index.tsx +65 -0
  26. package/CheckBox/styles.ts +15 -0
  27. package/CheckBox/types.ts +38 -0
  28. package/Consts/colors+spacing+radius.ts +218 -0
  29. package/Consts/index.ts +4 -0
  30. package/Consts/styles.ts +52 -0
  31. package/Consts/theme.ts +125 -0
  32. package/Divider/index.tsx +21 -0
  33. package/Icon/index.tsx +41 -0
  34. package/Icon/types.ts +27 -0
  35. package/IconButton/index.tsx +139 -0
  36. package/IconButton/styles.ts +19 -0
  37. package/Image/index.tsx +83 -0
  38. package/Image/styles.ts +5 -0
  39. package/Image/types.ts +5 -0
  40. package/Input/Input.tsx +192 -0
  41. package/Input/InputDropDown.tsx +114 -0
  42. package/Input/InputMoney.tsx +163 -0
  43. package/Input/InputOTP.tsx +235 -0
  44. package/Input/InputSearch.tsx +151 -0
  45. package/Input/InputTextArea.tsx +159 -0
  46. package/Input/common.tsx +129 -0
  47. package/Input/index.tsx +251 -0
  48. package/Input/styles.ts +160 -0
  49. package/Input/utils.ts +69 -0
  50. package/Layout/Card.tsx +180 -0
  51. package/Layout/GridSystem.tsx +136 -0
  52. package/Layout/Item.tsx +56 -0
  53. package/Layout/ItemList.tsx +55 -0
  54. package/Layout/ItemSectionList.tsx +39 -0
  55. package/Layout/Screen.tsx +355 -0
  56. package/Layout/Section.tsx +179 -0
  57. package/Layout/index.ts +29 -0
  58. package/Layout/styles.ts +97 -0
  59. package/Layout/types.ts +23 -0
  60. package/Layout/utils.ts +55 -0
  61. package/Loader/DotLoader.tsx +37 -0
  62. package/Loader/Loader.tsx +13 -0
  63. package/Loader/ProgressBar.tsx +44 -0
  64. package/Loader/Spinner.tsx +28 -0
  65. package/Loader/index.tsx +4 -0
  66. package/Loader/styles.ts +10 -0
  67. package/Loader/types.ts +35 -0
  68. package/Loader/utils.ts +25 -0
  69. package/Pagination/Dot.tsx +16 -0
  70. package/Pagination/PaginationDot.tsx +38 -0
  71. package/Pagination/PaginationNumber.tsx +24 -0
  72. package/Pagination/PaginationScroll.tsx +88 -0
  73. package/Pagination/PaginationWhiteDot.tsx +35 -0
  74. package/Pagination/index.tsx +25 -0
  75. package/Pagination/styles.ts +50 -0
  76. package/Pagination/types.ts +40 -0
  77. package/Popup/PopupNotify.tsx +266 -0
  78. package/Popup/PopupPromotion.tsx +120 -0
  79. package/Popup/index.tsx +4 -0
  80. package/Popup/types.ts +87 -0
  81. package/Radio/index.tsx +64 -0
  82. package/Radio/styles.ts +11 -0
  83. package/Radio/types.ts +38 -0
  84. package/Skeleton/index.tsx +72 -0
  85. package/Skeleton/styles.ts +5 -0
  86. package/Skeleton/types.ts +6 -0
  87. package/Switch/index.tsx +37 -0
  88. package/Switch/styles.ts +23 -0
  89. package/Switch/types.ts +26 -0
  90. package/Tag/index.tsx +79 -0
  91. package/Tag/styles.ts +24 -0
  92. package/Tag/types.ts +36 -0
  93. package/Text/index.tsx +110 -0
  94. package/Text/styles.ts +73 -0
  95. package/Text/types.ts +34 -0
  96. package/Text/utils.ts +14 -0
  97. package/Title/index.tsx +132 -0
  98. package/Title/styles.ts +52 -0
  99. package/Title/types.ts +52 -0
  100. package/code-scanner.js +51 -0
  101. package/index.ts +51 -0
  102. package/package.json +36 -0
  103. package/publish.sh +23 -0
  104. package/tsconfig.json +24 -0
  105. package/verify.js +44 -0
@@ -0,0 +1,55 @@
1
+ import {Dimensions} from 'react-native';
2
+ import React, {Fragment, ReactElement, useEffect, useState} from 'react';
3
+
4
+ /**
5
+ * validate children type
6
+ * @param children
7
+ * @param childrenTypes
8
+ */
9
+ const validateChildren = (
10
+ children: React.ReactNode | React.ReactNode[],
11
+ childrenTypes: Array<React.ReactNode>,
12
+ ) => {
13
+ const validateType = (child: React.ReactElement) => {
14
+ const valid = childrenTypes.some(
15
+ childrenType => child?.type === childrenType || child?.type == Fragment,
16
+ );
17
+ if (!valid) {
18
+ console.warn(
19
+ `Wrong children type for this component, expected are ${childrenTypes
20
+ .map(item => item)
21
+ .join(', ')}.`,
22
+ );
23
+ }
24
+ };
25
+ if (Array.isArray(children)) {
26
+ const flattenChildren: React.ReactElement[] = children.flat();
27
+ for (const child of flattenChildren) {
28
+ validateType(child);
29
+ }
30
+ return flattenChildren;
31
+ } else {
32
+ validateType(children as ReactElement);
33
+ return children;
34
+ }
35
+ };
36
+
37
+ const useGridSystem = () => {
38
+ const [numberOfColumns, setNumberOfColumns] = useState(
39
+ Dimensions.get('window').width > 600 ? 24 : 12,
40
+ );
41
+
42
+ useEffect(() => {
43
+ const subscription: any = Dimensions.addEventListener('change', () => {
44
+ const newColumns = Dimensions.get('window').width > 600 ? 24 : 12;
45
+ if (newColumns != numberOfColumns) {
46
+ setNumberOfColumns(newColumns);
47
+ }
48
+ });
49
+ return () => subscription?.remove();
50
+ }, []);
51
+
52
+ return {numberOfColumns};
53
+ };
54
+
55
+ export {validateChildren, useGridSystem};
@@ -0,0 +1,37 @@
1
+ import React, {FC, useContext} from 'react';
2
+ import AnimatedLottieView from 'lottie-react-native';
3
+ import animation from '../Assets/DotAnimation.json';
4
+ import {ApplicationContext} from '../Application';
5
+ import {hexToRGBA} from './utils';
6
+ import {LoaderProps} from './types';
7
+
8
+ const DotLoader: FC<LoaderProps> = ({color}) => {
9
+ const {theme} = useContext(ApplicationContext);
10
+
11
+ const arrayColor = [
12
+ color ?? theme.colors.primary,
13
+ theme.colors.background.surface,
14
+ color ?? theme.colors.primary,
15
+ ];
16
+
17
+ let source: any = require('../Assets/DotAnimation.json');
18
+ source.assets[0].layers[0].shapes[0].it.forEach((item: any) => {
19
+ if (item.ty === 'fl' && item.c) {
20
+ item.c.k.forEach((fillItem: any, index: number) => {
21
+ if (typeof fillItem !== 'number') {
22
+ fillItem.s = hexToRGBA(arrayColor[index] as string);
23
+ }
24
+ });
25
+ }
26
+ });
27
+
28
+ return (
29
+ <AnimatedLottieView
30
+ source={source}
31
+ style={{width: 52, height: 18}}
32
+ autoPlay
33
+ />
34
+ );
35
+ };
36
+
37
+ export default DotLoader;
@@ -0,0 +1,13 @@
1
+ import React, {FC} from 'react';
2
+ import {LoaderProps} from './types';
3
+ import DotLoader from './DotLoader';
4
+ import Spinner from './Spinner';
5
+
6
+ const Loader: FC<LoaderProps> = ({type = 'dot', ...props}) => {
7
+ if (type === 'spinner') {
8
+ return <Spinner {...props} key={props.color} />;
9
+ }
10
+ return <DotLoader {...props} key={props.color} />;
11
+ };
12
+
13
+ export default Loader;
@@ -0,0 +1,44 @@
1
+ import React, {FC, useContext, useEffect, useRef} from 'react';
2
+ import {Animated, View} from 'react-native';
3
+ import styles from './styles';
4
+ import {ProgressBarProps} from './types';
5
+ import {ApplicationContext} from '../Application';
6
+ import {Radius} from '../Consts';
7
+
8
+ const ProgressBar: FC<ProgressBarProps> = ({percent = 0, style}) => {
9
+ const {theme} = useContext(ApplicationContext);
10
+ const animation = useRef(new Animated.Value(0)).current;
11
+
12
+ useEffect(() => {
13
+ Animated.timing(animation, {
14
+ toValue: percent,
15
+ duration: 200,
16
+ useNativeDriver: false,
17
+ }).start();
18
+ }, [percent, animation]);
19
+
20
+ const width = animation.interpolate({
21
+ inputRange: [0, 100],
22
+ outputRange: ['0%', '100%'],
23
+ });
24
+
25
+ return (
26
+ <View
27
+ style={[
28
+ style,
29
+ styles.progressContainer,
30
+ {backgroundColor: theme.colors.background.default},
31
+ ]}>
32
+ <Animated.View
33
+ style={{
34
+ height: 4,
35
+ borderRadius: Radius.XXS,
36
+ width,
37
+ backgroundColor: theme.colors.primary,
38
+ }}
39
+ />
40
+ </View>
41
+ );
42
+ };
43
+
44
+ export default ProgressBar;
@@ -0,0 +1,28 @@
1
+ import React, {FC, useContext} from 'react';
2
+ import AnimatedLottieView from 'lottie-react-native';
3
+ import {hexToRGBA} from './utils';
4
+ import {ApplicationContext} from '../Application';
5
+ import {LoaderProps} from './types';
6
+
7
+ const Spinner: FC<LoaderProps> = ({color}) => {
8
+ const {theme} = useContext(ApplicationContext);
9
+
10
+ let source: any = require('../Assets/DotAnimation.json');
11
+ source.assets[0].layers.forEach((layer: any) => {
12
+ layer.shapes[0].it.forEach((item: any) => {
13
+ if (item.ty === 'fl' && item.c) {
14
+ item.c.k = hexToRGBA(color ?? theme.colors.primary);
15
+ }
16
+ });
17
+ });
18
+
19
+ return (
20
+ <AnimatedLottieView
21
+ source={source}
22
+ style={{width: 24, height: 24}}
23
+ autoPlay
24
+ />
25
+ );
26
+ };
27
+
28
+ export default Spinner;
@@ -0,0 +1,4 @@
1
+ import Loader from './Loader';
2
+ import ProgressBar from './ProgressBar';
3
+
4
+ export {Loader, ProgressBar};
@@ -0,0 +1,10 @@
1
+ import {StyleSheet} from 'react-native';
2
+ import {Radius} from '../Consts';
3
+
4
+ export default StyleSheet.create({
5
+ progressContainer: {
6
+ width: '100%',
7
+ height: 4,
8
+ borderRadius: Radius.XXS,
9
+ },
10
+ });
@@ -0,0 +1,35 @@
1
+ import {ViewStyle} from 'react-native';
2
+
3
+ export type LoaderProps = {
4
+ /**
5
+ * Optional. Type of loader, can be 'dot' or 'spinner'.
6
+ */
7
+ type?: 'dot' | 'spinner';
8
+
9
+ /**
10
+ * Optional. Color for the loader.
11
+ */
12
+ color?: string;
13
+
14
+ /**
15
+ * Optional. Style or styles for the loader component.
16
+ */
17
+ style?: ViewStyle | ViewStyle[];
18
+ };
19
+
20
+ export type ProgressBarProps = {
21
+ /**
22
+ * Required. Percentage value to display on the progress bar.
23
+ */
24
+ percent: number;
25
+
26
+ /**
27
+ * Optional. Color for the progress bar.
28
+ */
29
+ color?: string;
30
+
31
+ /**
32
+ * Optional. Style or styles for the progress bar component.
33
+ */
34
+ style?: ViewStyle | ViewStyle[];
35
+ };
@@ -0,0 +1,25 @@
1
+ export const hexToRGBA = (hex: string) => {
2
+ const normalizedHex = hex.startsWith('#') ? hex.slice(1) : hex;
3
+
4
+ if (!/^([0-9A-Fa-f]{3}){1,2}$/.test(normalizedHex)) {
5
+ throw new Error('Invalid HEX color.');
6
+ }
7
+
8
+ const expandedHex =
9
+ normalizedHex.length === 3
10
+ ? normalizedHex
11
+ .split('')
12
+ .map(val => val + val)
13
+ .join('')
14
+ : normalizedHex;
15
+
16
+ const hexMatch = expandedHex.match(/.{2}/g);
17
+
18
+ if (!hexMatch) {
19
+ throw new Error('HEX parsing failed.');
20
+ }
21
+
22
+ return hexMatch
23
+ .map(val => parseInt(val, 16))
24
+ .map(val => Math.round((val / 255) * 1000) / 1000);
25
+ };
@@ -0,0 +1,16 @@
1
+ import React, {FC, useContext} from 'react';
2
+ import {Animated} from 'react-native';
3
+ import styles from './styles';
4
+ import {DotProps} from './types';
5
+ import {ApplicationContext} from '../Application';
6
+
7
+ const Dot: FC<DotProps> = ({active, style}) => {
8
+ const {theme} = useContext(ApplicationContext);
9
+ const dotStyle = active
10
+ ? [styles.activeDot]
11
+ : [styles.inactiveDot, {backgroundColor: theme.colors.background.pressed}];
12
+
13
+ return <Animated.View style={[style, dotStyle]} />;
14
+ };
15
+
16
+ export default Dot;
@@ -0,0 +1,38 @@
1
+ import React, {FC, useContext} from 'react';
2
+ import {View} from 'react-native';
3
+ import {ChildPaginationProps} from './types';
4
+ import Dot from './Dot';
5
+ import styles from './styles';
6
+ import {Spacing} from '../Consts';
7
+ import {ApplicationContext} from '../Application';
8
+
9
+ const PaginationDot: FC<ChildPaginationProps> = ({
10
+ dataLength = 2,
11
+ activeIndex = 0,
12
+ style,
13
+ }) => {
14
+ const {theme} = useContext(ApplicationContext);
15
+ const renderDots = () => {
16
+ const dots: React.ReactElement[] = [];
17
+ for (let i = 0; i < dataLength; i++) {
18
+ dots.push(
19
+ <Dot
20
+ key={`Dot${i}`}
21
+ style={[
22
+ i !== dataLength - 1 ? {marginRight: Spacing.XS} : {},
23
+ {backgroundColor: theme.colors.primary},
24
+ ]}
25
+ active={activeIndex === i}
26
+ />,
27
+ );
28
+ }
29
+ return dots;
30
+ };
31
+ return (
32
+ <View style={[style, styles.row]}>
33
+ <View style={styles.paginationPinkContainer}>{renderDots()}</View>
34
+ </View>
35
+ );
36
+ };
37
+
38
+ export default PaginationDot;
@@ -0,0 +1,24 @@
1
+ import React, {FC} from 'react';
2
+ import {View} from 'react-native';
3
+ import {ChildPaginationProps} from './types';
4
+ import styles from './styles';
5
+ import {Text} from '../Text';
6
+ import {Colors} from '../Consts';
7
+
8
+ const PaginationNumber: FC<ChildPaginationProps> = ({
9
+ activeIndex = 0,
10
+ dataLength = 2,
11
+ style,
12
+ }) => {
13
+ return (
14
+ <View style={[style, styles.row]}>
15
+ <View style={styles.paginationNumberContainer}>
16
+ <Text color={Colors.black_01} typography={'label_default_medium'}>{`${
17
+ activeIndex + 1
18
+ }/${dataLength}`}</Text>
19
+ </View>
20
+ </View>
21
+ );
22
+ };
23
+
24
+ export default PaginationNumber;
@@ -0,0 +1,88 @@
1
+ import React, {FC, useContext, useRef, useState} from 'react';
2
+ import {Animated, View} from 'react-native';
3
+ import {ScrollIndicatorProps} from './types';
4
+ import styles from './styles';
5
+ import {ApplicationContext} from '../Application';
6
+
7
+ const INDICATOR_WIDTH = 24;
8
+ const INDICATOR_CONTAINER_WIDTH = 72;
9
+ const PaginationScroll: FC<ScrollIndicatorProps> = ({
10
+ style,
11
+ children,
12
+ scrollViewRef,
13
+ }) => {
14
+ const {theme} = useContext(ApplicationContext);
15
+ const left = useRef(new Animated.Value(0)).current;
16
+ const [scrollViewWidth, setScrollViewWidth] = useState(0);
17
+ const [scrollContentWidth, setScrollContentWidth] = useState(0);
18
+
19
+ const translateX = () => {
20
+ if (scrollViewWidth && scrollContentWidth) {
21
+ const value = left.interpolate({
22
+ inputRange: [0, scrollContentWidth - scrollViewWidth],
23
+ outputRange: [0, INDICATOR_CONTAINER_WIDTH - INDICATOR_WIDTH],
24
+ extrapolate: 'clamp',
25
+ });
26
+ return {transform: [{translateX: value}]};
27
+ }
28
+ return {};
29
+ };
30
+
31
+ const renderScrollView = () => {
32
+ return (
33
+ <Animated.ScrollView
34
+ ref={scrollViewRef}
35
+ onScroll={Animated.event(
36
+ [
37
+ {
38
+ nativeEvent: {
39
+ contentOffset: {
40
+ x: left,
41
+ },
42
+ },
43
+ },
44
+ ],
45
+ {useNativeDriver: true},
46
+ )}
47
+ alwaysBounceHorizontal={false}
48
+ showsHorizontalScrollIndicator={false}
49
+ horizontal
50
+ style={styles.scrollView}
51
+ onContentSizeChange={width => {
52
+ setScrollContentWidth(width);
53
+ }}
54
+ onLayout={e => {
55
+ setScrollViewWidth(e.nativeEvent.layout.width);
56
+ }}>
57
+ {children}
58
+ </Animated.ScrollView>
59
+ );
60
+ };
61
+ const renderIndicator = () => {
62
+ return (
63
+ <View
64
+ style={[
65
+ styles.indicatorContainer,
66
+ {backgroundColor: theme.colors.background.pressed},
67
+ ]}>
68
+ <Animated.View
69
+ style={[
70
+ styles.indicator,
71
+ {
72
+ backgroundColor: theme.colors.primary,
73
+ },
74
+ translateX(),
75
+ ]}
76
+ />
77
+ </View>
78
+ );
79
+ };
80
+ return (
81
+ <View style={[style, styles.scrollContainer]}>
82
+ {renderScrollView()}
83
+ {renderIndicator()}
84
+ </View>
85
+ );
86
+ };
87
+
88
+ export default PaginationScroll;
@@ -0,0 +1,35 @@
1
+ import React, {FC} from 'react';
2
+ import {View} from 'react-native';
3
+ import {ChildPaginationProps} from './types';
4
+ import styles from './styles';
5
+ import Dot from './Dot';
6
+ import {Colors, Spacing} from '../Consts';
7
+
8
+ const PaginationWhiteDot: FC<ChildPaginationProps> = ({
9
+ dataLength = 2,
10
+ activeIndex = 0,
11
+ style,
12
+ }) => {
13
+ const renderDots = () => {
14
+ const dots: React.ReactElement[] = [];
15
+ for (let i = 0; i < dataLength; i++) {
16
+ dots.push(
17
+ <Dot
18
+ style={[
19
+ i !== dataLength - 1 ? {marginRight: Spacing.XS} : {},
20
+ {backgroundColor: Colors.black_01},
21
+ ]}
22
+ active={activeIndex === i}
23
+ />,
24
+ );
25
+ }
26
+ return dots;
27
+ };
28
+ return (
29
+ <View style={[style, styles.row]}>
30
+ <View style={styles.paginationWhiteContainer}>{renderDots()}</View>
31
+ </View>
32
+ );
33
+ };
34
+
35
+ export default PaginationWhiteDot;
@@ -0,0 +1,25 @@
1
+ import React, {FC} from 'react';
2
+ import {PaginationProps} from './types';
3
+ import PaginationWhiteDot from './PaginationWhiteDot';
4
+ import PaginationDot from './PaginationDot';
5
+ import PaginationNumber from './PaginationNumber';
6
+ import PaginationScroll from './PaginationScroll';
7
+
8
+ const Pagination: FC<PaginationProps> = props => {
9
+ const {type} = props;
10
+
11
+ const getComponent = (): any => {
12
+ switch (type) {
13
+ case 'black_white':
14
+ return <PaginationWhiteDot {...props} />;
15
+ case 'number':
16
+ return <PaginationNumber {...props} />;
17
+ default:
18
+ return <PaginationDot {...props} />;
19
+ }
20
+ };
21
+
22
+ return getComponent();
23
+ };
24
+
25
+ export {Pagination, PaginationScroll};
@@ -0,0 +1,50 @@
1
+ import {StyleSheet} from 'react-native';
2
+ import {Colors, Radius, Spacing} from '../Consts';
3
+
4
+ export default StyleSheet.create({
5
+ activeDot: {
6
+ height: 4,
7
+ width: 12,
8
+ borderRadius: Radius.XS,
9
+ },
10
+ inactiveDot: {
11
+ height: 4,
12
+ width: 4,
13
+ borderRadius: Radius.XS,
14
+ },
15
+ paginationPinkContainer: {
16
+ flexDirection: 'row',
17
+ },
18
+ paginationWhiteContainer: {
19
+ flexDirection: 'row',
20
+ padding: Spacing.XS,
21
+ borderRadius: Radius.S,
22
+ backgroundColor: Colors.black_20 + '33',
23
+ },
24
+ paginationNumberContainer: {
25
+ paddingHorizontal: Spacing.S,
26
+ borderRadius: Radius.L,
27
+ backgroundColor: Colors.black_20 + '33',
28
+ alignItems: 'center',
29
+ justifyContent: 'center',
30
+ },
31
+ scrollContainer: {
32
+ alignItems: 'center',
33
+ width: '100%',
34
+ },
35
+ scrollView: {
36
+ marginBottom: Spacing.L,
37
+ },
38
+
39
+ indicator: {
40
+ width: 24,
41
+ height: 4,
42
+ borderRadius: Radius.XS,
43
+ },
44
+ indicatorContainer: {
45
+ width: 72,
46
+ height: 4,
47
+ borderRadius: Radius.XS,
48
+ },
49
+ row: {flexDirection: 'row'},
50
+ });
@@ -0,0 +1,40 @@
1
+ import {ScrollView, ScrollViewProps, ViewStyle} from 'react-native';
2
+ import {Ref} from 'react';
3
+
4
+ export type PaginationProps = {
5
+ /**
6
+ * Optional. Defines the visual style of the Pagination component.
7
+ * - 'default': Represents the default style.
8
+ * - 'black_white': Represents a pagination that have black background.
9
+ * - 'number': Represents a style where pages are represented by numbers.
10
+ * - 'scroll': Represents a scrollable style.
11
+ */
12
+ type?: 'default' | 'black_white' | 'number' | 'scroll';
13
+
14
+ /**
15
+ * Represents the currently active (selected) index in the Pagination component.
16
+ */
17
+ activeIndex: number;
18
+
19
+ /**
20
+ * Represents the total number of items (pages) in the Pagination component.
21
+ */
22
+ dataLength: number;
23
+
24
+ style?: ViewStyle | ViewStyle[];
25
+ };
26
+
27
+ export type DotProps = {
28
+ active: boolean;
29
+ style: ViewStyle | ViewStyle[];
30
+ };
31
+
32
+ export interface ScrollIndicatorProps extends ScrollViewProps {
33
+ /**
34
+ * Optional. Represents a reference to the ScrollView component.
35
+ * It can be used to access the instance methods of the ScrollView.
36
+ */
37
+ scrollViewRef?: Ref<ScrollView>;
38
+ }
39
+
40
+ export type ChildPaginationProps = Omit<PaginationProps, 'type'>;