react-native-football-formation 1.0.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 (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +447 -0
  3. package/dist/assets/index.d.ts +13 -0
  4. package/dist/assets/index.d.ts.map +1 -0
  5. package/dist/assets/index.js +15 -0
  6. package/dist/components/FormationField.d.ts +5 -0
  7. package/dist/components/FormationField.d.ts.map +1 -0
  8. package/dist/components/FormationField.js +147 -0
  9. package/dist/components/PlayerCard.d.ts +5 -0
  10. package/dist/components/PlayerCard.d.ts.map +1 -0
  11. package/dist/components/PlayerCard.js +365 -0
  12. package/dist/components/index.d.ts +3 -0
  13. package/dist/components/index.d.ts.map +1 -0
  14. package/dist/components/index.js +10 -0
  15. package/dist/index.d.ts +11 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +35 -0
  18. package/dist/theme/defaultTheme.d.ts +12 -0
  19. package/dist/theme/defaultTheme.d.ts.map +1 -0
  20. package/dist/theme/defaultTheme.js +70 -0
  21. package/dist/theme/index.d.ts +2 -0
  22. package/dist/theme/index.d.ts.map +1 -0
  23. package/dist/theme/index.js +17 -0
  24. package/dist/types/component.types.d.ts +48 -0
  25. package/dist/types/component.types.d.ts.map +1 -0
  26. package/dist/types/component.types.js +2 -0
  27. package/dist/types/formation.types.d.ts +59 -0
  28. package/dist/types/formation.types.d.ts.map +1 -0
  29. package/dist/types/formation.types.js +5 -0
  30. package/dist/types/index.d.ts +4 -0
  31. package/dist/types/index.d.ts.map +1 -0
  32. package/dist/types/index.js +19 -0
  33. package/dist/types/theme.types.d.ts +44 -0
  34. package/dist/types/theme.types.d.ts.map +1 -0
  35. package/dist/types/theme.types.js +5 -0
  36. package/dist/utils/formationCoordinates.d.ts +10 -0
  37. package/dist/utils/formationCoordinates.d.ts.map +1 -0
  38. package/dist/utils/formationCoordinates.js +311 -0
  39. package/dist/utils/index.d.ts +3 -0
  40. package/dist/utils/index.d.ts.map +1 -0
  41. package/dist/utils/index.js +18 -0
  42. package/dist/utils/transformLineup.d.ts +21 -0
  43. package/dist/utils/transformLineup.d.ts.map +1 -0
  44. package/dist/utils/transformLineup.js +126 -0
  45. package/package.json +60 -0
  46. package/src/assets/images/field.png +0 -0
  47. package/src/assets/images/football.png +0 -0
  48. package/src/assets/images/kicker.png +0 -0
  49. package/src/assets/images/ownGoals.png +0 -0
  50. package/src/assets/images/playerPlaceholder.png +0 -0
  51. package/src/assets/images/renewal.png +0 -0
  52. package/src/assets/index.ts +12 -0
  53. package/src/components/FormationField.tsx +182 -0
  54. package/src/components/PlayerCard.tsx +452 -0
  55. package/src/components/index.ts +2 -0
  56. package/src/index.ts +20 -0
  57. package/src/theme/defaultTheme.ts +74 -0
  58. package/src/theme/index.ts +1 -0
  59. package/src/types/component.types.ts +72 -0
  60. package/src/types/formation.types.ts +88 -0
  61. package/src/types/index.ts +3 -0
  62. package/src/types/theme.types.ts +48 -0
  63. package/src/utils/formationCoordinates.ts +335 -0
  64. package/src/utils/index.ts +2 -0
  65. package/src/utils/transformLineup.ts +158 -0
@@ -0,0 +1,74 @@
1
+ import { FormationTheme } from '../types';
2
+
3
+ /**
4
+ * Default theme configuration for the Formation Field component
5
+ * All values can be customized by passing a partial theme object to the component
6
+ */
7
+ export const defaultTheme: FormationTheme = {
8
+ colors: {
9
+ primary: '#A8FF03',
10
+ blue: '#2194FF',
11
+ white: '#ffffff',
12
+ text: '#13151F',
13
+ border: '#96CBCB',
14
+ warning: '#FFA500',
15
+ success: '#34C759',
16
+ error: '#dc3545',
17
+ newError: '#FF4A4A',
18
+ formationBadge: '#41854A',
19
+ },
20
+
21
+ spacing: {
22
+ playerCardWidth: 70,
23
+ playerCardHeight: 50,
24
+ playerImageSize: 44,
25
+ jerseyNumberSize: 16,
26
+ iconSize: 12,
27
+ badgeMinWidth: 20,
28
+ badgeHeight: 14,
29
+ },
30
+
31
+ typography: {
32
+ playerNameSize: 12,
33
+ formationSize: 14,
34
+ jerseyNumberSize: 8,
35
+ goalCountSize: 8,
36
+ fontFamily: undefined,
37
+ fontFamilyBold: undefined,
38
+ },
39
+
40
+ borderRadius: {
41
+ playerImage: 44,
42
+ badge: 12,
43
+ card: 1,
44
+ },
45
+ };
46
+
47
+ /**
48
+ * Deep merge theme objects
49
+ * Allows users to override only specific theme values
50
+ */
51
+ export const mergeTheme = (
52
+ customTheme?: Partial<FormationTheme>
53
+ ): FormationTheme => {
54
+ if (!customTheme) return defaultTheme;
55
+
56
+ return {
57
+ colors: {
58
+ ...defaultTheme.colors,
59
+ ...customTheme.colors,
60
+ },
61
+ spacing: {
62
+ ...defaultTheme.spacing,
63
+ ...customTheme.spacing,
64
+ },
65
+ typography: {
66
+ ...defaultTheme.typography,
67
+ ...customTheme.typography,
68
+ },
69
+ borderRadius: {
70
+ ...defaultTheme.borderRadius,
71
+ ...customTheme.borderRadius,
72
+ },
73
+ };
74
+ };
@@ -0,0 +1 @@
1
+ export * from './defaultTheme';
@@ -0,0 +1,72 @@
1
+ import { ReactNode } from 'react';
2
+ import { ImageSourcePropType, ViewStyle, TextStyle } from 'react-native';
3
+ import { LineupFormationPlayer, TeamLineup } from './formation.types';
4
+ import { FormationTheme } from './theme.types';
5
+
6
+ /**
7
+ * Props for the main FormationField component
8
+ */
9
+ export interface FormationFieldProps {
10
+ // Required
11
+ lineup: TeamLineup;
12
+
13
+ // Optional - Dimensions
14
+ width?: number; // Default: screen width
15
+ height?: number; // Default: 395
16
+
17
+ // Optional - Theme customization
18
+ theme?: Partial<FormationTheme>;
19
+
20
+ // Optional - Asset overrides
21
+ fieldImage?: ImageSourcePropType;
22
+ playerPlaceholder?: ImageSourcePropType;
23
+ footballIcon?: ImageSourcePropType;
24
+ kickerIcon?: ImageSourcePropType;
25
+ renewalIcon?: ImageSourcePropType;
26
+ ownGoalIcon?: ImageSourcePropType;
27
+ logoImage?: ImageSourcePropType;
28
+
29
+ // Optional - Component overrides
30
+ renderPlayerCard?: (
31
+ player: LineupFormationPlayer,
32
+ fieldWidth: number,
33
+ fieldHeight: number
34
+ ) => ReactNode;
35
+ renderFooter?: (formation: string) => ReactNode;
36
+
37
+ // Optional - Callbacks
38
+ onPlayerPress?: (player: LineupFormationPlayer) => void;
39
+
40
+ // Optional - Display options
41
+ showLogo?: boolean; // Default: true
42
+ showFormation?: boolean; // Default: true
43
+ showRating?: boolean; // Default: false
44
+
45
+ // Optional - Styling
46
+ containerStyle?: ViewStyle;
47
+ playerCardStyle?: ViewStyle;
48
+ playerNameStyle?: TextStyle;
49
+
50
+ // Optional - Photo URL resolver
51
+ getPlayerPhotoUrl?: (playerId: string) => string;
52
+ }
53
+
54
+ /**
55
+ * Props for the PlayerCard component
56
+ */
57
+ export interface PlayerCardProps {
58
+ player: LineupFormationPlayer;
59
+ fieldWidth: number;
60
+ fieldHeight: number;
61
+ theme: FormationTheme;
62
+ onPress?: (player: LineupFormationPlayer) => void;
63
+ style?: ViewStyle;
64
+ nameStyle?: TextStyle;
65
+
66
+ // Asset overrides
67
+ playerPlaceholder?: ImageSourcePropType;
68
+ footballIcon?: ImageSourcePropType;
69
+ kickerIcon?: ImageSourcePropType;
70
+ renewalIcon?: ImageSourcePropType;
71
+ ownGoalIcon?: ImageSourcePropType;
72
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Type definitions for React Native Football Formation component
3
+ */
4
+
5
+ export interface PlayerStats {
6
+ type: string;
7
+ value: string | number;
8
+ }
9
+
10
+ export interface Player {
11
+ rating: string;
12
+ playerId: string;
13
+ position: string;
14
+ matchName: string;
15
+ shirtNumber: number;
16
+ positionSide?: string;
17
+ formationPosition?: string;
18
+ formationPlace?: string;
19
+ stats: PlayerStats[] | null[];
20
+ }
21
+
22
+ export interface TeamLineup {
23
+ players: Player[];
24
+ formationUsed: string; // e.g., "4-3-3", "4-2-3-1"
25
+ }
26
+
27
+ export interface LineupFormationPlayer {
28
+ rating: string;
29
+ playerId: string;
30
+ position: string;
31
+ matchName: string;
32
+ shirtNumber: number;
33
+ isScorer: boolean;
34
+ isSubstitute: boolean;
35
+ isYellowCard: boolean;
36
+ isRedCard: boolean;
37
+ isOwnGoal: boolean;
38
+ ownGoals: number;
39
+ isGoalAssist: boolean;
40
+ goals: number;
41
+ formationPlace: string;
42
+ photo: string;
43
+ x: string | number; // X coordinate (0-100)
44
+ y: string | number; // Y coordinate (0-100)
45
+ }
46
+
47
+ /**
48
+ * Supported formation types
49
+ */
50
+ export type FormationType =
51
+ | '4-4-2'
52
+ | '4-1-2-1-2'
53
+ | '4-3-3'
54
+ | '4-5-1'
55
+ | '4-4-1-1'
56
+ | '4-1-4-1'
57
+ | '4-2-3-1'
58
+ | '4-3-2-1'
59
+ | '5-3-2'
60
+ | '5-4-1'
61
+ | '3-5-2'
62
+ | '3-4-3'
63
+ | '4-2-2-2'
64
+ | '3-5-1-1'
65
+ | '3-4-2-1'
66
+ | '3-4-1-2'
67
+ | '3-1-4-2'
68
+ | '3-4-3d'
69
+ | '4-1-3-2'
70
+ | '4-2-4-0'
71
+ | '4-3-1-2'
72
+ | '3-2-4-1'
73
+ | '3-3-3-1';
74
+
75
+ /**
76
+ * Coordinate for player positioning on the field
77
+ */
78
+ export interface FieldCoordinate {
79
+ x: number; // X position (0-100)
80
+ y: number; // Y position (0-100)
81
+ }
82
+
83
+ /**
84
+ * Formation coordinates mapping
85
+ */
86
+ export type FormationCoordinates = {
87
+ [key: string]: FieldCoordinate;
88
+ };
@@ -0,0 +1,3 @@
1
+ export * from './formation.types';
2
+ export * from './theme.types';
3
+ export * from './component.types';
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Theme configuration types for the formation component
3
+ */
4
+
5
+ export interface FormationThemeColors {
6
+ primary: string;
7
+ blue: string;
8
+ white: string;
9
+ text: string;
10
+ border: string;
11
+ warning: string;
12
+ success: string;
13
+ error: string;
14
+ newError: string;
15
+ formationBadge: string;
16
+ }
17
+
18
+ export interface FormationThemeSpacing {
19
+ playerCardWidth: number;
20
+ playerCardHeight: number;
21
+ playerImageSize: number;
22
+ jerseyNumberSize: number;
23
+ iconSize: number;
24
+ badgeMinWidth: number;
25
+ badgeHeight: number;
26
+ }
27
+
28
+ export interface FormationThemeTypography {
29
+ playerNameSize: number;
30
+ formationSize: number;
31
+ jerseyNumberSize: number;
32
+ goalCountSize: number;
33
+ fontFamily?: string;
34
+ fontFamilyBold?: string;
35
+ }
36
+
37
+ export interface FormationThemeBorderRadius {
38
+ playerImage: number;
39
+ badge: number;
40
+ card: number;
41
+ }
42
+
43
+ export interface FormationTheme {
44
+ colors: FormationThemeColors;
45
+ spacing: FormationThemeSpacing;
46
+ typography: FormationThemeTypography;
47
+ borderRadius: FormationThemeBorderRadius;
48
+ }
@@ -0,0 +1,335 @@
1
+ import { FormationCoordinates, FormationType } from '../types';
2
+
3
+ /**
4
+ * Formation coordinates based on formationPlace (1-11)
5
+ * Each formation maps player positions (1-11) to x,y coordinates on the field (0-100 scale)
6
+ *
7
+ * Position 1 is always the goalkeeper
8
+ * Positions 2-11 vary based on the tactical formation
9
+ */
10
+ export const FORMATION_COORDINATES_BY_PLACE: Record<
11
+ FormationType,
12
+ FormationCoordinates
13
+ > = {
14
+ '4-4-2': {
15
+ '1': { x: 49, y: 80 }, // GK
16
+ '2': { x: 82, y: 58 }, // RB
17
+ '3': { x: 16, y: 58 }, // LB
18
+ '4': { x: 58, y: 30 }, // LCB
19
+ '5': { x: 62, y: 58 }, // CB
20
+ '6': { x: 36, y: 58 }, // RCB
21
+ '7': { x: 76, y: 30 }, // RCM
22
+ '8': { x: 40, y: 30 }, // LCM
23
+ '9': { x: 38, y: 8 }, // ST
24
+ '10': { x: 60, y: 8 }, // RAM/RW
25
+ '11': { x: 22, y: 30 }, // LAM/LW
26
+ },
27
+
28
+ '4-1-2-1-2': {
29
+ '1': { x: 49, y: 80 }, // GK
30
+ '2': { x: 88, y: 61 }, // RB
31
+ '3': { x: 10, y: 61 }, // LB
32
+ '4': { x: 36, y: 61 }, // LCB
33
+ '5': { x: 62, y: 61 }, // RCB
34
+ '6': { x: 49, y: 50 }, // CDM
35
+ '7': { x: 68, y: 35 }, // RCM
36
+ '8': { x: 28, y: 35 }, // LCM
37
+ '9': { x: 36, y: 8 }, // LST
38
+ '10': { x: 62, y: 8 }, // RST
39
+ '11': { x: 49, y: 25 }, // CAM
40
+ },
41
+
42
+ '4-3-3': {
43
+ '1': { x: 49, y: 80 }, // GK
44
+ '2': { x: 80, y: 59 }, // RB
45
+ '3': { x: 18, y: 59 }, // LB
46
+ '4': { x: 49, y: 32 }, // LCB
47
+ '5': { x: 60, y: 59 }, // RCB
48
+ '6': { x: 38, y: 59 }, // CDM
49
+ '7': { x: 68, y: 32 }, // RCM
50
+ '8': { x: 28, y: 32 }, // LCM
51
+ '9': { x: 49, y: 8 }, // ST
52
+ '10': { x: 70, y: 8 }, // RW
53
+ '11': { x: 26, y: 8 }, // LW
54
+ },
55
+
56
+ '4-5-1': {
57
+ '1': { x: 49, y: 80 }, // GK
58
+ '2': { x: 88, y: 61 }, // RB
59
+ '3': { x: 10, y: 61 }, // LB
60
+ '4': { x: 36, y: 61 }, // LCB
61
+ '5': { x: 62, y: 61 }, // RCB
62
+ '6': { x: 49, y: 35 }, // CM
63
+ '7': { x: 68, y: 35 }, // RCM
64
+ '8': { x: 28, y: 35 }, // LCM
65
+ '9': { x: 49, y: 8 }, // ST
66
+ '10': { x: 88, y: 35 }, // RM
67
+ '11': { x: 10, y: 35 }, // LM
68
+ },
69
+
70
+ '4-4-1-1': {
71
+ '1': { x: 49, y: 80 }, // GK
72
+ '2': { x: 82, y: 61 }, // RB
73
+ '3': { x: 15, y: 61 }, // LB
74
+ '4': { x: 60, y: 40 }, // LCB
75
+ '5': { x: 62, y: 61 }, // RCB
76
+ '6': { x: 36, y: 61 }, // RCM
77
+ '7': { x: 80, y: 40 }, // LCM
78
+ '8': { x: 40, y: 40 }, // CM
79
+ '9': { x: 49, y: 8 }, // ST
80
+ '10': { x: 49, y: 25 }, // CAM
81
+ '11': { x: 20, y: 40 }, // RM
82
+ },
83
+
84
+ '4-1-4-1': {
85
+ '1': { x: 49, y: 80 }, // GK
86
+ '2': { x: 84, y: 61 }, // RB
87
+ '3': { x: 14, y: 61 }, // LB
88
+ '4': { x: 49, y: 44 }, // LCB
89
+ '5': { x: 62, y: 61 }, // RCB
90
+ '6': { x: 36, y: 61 }, // CDM
91
+ '7': { x: 60, y: 26 }, // RCAM
92
+ '8': { x: 40, y: 26 }, // LCAM
93
+ '9': { x: 49, y: 8 }, // ST
94
+ '10': { x: 77, y: 26 }, // RM
95
+ '11': { x: 20, y: 26 }, // LM
96
+ },
97
+
98
+ '4-2-3-1': {
99
+ '1': { x: 49, y: 80 }, // GK
100
+ '2': { x: 88, y: 61 }, // RB
101
+ '3': { x: 10, y: 61 }, // LB
102
+ '4': { x: 28, y: 40 }, // LCB
103
+ '5': { x: 62, y: 61 }, // RCB
104
+ '6': { x: 36, y: 61 }, // RCDM
105
+ '7': { x: 80, y: 24 }, // LCDM
106
+ '8': { x: 68, y: 40 }, // CAM
107
+ '9': { x: 49, y: 6 }, // ST
108
+ '10': { x: 49, y: 24 }, // RW
109
+ '11': { x: 15, y: 24 }, // LW
110
+ },
111
+
112
+ '4-3-2-1': {
113
+ '1': { x: 49, y: 80 }, // GK
114
+ '2': { x: 88, y: 61 }, // RB
115
+ '3': { x: 10, y: 61 }, // LB
116
+ '5': { x: 62, y: 61 }, // RCB
117
+ '6': { x: 36, y: 61 }, // CM
118
+ '4': { x: 49, y: 40 }, // LCB
119
+ '7': { x: 28, y: 40 }, // RCM
120
+ '8': { x: 68, y: 40 }, // LCM
121
+ '9': { x: 49, y: 8 }, // ST
122
+ '10': { x: 62, y: 22 }, // RCAM
123
+ '11': { x: 36, y: 22 }, // LCAM
124
+ },
125
+
126
+ '5-3-2': {
127
+ '1': { x: 49, y: 80 }, // GK
128
+ '2': { x: 82, y: 59 }, // RB
129
+ '3': { x: 14, y: 59 }, // LB
130
+ '4': { x: 32, y: 59 }, // LCB
131
+ '5': { x: 49, y: 59 }, // CB
132
+ '6': { x: 66, y: 59 }, // RCB
133
+ '7': { x: 68, y: 32 }, // RCM
134
+ '8': { x: 28, y: 32 }, // LCM
135
+ '9': { x: 36, y: 8 }, // LST
136
+ '10': { x: 62, y: 8 }, // RST
137
+ '11': { x: 49, y: 32 }, // CM
138
+ },
139
+
140
+ '5-4-1': {
141
+ '1': { x: 49, y: 80 }, // GK
142
+ '2': { x: 84, y: 58 }, // RB
143
+ '3': { x: 15, y: 58 }, // LB
144
+ '4': { x: 32, y: 58 }, // LCB
145
+ '5': { x: 49, y: 58 }, // CB
146
+ '6': { x: 67, y: 58 }, // RCB
147
+ '7': { x: 76, y: 30 }, // RCM
148
+ '8': { x: 58, y: 30 }, // LCM
149
+ '9': { x: 49, y: 8 }, // ST
150
+ '10': { x: 40, y: 30 }, // RM
151
+ '11': { x: 22, y: 30 }, // LM
152
+ },
153
+
154
+ '3-5-2': {
155
+ '1': { x: 49, y: 80 }, // GK
156
+ '2': { x: 86, y: 35 }, // RM
157
+ '3': { x: 16, y: 35 }, // LM
158
+ '4': { x: 28, y: 61 }, // LCB
159
+ '5': { x: 49, y: 61 }, // CB
160
+ '6': { x: 70, y: 61 }, // RCB
161
+ '7': { x: 68, y: 35 }, // RCM
162
+ '8': { x: 32, y: 35 }, // LCM
163
+ '9': { x: 40, y: 8 }, // LST
164
+ '10': { x: 60, y: 8 }, // RST
165
+ '11': { x: 49, y: 35 }, // CM
166
+ },
167
+
168
+ '3-4-3': {
169
+ '1': { x: 49, y: 80 }, // GK
170
+ '2': { x: 77, y: 33 }, // RM
171
+ '3': { x: 20, y: 33 }, // LM
172
+ '4': { x: 25, y: 59 }, // LCB
173
+ '5': { x: 49, y: 59 }, // CB
174
+ '6': { x: 72, y: 59 }, // RCB
175
+ '7': { x: 58, y: 33 }, // RCM
176
+ '8': { x: 38, y: 33 }, // LCM
177
+ '9': { x: 49, y: 8 }, // ST
178
+ '10': { x: 70, y: 8 }, // RW
179
+ '11': { x: 28, y: 8 }, // LW
180
+ },
181
+
182
+ '4-2-2-2': {
183
+ '1': { x: 49, y: 80 }, // GK
184
+ '2': { x: 87, y: 58 }, // RB
185
+ '3': { x: 10, y: 58 }, // LB
186
+ '4': { x: 34, y: 58 }, // LCB
187
+ '5': { x: 62, y: 58 }, // RCB
188
+ '6': { x: 62, y: 35 }, // RCDM
189
+ '7': { x: 35, y: 35 }, // LCDM
190
+ '8': { x: 76, y: 20 }, // RCAM
191
+ '9': { x: 36, y: 8 }, // LST
192
+ '10': { x: 60, y: 8 }, // RST
193
+ '11': { x: 22, y: 20 }, // LCAM
194
+ },
195
+
196
+ '3-5-1-1': {
197
+ '1': { x: 49, y: 80 }, // GK
198
+ '2': { x: 82, y: 40 }, // RWB
199
+ '3': { x: 16, y: 40 }, // LWB
200
+ '4': { x: 28, y: 61 }, // LCB
201
+ '5': { x: 49, y: 61 }, // CB
202
+ '6': { x: 68, y: 61 }, // RCB
203
+ '7': { x: 66, y: 40 }, // RCM
204
+ '8': { x: 31, y: 40 }, // LCM
205
+ '9': { x: 49, y: 8 }, // ST
206
+ '10': { x: 49, y: 25 }, // CAM
207
+ '11': { x: 49, y: 40 }, // CM
208
+ },
209
+
210
+ '3-4-2-1': {
211
+ '1': { x: 49, y: 80 }, // GK
212
+ '2': { x: 78, y: 40 }, // RM
213
+ '3': { x: 20, y: 40 }, // LM
214
+ '4': { x: 25, y: 61 }, // LCB
215
+ '5': { x: 49, y: 61 }, // CB
216
+ '6': { x: 70, y: 61 }, // RCB
217
+ '7': { x: 60, y: 40 }, // RCM
218
+ '8': { x: 40, y: 40 }, // LCM
219
+ '9': { x: 49, y: 8 }, // ST
220
+ '10': { x: 62, y: 22 }, // RCAM
221
+ '11': { x: 36, y: 22 }, // LCAM
222
+ },
223
+
224
+ '3-4-1-2': {
225
+ '1': { x: 49, y: 80 }, // GK
226
+ '2': { x: 80, y: 40 }, // RM
227
+ '3': { x: 18, y: 40 }, // LM
228
+ '4': { x: 28, y: 61 }, // LCB
229
+ '5': { x: 49, y: 61 }, // CB
230
+ '6': { x: 70, y: 61 }, // RCB
231
+ '7': { x: 62, y: 40 }, // RCM
232
+ '8': { x: 36, y: 40 }, // LCM
233
+ '9': { x: 49, y: 25 }, // LST
234
+ '10': { x: 62, y: 8 }, // RST
235
+ '11': { x: 36, y: 8 }, // CAM
236
+ },
237
+
238
+ '3-1-4-2': {
239
+ '1': { x: 49, y: 80 }, // GK
240
+ '2': { x: 80, y: 25 }, // RM
241
+ '3': { x: 15, y: 25 }, // LM
242
+ '4': { x: 49, y: 61 }, // LCB
243
+ '5': { x: 76, y: 61 }, // CB
244
+ '6': { x: 20, y: 61 }, // RCB
245
+ '7': { x: 49, y: 40 }, // RCAM
246
+ '8': { x: 62, y: 25 }, // LCAM
247
+ '9': { x: 62, y: 8 }, // LST
248
+ '10': { x: 36, y: 8 }, // RST
249
+ '11': { x: 36, y: 25 }, // CDM
250
+ },
251
+
252
+ '3-4-3d': {
253
+ '1': { x: 49, y: 80 }, // GK
254
+ '2': { x: 74, y: 35 }, // RWB (deeper)
255
+ '3': { x: 22, y: 35 }, // LWB (deeper)
256
+ '4': { x: 26, y: 61 }, // LCB
257
+ '5': { x: 50, y: 61 }, // CB
258
+ '6': { x: 72, y: 61 }, // RCB
259
+ '7': { x: 50, y: 45 }, // RCM
260
+ '8': { x: 50, y: 25 }, // LCM
261
+ '9': { x: 50, y: 8 }, // ST
262
+ '10': { x: 76, y: 15 }, // RW
263
+ '11': { x: 22, y: 15 }, // LW
264
+ },
265
+
266
+ '4-1-3-2': {
267
+ '1': { x: 49, y: 80 }, // GK
268
+ '2': { x: 86, y: 61 }, // RB
269
+ '3': { x: 12, y: 61 }, // LB
270
+ '4': { x: 36, y: 61 }, // LCB
271
+ '5': { x: 62, y: 61 }, // RCB
272
+ '6': { x: 49, y: 44 }, // CDM
273
+ '7': { x: 77, y: 25 }, // RCAM
274
+ '8': { x: 20, y: 25 }, // LCAM
275
+ '9': { x: 35, y: 6 }, // LST
276
+ '10': { x: 62, y: 6 }, // RST
277
+ '11': { x: 49, y: 25 }, // CAM
278
+ },
279
+
280
+ '4-2-4-0': {
281
+ '1': { x: 49, y: 80 }, // GK
282
+ '2': { x: 88, y: 55 }, // RB
283
+ '3': { x: 10, y: 55 }, // LB
284
+ '4': { x: 36, y: 55 }, // LCB
285
+ '5': { x: 62, y: 55 }, // RCB
286
+ '6': { x: 62, y: 30 }, // RCDM
287
+ '7': { x: 36, y: 30 }, // LCDM
288
+ '8': { x: 62, y: 8 }, // RCAM
289
+ '9': { x: 78, y: 16 }, // RW
290
+ '10': { x: 36, y: 8 }, // LCAM
291
+ '11': { x: 18, y: 16 }, // LW
292
+ },
293
+
294
+ '4-3-1-2': {
295
+ '1': { x: 49, y: 80 }, // GK
296
+ '2': { x: 84, y: 61 }, // RB
297
+ '3': { x: 14, y: 61 }, // LB
298
+ '4': { x: 36, y: 61 }, // LCB
299
+ '5': { x: 62, y: 61 }, // RCB
300
+ '6': { x: 49, y: 40 }, // CM
301
+ '7': { x: 68, y: 40 }, // RCM
302
+ '8': { x: 28, y: 40 }, // LCM
303
+ '9': { x: 36, y: 6 }, // LST
304
+ '10': { x: 62, y: 6 }, // RST
305
+ '11': { x: 49, y: 23 }, // CAM
306
+ },
307
+
308
+ '3-2-4-1': {
309
+ '1': { x: 49, y: 80 }, // GK
310
+ '2': { x: 76, y: 25 }, // RM
311
+ '3': { x: 22, y: 25 }, // LM
312
+ '4': { x: 20, y: 61 }, // LCB
313
+ '5': { x: 49, y: 61 }, // CB
314
+ '6': { x: 76, y: 61 }, // RCB
315
+ '7': { x: 62, y: 45 }, // RCM
316
+ '8': { x: 36, y: 45 }, // LCM
317
+ '9': { x: 49, y: 8 }, // ST
318
+ '10': { x: 58, y: 25 }, // RCAM
319
+ '11': { x: 40, y: 25 }, // LCAM
320
+ },
321
+
322
+ '3-3-3-1': {
323
+ '1': { x: 49, y: 80 }, // GK
324
+ '2': { x: 78, y: 40 }, // RCM
325
+ '3': { x: 20, y: 40 }, // LCM
326
+ '4': { x: 20, y: 61 }, // LCB
327
+ '5': { x: 49, y: 61 }, // CB
328
+ '6': { x: 76, y: 61 }, // RCB
329
+ '7': { x: 49, y: 40 }, // CM
330
+ '8': { x: 76, y: 20 }, // RW
331
+ '9': { x: 49, y: 8 }, // ST
332
+ '10': { x: 49, y: 20 }, // CAM
333
+ '11': { x: 24, y: 20 }, // LW
334
+ },
335
+ };
@@ -0,0 +1,2 @@
1
+ export * from './formationCoordinates';
2
+ export * from './transformLineup';