@fuzo/soccer-board 0.1.0-alpha.2 → 0.2.0-alpha.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.
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ A beautiful, interactive soccer field component for Angular applications. Create
|
|
|
22
22
|
## 📦 Installation
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
npm install fuzo
|
|
25
|
+
npm install @fuzo/soccer-board
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
That's it! The library includes `html2canvas-pro` as a dependency for PNG export functionality (supports modern CSS color functions like `oklab`).
|
|
@@ -32,7 +32,7 @@ That's it! The library includes `html2canvas-pro` as a dependency for PNG export
|
|
|
32
32
|
### 1. Import the Component
|
|
33
33
|
|
|
34
34
|
```typescript
|
|
35
|
-
import { SoccerBoardComponent, SoccerBoardPlayer, SoccerBoardOrientation, SoccerBoardTeamSide } from 'fuzo
|
|
35
|
+
import { SoccerBoardComponent, SoccerBoardPlayer, SoccerBoardOrientation, SoccerBoardTeamSide } from '@fuzo/soccer-board';
|
|
36
36
|
|
|
37
37
|
@Component({
|
|
38
38
|
selector: 'app-my-component',
|
|
@@ -316,6 +316,36 @@ Make sure player photos are accessible and CORS is configured correctly if loadi
|
|
|
316
316
|
- Use `[fit]="SoccerBoardFitMode.Contain"` for responsive behavior
|
|
317
317
|
- Ensure parent container has defined dimensions
|
|
318
318
|
|
|
319
|
+
## 💻 Local Development
|
|
320
|
+
|
|
321
|
+
If you want to use the library locally in your project during development (to test changes before publishing), check out [LOCAL_DEVELOPMENT.md](./LOCAL_DEVELOPMENT.md) for detailed instructions.
|
|
322
|
+
|
|
323
|
+
**Quick Start:**
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# 1. From the library directory
|
|
327
|
+
cd soccer-board-angular
|
|
328
|
+
npm run link # Builds and creates global link (points to dist/soccer-board-angular)
|
|
329
|
+
|
|
330
|
+
# 2. From your project
|
|
331
|
+
cd /your/project
|
|
332
|
+
npm link @fuzo/soccer-board # Links to local version
|
|
333
|
+
|
|
334
|
+
# 3. After making changes, rebuild:
|
|
335
|
+
cd soccer-board-angular
|
|
336
|
+
npm run build # Rebuild the library
|
|
337
|
+
|
|
338
|
+
# 4. When ready to publish:
|
|
339
|
+
cd /your/project
|
|
340
|
+
npm unlink @fuzo/soccer-board
|
|
341
|
+
cd soccer-board-angular
|
|
342
|
+
npm publish --access public
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**⚠️ Important:** The `npm run link` command creates a symlink pointing to `dist/soccer-board-angular/` (the built package), NOT to `soccer-board-angular/` (the source directory). This is correct because npm needs to link to the packaged, built version of the library.
|
|
346
|
+
|
|
347
|
+
See [LOCAL_DEVELOPMENT.md](./LOCAL_DEVELOPMENT.md) for more details and troubleshooting.
|
|
348
|
+
|
|
319
349
|
## 🤝 Contributing
|
|
320
350
|
|
|
321
351
|
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
@@ -283,8 +283,20 @@ class SoccerBoardPlayerComponent {
|
|
|
283
283
|
console.log('[Player] Start drag');
|
|
284
284
|
const element = this.hostElement.nativeElement;
|
|
285
285
|
const rect = element.getBoundingClientRect();
|
|
286
|
-
|
|
287
|
-
|
|
286
|
+
// Calculate offset relative to the click point
|
|
287
|
+
// This maintains the relative position between cursor and element during drag
|
|
288
|
+
const offsetX = clientX - rect.left;
|
|
289
|
+
const offsetY = clientY - rect.top;
|
|
290
|
+
// Apply fixed position first to maintain visual position
|
|
291
|
+
element.style.position = 'fixed';
|
|
292
|
+
element.style.left = `${rect.left}px`;
|
|
293
|
+
element.style.top = `${rect.top}px`;
|
|
294
|
+
element.style.width = `${rect.width}px`;
|
|
295
|
+
element.style.height = `${rect.height}px`;
|
|
296
|
+
element.style.margin = '0';
|
|
297
|
+
// Store offset after fixing position
|
|
298
|
+
this.dragOffsetX.set(offsetX);
|
|
299
|
+
this.dragOffsetY.set(offsetY);
|
|
288
300
|
this.isDragging.set(true);
|
|
289
301
|
const player = this.player();
|
|
290
302
|
console.log('[Player] Emitting dragStart', { playerId: player.id, playerName: player.name });
|
|
@@ -311,7 +323,7 @@ class SoccerBoardPlayerComponent {
|
|
|
311
323
|
const offsetX = this.dragOffsetX();
|
|
312
324
|
const offsetY = this.dragOffsetY();
|
|
313
325
|
// Move visually during drag
|
|
314
|
-
|
|
326
|
+
// Position is already fixed from startDrag, just update coordinates
|
|
315
327
|
element.style.left = `${clientX - offsetX}px`;
|
|
316
328
|
element.style.top = `${clientY - offsetY}px`;
|
|
317
329
|
element.style.pointerEvents = 'none';
|
|
@@ -339,10 +351,14 @@ class SoccerBoardPlayerComponent {
|
|
|
339
351
|
console.log('[Player] End drag', { clientX, clientY });
|
|
340
352
|
this.isDragging.set(false);
|
|
341
353
|
const element = this.hostElement.nativeElement;
|
|
354
|
+
// Restore original styles
|
|
342
355
|
element.style.pointerEvents = '';
|
|
343
356
|
element.style.position = '';
|
|
344
357
|
element.style.left = '';
|
|
345
358
|
element.style.top = '';
|
|
359
|
+
element.style.width = '';
|
|
360
|
+
element.style.height = '';
|
|
361
|
+
element.style.margin = '';
|
|
346
362
|
const player = this.player();
|
|
347
363
|
const dragEndEvent = {
|
|
348
364
|
playerId: player.id,
|
|
@@ -947,75 +963,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
947
963
|
args: ['style.width']
|
|
948
964
|
}] } });
|
|
949
965
|
|
|
950
|
-
var PlayersPosition;
|
|
951
|
-
(function (PlayersPosition) {
|
|
952
|
-
PlayersPosition["Left"] = "left";
|
|
953
|
-
PlayersPosition["Right"] = "right";
|
|
954
|
-
PlayersPosition["Top"] = "top";
|
|
955
|
-
PlayersPosition["Bottom"] = "bottom";
|
|
956
|
-
})(PlayersPosition || (PlayersPosition = {}));
|
|
957
|
-
class SoccerBoardLayoutComponent {
|
|
958
|
-
// Expose enums to template
|
|
959
|
-
PlayersPosition = PlayersPosition;
|
|
960
|
-
PlayerSize = SoccerBoardPlayerSize;
|
|
961
|
-
// Inputs
|
|
962
|
-
players = input.required(...(ngDevMode ? [{ debugName: "players" }] : []));
|
|
963
|
-
orientation = input(SoccerBoardOrientation.Portrait, ...(ngDevMode ? [{ debugName: "orientation" }] : []));
|
|
964
|
-
teamSide = input(null, ...(ngDevMode ? [{ debugName: "teamSide" }] : []));
|
|
965
|
-
showPositions = input(false, ...(ngDevMode ? [{ debugName: "showPositions" }] : []));
|
|
966
|
-
fit = input(null, ...(ngDevMode ? [{ debugName: "fit" }] : []));
|
|
967
|
-
playersPosition = input(PlayersPosition.Left, ...(ngDevMode ? [{ debugName: "playersPosition" }] : []));
|
|
968
|
-
playersColumns = input(2, ...(ngDevMode ? [{ debugName: "playersColumns" }] : [])); // Number of columns for players grid
|
|
969
|
-
// ViewChild reference to soccer board
|
|
970
|
-
soccerBoard = viewChild.required('soccerBoard');
|
|
971
|
-
// Outputs
|
|
972
|
-
playerPositioned = output();
|
|
973
|
-
playerRemovedFromField = output();
|
|
974
|
-
// Computed: players available (not on field)
|
|
975
|
-
availablePlayers = computed(() => {
|
|
976
|
-
return this.players().filter((player) => player.fieldX === undefined || player.fieldY === undefined);
|
|
977
|
-
}, ...(ngDevMode ? [{ debugName: "availablePlayers" }] : []));
|
|
978
|
-
// Computed: layout classes based on players position
|
|
979
|
-
layoutClasses = computed(() => {
|
|
980
|
-
const position = this.playersPosition();
|
|
981
|
-
switch (position) {
|
|
982
|
-
case PlayersPosition.Right:
|
|
983
|
-
return 'layout-players-right';
|
|
984
|
-
case PlayersPosition.Top:
|
|
985
|
-
return 'layout-players-top';
|
|
986
|
-
case PlayersPosition.Bottom:
|
|
987
|
-
return 'layout-players-bottom';
|
|
988
|
-
default:
|
|
989
|
-
return 'layout-players-left';
|
|
990
|
-
}
|
|
991
|
-
}, ...(ngDevMode ? [{ debugName: "layoutClasses" }] : []));
|
|
992
|
-
// Computed: players grid columns
|
|
993
|
-
playersGridColumns = computed(() => {
|
|
994
|
-
return `repeat(${this.playersColumns()}, minmax(0, 1fr))`;
|
|
995
|
-
}, ...(ngDevMode ? [{ debugName: "playersGridColumns" }] : []));
|
|
996
|
-
onPlayerDragEnd(event) {
|
|
997
|
-
const board = this.soccerBoard();
|
|
998
|
-
if (board) {
|
|
999
|
-
board.handlePlayerDrop(event);
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
onPlayerPositioned(event) {
|
|
1003
|
-
this.playerPositioned.emit(event);
|
|
1004
|
-
}
|
|
1005
|
-
onPlayerRemoveFromField(event) {
|
|
1006
|
-
this.playerRemovedFromField.emit(event);
|
|
1007
|
-
}
|
|
1008
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SoccerBoardLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1009
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: SoccerBoardLayoutComponent, isStandalone: true, selector: "lib-soccer-board-layout", inputs: { players: { classPropertyName: "players", publicName: "players", isSignal: true, isRequired: true, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, teamSide: { classPropertyName: "teamSide", publicName: "teamSide", isSignal: true, isRequired: false, transformFunction: null }, showPositions: { classPropertyName: "showPositions", publicName: "showPositions", isSignal: true, isRequired: false, transformFunction: null }, fit: { classPropertyName: "fit", publicName: "fit", isSignal: true, isRequired: false, transformFunction: null }, playersPosition: { classPropertyName: "playersPosition", publicName: "playersPosition", isSignal: true, isRequired: false, transformFunction: null }, playersColumns: { classPropertyName: "playersColumns", publicName: "playersColumns", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { playerPositioned: "playerPositioned", playerRemovedFromField: "playerRemovedFromField" }, viewQueries: [{ propertyName: "soccerBoard", first: true, predicate: ["soccerBoard"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"soccer-board-layout\" [class]=\"layoutClasses()\">\n <!-- Players Sidebar -->\n <div class=\"players-sidebar\">\n <div class=\"players-header\">\n <h3 class=\"players-title\">Available Players</h3>\n <span class=\"players-count\">{{ availablePlayers().length }}</span>\n </div>\n <div class=\"players-grid\" [style.grid-template-columns]=\"playersGridColumns()\">\n @for (player of availablePlayers(); track player.id) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Medium\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n />\n }\n </div>\n </div>\n\n <!-- Soccer Board Area -->\n <div class=\"board-area\">\n <fuzo-soccer-board\n #soccerBoard\n [orientation]=\"orientation()\"\n [teamSide]=\"teamSide()\"\n [showPositions]=\"showPositions()\"\n [fit]=\"fit()\"\n [players]=\"players()\"\n (playerPositioned)=\"onPlayerPositioned($event)\"\n (playerRemovedFromField)=\"onPlayerRemoveFromField($event)\"\n />\n </div>\n</div>\n", styles: [".soccer-board-layout{display:flex;width:100%;height:100%;gap:1.5rem}.layout-players-left{flex-direction:row}.layout-players-left .players-sidebar{width:300px;min-width:300px;flex-shrink:0}.layout-players-left .board-area{flex:1;min-width:0}.layout-players-right{flex-direction:row-reverse}.layout-players-right .players-sidebar{width:300px;min-width:300px;flex-shrink:0}.layout-players-right .board-area{flex:1;min-width:0}.layout-players-top{flex-direction:column}.layout-players-top .players-sidebar{width:100%;max-height:300px}.layout-players-top .board-area{flex:1;min-height:0}.layout-players-bottom{flex-direction:column-reverse}.layout-players-bottom .players-sidebar{width:100%;max-height:300px}.layout-players-bottom .board-area{flex:1;min-height:0}.players-sidebar{display:flex;flex-direction:column;background:#f5f5f5;border-radius:8px;padding:1rem;overflow-y:auto;box-shadow:0 2px 8px #0000001a}.players-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:2px solid #e5e5e5}.players-title{font-size:1.125rem;font-weight:600;color:#333;margin:0}.players-count{font-size:.875rem;color:#666;background:#e5e5e5;padding:.25rem .5rem;border-radius:12px;font-weight:500}.players-grid{display:grid;gap:1rem;align-content:start}\n"], dependencies: [{ kind: "component", type: SoccerBoardComponent, selector: "fuzo-soccer-board", inputs: ["orientation", "teamSide", "showPositions", "fit", "players", "showPlayersSidebar", "playersPosition", "playersColumns", "maxPlayersPerSide"], outputs: ["playerPositioned", "playerRemovedFromField", "imageExported", "playerClicked"] }, { kind: "component", type: SoccerBoardPlayerComponent, selector: "lib-soccer-board-player", inputs: ["player", "size"], outputs: ["dragStart", "dragging", "dragEnd", "removeFromField", "playerClicked"] }] });
|
|
1010
|
-
}
|
|
1011
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SoccerBoardLayoutComponent, decorators: [{
|
|
1012
|
-
type: Component,
|
|
1013
|
-
args: [{ selector: 'lib-soccer-board-layout', standalone: true, imports: [SoccerBoardComponent, SoccerBoardPlayerComponent], template: "<div class=\"soccer-board-layout\" [class]=\"layoutClasses()\">\n <!-- Players Sidebar -->\n <div class=\"players-sidebar\">\n <div class=\"players-header\">\n <h3 class=\"players-title\">Available Players</h3>\n <span class=\"players-count\">{{ availablePlayers().length }}</span>\n </div>\n <div class=\"players-grid\" [style.grid-template-columns]=\"playersGridColumns()\">\n @for (player of availablePlayers(); track player.id) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Medium\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n />\n }\n </div>\n </div>\n\n <!-- Soccer Board Area -->\n <div class=\"board-area\">\n <fuzo-soccer-board\n #soccerBoard\n [orientation]=\"orientation()\"\n [teamSide]=\"teamSide()\"\n [showPositions]=\"showPositions()\"\n [fit]=\"fit()\"\n [players]=\"players()\"\n (playerPositioned)=\"onPlayerPositioned($event)\"\n (playerRemovedFromField)=\"onPlayerRemoveFromField($event)\"\n />\n </div>\n</div>\n", styles: [".soccer-board-layout{display:flex;width:100%;height:100%;gap:1.5rem}.layout-players-left{flex-direction:row}.layout-players-left .players-sidebar{width:300px;min-width:300px;flex-shrink:0}.layout-players-left .board-area{flex:1;min-width:0}.layout-players-right{flex-direction:row-reverse}.layout-players-right .players-sidebar{width:300px;min-width:300px;flex-shrink:0}.layout-players-right .board-area{flex:1;min-width:0}.layout-players-top{flex-direction:column}.layout-players-top .players-sidebar{width:100%;max-height:300px}.layout-players-top .board-area{flex:1;min-height:0}.layout-players-bottom{flex-direction:column-reverse}.layout-players-bottom .players-sidebar{width:100%;max-height:300px}.layout-players-bottom .board-area{flex:1;min-height:0}.players-sidebar{display:flex;flex-direction:column;background:#f5f5f5;border-radius:8px;padding:1rem;overflow-y:auto;box-shadow:0 2px 8px #0000001a}.players-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:2px solid #e5e5e5}.players-title{font-size:1.125rem;font-weight:600;color:#333;margin:0}.players-count{font-size:.875rem;color:#666;background:#e5e5e5;padding:.25rem .5rem;border-radius:12px;font-weight:500}.players-grid{display:grid;gap:1rem;align-content:start}\n"] }]
|
|
1014
|
-
}], propDecorators: { players: [{ type: i0.Input, args: [{ isSignal: true, alias: "players", required: true }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], teamSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "teamSide", required: false }] }], showPositions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPositions", required: false }] }], fit: [{ type: i0.Input, args: [{ isSignal: true, alias: "fit", required: false }] }], playersPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "playersPosition", required: false }] }], playersColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "playersColumns", required: false }] }], soccerBoard: [{ type: i0.ViewChild, args: ['soccerBoard', { isSignal: true }] }], playerPositioned: [{ type: i0.Output, args: ["playerPositioned"] }], playerRemovedFromField: [{ type: i0.Output, args: ["playerRemovedFromField"] }] } });
|
|
1015
|
-
|
|
1016
966
|
/**
|
|
1017
967
|
* Generated bundle index. Do not edit.
|
|
1018
968
|
*/
|
|
1019
969
|
|
|
1020
|
-
export {
|
|
970
|
+
export { SoccerBoardComponent, SoccerBoardFieldConstants, SoccerBoardFitMode, SoccerBoardOrientation, SoccerBoardPlayerComponent, SoccerBoardPlayerSize, SoccerBoardTeamSide };
|
|
1021
971
|
//# sourceMappingURL=fuzo-soccer-board.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzo-soccer-board.mjs","sources":["../../../soccer-board-angular/src/lib/constants/field.constants.ts","../../../soccer-board-angular/src/lib/types/fit-mode.type.ts","../../../soccer-board-angular/src/lib/types/orientation.type.ts","../../../soccer-board-angular/src/lib/types/player-size.type.ts","../../../soccer-board-angular/src/lib/types/team-side.type.ts","../../../soccer-board-angular/src/lib/utils/field-positions.ts","../../../soccer-board-angular/src/lib/components/soccer-board-player/soccer-board-player.component.ts","../../../soccer-board-angular/src/lib/components/soccer-board-player/soccer-board-player.component.html","../../../soccer-board-angular/src/lib/components/soccer-board/soccer-board.component.ts","../../../soccer-board-angular/src/lib/components/soccer-board/soccer-board.component.html","../../../soccer-board-angular/src/lib/components/soccer-board-layout/soccer-board-layout.component.ts","../../../soccer-board-angular/src/lib/components/soccer-board-layout/soccer-board-layout.component.html","../../../soccer-board-angular/src/fuzo-soccer-board.ts"],"sourcesContent":["/**\n * Soccer Board Field dimension constants\n * Based on FIFA regulations: 105m x 68m\n */\nexport const SoccerBoardFieldConstants = {\n /**\n * Field aspect ratio (width / height)\n * FIFA standard: 105m / 68m ≈ 1.544\n */\n RATIO: 105 / 68,\n} as const;\n","/**\n * Soccer Board Fit Mode types for responsive field sizing\n */\nexport enum SoccerBoardFitMode {\n Contain = 'contain',\n}\n\n/**\n * Type for soccer board fit mode values (including null for no fit)\n */\nexport type SoccerBoardFitModeType = SoccerBoardFitMode | null;\n","/**\n * Soccer Board Field Orientation types\n */\nexport enum SoccerBoardOrientation {\n Portrait = 'portrait',\n Landscape = 'landscape',\n}\n\n/**\n * Type for soccer board field orientation values\n */\nexport type SoccerBoardOrientationType = SoccerBoardOrientation;\n","/**\n * Soccer Board Player Card Size types\n */\nexport enum SoccerBoardPlayerSize {\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n}\n\n/**\n * Type for soccer board player size values\n */\nexport type SoccerBoardPlayerSizeType = SoccerBoardPlayerSize;\n","/**\n * Soccer Board Team Side types\n */\nexport enum SoccerBoardTeamSide {\n Home = 'home',\n Away = 'away',\n}\n\n/**\n * Type for soccer board team side values (including null for both)\n */\nexport type SoccerBoardTeamSideType = SoccerBoardTeamSide | null;\n","/**\n * Soccer Board Position Zone data structure\n */\nexport interface SoccerBoardPositionZone {\n id: string;\n label: string;\n color: string;\n portrait: { x: number; y: number; width: number; height: number };\n landscape: { x: number; y: number; width: number; height: number };\n}\n\n/**\n * Get tactical position zones data\n * All tactical positions with coordinates for each orientation\n * Portrait: x=left-right, y=center(0)-goal(100)\n * Landscape: x=center(0)-goal(100), y=top(0)-bottom(100)\n */\nexport function getPositionsData(): SoccerBoardPositionZone[] {\n // Colors by position type\n const colors = {\n goalkeeper: 'rgba(255, 200, 0, 0.5)', // Yellow\n defense: 'rgba(70, 130, 255, 0.5)', // Blue\n defensiveMid: 'rgba(100, 180, 255, 0.5)', // Light blue\n midfield: 'rgba(50, 200, 100, 0.5)', // Green\n attackingMid: 'rgba(150, 220, 100, 0.5)', // Light green\n forward: 'rgba(255, 100, 100, 0.5)', // Red\n striker: 'rgba(255, 50, 50, 0.5)', // Dark red\n };\n\n return [\n // ============ DEFENSE ZONE ============\n {\n id: 'LB',\n label: 'LB',\n color: colors.defense,\n portrait: { x: 0, y: 70, width: 20, height: 30 },\n landscape: { x: 70, y: 0, width: 30, height: 20 },\n },\n {\n id: 'CB',\n label: 'CB',\n color: colors.defense,\n portrait: { x: 20, y: 70, width: 60, height: 19.5 },\n landscape: { x: 70, y: 20, width: 19.5, height: 60 },\n },\n {\n id: 'CB',\n label: '',\n color: colors.defense,\n portrait: { x: 20, y: 89.5, width: 16.55, height: 10.5 },\n landscape: { x: 89.5, y: 20, width: 10.5, height: 16.55 },\n },\n {\n id: 'GK',\n label: 'GK',\n color: colors.goalkeeper,\n portrait: { x: 36.55, y: 89.5, width: 26.9, height: 10.5 },\n landscape: { x: 89.5, y: 36.55, width: 10.5, height: 26.9 },\n },\n {\n id: 'CB',\n label: '',\n color: colors.defense,\n portrait: { x: 63.45, y: 89.5, width: 16.55, height: 10.5 },\n landscape: { x: 89.5, y: 63.45, width: 10.5, height: 16.55 },\n },\n {\n id: 'RB',\n label: 'RB',\n color: colors.defense,\n portrait: { x: 80, y: 70, width: 20, height: 30 },\n landscape: { x: 70, y: 80, width: 30, height: 20 },\n },\n\n // ============ DEFENSIVE MIDFIELD ZONE ============\n {\n id: 'LWB',\n label: 'LWB',\n color: colors.defensiveMid,\n portrait: { x: 0, y: 55, width: 25, height: 15 },\n landscape: { x: 55, y: 0, width: 15, height: 25 },\n },\n {\n id: 'CDM',\n label: 'CDM',\n color: colors.defensiveMid,\n portrait: { x: 25, y: 55, width: 50, height: 15 },\n landscape: { x: 55, y: 25, width: 15, height: 50 },\n },\n {\n id: 'RWB',\n label: 'RWB',\n color: colors.defensiveMid,\n portrait: { x: 75, y: 55, width: 25, height: 15 },\n landscape: { x: 55, y: 75, width: 15, height: 25 },\n },\n\n // ============ CENTRAL MIDFIELD ZONE ============\n {\n id: 'LM',\n label: 'LM',\n color: colors.midfield,\n portrait: { x: 0, y: 40, width: 25, height: 15 },\n landscape: { x: 40, y: 0, width: 15, height: 25 },\n },\n {\n id: 'CM',\n label: 'CM',\n color: colors.midfield,\n portrait: { x: 25, y: 40, width: 50, height: 15 },\n landscape: { x: 40, y: 25, width: 15, height: 50 },\n },\n {\n id: 'RM',\n label: 'RM',\n color: colors.midfield,\n portrait: { x: 75, y: 40, width: 25, height: 15 },\n landscape: { x: 40, y: 75, width: 15, height: 25 },\n },\n\n // ============ ATTACKING ZONE ============\n {\n id: 'LW',\n label: 'LW',\n color: colors.forward,\n portrait: { x: 0, y: 0, width: 25, height: 40 },\n landscape: { x: 0, y: 0, width: 40, height: 25 },\n },\n {\n id: 'CAM',\n label: 'CAM',\n color: colors.attackingMid,\n portrait: { x: 25, y: 25, width: 50, height: 15 },\n landscape: { x: 25, y: 25, width: 15, height: 50 },\n },\n {\n id: 'RW',\n label: 'RW',\n color: colors.forward,\n portrait: { x: 75, y: 0, width: 25, height: 40 },\n landscape: { x: 0, y: 75, width: 40, height: 25 },\n },\n {\n id: 'CF',\n label: 'CF',\n color: colors.forward,\n portrait: { x: 25, y: 10, width: 50, height: 15 },\n landscape: { x: 10, y: 25, width: 15, height: 50 },\n },\n {\n id: 'ST',\n label: 'ST',\n color: colors.striker,\n portrait: { x: 25, y: 0, width: 50, height: 10 },\n landscape: { x: 0, y: 25, width: 10, height: 50 },\n },\n ];\n}\n","import {\n Component,\n input,\n computed,\n output,\n signal,\n HostListener,\n ElementRef,\n inject,\n effect,\n} from '@angular/core';\nimport { SoccerBoardPlayer } from '../../models/player.model';\nimport { SoccerBoardPlayerSize, SoccerBoardPlayerSizeType } from '../../types/player-size.type';\n\n@Component({\n selector: 'lib-soccer-board-player',\n standalone: true,\n imports: [],\n templateUrl: './soccer-board-player.component.html',\n styleUrl: './soccer-board-player.component.scss',\n})\nexport class SoccerBoardPlayerComponent {\n // Host element reference\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n\n // Inputs using signals\n player = input.required<SoccerBoardPlayer>();\n size = input<SoccerBoardPlayerSizeType>(SoccerBoardPlayerSize.Medium);\n\n // Outputs\n dragStart = output<{ playerId: string; playerName: string }>();\n dragging = output<{ playerId: string; clientX: number; clientY: number; offsetX: number; offsetY: number }>();\n dragEnd = output<{ playerId: string; clientX: number; clientY: number; offsetX: number; offsetY: number }>();\n removeFromField = output<{ playerId: string }>();\n playerClicked = output<{ playerId: string; player: SoccerBoardPlayer }>();\n\n // Drag state signals\n private readonly isDragging = signal<boolean>(false);\n private readonly dragOffsetX = signal<number>(0);\n private readonly dragOffsetY = signal<number>(0);\n\n // Computed drag styles\n dragStyles = computed(() => {\n if (this.isDragging()) {\n return {\n opacity: '0.7',\n cursor: 'grabbing',\n zIndex: '1000',\n };\n }\n return {\n opacity: '1',\n cursor: 'grab',\n zIndex: '',\n };\n });\n\n // Computed values\n playerPhoto = computed(() => {\n const photo = this.player()?.photo;\n return photo || null;\n });\n\n playerName = computed(() => this.player()?.name || '');\n playerNumber = computed(() => this.player()?.number);\n \n // Determine if player is on the field (has fieldX and fieldY coordinates)\n isOnField = computed(() => {\n const player = this.player();\n return player?.fieldX !== undefined && player?.fieldY !== undefined;\n });\n\n // Show fieldPosition if on field, otherwise show preferredPosition\n playerPosition = computed(() => {\n const player = this.player();\n if (this.isOnField() && player?.fieldPosition) {\n return player.fieldPosition;\n }\n return player?.preferredPosition;\n });\n\n // Size classes\n sizeClasses = computed(() => {\n const size = this.size();\n switch (size) {\n case SoccerBoardPlayerSize.Small:\n return 'w-12 h-12';\n case SoccerBoardPlayerSize.Large:\n return 'w-20 h-20';\n default:\n return 'w-16 h-16';\n }\n });\n\n constructor() {\n // Effect to apply drag styles\n effect(() => {\n const styles = this.dragStyles();\n const element = this.hostElement.nativeElement;\n element.style.opacity = styles.opacity;\n element.style.cursor = styles.cursor;\n element.style.zIndex = styles.zIndex;\n });\n }\n\n @HostListener('mousedown', ['$event'])\n onMouseDown(event: MouseEvent): void {\n event.preventDefault();\n this.startDrag(event.clientX, event.clientY);\n }\n\n @HostListener('touchstart', ['$event'])\n onTouchStart(event: TouchEvent): void {\n if (event.touches.length !== 1) return;\n event.preventDefault();\n const touch = event.touches[0];\n this.startDrag(touch.clientX, touch.clientY);\n }\n\n private startDrag(clientX: number, clientY: number): void {\n console.log('[Player] Start drag');\n const element = this.hostElement.nativeElement;\n const rect = element.getBoundingClientRect();\n \n this.dragOffsetX.set(clientX - rect.left);\n this.dragOffsetY.set(clientY - rect.top);\n this.isDragging.set(true);\n\n const player = this.player();\n console.log('[Player] Emitting dragStart', { playerId: player.id, playerName: player.name });\n this.dragStart.emit({\n playerId: player.id,\n playerName: player.name,\n });\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.isDragging()) return;\n event.preventDefault();\n this.handleDrag(event.clientX, event.clientY);\n }\n\n @HostListener('document:touchmove', ['$event'])\n onTouchMove(event: TouchEvent): void {\n if (!this.isDragging() || event.touches.length !== 1) return;\n event.preventDefault();\n const touch = event.touches[0];\n this.handleDrag(touch.clientX, touch.clientY);\n }\n\n private handleDrag(clientX: number, clientY: number): void {\n const element = this.hostElement.nativeElement;\n const offsetX = this.dragOffsetX();\n const offsetY = this.dragOffsetY();\n\n // Move visually during drag\n element.style.position = 'fixed';\n element.style.left = `${clientX - offsetX}px`;\n element.style.top = `${clientY - offsetY}px`;\n element.style.pointerEvents = 'none';\n\n const player = this.player();\n this.dragging.emit({\n playerId: player.id,\n clientX,\n clientY,\n offsetX,\n offsetY,\n });\n }\n\n @HostListener('document:mouseup', ['$event'])\n onMouseUp(event: MouseEvent): void {\n if (!this.isDragging()) return;\n this.endDrag(event.clientX, event.clientY);\n }\n\n @HostListener('document:touchend', ['$event'])\n onTouchEnd(event: TouchEvent): void {\n if (!this.isDragging()) return;\n const touch = event.changedTouches[0];\n this.endDrag(touch.clientX, touch.clientY);\n }\n\n private endDrag(clientX: number, clientY: number): void {\n console.log('[Player] End drag', { clientX, clientY });\n this.isDragging.set(false);\n \n const element = this.hostElement.nativeElement;\n element.style.pointerEvents = '';\n element.style.position = '';\n element.style.left = '';\n element.style.top = '';\n\n const player = this.player();\n const dragEndEvent = {\n playerId: player.id,\n clientX,\n clientY,\n offsetX: this.dragOffsetX(),\n offsetY: this.dragOffsetY(),\n };\n console.log('[Player] Emitting dragEnd', dragEndEvent);\n this.dragEnd.emit(dragEndEvent);\n }\n\n onRemoveClick(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n const player = this.player();\n console.log('[Player] Remove from field clicked', player.id);\n this.removeFromField.emit({ playerId: player.id });\n }\n\n onPlayerClick(event: MouseEvent): void {\n // Don't emit click if we're dragging or if the click was on the remove button\n if (this.isDragging()) {\n return;\n }\n \n event.stopPropagation();\n const player = this.player();\n console.log('[Player] Player clicked', player.id);\n this.playerClicked.emit({ playerId: player.id, player });\n }\n}\n","<div\n class=\"player-card group select-none cursor-pointer\"\n [class]=\"sizeClasses()\"\n (click)=\"onPlayerClick($event)\"\n>\n <!-- Golden Border Wrapper -->\n <div class=\"player-border-wrapper\">\n <!-- Main Content Container -->\n <div class=\"player-content relative w-full h-full overflow-hidden rounded-md shadow-lg\">\n <!-- Top Left: Number and Position - Above the photo -->\n <div class=\"player-info-top-left absolute left-0.5 top-1 flex flex-col gap-0.5 z-30\">\n <!-- Player Number -->\n @if (playerNumber()) {\n <div class=\"player-number-badge text-white text-xs font-bold\">\n {{ playerNumber() }}\n </div>\n }\n\n <!-- Position -->\n @if (playerPosition()) {\n <div class=\"player-position-badge text-white text-[10px] font-bold\">\n {{ playerPosition() }}\n </div>\n }\n </div>\n\n <!-- Right Side: Player Photo -->\n <div class=\"player-photo-container absolute right-0 bottom-0 w-4/5 overflow-visible\">\n @if (playerPhoto()) {\n <img\n [src]=\"playerPhoto()!\"\n [alt]=\"playerName()\"\n class=\"player-photo-image\"\n />\n } @else {\n <!-- Placeholder -->\n <div class=\"w-full h-full flex items-center justify-center bg-gradient-to-br from-gray-400 to-gray-600\">\n <svg class=\"w-8 h-8 text-white opacity-50\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n }\n </div>\n\n <!-- Hover Effect Overlay -->\n <div class=\"absolute inset-0 bg-white/0 group-hover:bg-white/10 transition-all duration-200 rounded-md pointer-events-none\"></div>\n </div>\n </div>\n\n <!-- Remove Button (only when on field) - Outside the card -->\n @if (isOnField()) {\n <button\n class=\"remove-badge absolute bg-red-500 hover:bg-red-600 text-white text-xs font-bold rounded-full w-5 h-5 flex items-center justify-center shadow-lg transition-colors z-30 border-2 border-white\"\n (click)=\"onRemoveClick($event)\"\n type=\"button\"\n aria-label=\"Remove from field\"\n >\n ×\n </button>\n }\n\n <!-- Player Name (outside the card, below) -->\n <div class=\"player-name-outside text-white text-[10px] font-semibold truncate text-center leading-tight mt-0.5\">\n {{ playerName() }}\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n HostBinding,\n OnDestroy,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport html2canvas from 'html2canvas-pro'; // Supports oklab/oklch colors\nimport { SoccerBoardFieldConstants } from '../../constants/field.constants';\nimport { SoccerBoardPlayer } from '../../models/player.model';\nimport { SoccerBoardFitMode, SoccerBoardFitModeType } from '../../types/fit-mode.type';\nimport { SoccerBoardOrientation, SoccerBoardOrientationType } from '../../types/orientation.type';\nimport { SoccerBoardPlayerSize } from '../../types/player-size.type';\nimport { SoccerBoardTeamSide, SoccerBoardTeamSideType } from '../../types/team-side.type';\nimport { getPositionsData } from '../../utils/field-positions';\nimport { SoccerBoardPlayerComponent } from '../soccer-board-player/soccer-board-player.component';\n\n/**\n * Soccer Board Component\n * Renders a FIFA-compliant soccer field with two halves (HOME and AWAY)\n * Supports portrait and landscape orientations\n */\n@Component({\n selector: 'fuzo-soccer-board',\n standalone: true,\n imports: [SoccerBoardPlayerComponent],\n templateUrl: './soccer-board.component.html',\n styleUrl: './soccer-board.component.scss',\n})\nexport class SoccerBoardComponent implements AfterViewInit, OnDestroy {\n // Host element reference\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n private readonly platformId = inject(PLATFORM_ID);\n\n // Expose SoccerBoardPlayerSize to template\n protected readonly PlayerSize = SoccerBoardPlayerSize;\n\n // Inputs using signals\n orientation = input<SoccerBoardOrientationType>(SoccerBoardOrientation.Landscape);\n teamSide = input<SoccerBoardTeamSideType>(null);\n showPositions = input<boolean>(false);\n fit = input<SoccerBoardFitModeType>(null);\n players = input<SoccerBoardPlayer[]>([]);\n\n // Layout configuration\n showPlayersSidebar = input<boolean>(true);\n playersPosition = input<'left' | 'right' | 'top' | 'bottom'>('left');\n playersColumns = input<number>(2);\n\n // Maximum players per side (default: 7)\n maxPlayersPerSide = input<number>(7);\n\n // ViewChild references\n fieldContainer = viewChild<ElementRef<HTMLElement>>('fieldContainer');\n homeHalf = viewChild<ElementRef<HTMLElement>>('homeHalf');\n awayHalf = viewChild<ElementRef<HTMLElement>>('awayHalf');\n soccerBoardContainer = viewChild<ElementRef<HTMLElement>>('soccerBoardContainer');\n\n // Outputs\n playerPositioned = output<{\n playerId: string;\n fieldX: number;\n fieldY: number;\n side: SoccerBoardTeamSide;\n position: string;\n }>();\n\n playerRemovedFromField = output<{\n playerId: string;\n }>();\n\n imageExported = output<{\n blob: Blob;\n dataUrl: string;\n }>();\n\n playerClicked = output<{\n playerId: string;\n player: SoccerBoardPlayer;\n }>();\n\n // Method to handle player drag end (called from template)\n onPlayerDragEnd(event: {\n playerId: string;\n clientX: number;\n clientY: number;\n offsetX: number;\n offsetY: number;\n }): void {\n this.handlePlayerDrop(event);\n }\n\n // Method to handle player click (called from template)\n onPlayerClick(event: { playerId: string; player: SoccerBoardPlayer }): void {\n console.log('[SoccerBoard] Player clicked', event.playerId);\n this.playerClicked.emit(event);\n }\n\n // Method to handle player remove from field (called from template)\n onPlayerRemoveFromField(event: { playerId: string }): void {\n // Emit event to parent to handle removal\n console.log('[SoccerBoard] Player remove requested', event.playerId);\n this.playerRemovedFromField.emit({ playerId: event.playerId });\n }\n\n // Reactive width signal for host element\n private readonly hostWidth = signal<string>('');\n\n // Host binding for width (reactive)\n @HostBinding('style.width')\n get hostWidthStyle(): string {\n return this.hostWidth();\n }\n\n // Computed values\n isLandscape = computed(() => this.orientation() === SoccerBoardOrientation.Landscape);\n showHome = computed(() => {\n const side = this.teamSide();\n return side === null || side === SoccerBoardTeamSide.Home;\n });\n showAway = computed(() => {\n const side = this.teamSide();\n return side === null || side === SoccerBoardTeamSide.Away;\n });\n\n // Computed position zones\n homeZones = computed(() => {\n if (!this.showPositions()) {\n return [];\n }\n const positionsData = getPositionsData();\n const orientation = this.orientation();\n return positionsData.map((pos) => ({\n ...pos,\n coords: pos[orientation],\n }));\n });\n\n awayZones = computed(() => {\n if (!this.showPositions()) {\n return [];\n }\n const positionsData = getPositionsData();\n const orientation = this.orientation();\n return positionsData.map((pos) => {\n const coords = pos[orientation];\n let awayCoords;\n\n if (orientation === SoccerBoardOrientation.Portrait) {\n // Portrait: invert Y\n awayCoords = {\n ...coords,\n y: 100 - coords.y - coords.height,\n };\n } else {\n // Landscape: invert X\n awayCoords = {\n ...coords,\n x: 100 - coords.x - coords.width,\n };\n }\n\n return {\n ...pos,\n coords: awayCoords,\n };\n });\n });\n\n // Computed players by side\n homePlayers = computed(() => {\n return this.players().filter(\n (player) => player.side === SoccerBoardTeamSide.Home && player.fieldX !== undefined && player.fieldY !== undefined\n );\n });\n\n awayPlayers = computed(() => {\n return this.players().filter(\n (player) => player.side === SoccerBoardTeamSide.Away && player.fieldX !== undefined && player.fieldY !== undefined\n );\n });\n\n // Computed: players available (not on field)\n availablePlayers = computed(() => {\n return this.players().filter(\n (player) => player.fieldX === undefined || player.fieldY === undefined\n );\n });\n\n // Computed: layout classes based on players position\n layoutClasses = computed(() => {\n if (!this.showPlayersSidebar()) {\n return 'layout-no-sidebar';\n }\n const position = this.playersPosition();\n switch (position) {\n case 'right':\n return 'layout-players-right';\n case 'top':\n return 'layout-players-top';\n case 'bottom':\n return 'layout-players-bottom';\n default:\n return 'layout-players-left';\n }\n });\n\n // Computed: players grid columns\n playersGridColumns = computed(() => {\n return `repeat(${this.playersColumns()}, minmax(0, 1fr))`;\n });\n\n // Helper method to get visual position for a player (public for template)\n public getPlayerPosition(player: SoccerBoardPlayer): { left: number; top: number } {\n if (player.fieldX === undefined || player.fieldY === undefined || !player.side) {\n return { left: 0, top: 0 };\n }\n return this.fieldToHalfCoordinates(player.fieldX, player.fieldY, player.side);\n }\n\n private resizeObserver: ResizeObserver | null = null;\n\n constructor() {\n // Only run effects in browser (SSR protection)\n if (isPlatformBrowser(this.platformId)) {\n // Effect to update field size when fit or orientation changes\n effect(() => {\n this.fit();\n this.orientation();\n // Use setTimeout to ensure view is initialized\n setTimeout(() => {\n this.setupResizeObserver();\n this.updateFieldSize();\n }, 0);\n });\n\n // Effect to watch for --soccer-board-width CSS custom property changes\n effect(() => {\n // Trigger update when orientation changes (affects width calculation)\n this.orientation();\n if (this.fit() !== SoccerBoardFitMode.Contain) {\n this.updateFieldSizeFromCSS();\n }\n });\n }\n }\n\n /**\n * Handles player drag end event\n * Called from parent component when a player is dropped\n * @public\n */\n public handlePlayerDrop(event: {\n playerId: string;\n clientX: number;\n clientY: number;\n offsetX: number;\n offsetY: number;\n }): void {\n console.log('[SoccerBoard] handlePlayerDrop called', event);\n\n const position = this.calculateFieldPosition(\n event.clientX,\n event.clientY\n );\n\n console.log('[SoccerBoard] Calculated position', position);\n\n if (position) {\n // Check if player is already on the field (moving to a different position)\n const currentPlayer = this.players().find((p) => p.id === event.playerId);\n const isMovingPlayer = currentPlayer?.fieldX !== undefined && currentPlayer?.fieldY !== undefined;\n\n // Check maximum players per side (only for new players, not when moving)\n if (!isMovingPlayer) {\n const playersOnSide = this.players().filter(\n (p) => p.side === position.side && p.fieldX !== undefined && p.fieldY !== undefined\n ).length;\n\n if (playersOnSide >= this.maxPlayersPerSide()) {\n console.warn(\n `[SoccerBoard] Maximum players (${this.maxPlayersPerSide()}) reached for ${position.side} side`\n );\n return; // Don't allow drop if max players reached\n }\n }\n\n const tacticalPosition = this.detectTacticalPosition(\n position.fieldX,\n position.fieldY,\n position.side\n );\n\n console.log('🎯 Player dropped:', {\n playerId: event.playerId,\n position: tacticalPosition,\n coordinates: {\n fieldX: position.fieldX,\n fieldY: position.fieldY,\n side: position.side,\n },\n });\n\n // Emit event with position information\n this.playerPositioned.emit({\n playerId: event.playerId,\n fieldX: position.fieldX,\n fieldY: position.fieldY,\n side: position.side,\n position: tacticalPosition,\n });\n } else {\n console.warn('[SoccerBoard] Position is null - player not dropped on field');\n }\n }\n\n /**\n * Calculates field position from client coordinates\n */\n private calculateFieldPosition(\n clientX: number,\n clientY: number\n ): { fieldX: number; fieldY: number; side: SoccerBoardTeamSide } | null {\n const homeHalfEl = this.homeHalf()?.nativeElement;\n const awayHalfEl = this.awayHalf()?.nativeElement;\n\n if (!homeHalfEl || !awayHalfEl) {\n return null;\n }\n\n // Get the center point of the dragged element\n // Use clientX/clientY directly as they represent where the mouse/touch is\n // The offset is already accounted for in the drag handling\n const centerX = clientX;\n const centerY = clientY;\n\n // Check HOME half\n const homeRect = homeHalfEl.getBoundingClientRect();\n const isInHome =\n centerX >= homeRect.left &&\n centerX <= homeRect.right &&\n centerY >= homeRect.top &&\n centerY <= homeRect.bottom;\n\n // Check AWAY half\n const awayRect = awayHalfEl.getBoundingClientRect();\n const isInAway =\n centerX >= awayRect.left &&\n centerX <= awayRect.right &&\n centerY >= awayRect.top &&\n centerY <= awayRect.bottom;\n\n if (!isInHome && !isInAway) {\n return null; // Not over the field\n }\n\n const side = isInHome ? SoccerBoardTeamSide.Home : SoccerBoardTeamSide.Away;\n const halfRect = isInHome ? homeRect : awayRect;\n\n // Calculate position within the half (0-100%)\n const relativeX = ((centerX - halfRect.left) / halfRect.width) * 100;\n const relativeY = ((centerY - halfRect.top) / halfRect.height) * 100;\n\n // Clamp to 0-100%\n const clampedX = Math.max(0, Math.min(100, relativeX));\n const clampedY = Math.max(0, Math.min(100, relativeY));\n\n // Convert to field coordinates (normalized)\n const orientation = this.orientation();\n let fieldX: number;\n let fieldY: number;\n\n if (orientation === SoccerBoardOrientation.Portrait) {\n // Portrait: X is width, Y is length\n fieldX = clampedX;\n if (side === SoccerBoardTeamSide.Home) {\n // HOME is bottom half (50-100% of field length)\n fieldY = 50 + clampedY / 2;\n } else {\n // AWAY is top half (0-50% of field length)\n fieldY = clampedY / 2;\n }\n } else {\n // Landscape: X is length, Y is width\n fieldY = clampedY; // Y is the width (top-bottom in visual space)\n if (side === SoccerBoardTeamSide.Home) {\n // HOME is right half (50-100% of field length)\n fieldX = 50 + clampedX / 2;\n } else {\n // AWAY is left half (0-50% of field length)\n fieldX = clampedX / 2;\n }\n }\n\n return { fieldX, fieldY, side };\n }\n\n /**\n * Converts field coordinates to half coordinates\n */\n private fieldToHalfCoordinates(\n fieldX: number,\n fieldY: number,\n side: SoccerBoardTeamSide\n ): { left: number; top: number } {\n const orientation = this.orientation();\n let left: number;\n let top: number;\n\n if (orientation === SoccerBoardOrientation.Portrait) {\n // Portrait mode\n left = fieldX;\n if (side === SoccerBoardTeamSide.Home) {\n // HOME: fieldY 50-100% maps to top 0-100%\n top = (fieldY - 50) * 2;\n } else {\n // AWAY: fieldY 0-50% maps to top 0-100%\n top = fieldY * 2;\n }\n } else {\n // Landscape mode\n top = fieldY;\n if (side === SoccerBoardTeamSide.Home) {\n // HOME: fieldX 50-100% maps to left 0-100%\n left = (fieldX - 50) * 2;\n } else {\n // AWAY: fieldX 0-50% maps to left 0-100%\n left = fieldX * 2;\n }\n }\n\n return { left, top };\n }\n\n /**\n * Detects tactical position based on field coordinates\n */\n private detectTacticalPosition(\n fieldX: number,\n fieldY: number,\n side: SoccerBoardTeamSide\n ): string {\n // Convert field coordinates to half coordinates\n const { left: halfX, top: halfY } = this.fieldToHalfCoordinates(\n fieldX,\n fieldY,\n side\n );\n\n // Get position data (same as show-positions)\n const positionsData = getPositionsData();\n const orientation = this.orientation();\n\n // Find which position zone contains this point\n let detectedPosition = 'CM'; // Default fallback\n let smallestArea = Infinity;\n\n for (const pos of positionsData) {\n let coords = pos[orientation];\n\n // For AWAY, we need to invert coordinates (same logic as renderPositionZones)\n if (side === SoccerBoardTeamSide.Away) {\n if (orientation === SoccerBoardOrientation.Portrait) {\n // Portrait: invert Y\n coords = {\n ...coords,\n y: 100 - coords.y - coords.height,\n };\n } else {\n // Landscape: invert X\n coords = {\n ...coords,\n x: 100 - coords.x - coords.width,\n };\n }\n }\n\n // Check if point is inside this zone\n const isInside =\n halfX >= coords.x &&\n halfX <= coords.x + coords.width &&\n halfY >= coords.y &&\n halfY <= coords.y + coords.height;\n\n if (isInside) {\n // If multiple zones overlap, prefer the smallest one (most specific)\n const area = coords.width * coords.height;\n if (area < smallestArea) {\n smallestArea = area;\n detectedPosition = pos.id;\n }\n }\n }\n\n return detectedPosition;\n }\n\n ngAfterViewInit(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n // Initial setup\n setTimeout(() => {\n this.updateFieldSize();\n this.setupResizeObserver();\n }, 0);\n }\n\n ngOnDestroy(): void {\n this.cleanupResizeObserver();\n }\n\n private setupResizeObserver(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n this.cleanupResizeObserver();\n\n if (this.fit() !== SoccerBoardFitMode.Contain) {\n return;\n }\n\n // Observe the host element's parent (like in the original)\n const parentElement = this.hostElement.nativeElement.parentElement;\n if (!parentElement) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateFieldSize();\n });\n\n this.resizeObserver.observe(parentElement);\n }\n\n private cleanupResizeObserver(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n private updateFieldSize(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n \n const hostElement = this.hostElement.nativeElement;\n\n // If fit=\"contain\", calculate size based on parent container (like original)\n if (this.fit() === SoccerBoardFitMode.Contain && hostElement.parentElement) {\n const parent = hostElement.parentElement;\n const parentStyle = getComputedStyle(parent);\n const parentWidth =\n parent.clientWidth -\n parseFloat(parentStyle.paddingLeft) -\n parseFloat(parentStyle.paddingRight);\n const parentHeight =\n parent.clientHeight -\n parseFloat(parentStyle.paddingTop) -\n parseFloat(parentStyle.paddingBottom);\n\n if (parentWidth > 0 && parentHeight > 0) {\n const fieldAspectRatio =\n this.orientation() === SoccerBoardOrientation.Landscape\n ? SoccerBoardFieldConstants.RATIO\n : 1 / SoccerBoardFieldConstants.RATIO;\n const containerAspectRatio = parentWidth / parentHeight;\n\n let width: number;\n\n if (containerAspectRatio > fieldAspectRatio) {\n // Container is wider - height is the constraint\n const height = parentHeight;\n width = height * fieldAspectRatio;\n } else {\n // Container is taller - width is the constraint\n width = parentWidth;\n }\n\n // Update width signal reactively\n this.hostWidth.set(`${width}px`);\n return;\n }\n }\n\n // Otherwise, use --soccer-board-width CSS custom property (like original)\n this.updateFieldSizeFromCSS();\n }\n\n private updateFieldSizeFromCSS(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const hostElement = this.hostElement.nativeElement;\n const computedStyle = getComputedStyle(hostElement);\n const fieldWidth = computedStyle.getPropertyValue('--soccer-board-width').trim();\n\n if (!fieldWidth || fieldWidth === '100%') {\n // Default behavior: 100% width, let CSS handle it\n this.hostWidth.set(fieldWidth || '100%');\n return;\n }\n\n // Parse the width value\n const match = fieldWidth.match(/^([\\d.]+)(px|rem|em|vw|vh|%)?$/);\n if (!match) {\n this.hostWidth.set(fieldWidth);\n return;\n }\n\n const value = parseFloat(match[1]);\n const unit = match[2] || 'px';\n\n if (this.orientation() === SoccerBoardOrientation.Landscape) {\n // In landscape, the CSS width represents the field length (105m)\n // So we multiply the physical width (68m) by the ratio to get the CSS width\n const landscapeWidth = value * SoccerBoardFieldConstants.RATIO;\n this.hostWidth.set(`${landscapeWidth}${unit}`);\n } else {\n // In portrait, the CSS width represents the field width (68m)\n this.hostWidth.set(`${value}${unit}`);\n }\n }\n\n /**\n * Exports the soccer board field (without sidebar) to PNG image\n * @public\n */\n public async exportToPNG(): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) {\n console.warn('[SoccerBoard] Export to PNG is only available in browser');\n return;\n }\n \n const container = this.fieldContainer()?.nativeElement;\n if (!container) {\n console.error('[SoccerBoard] Field container not found for export');\n return;\n }\n\n try {\n console.log('[SoccerBoard] Starting PNG export...');\n\n // Wait for all images to load before exporting\n const images = container.querySelectorAll('img');\n const imagePromises = Array.from(images).map((img) => {\n if (img.complete) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n img.onload = () => resolve();\n img.onerror = () => resolve(); // Continue even if image fails to load\n // Timeout after 5 seconds\n setTimeout(() => resolve(), 5000);\n });\n });\n\n await Promise.all(imagePromises);\n console.log('[SoccerBoard] All images loaded, capturing...');\n\n // Use html2canvas-pro to capture the field (supports oklab/oklch colors)\n const canvas = await html2canvas(container, {\n backgroundColor: null, // Transparent background\n scale: 2, // Higher quality\n logging: false,\n useCORS: true, // Allow cross-origin images\n allowTaint: false,\n width: container.offsetWidth,\n height: container.offsetHeight,\n ignoreElements: (element) => {\n // Ignore remove badges\n return element.classList?.contains('remove-badge') || false;\n },\n });\n\n // Convert canvas to blob and emit event\n canvas.toBlob((blob) => {\n if (!blob) {\n console.error('[SoccerBoard] Failed to create blob');\n return;\n }\n\n // Get data URL for the image\n const dataUrl = canvas.toDataURL('image/png');\n\n // Emit event with blob and data URL\n this.imageExported.emit({\n blob,\n dataUrl,\n });\n\n // Also trigger automatic download (optional - app can handle it via event)\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `soccer-board-${Date.now()}.png`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n console.log('[SoccerBoard] PNG exported successfully');\n }, 'image/png');\n } catch (error) {\n console.error('[SoccerBoard] Error exporting to PNG:', error);\n }\n }\n}\n","<div class=\"soccer-board-wrapper\" [class]=\"layoutClasses()\">\n <!-- Players Sidebar -->\n @if (showPlayersSidebar()) {\n <div class=\"players-sidebar\">\n <div\n class=\"players-grid\"\n [style.grid-template-columns]=\"playersGridColumns()\"\n >\n @for (player of availablePlayers(); track player.id) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Medium\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n (playerClicked)=\"onPlayerClick($event)\"\n />\n }\n </div>\n </div>\n }\n\n <!-- Soccer Board Container -->\n <div #soccerBoardContainer class=\"soccer-board-container\">\n <div\n #fieldContainer\n class=\"field-container\"\n [class.landscape]=\"isLandscape()\"\n >\n <!-- AWAY half -->\n <div #awayHalf class=\"field-half away\" [class.hidden]=\"!showAway()\">\n <div class=\"field-lines\">\n <div class=\"center-border\"></div>\n <div class=\"half-circle\"></div>\n <div class=\"penalty-area\"></div>\n <div class=\"goal-area\"></div>\n </div>\n\n <!-- Position zones -->\n @if (showPositions()) {\n <div class=\"position-zones\">\n @for (\n zone of awayZones();\n track zone.id + zone.coords.x + zone.coords.y\n ) {\n <div\n class=\"position-zone\"\n [style.left.%]=\"zone.coords.x\"\n [style.top.%]=\"zone.coords.y\"\n [style.width.%]=\"zone.coords.width\"\n [style.height.%]=\"zone.coords.height\"\n [style.background]=\"zone.color\"\n >\n {{ zone.label }}\n </div>\n }\n </div>\n }\n\n <!-- Players container -->\n <div class=\"players-container\" id=\"players-away\">\n @for (player of awayPlayers(); track player.id) {\n @if (player.fieldX !== undefined && player.fieldY !== undefined) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Small\"\n [style.position]=\"'absolute'\"\n [style.left.%]=\"getPlayerPosition(player).left\"\n [style.top.%]=\"getPlayerPosition(player).top\"\n [style.transform]=\"'translate(-50%, -50%)'\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n (removeFromField)=\"onPlayerRemoveFromField($event)\"\n (playerClicked)=\"onPlayerClick($event)\"\n />\n }\n }\n </div>\n </div>\n\n <!-- HOME half -->\n <div #homeHalf class=\"field-half home\" [class.hidden]=\"!showHome()\">\n <div class=\"field-lines\">\n <div class=\"center-border\"></div>\n <div class=\"half-circle\"></div>\n <div class=\"penalty-area\"></div>\n <div class=\"goal-area\"></div>\n </div>\n\n <!-- Position zones -->\n @if (showPositions()) {\n <div class=\"position-zones\">\n @for (\n zone of homeZones();\n track zone.id + zone.coords.x + zone.coords.y\n ) {\n <div\n class=\"position-zone\"\n [style.left.%]=\"zone.coords.x\"\n [style.top.%]=\"zone.coords.y\"\n [style.width.%]=\"zone.coords.width\"\n [style.height.%]=\"zone.coords.height\"\n [style.background]=\"zone.color\"\n >\n {{ zone.label }}\n </div>\n }\n </div>\n }\n\n <!-- Players container -->\n <div class=\"players-container\" id=\"players-home\">\n @for (player of homePlayers(); track player.id) {\n @if (player.fieldX !== undefined && player.fieldY !== undefined) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Small\"\n [style.position]=\"'absolute'\"\n [style.left.%]=\"getPlayerPosition(player).left\"\n [style.top.%]=\"getPlayerPosition(player).top\"\n [style.transform]=\"'translate(-50%, -50%)'\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n (removeFromField)=\"onPlayerRemoveFromField($event)\"\n (playerClicked)=\"onPlayerClick($event)\"\n />\n }\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, computed, input, output, viewChild } from '@angular/core';\nimport { SoccerBoardPlayer } from '../../models/player.model';\nimport { SoccerBoardOrientation, SoccerBoardOrientationType } from '../../types/orientation.type';\nimport { SoccerBoardTeamSide, SoccerBoardTeamSideType } from '../../types/team-side.type';\nimport { SoccerBoardFitMode, SoccerBoardFitModeType } from '../../types/fit-mode.type';\nimport { SoccerBoardPlayerSize, SoccerBoardPlayerSizeType } from '../../types/player-size.type';\nimport { SoccerBoardComponent } from '../soccer-board/soccer-board.component';\nimport { SoccerBoardPlayerComponent } from '../soccer-board-player/soccer-board-player.component';\n\nexport enum PlayersPosition {\n Left = 'left',\n Right = 'right',\n Top = 'top',\n Bottom = 'bottom',\n}\n\nexport type PlayersPositionType = `${PlayersPosition}`;\n\n@Component({\n selector: 'lib-soccer-board-layout',\n standalone: true,\n imports: [SoccerBoardComponent, SoccerBoardPlayerComponent],\n templateUrl: './soccer-board-layout.component.html',\n styleUrl: './soccer-board-layout.component.scss',\n})\nexport class SoccerBoardLayoutComponent {\n // Expose enums to template\n protected readonly PlayersPosition = PlayersPosition;\n protected readonly PlayerSize = SoccerBoardPlayerSize;\n\n // Inputs\n players = input.required<SoccerBoardPlayer[]>();\n orientation = input<SoccerBoardOrientationType>(SoccerBoardOrientation.Portrait);\n teamSide = input<SoccerBoardTeamSideType>(null);\n showPositions = input<boolean>(false);\n fit = input<SoccerBoardFitModeType>(null);\n playersPosition = input<PlayersPositionType>(PlayersPosition.Left);\n playersColumns = input<number>(2); // Number of columns for players grid\n\n // ViewChild reference to soccer board\n soccerBoard = viewChild.required<SoccerBoardComponent>('soccerBoard');\n\n // Outputs\n playerPositioned = output<{\n playerId: string;\n fieldX: number;\n fieldY: number;\n side: SoccerBoardTeamSide;\n position: string;\n }>();\n\n playerRemovedFromField = output<{\n playerId: string;\n }>();\n\n // Computed: players available (not on field)\n availablePlayers = computed(() => {\n return this.players().filter(\n (player) => player.fieldX === undefined || player.fieldY === undefined\n );\n });\n\n // Computed: layout classes based on players position\n layoutClasses = computed(() => {\n const position = this.playersPosition();\n switch (position) {\n case PlayersPosition.Right:\n return 'layout-players-right';\n case PlayersPosition.Top:\n return 'layout-players-top';\n case PlayersPosition.Bottom:\n return 'layout-players-bottom';\n default:\n return 'layout-players-left';\n }\n });\n\n // Computed: players grid columns\n playersGridColumns = computed(() => {\n return `repeat(${this.playersColumns()}, minmax(0, 1fr))`;\n });\n\n onPlayerDragEnd(event: {\n playerId: string;\n clientX: number;\n clientY: number;\n offsetX: number;\n offsetY: number;\n }): void {\n const board = this.soccerBoard();\n if (board) {\n board.handlePlayerDrop(event);\n }\n }\n\n onPlayerPositioned(event: {\n playerId: string;\n fieldX: number;\n fieldY: number;\n side: SoccerBoardTeamSide;\n position: string;\n }): void {\n this.playerPositioned.emit(event);\n }\n\n onPlayerRemoveFromField(event: { playerId: string }): void {\n this.playerRemovedFromField.emit(event);\n }\n}\n","<div class=\"soccer-board-layout\" [class]=\"layoutClasses()\">\n <!-- Players Sidebar -->\n <div class=\"players-sidebar\">\n <div class=\"players-header\">\n <h3 class=\"players-title\">Available Players</h3>\n <span class=\"players-count\">{{ availablePlayers().length }}</span>\n </div>\n <div class=\"players-grid\" [style.grid-template-columns]=\"playersGridColumns()\">\n @for (player of availablePlayers(); track player.id) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Medium\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n />\n }\n </div>\n </div>\n\n <!-- Soccer Board Area -->\n <div class=\"board-area\">\n <fuzo-soccer-board\n #soccerBoard\n [orientation]=\"orientation()\"\n [teamSide]=\"teamSide()\"\n [showPositions]=\"showPositions()\"\n [fit]=\"fit()\"\n [players]=\"players()\"\n (playerPositioned)=\"onPlayerPositioned($event)\"\n (playerRemovedFromField)=\"onPlayerRemoveFromField($event)\"\n />\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fuzo-soccer-board.mjs","sources":["../../../soccer-board-angular/src/lib/constants/field.constants.ts","../../../soccer-board-angular/src/lib/types/fit-mode.type.ts","../../../soccer-board-angular/src/lib/types/orientation.type.ts","../../../soccer-board-angular/src/lib/types/player-size.type.ts","../../../soccer-board-angular/src/lib/types/team-side.type.ts","../../../soccer-board-angular/src/lib/utils/field-positions.ts","../../../soccer-board-angular/src/lib/components/soccer-board-player/soccer-board-player.component.ts","../../../soccer-board-angular/src/lib/components/soccer-board-player/soccer-board-player.component.html","../../../soccer-board-angular/src/lib/components/soccer-board/soccer-board.component.ts","../../../soccer-board-angular/src/lib/components/soccer-board/soccer-board.component.html","../../../soccer-board-angular/src/fuzo-soccer-board.ts"],"sourcesContent":["/**\n * Soccer Board Field dimension constants\n * Based on FIFA regulations: 105m x 68m\n */\nexport const SoccerBoardFieldConstants = {\n /**\n * Field aspect ratio (width / height)\n * FIFA standard: 105m / 68m ≈ 1.544\n */\n RATIO: 105 / 68,\n} as const;\n","/**\n * Soccer Board Fit Mode types for responsive field sizing\n */\nexport enum SoccerBoardFitMode {\n Contain = 'contain',\n}\n\n/**\n * Type for soccer board fit mode values (including null for no fit)\n */\nexport type SoccerBoardFitModeType = SoccerBoardFitMode | null;\n","/**\n * Soccer Board Field Orientation types\n */\nexport enum SoccerBoardOrientation {\n Portrait = 'portrait',\n Landscape = 'landscape',\n}\n\n/**\n * Type for soccer board field orientation values\n */\nexport type SoccerBoardOrientationType = SoccerBoardOrientation;\n","/**\n * Soccer Board Player Card Size types\n */\nexport enum SoccerBoardPlayerSize {\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n}\n\n/**\n * Type for soccer board player size values\n */\nexport type SoccerBoardPlayerSizeType = SoccerBoardPlayerSize;\n","/**\n * Soccer Board Team Side types\n */\nexport enum SoccerBoardTeamSide {\n Home = 'home',\n Away = 'away',\n}\n\n/**\n * Type for soccer board team side values (including null for both)\n */\nexport type SoccerBoardTeamSideType = SoccerBoardTeamSide | null;\n","/**\n * Soccer Board Position Zone data structure\n */\nexport interface SoccerBoardPositionZone {\n id: string;\n label: string;\n color: string;\n portrait: { x: number; y: number; width: number; height: number };\n landscape: { x: number; y: number; width: number; height: number };\n}\n\n/**\n * Get tactical position zones data\n * All tactical positions with coordinates for each orientation\n * Portrait: x=left-right, y=center(0)-goal(100)\n * Landscape: x=center(0)-goal(100), y=top(0)-bottom(100)\n */\nexport function getPositionsData(): SoccerBoardPositionZone[] {\n // Colors by position type\n const colors = {\n goalkeeper: 'rgba(255, 200, 0, 0.5)', // Yellow\n defense: 'rgba(70, 130, 255, 0.5)', // Blue\n defensiveMid: 'rgba(100, 180, 255, 0.5)', // Light blue\n midfield: 'rgba(50, 200, 100, 0.5)', // Green\n attackingMid: 'rgba(150, 220, 100, 0.5)', // Light green\n forward: 'rgba(255, 100, 100, 0.5)', // Red\n striker: 'rgba(255, 50, 50, 0.5)', // Dark red\n };\n\n return [\n // ============ DEFENSE ZONE ============\n {\n id: 'LB',\n label: 'LB',\n color: colors.defense,\n portrait: { x: 0, y: 70, width: 20, height: 30 },\n landscape: { x: 70, y: 0, width: 30, height: 20 },\n },\n {\n id: 'CB',\n label: 'CB',\n color: colors.defense,\n portrait: { x: 20, y: 70, width: 60, height: 19.5 },\n landscape: { x: 70, y: 20, width: 19.5, height: 60 },\n },\n {\n id: 'CB',\n label: '',\n color: colors.defense,\n portrait: { x: 20, y: 89.5, width: 16.55, height: 10.5 },\n landscape: { x: 89.5, y: 20, width: 10.5, height: 16.55 },\n },\n {\n id: 'GK',\n label: 'GK',\n color: colors.goalkeeper,\n portrait: { x: 36.55, y: 89.5, width: 26.9, height: 10.5 },\n landscape: { x: 89.5, y: 36.55, width: 10.5, height: 26.9 },\n },\n {\n id: 'CB',\n label: '',\n color: colors.defense,\n portrait: { x: 63.45, y: 89.5, width: 16.55, height: 10.5 },\n landscape: { x: 89.5, y: 63.45, width: 10.5, height: 16.55 },\n },\n {\n id: 'RB',\n label: 'RB',\n color: colors.defense,\n portrait: { x: 80, y: 70, width: 20, height: 30 },\n landscape: { x: 70, y: 80, width: 30, height: 20 },\n },\n\n // ============ DEFENSIVE MIDFIELD ZONE ============\n {\n id: 'LWB',\n label: 'LWB',\n color: colors.defensiveMid,\n portrait: { x: 0, y: 55, width: 25, height: 15 },\n landscape: { x: 55, y: 0, width: 15, height: 25 },\n },\n {\n id: 'CDM',\n label: 'CDM',\n color: colors.defensiveMid,\n portrait: { x: 25, y: 55, width: 50, height: 15 },\n landscape: { x: 55, y: 25, width: 15, height: 50 },\n },\n {\n id: 'RWB',\n label: 'RWB',\n color: colors.defensiveMid,\n portrait: { x: 75, y: 55, width: 25, height: 15 },\n landscape: { x: 55, y: 75, width: 15, height: 25 },\n },\n\n // ============ CENTRAL MIDFIELD ZONE ============\n {\n id: 'LM',\n label: 'LM',\n color: colors.midfield,\n portrait: { x: 0, y: 40, width: 25, height: 15 },\n landscape: { x: 40, y: 0, width: 15, height: 25 },\n },\n {\n id: 'CM',\n label: 'CM',\n color: colors.midfield,\n portrait: { x: 25, y: 40, width: 50, height: 15 },\n landscape: { x: 40, y: 25, width: 15, height: 50 },\n },\n {\n id: 'RM',\n label: 'RM',\n color: colors.midfield,\n portrait: { x: 75, y: 40, width: 25, height: 15 },\n landscape: { x: 40, y: 75, width: 15, height: 25 },\n },\n\n // ============ ATTACKING ZONE ============\n {\n id: 'LW',\n label: 'LW',\n color: colors.forward,\n portrait: { x: 0, y: 0, width: 25, height: 40 },\n landscape: { x: 0, y: 0, width: 40, height: 25 },\n },\n {\n id: 'CAM',\n label: 'CAM',\n color: colors.attackingMid,\n portrait: { x: 25, y: 25, width: 50, height: 15 },\n landscape: { x: 25, y: 25, width: 15, height: 50 },\n },\n {\n id: 'RW',\n label: 'RW',\n color: colors.forward,\n portrait: { x: 75, y: 0, width: 25, height: 40 },\n landscape: { x: 0, y: 75, width: 40, height: 25 },\n },\n {\n id: 'CF',\n label: 'CF',\n color: colors.forward,\n portrait: { x: 25, y: 10, width: 50, height: 15 },\n landscape: { x: 10, y: 25, width: 15, height: 50 },\n },\n {\n id: 'ST',\n label: 'ST',\n color: colors.striker,\n portrait: { x: 25, y: 0, width: 50, height: 10 },\n landscape: { x: 0, y: 25, width: 10, height: 50 },\n },\n ];\n}\n","import {\n Component,\n input,\n computed,\n output,\n signal,\n HostListener,\n ElementRef,\n inject,\n effect,\n} from '@angular/core';\nimport { SoccerBoardPlayer } from '../../models/player.model';\nimport { SoccerBoardPlayerSize, SoccerBoardPlayerSizeType } from '../../types/player-size.type';\n\n@Component({\n selector: 'lib-soccer-board-player',\n standalone: true,\n imports: [],\n templateUrl: './soccer-board-player.component.html',\n styleUrl: './soccer-board-player.component.scss',\n})\nexport class SoccerBoardPlayerComponent {\n // Host element reference\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n\n // Inputs using signals\n player = input.required<SoccerBoardPlayer>();\n size = input<SoccerBoardPlayerSizeType>(SoccerBoardPlayerSize.Medium);\n\n // Outputs\n dragStart = output<{ playerId: string; playerName: string }>();\n dragging = output<{ playerId: string; clientX: number; clientY: number; offsetX: number; offsetY: number }>();\n dragEnd = output<{ playerId: string; clientX: number; clientY: number; offsetX: number; offsetY: number }>();\n removeFromField = output<{ playerId: string }>();\n playerClicked = output<{ playerId: string; player: SoccerBoardPlayer }>();\n\n // Drag state signals\n private readonly isDragging = signal<boolean>(false);\n private readonly dragOffsetX = signal<number>(0);\n private readonly dragOffsetY = signal<number>(0);\n\n // Computed drag styles\n dragStyles = computed(() => {\n if (this.isDragging()) {\n return {\n opacity: '0.7',\n cursor: 'grabbing',\n zIndex: '1000',\n };\n }\n return {\n opacity: '1',\n cursor: 'grab',\n zIndex: '',\n };\n });\n\n // Computed values\n playerPhoto = computed(() => {\n const photo = this.player()?.photo;\n return photo || null;\n });\n\n playerName = computed(() => this.player()?.name || '');\n playerNumber = computed(() => this.player()?.number);\n \n // Determine if player is on the field (has fieldX and fieldY coordinates)\n isOnField = computed(() => {\n const player = this.player();\n return player?.fieldX !== undefined && player?.fieldY !== undefined;\n });\n\n // Show fieldPosition if on field, otherwise show preferredPosition\n playerPosition = computed(() => {\n const player = this.player();\n if (this.isOnField() && player?.fieldPosition) {\n return player.fieldPosition;\n }\n return player?.preferredPosition;\n });\n\n // Size classes\n sizeClasses = computed(() => {\n const size = this.size();\n switch (size) {\n case SoccerBoardPlayerSize.Small:\n return 'w-12 h-12';\n case SoccerBoardPlayerSize.Large:\n return 'w-20 h-20';\n default:\n return 'w-16 h-16';\n }\n });\n\n constructor() {\n // Effect to apply drag styles\n effect(() => {\n const styles = this.dragStyles();\n const element = this.hostElement.nativeElement;\n element.style.opacity = styles.opacity;\n element.style.cursor = styles.cursor;\n element.style.zIndex = styles.zIndex;\n });\n }\n\n @HostListener('mousedown', ['$event'])\n onMouseDown(event: MouseEvent): void {\n event.preventDefault();\n this.startDrag(event.clientX, event.clientY);\n }\n\n @HostListener('touchstart', ['$event'])\n onTouchStart(event: TouchEvent): void {\n if (event.touches.length !== 1) return;\n event.preventDefault();\n const touch = event.touches[0];\n this.startDrag(touch.clientX, touch.clientY);\n }\n\n private startDrag(clientX: number, clientY: number): void {\n console.log('[Player] Start drag');\n const element = this.hostElement.nativeElement;\n const rect = element.getBoundingClientRect();\n \n // Calculate offset relative to the click point\n // This maintains the relative position between cursor and element during drag\n const offsetX = clientX - rect.left;\n const offsetY = clientY - rect.top;\n \n // Apply fixed position first to maintain visual position\n element.style.position = 'fixed';\n element.style.left = `${rect.left}px`;\n element.style.top = `${rect.top}px`;\n element.style.width = `${rect.width}px`;\n element.style.height = `${rect.height}px`;\n element.style.margin = '0';\n \n // Store offset after fixing position\n this.dragOffsetX.set(offsetX);\n this.dragOffsetY.set(offsetY);\n this.isDragging.set(true);\n\n const player = this.player();\n console.log('[Player] Emitting dragStart', { playerId: player.id, playerName: player.name });\n this.dragStart.emit({\n playerId: player.id,\n playerName: player.name,\n });\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.isDragging()) return;\n event.preventDefault();\n this.handleDrag(event.clientX, event.clientY);\n }\n\n @HostListener('document:touchmove', ['$event'])\n onTouchMove(event: TouchEvent): void {\n if (!this.isDragging() || event.touches.length !== 1) return;\n event.preventDefault();\n const touch = event.touches[0];\n this.handleDrag(touch.clientX, touch.clientY);\n }\n\n private handleDrag(clientX: number, clientY: number): void {\n const element = this.hostElement.nativeElement;\n const offsetX = this.dragOffsetX();\n const offsetY = this.dragOffsetY();\n\n // Move visually during drag\n // Position is already fixed from startDrag, just update coordinates\n element.style.left = `${clientX - offsetX}px`;\n element.style.top = `${clientY - offsetY}px`;\n element.style.pointerEvents = 'none';\n\n const player = this.player();\n this.dragging.emit({\n playerId: player.id,\n clientX,\n clientY,\n offsetX,\n offsetY,\n });\n }\n\n @HostListener('document:mouseup', ['$event'])\n onMouseUp(event: MouseEvent): void {\n if (!this.isDragging()) return;\n this.endDrag(event.clientX, event.clientY);\n }\n\n @HostListener('document:touchend', ['$event'])\n onTouchEnd(event: TouchEvent): void {\n if (!this.isDragging()) return;\n const touch = event.changedTouches[0];\n this.endDrag(touch.clientX, touch.clientY);\n }\n\n private endDrag(clientX: number, clientY: number): void {\n console.log('[Player] End drag', { clientX, clientY });\n this.isDragging.set(false);\n \n const element = this.hostElement.nativeElement;\n // Restore original styles\n element.style.pointerEvents = '';\n element.style.position = '';\n element.style.left = '';\n element.style.top = '';\n element.style.width = '';\n element.style.height = '';\n element.style.margin = '';\n\n const player = this.player();\n const dragEndEvent = {\n playerId: player.id,\n clientX,\n clientY,\n offsetX: this.dragOffsetX(),\n offsetY: this.dragOffsetY(),\n };\n console.log('[Player] Emitting dragEnd', dragEndEvent);\n this.dragEnd.emit(dragEndEvent);\n }\n\n onRemoveClick(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n const player = this.player();\n console.log('[Player] Remove from field clicked', player.id);\n this.removeFromField.emit({ playerId: player.id });\n }\n\n onPlayerClick(event: MouseEvent): void {\n // Don't emit click if we're dragging or if the click was on the remove button\n if (this.isDragging()) {\n return;\n }\n \n event.stopPropagation();\n const player = this.player();\n console.log('[Player] Player clicked', player.id);\n this.playerClicked.emit({ playerId: player.id, player });\n }\n}\n","<div\n class=\"player-card group select-none cursor-pointer\"\n [class]=\"sizeClasses()\"\n (click)=\"onPlayerClick($event)\"\n>\n <!-- Golden Border Wrapper -->\n <div class=\"player-border-wrapper\">\n <!-- Main Content Container -->\n <div class=\"player-content relative w-full h-full overflow-hidden rounded-md shadow-lg\">\n <!-- Top Left: Number and Position - Above the photo -->\n <div class=\"player-info-top-left absolute left-0.5 top-1 flex flex-col gap-0.5 z-30\">\n <!-- Player Number -->\n @if (playerNumber()) {\n <div class=\"player-number-badge text-white text-xs font-bold\">\n {{ playerNumber() }}\n </div>\n }\n\n <!-- Position -->\n @if (playerPosition()) {\n <div class=\"player-position-badge text-white text-[10px] font-bold\">\n {{ playerPosition() }}\n </div>\n }\n </div>\n\n <!-- Right Side: Player Photo -->\n <div class=\"player-photo-container absolute right-0 bottom-0 w-4/5 overflow-visible\">\n @if (playerPhoto()) {\n <img\n [src]=\"playerPhoto()!\"\n [alt]=\"playerName()\"\n class=\"player-photo-image\"\n />\n } @else {\n <!-- Placeholder -->\n <div class=\"w-full h-full flex items-center justify-center bg-gradient-to-br from-gray-400 to-gray-600\">\n <svg class=\"w-8 h-8 text-white opacity-50\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n }\n </div>\n\n <!-- Hover Effect Overlay -->\n <div class=\"absolute inset-0 bg-white/0 group-hover:bg-white/10 transition-all duration-200 rounded-md pointer-events-none\"></div>\n </div>\n </div>\n\n <!-- Remove Button (only when on field) - Outside the card -->\n @if (isOnField()) {\n <button\n class=\"remove-badge absolute bg-red-500 hover:bg-red-600 text-white text-xs font-bold rounded-full w-5 h-5 flex items-center justify-center shadow-lg transition-colors z-30 border-2 border-white\"\n (click)=\"onRemoveClick($event)\"\n type=\"button\"\n aria-label=\"Remove from field\"\n >\n ×\n </button>\n }\n\n <!-- Player Name (outside the card, below) -->\n <div class=\"player-name-outside text-white text-[10px] font-semibold truncate text-center leading-tight mt-0.5\">\n {{ playerName() }}\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n HostBinding,\n OnDestroy,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport html2canvas from 'html2canvas-pro'; // Supports oklab/oklch colors\nimport { SoccerBoardFieldConstants } from '../../constants/field.constants';\nimport { SoccerBoardPlayer } from '../../models/player.model';\nimport { SoccerBoardFitMode, SoccerBoardFitModeType } from '../../types/fit-mode.type';\nimport { SoccerBoardOrientation, SoccerBoardOrientationType } from '../../types/orientation.type';\nimport { SoccerBoardPlayerSize } from '../../types/player-size.type';\nimport { SoccerBoardTeamSide, SoccerBoardTeamSideType } from '../../types/team-side.type';\nimport { getPositionsData } from '../../utils/field-positions';\nimport { SoccerBoardPlayerComponent } from '../soccer-board-player/soccer-board-player.component';\n\n/**\n * Soccer Board Component\n * Renders a FIFA-compliant soccer field with two halves (HOME and AWAY)\n * Supports portrait and landscape orientations\n */\n@Component({\n selector: 'fuzo-soccer-board',\n standalone: true,\n imports: [SoccerBoardPlayerComponent],\n templateUrl: './soccer-board.component.html',\n styleUrl: './soccer-board.component.scss',\n})\nexport class SoccerBoardComponent implements AfterViewInit, OnDestroy {\n // Host element reference\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n private readonly platformId = inject(PLATFORM_ID);\n\n // Expose SoccerBoardPlayerSize to template\n protected readonly PlayerSize = SoccerBoardPlayerSize;\n\n // Inputs using signals\n orientation = input<SoccerBoardOrientationType>(SoccerBoardOrientation.Landscape);\n teamSide = input<SoccerBoardTeamSideType>(null);\n showPositions = input<boolean>(false);\n fit = input<SoccerBoardFitModeType>(null);\n players = input<SoccerBoardPlayer[]>([]);\n\n // Layout configuration\n showPlayersSidebar = input<boolean>(true);\n playersPosition = input<'left' | 'right' | 'top' | 'bottom'>('left');\n playersColumns = input<number>(2);\n\n // Maximum players per side (default: 7)\n maxPlayersPerSide = input<number>(7);\n\n // ViewChild references\n fieldContainer = viewChild<ElementRef<HTMLElement>>('fieldContainer');\n homeHalf = viewChild<ElementRef<HTMLElement>>('homeHalf');\n awayHalf = viewChild<ElementRef<HTMLElement>>('awayHalf');\n soccerBoardContainer = viewChild<ElementRef<HTMLElement>>('soccerBoardContainer');\n\n // Outputs\n playerPositioned = output<{\n playerId: string;\n fieldX: number;\n fieldY: number;\n side: SoccerBoardTeamSide;\n position: string;\n }>();\n\n playerRemovedFromField = output<{\n playerId: string;\n }>();\n\n imageExported = output<{\n blob: Blob;\n dataUrl: string;\n }>();\n\n playerClicked = output<{\n playerId: string;\n player: SoccerBoardPlayer;\n }>();\n\n // Method to handle player drag end (called from template)\n onPlayerDragEnd(event: {\n playerId: string;\n clientX: number;\n clientY: number;\n offsetX: number;\n offsetY: number;\n }): void {\n this.handlePlayerDrop(event);\n }\n\n // Method to handle player click (called from template)\n onPlayerClick(event: { playerId: string; player: SoccerBoardPlayer }): void {\n console.log('[SoccerBoard] Player clicked', event.playerId);\n this.playerClicked.emit(event);\n }\n\n // Method to handle player remove from field (called from template)\n onPlayerRemoveFromField(event: { playerId: string }): void {\n // Emit event to parent to handle removal\n console.log('[SoccerBoard] Player remove requested', event.playerId);\n this.playerRemovedFromField.emit({ playerId: event.playerId });\n }\n\n // Reactive width signal for host element\n private readonly hostWidth = signal<string>('');\n\n // Host binding for width (reactive)\n @HostBinding('style.width')\n get hostWidthStyle(): string {\n return this.hostWidth();\n }\n\n // Computed values\n isLandscape = computed(() => this.orientation() === SoccerBoardOrientation.Landscape);\n showHome = computed(() => {\n const side = this.teamSide();\n return side === null || side === SoccerBoardTeamSide.Home;\n });\n showAway = computed(() => {\n const side = this.teamSide();\n return side === null || side === SoccerBoardTeamSide.Away;\n });\n\n // Computed position zones\n homeZones = computed(() => {\n if (!this.showPositions()) {\n return [];\n }\n const positionsData = getPositionsData();\n const orientation = this.orientation();\n return positionsData.map((pos) => ({\n ...pos,\n coords: pos[orientation],\n }));\n });\n\n awayZones = computed(() => {\n if (!this.showPositions()) {\n return [];\n }\n const positionsData = getPositionsData();\n const orientation = this.orientation();\n return positionsData.map((pos) => {\n const coords = pos[orientation];\n let awayCoords;\n\n if (orientation === SoccerBoardOrientation.Portrait) {\n // Portrait: invert Y\n awayCoords = {\n ...coords,\n y: 100 - coords.y - coords.height,\n };\n } else {\n // Landscape: invert X\n awayCoords = {\n ...coords,\n x: 100 - coords.x - coords.width,\n };\n }\n\n return {\n ...pos,\n coords: awayCoords,\n };\n });\n });\n\n // Computed players by side\n homePlayers = computed(() => {\n return this.players().filter(\n (player) => player.side === SoccerBoardTeamSide.Home && player.fieldX !== undefined && player.fieldY !== undefined\n );\n });\n\n awayPlayers = computed(() => {\n return this.players().filter(\n (player) => player.side === SoccerBoardTeamSide.Away && player.fieldX !== undefined && player.fieldY !== undefined\n );\n });\n\n // Computed: players available (not on field)\n availablePlayers = computed(() => {\n return this.players().filter(\n (player) => player.fieldX === undefined || player.fieldY === undefined\n );\n });\n\n // Computed: layout classes based on players position\n layoutClasses = computed(() => {\n if (!this.showPlayersSidebar()) {\n return 'layout-no-sidebar';\n }\n const position = this.playersPosition();\n switch (position) {\n case 'right':\n return 'layout-players-right';\n case 'top':\n return 'layout-players-top';\n case 'bottom':\n return 'layout-players-bottom';\n default:\n return 'layout-players-left';\n }\n });\n\n // Computed: players grid columns\n playersGridColumns = computed(() => {\n return `repeat(${this.playersColumns()}, minmax(0, 1fr))`;\n });\n\n // Helper method to get visual position for a player (public for template)\n public getPlayerPosition(player: SoccerBoardPlayer): { left: number; top: number } {\n if (player.fieldX === undefined || player.fieldY === undefined || !player.side) {\n return { left: 0, top: 0 };\n }\n return this.fieldToHalfCoordinates(player.fieldX, player.fieldY, player.side);\n }\n\n private resizeObserver: ResizeObserver | null = null;\n\n constructor() {\n // Only run effects in browser (SSR protection)\n if (isPlatformBrowser(this.platformId)) {\n // Effect to update field size when fit or orientation changes\n effect(() => {\n this.fit();\n this.orientation();\n // Use setTimeout to ensure view is initialized\n setTimeout(() => {\n this.setupResizeObserver();\n this.updateFieldSize();\n }, 0);\n });\n\n // Effect to watch for --soccer-board-width CSS custom property changes\n effect(() => {\n // Trigger update when orientation changes (affects width calculation)\n this.orientation();\n if (this.fit() !== SoccerBoardFitMode.Contain) {\n this.updateFieldSizeFromCSS();\n }\n });\n }\n }\n\n /**\n * Handles player drag end event\n * Called from parent component when a player is dropped\n * @public\n */\n public handlePlayerDrop(event: {\n playerId: string;\n clientX: number;\n clientY: number;\n offsetX: number;\n offsetY: number;\n }): void {\n console.log('[SoccerBoard] handlePlayerDrop called', event);\n\n const position = this.calculateFieldPosition(\n event.clientX,\n event.clientY\n );\n\n console.log('[SoccerBoard] Calculated position', position);\n\n if (position) {\n // Check if player is already on the field (moving to a different position)\n const currentPlayer = this.players().find((p) => p.id === event.playerId);\n const isMovingPlayer = currentPlayer?.fieldX !== undefined && currentPlayer?.fieldY !== undefined;\n\n // Check maximum players per side (only for new players, not when moving)\n if (!isMovingPlayer) {\n const playersOnSide = this.players().filter(\n (p) => p.side === position.side && p.fieldX !== undefined && p.fieldY !== undefined\n ).length;\n\n if (playersOnSide >= this.maxPlayersPerSide()) {\n console.warn(\n `[SoccerBoard] Maximum players (${this.maxPlayersPerSide()}) reached for ${position.side} side`\n );\n return; // Don't allow drop if max players reached\n }\n }\n\n const tacticalPosition = this.detectTacticalPosition(\n position.fieldX,\n position.fieldY,\n position.side\n );\n\n console.log('🎯 Player dropped:', {\n playerId: event.playerId,\n position: tacticalPosition,\n coordinates: {\n fieldX: position.fieldX,\n fieldY: position.fieldY,\n side: position.side,\n },\n });\n\n // Emit event with position information\n this.playerPositioned.emit({\n playerId: event.playerId,\n fieldX: position.fieldX,\n fieldY: position.fieldY,\n side: position.side,\n position: tacticalPosition,\n });\n } else {\n console.warn('[SoccerBoard] Position is null - player not dropped on field');\n }\n }\n\n /**\n * Calculates field position from client coordinates\n */\n private calculateFieldPosition(\n clientX: number,\n clientY: number\n ): { fieldX: number; fieldY: number; side: SoccerBoardTeamSide } | null {\n const homeHalfEl = this.homeHalf()?.nativeElement;\n const awayHalfEl = this.awayHalf()?.nativeElement;\n\n if (!homeHalfEl || !awayHalfEl) {\n return null;\n }\n\n // Get the center point of the dragged element\n // Use clientX/clientY directly as they represent where the mouse/touch is\n // The offset is already accounted for in the drag handling\n const centerX = clientX;\n const centerY = clientY;\n\n // Check HOME half\n const homeRect = homeHalfEl.getBoundingClientRect();\n const isInHome =\n centerX >= homeRect.left &&\n centerX <= homeRect.right &&\n centerY >= homeRect.top &&\n centerY <= homeRect.bottom;\n\n // Check AWAY half\n const awayRect = awayHalfEl.getBoundingClientRect();\n const isInAway =\n centerX >= awayRect.left &&\n centerX <= awayRect.right &&\n centerY >= awayRect.top &&\n centerY <= awayRect.bottom;\n\n if (!isInHome && !isInAway) {\n return null; // Not over the field\n }\n\n const side = isInHome ? SoccerBoardTeamSide.Home : SoccerBoardTeamSide.Away;\n const halfRect = isInHome ? homeRect : awayRect;\n\n // Calculate position within the half (0-100%)\n const relativeX = ((centerX - halfRect.left) / halfRect.width) * 100;\n const relativeY = ((centerY - halfRect.top) / halfRect.height) * 100;\n\n // Clamp to 0-100%\n const clampedX = Math.max(0, Math.min(100, relativeX));\n const clampedY = Math.max(0, Math.min(100, relativeY));\n\n // Convert to field coordinates (normalized)\n const orientation = this.orientation();\n let fieldX: number;\n let fieldY: number;\n\n if (orientation === SoccerBoardOrientation.Portrait) {\n // Portrait: X is width, Y is length\n fieldX = clampedX;\n if (side === SoccerBoardTeamSide.Home) {\n // HOME is bottom half (50-100% of field length)\n fieldY = 50 + clampedY / 2;\n } else {\n // AWAY is top half (0-50% of field length)\n fieldY = clampedY / 2;\n }\n } else {\n // Landscape: X is length, Y is width\n fieldY = clampedY; // Y is the width (top-bottom in visual space)\n if (side === SoccerBoardTeamSide.Home) {\n // HOME is right half (50-100% of field length)\n fieldX = 50 + clampedX / 2;\n } else {\n // AWAY is left half (0-50% of field length)\n fieldX = clampedX / 2;\n }\n }\n\n return { fieldX, fieldY, side };\n }\n\n /**\n * Converts field coordinates to half coordinates\n */\n private fieldToHalfCoordinates(\n fieldX: number,\n fieldY: number,\n side: SoccerBoardTeamSide\n ): { left: number; top: number } {\n const orientation = this.orientation();\n let left: number;\n let top: number;\n\n if (orientation === SoccerBoardOrientation.Portrait) {\n // Portrait mode\n left = fieldX;\n if (side === SoccerBoardTeamSide.Home) {\n // HOME: fieldY 50-100% maps to top 0-100%\n top = (fieldY - 50) * 2;\n } else {\n // AWAY: fieldY 0-50% maps to top 0-100%\n top = fieldY * 2;\n }\n } else {\n // Landscape mode\n top = fieldY;\n if (side === SoccerBoardTeamSide.Home) {\n // HOME: fieldX 50-100% maps to left 0-100%\n left = (fieldX - 50) * 2;\n } else {\n // AWAY: fieldX 0-50% maps to left 0-100%\n left = fieldX * 2;\n }\n }\n\n return { left, top };\n }\n\n /**\n * Detects tactical position based on field coordinates\n */\n private detectTacticalPosition(\n fieldX: number,\n fieldY: number,\n side: SoccerBoardTeamSide\n ): string {\n // Convert field coordinates to half coordinates\n const { left: halfX, top: halfY } = this.fieldToHalfCoordinates(\n fieldX,\n fieldY,\n side\n );\n\n // Get position data (same as show-positions)\n const positionsData = getPositionsData();\n const orientation = this.orientation();\n\n // Find which position zone contains this point\n let detectedPosition = 'CM'; // Default fallback\n let smallestArea = Infinity;\n\n for (const pos of positionsData) {\n let coords = pos[orientation];\n\n // For AWAY, we need to invert coordinates (same logic as renderPositionZones)\n if (side === SoccerBoardTeamSide.Away) {\n if (orientation === SoccerBoardOrientation.Portrait) {\n // Portrait: invert Y\n coords = {\n ...coords,\n y: 100 - coords.y - coords.height,\n };\n } else {\n // Landscape: invert X\n coords = {\n ...coords,\n x: 100 - coords.x - coords.width,\n };\n }\n }\n\n // Check if point is inside this zone\n const isInside =\n halfX >= coords.x &&\n halfX <= coords.x + coords.width &&\n halfY >= coords.y &&\n halfY <= coords.y + coords.height;\n\n if (isInside) {\n // If multiple zones overlap, prefer the smallest one (most specific)\n const area = coords.width * coords.height;\n if (area < smallestArea) {\n smallestArea = area;\n detectedPosition = pos.id;\n }\n }\n }\n\n return detectedPosition;\n }\n\n ngAfterViewInit(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n // Initial setup\n setTimeout(() => {\n this.updateFieldSize();\n this.setupResizeObserver();\n }, 0);\n }\n\n ngOnDestroy(): void {\n this.cleanupResizeObserver();\n }\n\n private setupResizeObserver(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n this.cleanupResizeObserver();\n\n if (this.fit() !== SoccerBoardFitMode.Contain) {\n return;\n }\n\n // Observe the host element's parent (like in the original)\n const parentElement = this.hostElement.nativeElement.parentElement;\n if (!parentElement) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateFieldSize();\n });\n\n this.resizeObserver.observe(parentElement);\n }\n\n private cleanupResizeObserver(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n private updateFieldSize(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n \n const hostElement = this.hostElement.nativeElement;\n\n // If fit=\"contain\", calculate size based on parent container (like original)\n if (this.fit() === SoccerBoardFitMode.Contain && hostElement.parentElement) {\n const parent = hostElement.parentElement;\n const parentStyle = getComputedStyle(parent);\n const parentWidth =\n parent.clientWidth -\n parseFloat(parentStyle.paddingLeft) -\n parseFloat(parentStyle.paddingRight);\n const parentHeight =\n parent.clientHeight -\n parseFloat(parentStyle.paddingTop) -\n parseFloat(parentStyle.paddingBottom);\n\n if (parentWidth > 0 && parentHeight > 0) {\n const fieldAspectRatio =\n this.orientation() === SoccerBoardOrientation.Landscape\n ? SoccerBoardFieldConstants.RATIO\n : 1 / SoccerBoardFieldConstants.RATIO;\n const containerAspectRatio = parentWidth / parentHeight;\n\n let width: number;\n\n if (containerAspectRatio > fieldAspectRatio) {\n // Container is wider - height is the constraint\n const height = parentHeight;\n width = height * fieldAspectRatio;\n } else {\n // Container is taller - width is the constraint\n width = parentWidth;\n }\n\n // Update width signal reactively\n this.hostWidth.set(`${width}px`);\n return;\n }\n }\n\n // Otherwise, use --soccer-board-width CSS custom property (like original)\n this.updateFieldSizeFromCSS();\n }\n\n private updateFieldSizeFromCSS(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const hostElement = this.hostElement.nativeElement;\n const computedStyle = getComputedStyle(hostElement);\n const fieldWidth = computedStyle.getPropertyValue('--soccer-board-width').trim();\n\n if (!fieldWidth || fieldWidth === '100%') {\n // Default behavior: 100% width, let CSS handle it\n this.hostWidth.set(fieldWidth || '100%');\n return;\n }\n\n // Parse the width value\n const match = fieldWidth.match(/^([\\d.]+)(px|rem|em|vw|vh|%)?$/);\n if (!match) {\n this.hostWidth.set(fieldWidth);\n return;\n }\n\n const value = parseFloat(match[1]);\n const unit = match[2] || 'px';\n\n if (this.orientation() === SoccerBoardOrientation.Landscape) {\n // In landscape, the CSS width represents the field length (105m)\n // So we multiply the physical width (68m) by the ratio to get the CSS width\n const landscapeWidth = value * SoccerBoardFieldConstants.RATIO;\n this.hostWidth.set(`${landscapeWidth}${unit}`);\n } else {\n // In portrait, the CSS width represents the field width (68m)\n this.hostWidth.set(`${value}${unit}`);\n }\n }\n\n /**\n * Exports the soccer board field (without sidebar) to PNG image\n * @public\n */\n public async exportToPNG(): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) {\n console.warn('[SoccerBoard] Export to PNG is only available in browser');\n return;\n }\n \n const container = this.fieldContainer()?.nativeElement;\n if (!container) {\n console.error('[SoccerBoard] Field container not found for export');\n return;\n }\n\n try {\n console.log('[SoccerBoard] Starting PNG export...');\n\n // Wait for all images to load before exporting\n const images = container.querySelectorAll('img');\n const imagePromises = Array.from(images).map((img) => {\n if (img.complete) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n img.onload = () => resolve();\n img.onerror = () => resolve(); // Continue even if image fails to load\n // Timeout after 5 seconds\n setTimeout(() => resolve(), 5000);\n });\n });\n\n await Promise.all(imagePromises);\n console.log('[SoccerBoard] All images loaded, capturing...');\n\n // Use html2canvas-pro to capture the field (supports oklab/oklch colors)\n const canvas = await html2canvas(container, {\n backgroundColor: null, // Transparent background\n scale: 2, // Higher quality\n logging: false,\n useCORS: true, // Allow cross-origin images\n allowTaint: false,\n width: container.offsetWidth,\n height: container.offsetHeight,\n ignoreElements: (element) => {\n // Ignore remove badges\n return element.classList?.contains('remove-badge') || false;\n },\n });\n\n // Convert canvas to blob and emit event\n canvas.toBlob((blob) => {\n if (!blob) {\n console.error('[SoccerBoard] Failed to create blob');\n return;\n }\n\n // Get data URL for the image\n const dataUrl = canvas.toDataURL('image/png');\n\n // Emit event with blob and data URL\n this.imageExported.emit({\n blob,\n dataUrl,\n });\n\n // Also trigger automatic download (optional - app can handle it via event)\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `soccer-board-${Date.now()}.png`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n console.log('[SoccerBoard] PNG exported successfully');\n }, 'image/png');\n } catch (error) {\n console.error('[SoccerBoard] Error exporting to PNG:', error);\n }\n }\n}\n","<div class=\"soccer-board-wrapper\" [class]=\"layoutClasses()\">\n <!-- Players Sidebar -->\n @if (showPlayersSidebar()) {\n <div class=\"players-sidebar\">\n <div\n class=\"players-grid\"\n [style.grid-template-columns]=\"playersGridColumns()\"\n >\n @for (player of availablePlayers(); track player.id) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Medium\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n (playerClicked)=\"onPlayerClick($event)\"\n />\n }\n </div>\n </div>\n }\n\n <!-- Soccer Board Container -->\n <div #soccerBoardContainer class=\"soccer-board-container\">\n <div\n #fieldContainer\n class=\"field-container\"\n [class.landscape]=\"isLandscape()\"\n >\n <!-- AWAY half -->\n <div #awayHalf class=\"field-half away\" [class.hidden]=\"!showAway()\">\n <div class=\"field-lines\">\n <div class=\"center-border\"></div>\n <div class=\"half-circle\"></div>\n <div class=\"penalty-area\"></div>\n <div class=\"goal-area\"></div>\n </div>\n\n <!-- Position zones -->\n @if (showPositions()) {\n <div class=\"position-zones\">\n @for (\n zone of awayZones();\n track zone.id + zone.coords.x + zone.coords.y\n ) {\n <div\n class=\"position-zone\"\n [style.left.%]=\"zone.coords.x\"\n [style.top.%]=\"zone.coords.y\"\n [style.width.%]=\"zone.coords.width\"\n [style.height.%]=\"zone.coords.height\"\n [style.background]=\"zone.color\"\n >\n {{ zone.label }}\n </div>\n }\n </div>\n }\n\n <!-- Players container -->\n <div class=\"players-container\" id=\"players-away\">\n @for (player of awayPlayers(); track player.id) {\n @if (player.fieldX !== undefined && player.fieldY !== undefined) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Small\"\n [style.position]=\"'absolute'\"\n [style.left.%]=\"getPlayerPosition(player).left\"\n [style.top.%]=\"getPlayerPosition(player).top\"\n [style.transform]=\"'translate(-50%, -50%)'\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n (removeFromField)=\"onPlayerRemoveFromField($event)\"\n (playerClicked)=\"onPlayerClick($event)\"\n />\n }\n }\n </div>\n </div>\n\n <!-- HOME half -->\n <div #homeHalf class=\"field-half home\" [class.hidden]=\"!showHome()\">\n <div class=\"field-lines\">\n <div class=\"center-border\"></div>\n <div class=\"half-circle\"></div>\n <div class=\"penalty-area\"></div>\n <div class=\"goal-area\"></div>\n </div>\n\n <!-- Position zones -->\n @if (showPositions()) {\n <div class=\"position-zones\">\n @for (\n zone of homeZones();\n track zone.id + zone.coords.x + zone.coords.y\n ) {\n <div\n class=\"position-zone\"\n [style.left.%]=\"zone.coords.x\"\n [style.top.%]=\"zone.coords.y\"\n [style.width.%]=\"zone.coords.width\"\n [style.height.%]=\"zone.coords.height\"\n [style.background]=\"zone.color\"\n >\n {{ zone.label }}\n </div>\n }\n </div>\n }\n\n <!-- Players container -->\n <div class=\"players-container\" id=\"players-home\">\n @for (player of homePlayers(); track player.id) {\n @if (player.fieldX !== undefined && player.fieldY !== undefined) {\n <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Small\"\n [style.position]=\"'absolute'\"\n [style.left.%]=\"getPlayerPosition(player).left\"\n [style.top.%]=\"getPlayerPosition(player).top\"\n [style.transform]=\"'translate(-50%, -50%)'\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n (removeFromField)=\"onPlayerRemoveFromField($event)\"\n (playerClicked)=\"onPlayerClick($event)\"\n />\n }\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fuzo/soccer-board",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-alpha.1",
|
|
4
4
|
"description": "A beautiful, interactive soccer field component for Angular applications. Create tactical formations, manage player positions, and export your field as PNG images.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -279,58 +279,6 @@ declare class SoccerBoardPlayerComponent {
|
|
|
279
279
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SoccerBoardPlayerComponent, "lib-soccer-board-player", never, { "player": { "alias": "player"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "dragStart": "dragStart"; "dragging": "dragging"; "dragEnd": "dragEnd"; "removeFromField": "removeFromField"; "playerClicked": "playerClicked"; }, never, never, true, never>;
|
|
280
280
|
}
|
|
281
281
|
|
|
282
|
-
declare enum PlayersPosition {
|
|
283
|
-
Left = "left",
|
|
284
|
-
Right = "right",
|
|
285
|
-
Top = "top",
|
|
286
|
-
Bottom = "bottom"
|
|
287
|
-
}
|
|
288
|
-
type PlayersPositionType = `${PlayersPosition}`;
|
|
289
|
-
declare class SoccerBoardLayoutComponent {
|
|
290
|
-
protected readonly PlayersPosition: typeof PlayersPosition;
|
|
291
|
-
protected readonly PlayerSize: typeof SoccerBoardPlayerSize;
|
|
292
|
-
players: _angular_core.InputSignal<SoccerBoardPlayer[]>;
|
|
293
|
-
orientation: _angular_core.InputSignal<SoccerBoardOrientation>;
|
|
294
|
-
teamSide: _angular_core.InputSignal<SoccerBoardTeamSideType>;
|
|
295
|
-
showPositions: _angular_core.InputSignal<boolean>;
|
|
296
|
-
fit: _angular_core.InputSignal<SoccerBoardFitMode>;
|
|
297
|
-
playersPosition: _angular_core.InputSignal<"left" | "right" | "top" | "bottom">;
|
|
298
|
-
playersColumns: _angular_core.InputSignal<number>;
|
|
299
|
-
soccerBoard: _angular_core.Signal<SoccerBoardComponent>;
|
|
300
|
-
playerPositioned: _angular_core.OutputEmitterRef<{
|
|
301
|
-
playerId: string;
|
|
302
|
-
fieldX: number;
|
|
303
|
-
fieldY: number;
|
|
304
|
-
side: SoccerBoardTeamSide;
|
|
305
|
-
position: string;
|
|
306
|
-
}>;
|
|
307
|
-
playerRemovedFromField: _angular_core.OutputEmitterRef<{
|
|
308
|
-
playerId: string;
|
|
309
|
-
}>;
|
|
310
|
-
availablePlayers: _angular_core.Signal<SoccerBoardPlayer[]>;
|
|
311
|
-
layoutClasses: _angular_core.Signal<"layout-players-right" | "layout-players-top" | "layout-players-bottom" | "layout-players-left">;
|
|
312
|
-
playersGridColumns: _angular_core.Signal<string>;
|
|
313
|
-
onPlayerDragEnd(event: {
|
|
314
|
-
playerId: string;
|
|
315
|
-
clientX: number;
|
|
316
|
-
clientY: number;
|
|
317
|
-
offsetX: number;
|
|
318
|
-
offsetY: number;
|
|
319
|
-
}): void;
|
|
320
|
-
onPlayerPositioned(event: {
|
|
321
|
-
playerId: string;
|
|
322
|
-
fieldX: number;
|
|
323
|
-
fieldY: number;
|
|
324
|
-
side: SoccerBoardTeamSide;
|
|
325
|
-
position: string;
|
|
326
|
-
}): void;
|
|
327
|
-
onPlayerRemoveFromField(event: {
|
|
328
|
-
playerId: string;
|
|
329
|
-
}): void;
|
|
330
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SoccerBoardLayoutComponent, never>;
|
|
331
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SoccerBoardLayoutComponent, "lib-soccer-board-layout", never, { "players": { "alias": "players"; "required": true; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "teamSide": { "alias": "teamSide"; "required": false; "isSignal": true; }; "showPositions": { "alias": "showPositions"; "required": false; "isSignal": true; }; "fit": { "alias": "fit"; "required": false; "isSignal": true; }; "playersPosition": { "alias": "playersPosition"; "required": false; "isSignal": true; }; "playersColumns": { "alias": "playersColumns"; "required": false; "isSignal": true; }; }, { "playerPositioned": "playerPositioned"; "playerRemovedFromField": "playerRemovedFromField"; }, never, never, true, never>;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
282
|
/**
|
|
335
283
|
* Soccer Board Field dimension constants
|
|
336
284
|
* Based on FIFA regulations: 105m x 68m
|
|
@@ -343,5 +291,5 @@ declare const SoccerBoardFieldConstants: {
|
|
|
343
291
|
readonly RATIO: number;
|
|
344
292
|
};
|
|
345
293
|
|
|
346
|
-
export {
|
|
347
|
-
export type {
|
|
294
|
+
export { SoccerBoardComponent, SoccerBoardFieldConstants, SoccerBoardFitMode, SoccerBoardOrientation, SoccerBoardPlayerComponent, SoccerBoardPlayerSize, SoccerBoardTeamSide };
|
|
295
|
+
export type { SoccerBoardFitModeType, SoccerBoardOrientationType, SoccerBoardPlayer, SoccerBoardPlayerSizeType, SoccerBoardTeamSideType };
|