@momo-kits/foundation 0.75.1-beta.8 → 0.75.2-beta.0

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 (112) hide show
  1. package/Application/BottomTab/BottomTabBar.tsx +478 -0
  2. package/Application/BottomTab/index.tsx +134 -0
  3. package/Application/Components.tsx +552 -0
  4. package/Application/ModalScreen.tsx +244 -0
  5. package/Application/Navigation.ts +50 -0
  6. package/Application/NavigationContainer.tsx +128 -0
  7. package/Application/Navigator.ts +151 -0
  8. package/Application/StackScreen.tsx +146 -0
  9. package/Application/index.ts +37 -0
  10. package/{Navigation → Application}/types.ts +96 -27
  11. package/Application/utils.tsx +175 -0
  12. package/Assets/DotAnimation.json +256 -0
  13. package/Assets/SpinnerAnimation.json +1027 -0
  14. package/Assets/icon.json +89 -5
  15. package/Assets/icon_bank.json +506 -0
  16. package/Assets/language.json +202 -0
  17. package/Badge/Badge.tsx +56 -0
  18. package/Badge/BadgeDot.tsx +11 -0
  19. package/Badge/BadgeRibbon.tsx +125 -0
  20. package/Badge/Shape.tsx +29 -0
  21. package/Badge/index.tsx +7 -0
  22. package/Badge/styles.ts +58 -0
  23. package/Badge/types.ts +63 -0
  24. package/Button/index.tsx +90 -39
  25. package/Button/styles.ts +19 -0
  26. package/CheckBox/index.tsx +58 -43
  27. package/CheckBox/styles.ts +1 -1
  28. package/CheckBox/types.ts +6 -4
  29. package/Consts/colors+spacing+radius.ts +18 -0
  30. package/Consts/styles.ts +0 -26
  31. package/Consts/theme.ts +5 -1
  32. package/Divider/index.tsx +3 -1
  33. package/Icon/index.tsx +14 -10
  34. package/Icon/types.ts +4 -3
  35. package/IconButton/index.tsx +24 -15
  36. package/Image/index.tsx +63 -45
  37. package/Image/styles.ts +1 -9
  38. package/Image/types.ts +5 -1
  39. package/Input/Input.tsx +227 -115
  40. package/Input/InputDropDown.tsx +132 -0
  41. package/Input/InputMoney.tsx +174 -110
  42. package/Input/InputOTP.tsx +257 -0
  43. package/Input/InputSearch.tsx +160 -130
  44. package/Input/InputTextArea.tsx +149 -121
  45. package/Input/common.tsx +43 -18
  46. package/Input/index.tsx +205 -17
  47. package/Input/styles.ts +44 -7
  48. package/Input/utils.ts +2 -2
  49. package/Layout/Card.tsx +154 -62
  50. package/Layout/FloatingButton.tsx +128 -0
  51. package/Layout/GridSystem.tsx +35 -23
  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 +378 -0
  56. package/Layout/Section.tsx +74 -39
  57. package/Layout/index.ts +14 -3
  58. package/Layout/styles.ts +101 -0
  59. package/Layout/types.ts +1 -39
  60. package/Layout/utils.ts +42 -37
  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 +29 -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 +1 -1
  70. package/Pagination/PaginationDot.tsx +8 -3
  71. package/Pagination/PaginationNumber.tsx +8 -7
  72. package/Pagination/PaginationScroll.tsx +1 -1
  73. package/Pagination/PaginationWhiteDot.tsx +8 -5
  74. package/Pagination/styles.ts +3 -0
  75. package/Pagination/types.ts +2 -0
  76. package/Popup/PopupNotify.tsx +102 -44
  77. package/Popup/PopupPromotion.tsx +63 -22
  78. package/Popup/types.ts +15 -4
  79. package/Radio/index.tsx +35 -21
  80. package/Radio/types.ts +7 -5
  81. package/Skeleton/index.tsx +1 -1
  82. package/Skeleton/types.ts +3 -0
  83. package/Switch/index.tsx +35 -24
  84. package/Switch/types.ts +5 -3
  85. package/Tag/index.tsx +1 -1
  86. package/Text/index.tsx +32 -26
  87. package/Text/styles.ts +38 -0
  88. package/Text/types.ts +25 -13
  89. package/Text/utils.ts +14 -0
  90. package/Title/index.tsx +186 -0
  91. package/Title/styles.ts +79 -0
  92. package/Title/types.ts +20 -0
  93. package/code-scanner.js +143 -0
  94. package/index.ts +17 -3
  95. package/migrate_typo.js +56 -0
  96. package/package.json +44 -39
  97. package/publish.sh +2 -5
  98. package/tsconfig.json +24 -0
  99. package/verify.js +47 -0
  100. package/Assets/header-background.png +0 -0
  101. package/Layout/ScreenContainer.tsx +0 -122
  102. package/Navigation/BottomTab.tsx +0 -39
  103. package/Navigation/Components.tsx +0 -365
  104. package/Navigation/ModalScreen.tsx +0 -226
  105. package/Navigation/Navigation.ts +0 -44
  106. package/Navigation/NavigationButton.tsx +0 -54
  107. package/Navigation/NavigationContainer.tsx +0 -77
  108. package/Navigation/Navigator.ts +0 -82
  109. package/Navigation/Observer.ts +0 -79
  110. package/Navigation/StackScreen.tsx +0 -27
  111. package/Navigation/index.ts +0 -14
  112. package/Navigation/utils.tsx +0 -137
@@ -0,0 +1,37 @@
1
+ import {Platform} from 'react-native';
2
+ import {NavigationContainer} from './NavigationContainer';
3
+ import Screen from '../Layout/Screen';
4
+ import {
5
+ HeaderAnimated,
6
+ HeaderBackground,
7
+ HeaderCustom,
8
+ HeaderRightAction,
9
+ HeaderTitle,
10
+ NavigationButton,
11
+ } from './Components';
12
+ import BottomTab from './BottomTab';
13
+ import {createContext} from 'react';
14
+ import {defaultContext} from '../Consts';
15
+
16
+ const Context = createContext({});
17
+ const ApplicationContext = createContext(defaultContext);
18
+
19
+ const MiniAppContext = (Platform as any).MiniAppContext ?? Context;
20
+ const ScreenContext = (Platform as any).ScreenContext ?? Context;
21
+ const ComponentContext = (Platform as any).ComponentContext ?? Context;
22
+
23
+ export {
24
+ ApplicationContext,
25
+ MiniAppContext,
26
+ ScreenContext,
27
+ ComponentContext,
28
+ NavigationContainer,
29
+ Screen,
30
+ BottomTab,
31
+ NavigationButton,
32
+ HeaderTitle,
33
+ HeaderBackground,
34
+ HeaderRightAction,
35
+ HeaderCustom,
36
+ HeaderAnimated,
37
+ };
@@ -1,7 +1,11 @@
1
- import {Animated, ScrollViewProps, ViewProps} from 'react-native';
1
+ import {StackNavigationOptions} from '@react-navigation/stack';
2
2
  import React from 'react';
3
- import Navigator from './Navigator';
3
+ import {Animated, FlatListProps, ViewProps} from 'react-native';
4
4
  import {PopupNotifyProps} from '../Popup/types';
5
+ import Navigation from './Navigation';
6
+ import Navigator from './Navigator';
7
+
8
+ type Screen = React.ComponentType<NavigationScreenProps>;
5
9
 
6
10
  export type Theme = {
7
11
  dark: boolean;
@@ -59,71 +63,111 @@ export type Theme = {
59
63
  };
60
64
 
61
65
  export type Context = {
66
+ [key: string]: any;
62
67
  theme: Theme;
63
68
  navigator?: Navigator;
69
+ showGrid?: boolean;
70
+ translate?: (key: string) => string;
71
+ };
72
+
73
+ export type MiniAppInfo = {
74
+ [key: string]: any;
75
+ code: string;
76
+ appId: string;
77
+ buildNumber: number;
78
+ flowPartnerId?: string;
79
+ toolkitConfig?: any;
80
+ fromCode?: string;
81
+ };
82
+
83
+ export type LocalizationObject = {
84
+ vi: {
85
+ [key: string]: string;
86
+ };
87
+ en: {
88
+ [key: string]: string;
89
+ };
64
90
  };
65
91
 
66
92
  export type NavigationContainerProps = {
67
- screen: React.ElementType;
93
+ screen: Screen;
68
94
  options?: NavigationOptions;
69
95
  theme: Theme;
70
- maxApi?: any;
96
+ maxApi: any;
97
+ localization?: LocalizationObject;
98
+ initialParams?: any;
71
99
  };
72
100
 
73
- export interface ScreenContainerProps extends ViewProps {
74
- enableKeyboardAvoidingView?: boolean;
75
- headerBackground?: string;
76
- scrollable?: boolean;
77
- scrollY?: Animated.Value;
78
- scrollViewProps?: ScrollViewProps;
79
- footerComponent?: React.ElementType;
80
- }
101
+ export type NavigationScreenProps = {
102
+ [key: string]: any;
103
+ options?: NavigationOptions;
104
+ navigation: Navigation;
105
+ };
81
106
 
82
107
  export type ScreenParams = {
83
108
  [key: string]: any;
84
- screen: React.ElementType;
109
+ screen: Screen;
85
110
  options?: NavigationOptions;
86
111
  };
87
112
 
88
113
  export interface ModalParams extends ScreenParams {
89
114
  [key: string]: any;
90
- screen: React.ElementType;
91
- onDismiss?: (mounted?: boolean) => void;
115
+ onDismiss?: () => void;
92
116
  barrierDismissible?: boolean;
93
117
  }
94
118
 
95
119
  export interface BottomSheetParams extends ScreenParams {
96
120
  [key: string]: any;
97
121
  onDismiss?: () => void;
122
+ footerComponent?: React.ReactNode;
123
+ flatListProps?: FlatListProps<any>;
98
124
  }
99
125
 
100
126
  export type NavigationButtonProps = {
101
127
  icon: string;
102
128
  tintColor?: string;
103
- backgroundColor?: string;
104
129
  useBorder?: boolean;
105
130
  onPress: () => void;
131
+ badgeType?: 'dot' | 'number';
132
+ badgeValue?: number;
106
133
  accessibilityLabel?: string;
107
134
  };
108
135
 
109
- export type NavigationOptions = {
136
+ export type PinnedToolType = {
137
+ key: string;
138
+ badgeValue?: number;
139
+ badgeType?: 'number' | 'dot';
140
+ };
141
+
142
+ export type RuntimeToolType = {
143
+ title: {vi: string; en: string};
144
+ icon: string;
145
+ key: string;
146
+ };
147
+
148
+ export interface NavigationOptions extends StackNavigationOptions {
110
149
  preventBack?: PopupNotifyProps;
150
+ onPressLeftHeader?: () => void;
111
151
  surface?: boolean;
112
- title?: string;
113
- headerTitleAlign?: 'left' | 'center';
152
+ hiddenBack?: boolean;
114
153
  customTitle?: TitleCustomProps;
115
- headerRight?: (props?: any) => React.ReactElement;
116
- animatedValue?: Animated.Value;
117
- };
154
+ toolkitParams?: {
155
+ pinnedTool?: PinnedToolType;
156
+ runtimeTools?: RuntimeToolType[];
157
+ preventClose?: PopupNotifyProps;
158
+ };
159
+ }
118
160
 
119
161
  export interface HeaderBackProps extends NavigationButtonProps {
120
162
  preventBack?: PopupNotifyProps;
163
+ onPressLeftHeader?: () => void;
121
164
  }
122
165
 
123
166
  export type HeaderBackgroundProps = {
124
167
  image?: string | null;
125
168
  backgroundColor?: string | null;
126
169
  animatedValue?: Animated.Value;
170
+ useBorder?: boolean;
127
171
  };
128
172
 
129
173
  export type TitleCustomProps = {
@@ -139,19 +183,44 @@ export type TitleCustomProps = {
139
183
  export type HeaderToolkitProps = {
140
184
  [key: string]: any;
141
185
  appCode: string;
142
- hidden: boolean;
143
- type: string;
144
- onAction?: (action: string) => void;
186
+ configs: any[];
145
187
  };
146
188
 
189
+ export interface HeaderAnimatedProps extends ViewProps {
190
+ animatedValue: Animated.Value;
191
+ image: string;
192
+ }
193
+
147
194
  export type BottomTabItemProps = {
195
+ name: string;
148
196
  label: string;
149
197
  icon: string;
150
198
  showDot?: boolean;
151
- badgeLabel?: string;
152
- screen: React.ComponentType<any>;
199
+ badgeLabel?: string | number;
200
+ screen: Screen;
201
+ options: NavigationOptions;
153
202
  };
154
203
 
155
204
  export type BottomTabProps = {
205
+ nested?: boolean;
156
206
  tabs: BottomTabItemProps[];
207
+ initialRouteName?: string;
208
+ navigation: Navigation;
209
+ listeners?: {
210
+ tabPress?: any;
211
+ focus?: any;
212
+ };
213
+ floatingButton?: FloatingButtonProps;
214
+ };
215
+
216
+ export type FloatingButtonProps = {
217
+ container?: React.ReactNode;
218
+ icon: string | React.ReactNode;
219
+ label: string;
220
+ onPress: () => void;
221
+ };
222
+
223
+ export type AnimatedHeader = {
224
+ type: 'default' | 'surface';
225
+ component?: (props?: any) => React.ReactElement;
157
226
  };
@@ -0,0 +1,175 @@
1
+ import React from 'react';
2
+ import {
3
+ StackNavigationOptions,
4
+ TransitionPresets,
5
+ } from '@react-navigation/stack';
6
+ import {
7
+ HeaderBackground,
8
+ HeaderCustom,
9
+ HeaderLeft,
10
+ HeaderTitle,
11
+ HeaderToolkitAction,
12
+ } from './Components';
13
+ import {NavigationOptions, Theme} from './types';
14
+ import {Colors} from '../Consts';
15
+ import {Platform} from 'react-native';
16
+ const isIOS = Platform.OS === 'ios';
17
+ /**
18
+ * default options for stack screen
19
+ */
20
+ const getStackOptions = (): StackNavigationOptions => {
21
+ return {
22
+ headerTitleAlign: 'left',
23
+ headerTitle: HeaderTitle,
24
+ headerBackground: (props: any) => <HeaderBackground {...props} />,
25
+ headerLeft: (props: any) => <HeaderLeft {...props} />,
26
+ headerRight: (props: any) => <HeaderToolkitAction {...props} />,
27
+ headerTintColor: Colors.black_01,
28
+ };
29
+ };
30
+
31
+ /**
32
+ * default options for dialog screen
33
+ */
34
+ const getDialogOptions = (): StackNavigationOptions => {
35
+ return {
36
+ headerTitleAlign: 'left',
37
+ headerTitle: HeaderTitle,
38
+ headerLeft: (props: any) => <HeaderLeft {...props} />,
39
+ headerBackground: (props: any) => <HeaderBackground {...props} />,
40
+ headerTintColor: Colors.black_01,
41
+ ...TransitionPresets.ModalTransition,
42
+ };
43
+ };
44
+
45
+ /**
46
+ * default options for modal screen
47
+ */
48
+ const getModalOptions = (): StackNavigationOptions => {
49
+ return {
50
+ headerShown: false,
51
+ headerBackground: undefined,
52
+ cardStyle: {backgroundColor: 'transparent'},
53
+ cardOverlayEnabled: true,
54
+ animationEnabled: false,
55
+ cardStyleInterpolator: ({current: {progress}}) => ({
56
+ cardStyle: {
57
+ opacity: progress.interpolate({
58
+ inputRange: [0, 0.5, 0.9, 1],
59
+ outputRange: [0, 0.25, 0.7, 1],
60
+ }),
61
+ },
62
+ overlayStyle: {
63
+ opacity: progress.interpolate({
64
+ inputRange: [0, 0.5, 0.9, 1],
65
+ outputRange: [0, 0.2, 0.4, 0.6],
66
+ extrapolate: 'clamp',
67
+ }),
68
+ },
69
+ }),
70
+ };
71
+ };
72
+
73
+ /**
74
+ * build react-navigation options
75
+ */
76
+ const getOptions = (params: NavigationOptions, theme: Theme) => {
77
+ let options = {};
78
+
79
+ if (
80
+ typeof params.onPressLeftHeader === 'function' ||
81
+ params.preventBack !== undefined ||
82
+ typeof params.hiddenBack === 'boolean'
83
+ ) {
84
+ options = {
85
+ ...options,
86
+ headerLeft: params.hiddenBack
87
+ ? null
88
+ : (props: any) => (
89
+ <HeaderLeft
90
+ {...props}
91
+ preventBack={params.preventBack}
92
+ onPressLeftHeader={params.onPressLeftHeader}
93
+ />
94
+ ),
95
+ };
96
+ }
97
+
98
+ if (typeof params.surface == 'boolean') {
99
+ if (params.surface) {
100
+ options = {
101
+ ...options,
102
+ headerTintColor: theme.colors.text.default,
103
+ headerBackground: () => (
104
+ <HeaderBackground
105
+ image={null}
106
+ backgroundColor={theme.colors.background.surface}
107
+ useBorder={true}
108
+ />
109
+ ),
110
+ };
111
+ } else {
112
+ options = {
113
+ ...options,
114
+ headerTintColor: Colors.black_01,
115
+ headerBackground: HeaderBackground,
116
+ };
117
+ }
118
+ }
119
+
120
+ if (params.customTitle) {
121
+ options = {
122
+ ...options,
123
+ headerTitleAlign: 'left',
124
+ headerTitle: (props: any) => {
125
+ return <HeaderCustom {...params.customTitle} {...props} />;
126
+ },
127
+ };
128
+ }
129
+
130
+ if (params.toolkitParams) {
131
+ options = {
132
+ ...options,
133
+ headerRight: (props: any) => {
134
+ return <HeaderToolkitAction {...params.toolkitParams} {...props} />;
135
+ },
136
+ };
137
+ }
138
+
139
+ return {
140
+ ...params,
141
+ ...options,
142
+ };
143
+ };
144
+
145
+ const getAccessibilityID = (
146
+ key = '',
147
+ override: string | undefined = undefined,
148
+ ) => {
149
+ if (isIOS) {
150
+ return {
151
+ accessible: true,
152
+ testID: override || key,
153
+ };
154
+ } else {
155
+ return {
156
+ accessibilityLabel: override || key,
157
+ };
158
+ }
159
+ };
160
+
161
+ const formatNameLength = (name = '') => {
162
+ let formattedName = name;
163
+ if (formattedName.length > 100) {
164
+ formattedName = formattedName.substring(0, 100);
165
+ }
166
+ return formattedName;
167
+ };
168
+ export {
169
+ getStackOptions,
170
+ getDialogOptions,
171
+ getModalOptions,
172
+ getOptions,
173
+ formatNameLength,
174
+ getAccessibilityID,
175
+ };
@@ -0,0 +1,256 @@
1
+ {
2
+ "v": "4.8.0",
3
+ "meta": {"g": "LottieFiles AE 3.2.2", "a": "", "k": "", "d": "", "tc": ""},
4
+ "fr": 60,
5
+ "ip": 10,
6
+ "op": 54,
7
+ "w": 52,
8
+ "h": 20,
9
+ "nm": "Dot 10",
10
+ "ddd": 0,
11
+ "assets": [
12
+ {
13
+ "id": "comp_0",
14
+ "layers": [
15
+ {
16
+ "ddd": 0,
17
+ "ind": 1,
18
+ "ty": 4,
19
+ "nm": "1",
20
+ "sr": 1,
21
+ "ks": {
22
+ "o": {"a": 0, "k": 100, "ix": 11},
23
+ "r": {"a": 0, "k": 0, "ix": 10},
24
+ "p": {
25
+ "a": 1,
26
+ "k": [
27
+ {
28
+ "i": {"x": 0.711, "y": 1},
29
+ "o": {"x": 0.26, "y": 0.24},
30
+ "t": 0,
31
+ "s": [-14, 11, 0],
32
+ "to": [0, -1.172, 0],
33
+ "ti": [0, -0.21, 0]
34
+ },
35
+ {
36
+ "i": {"x": 0.667, "y": 1},
37
+ "o": {"x": 0.333, "y": 0},
38
+ "t": 17,
39
+ "s": [-14, 5, 0],
40
+ "to": [0, 0.333, 0],
41
+ "ti": [0, -1, 0]
42
+ },
43
+ {
44
+ "i": {"x": 0.833, "y": 0.542},
45
+ "o": {"x": 0.333, "y": 0},
46
+ "t": 30,
47
+ "s": [-14, 13, 0],
48
+ "to": [0, 1, 0],
49
+ "ti": [0, 0.333, 0]
50
+ },
51
+ {"t": 45, "s": [-14, 11, 0]}
52
+ ],
53
+ "ix": 2
54
+ },
55
+ "a": {"a": 0, "k": [-40, 0, 0], "ix": 1},
56
+ "s": {"a": 0, "k": [100, 100, 100], "ix": 6}
57
+ },
58
+ "ao": 0,
59
+ "shapes": [
60
+ {
61
+ "ty": "gr",
62
+ "it": [
63
+ {
64
+ "d": 1,
65
+ "ty": "el",
66
+ "s": {"a": 0, "k": [12, 12], "ix": 2},
67
+ "p": {"a": 0, "k": [0, 0], "ix": 3},
68
+ "nm": "Ellipse Path 1",
69
+ "mn": "ADBE Vector Shape - Ellipse",
70
+ "hd": false
71
+ },
72
+ {
73
+ "ty": "st",
74
+ "c": {"a": 0, "k": [1, 1, 1, 1], "ix": 3},
75
+ "o": {"a": 0, "k": 100, "ix": 4},
76
+ "w": {"a": 0, "k": 0, "ix": 5},
77
+ "lc": 1,
78
+ "lj": 1,
79
+ "ml": 4,
80
+ "bm": 0,
81
+ "nm": "Stroke 1",
82
+ "mn": "ADBE Vector Graphic - Stroke",
83
+ "hd": false
84
+ },
85
+ {
86
+ "ty": "fl",
87
+ "c": {
88
+ "a": 1,
89
+ "k": [
90
+ {
91
+ "i": {"x": [0.833], "y": [0.833]},
92
+ "o": {"x": [0.167], "y": [0.167]},
93
+ "t": 0,
94
+ "s": [0.968627510819, 0.674509803922, 0.835294177485, 1]
95
+ },
96
+ {
97
+ "i": {"x": [0.833], "y": [0.833]},
98
+ "o": {"x": [0.167], "y": [0.167]},
99
+ "t": 17,
100
+ "s": [0.921568632126, 0.184313729405, 0.588235318661, 1]
101
+ },
102
+ {
103
+ "t": 35,
104
+ "s": [0.968627510819, 0.674509803922, 0.835294177485, 1]
105
+ }
106
+ ],
107
+ "ix": 4
108
+ },
109
+ "o": {"a": 0, "k": 100, "ix": 5},
110
+ "r": 1,
111
+ "bm": 0,
112
+ "nm": "Fill 1",
113
+ "mn": "ADBE Vector Graphic - Fill",
114
+ "hd": false
115
+ },
116
+ {
117
+ "ty": "tr",
118
+ "p": {"a": 0, "k": [-20, 1], "ix": 2},
119
+ "a": {"a": 0, "k": [0, 0], "ix": 1},
120
+ "s": {"a": 0, "k": [100, 100], "ix": 3},
121
+ "r": {"a": 0, "k": 0, "ix": 6},
122
+ "o": {"a": 0, "k": 100, "ix": 7},
123
+ "sk": {"a": 0, "k": 0, "ix": 4},
124
+ "sa": {"a": 0, "k": 0, "ix": 5},
125
+ "nm": "Transform"
126
+ }
127
+ ],
128
+ "nm": "Ellipse 1",
129
+ "np": 3,
130
+ "cix": 2,
131
+ "bm": 0,
132
+ "ix": 1,
133
+ "mn": "ADBE Vector Group",
134
+ "hd": false
135
+ }
136
+ ],
137
+ "ip": 0,
138
+ "op": 45,
139
+ "st": 0,
140
+ "bm": 0
141
+ }
142
+ ]
143
+ }
144
+ ],
145
+ "layers": [
146
+ {
147
+ "ddd": 0,
148
+ "ind": 1,
149
+ "ty": 0,
150
+ "nm": "Dot 0",
151
+ "refId": "comp_0",
152
+ "sr": 1,
153
+ "ks": {
154
+ "o": {"a": 0, "k": 100, "ix": 11},
155
+ "r": {"a": 0, "k": 0, "ix": 10},
156
+ "p": {"a": 0, "k": [6, 10, 0], "ix": 2},
157
+ "a": {"a": 0, "k": [-34, 10, 0], "ix": 1},
158
+ "s": {"a": 0, "k": [100, 100, 100], "ix": 6}
159
+ },
160
+ "ao": 0,
161
+ "tm": {
162
+ "a": 1,
163
+ "k": [
164
+ {
165
+ "i": {"x": [0.833], "y": [0.833]},
166
+ "o": {"x": [0.167], "y": [0.167]},
167
+ "t": 10,
168
+ "s": [0]
169
+ },
170
+ {"t": 54, "s": [0.733]}
171
+ ],
172
+ "ix": 2,
173
+ "x": "var $bm_rt;\n$bm_rt = loopOut('cycle', 0);"
174
+ },
175
+ "w": 12,
176
+ "h": 20,
177
+ "ip": 10,
178
+ "op": 90,
179
+ "st": 10,
180
+ "bm": 0
181
+ },
182
+ {
183
+ "ddd": 0,
184
+ "ind": 2,
185
+ "ty": 0,
186
+ "nm": "Dot 0",
187
+ "refId": "comp_0",
188
+ "sr": 1,
189
+ "ks": {
190
+ "o": {"a": 0, "k": 100, "ix": 11},
191
+ "r": {"a": 0, "k": 0, "ix": 10},
192
+ "p": {"a": 0, "k": [6, 10, 0], "ix": 2},
193
+ "a": {"a": 0, "k": [-14, 10, 0], "ix": 1},
194
+ "s": {"a": 0, "k": [100, 100, 100], "ix": 6}
195
+ },
196
+ "ao": 0,
197
+ "tm": {
198
+ "a": 1,
199
+ "k": [
200
+ {
201
+ "i": {"x": [0.833], "y": [0.833]},
202
+ "o": {"x": [0.167], "y": [0.167]},
203
+ "t": 5,
204
+ "s": [0]
205
+ },
206
+ {"t": 49, "s": [0.733]}
207
+ ],
208
+ "ix": 2,
209
+ "x": "var $bm_rt;\n$bm_rt = loopOut('cycle', 0);"
210
+ },
211
+ "w": 12,
212
+ "h": 20,
213
+ "ip": 5,
214
+ "op": 85,
215
+ "st": 5,
216
+ "bm": 0
217
+ },
218
+ {
219
+ "ddd": 0,
220
+ "ind": 3,
221
+ "ty": 0,
222
+ "nm": "Dot 0",
223
+ "refId": "comp_0",
224
+ "sr": 1,
225
+ "ks": {
226
+ "o": {"a": 0, "k": 100, "ix": 11},
227
+ "r": {"a": 0, "k": 0, "ix": 10},
228
+ "p": {"a": 0, "k": [6, 10, 0], "ix": 2},
229
+ "a": {"a": 0, "k": [6, 10, 0], "ix": 1},
230
+ "s": {"a": 0, "k": [100, 100, 100], "ix": 6}
231
+ },
232
+ "ao": 0,
233
+ "tm": {
234
+ "a": 1,
235
+ "k": [
236
+ {
237
+ "i": {"x": [0.833], "y": [0.833]},
238
+ "o": {"x": [0.167], "y": [0.167]},
239
+ "t": 0,
240
+ "s": [0]
241
+ },
242
+ {"t": 44, "s": [0.733]}
243
+ ],
244
+ "ix": 2,
245
+ "x": "var $bm_rt;\n$bm_rt = loopOut('cycle', 0);"
246
+ },
247
+ "w": 12,
248
+ "h": 20,
249
+ "ip": 0,
250
+ "op": 80,
251
+ "st": 0,
252
+ "bm": 0
253
+ }
254
+ ],
255
+ "markers": []
256
+ }