@fuzo/soccer-board 0.1.0-alpha.2 → 0.2.0-alpha.2
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 +22 -2
- package/fesm2022/fuzo-soccer-board.mjs +328 -158
- package/fesm2022/fuzo-soccer-board.mjs.map +1 -1
- package/package.json +1 -1
- package/types/fuzo-soccer-board.d.ts +30 -60
|
@@ -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 // Position inputs - when provided, the component positions itself\n // These are percentage values (0-100) relative to parent container\n positionLeft = input<number | null>(null);\n positionTop = input<number | null>(null);\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; elementWidth: number; elementHeight: 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 // Track if we're waiting for position update after drag\n private readonly waitingForPositionUpdate = signal<boolean>(false);\n private readonly lastDragEndPosition = signal<{ left: number; top: number } | null>(null);\n\n // Track if drag has actually started (mouse moved after mousedown)\n private readonly isPotentialDrag = signal<boolean>(false);\n private readonly dragStartX = signal<number>(0);\n private readonly dragStartY = signal<number>(0);\n private readonly DRAG_THRESHOLD = 5;\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 // Determine if this component should position itself (has position inputs)\n private hasPosition = computed(() => {\n return this.positionLeft() !== null && this.positionTop() !== null;\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 position styles when not dragging\n effect(() => {\n const element = this.hostElement.nativeElement;\n const dragging = this.isDragging();\n const waiting = this.waitingForPositionUpdate();\n const left = this.positionLeft();\n const top = this.positionTop();\n const hasPos = this.hasPosition();\n const lastPos = this.lastDragEndPosition();\n\n // Don't update position styles while dragging\n if (dragging) {\n return;\n }\n\n // If we're waiting for position update after drag ended\n if (waiting && lastPos !== null) {\n // Check if position has changed from what it was at drag end\n // If position changed, we received the update and can apply the new position\n if (left !== lastPos.left || top !== lastPos.top) {\n this.waitingForPositionUpdate.set(false);\n this.lastDragEndPosition.set(null);\n // Continue to apply the new position below\n } else {\n // Still waiting for position update, keep the element in its current visual position\n return;\n }\n }\n\n if (hasPos && left !== null && top !== null) {\n // Player is on the field - apply absolute positioning\n element.style.position = 'absolute';\n element.style.left = `${left}%`;\n element.style.top = `${top}%`;\n element.style.transform = 'translate(-50%, -50%)';\n } else {\n // Player is in sidebar - clear positioning styles\n element.style.position = '';\n element.style.left = '';\n element.style.top = '';\n element.style.transform = '';\n }\n });\n\n // Effect to apply drag visual styles (opacity, cursor, zIndex)\n effect(() => {\n const dragging = this.isDragging();\n const element = this.hostElement.nativeElement;\n\n if (dragging) {\n element.style.opacity = '0.8';\n element.style.cursor = 'grabbing';\n element.style.zIndex = '1000';\n } else {\n element.style.opacity = '';\n element.style.cursor = '';\n element.style.zIndex = '';\n }\n });\n }\n\n @HostListener('mousedown', ['$event'])\n onMouseDown(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.closest('.remove-badge')) {\n return;\n }\n\n event.preventDefault();\n this.preparePotentialDrag(event.clientX, event.clientY);\n }\n\n @HostListener('touchstart', ['$event'])\n onTouchStart(event: TouchEvent): void {\n if (event.touches.length !== 1) return;\n\n const target = event.target as HTMLElement;\n if (target.closest('.remove-badge')) {\n return;\n }\n\n event.preventDefault();\n const touch = event.touches[0];\n this.preparePotentialDrag(touch.clientX, touch.clientY);\n }\n\n private preparePotentialDrag(clientX: number, clientY: number): void {\n this.dragStartX.set(clientX);\n this.dragStartY.set(clientY);\n this.isPotentialDrag.set(true);\n\n const element = this.hostElement.nativeElement;\n const rect = element.getBoundingClientRect();\n this.dragOffsetX.set(clientX - rect.left);\n this.dragOffsetY.set(clientY - rect.top);\n }\n\n private startDrag(clientX: number, clientY: number): void {\n const element = this.hostElement.nativeElement;\n const rect = element.getBoundingClientRect();\n\n // IMPORTANT: Set dragging state FIRST\n this.isDragging.set(true);\n\n // Apply fixed position for smooth dragging\n // Use exact current visual position to prevent any jump\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.transform = 'none'; // Remove translate during drag\n element.style.margin = '0';\n element.style.pointerEvents = 'none';\n\n const player = this.player();\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.isPotentialDrag() && !this.isDragging()) {\n const deltaX = Math.abs(event.clientX - this.dragStartX());\n const deltaY = Math.abs(event.clientY - this.dragStartY());\n\n if (deltaX > this.DRAG_THRESHOLD || deltaY > this.DRAG_THRESHOLD) {\n this.startDrag(event.clientX, event.clientY);\n }\n return;\n }\n\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 (event.touches.length !== 1) return;\n const touch = event.touches[0];\n\n if (this.isPotentialDrag() && !this.isDragging()) {\n const deltaX = Math.abs(touch.clientX - this.dragStartX());\n const deltaY = Math.abs(touch.clientY - this.dragStartY());\n\n if (deltaX > this.DRAG_THRESHOLD || deltaY > this.DRAG_THRESHOLD) {\n this.startDrag(touch.clientX, touch.clientY);\n }\n return;\n }\n\n if (!this.isDragging()) return;\n event.preventDefault();\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 // Update position during drag\n element.style.left = `${clientX - offsetX}px`;\n element.style.top = `${clientY - offsetY}px`;\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.isPotentialDrag() && !this.isDragging()) {\n this.isPotentialDrag.set(false);\n return;\n }\n\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.isPotentialDrag() && !this.isDragging()) {\n this.isPotentialDrag.set(false);\n return;\n }\n\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 const element = this.hostElement.nativeElement;\n const player = this.player();\n const rect = element.getBoundingClientRect();\n\n // Store current position inputs to detect when they change\n const currentLeft = this.positionLeft();\n const currentTop = this.positionTop();\n\n // Emit event with all necessary information\n const dragEndEvent = {\n playerId: player.id,\n clientX,\n clientY,\n offsetX: this.dragOffsetX(),\n offsetY: this.dragOffsetY(),\n elementWidth: rect.width,\n elementHeight: rect.height,\n };\n this.dragEnd.emit(dragEndEvent);\n\n // Mark that we're waiting for position update\n // Store the current position so we can detect when it changes\n if (currentLeft !== null && currentTop !== null) {\n this.waitingForPositionUpdate.set(true);\n this.lastDragEndPosition.set({ left: currentLeft, top: currentTop });\n }\n\n // Clear drag state\n this.isDragging.set(false);\n this.isPotentialDrag.set(false);\n\n // Clear drag-specific styles except position-related ones\n // Position will be handled by the effect when new position arrives\n element.style.width = '';\n element.style.height = '';\n element.style.margin = '';\n element.style.pointerEvents = '';\n\n // If we're waiting for position update, keep fixed position temporarily\n // Otherwise, clear it and let effect handle positioning\n if (!this.waitingForPositionUpdate()) {\n element.style.position = '';\n element.style.left = '';\n element.style.top = '';\n element.style.transform = '';\n }\n\n // Fallback: if position doesn't update within 500ms, clear waiting state\n // This handles edge cases where the drop was outside the field\n setTimeout(() => {\n if (this.waitingForPositionUpdate()) {\n this.waitingForPositionUpdate.set(false);\n this.lastDragEndPosition.set(null);\n // Clear fixed position and revert to input-based position\n element.style.position = '';\n element.style.left = '';\n element.style.top = '';\n element.style.transform = '';\n }\n }, 500);\n }\n\n onRemoveClick(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n const player = this.player();\n this.removeFromField.emit({ playerId: player.id });\n }\n\n onPlayerClick(event: MouseEvent): void {\n if (this.isDragging() || this.isPotentialDrag()) {\n return;\n }\n\n event.stopPropagation();\n const player = this.player();\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 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 (mousedown)=\"$event.stopPropagation()\"\n (touchstart)=\"$event.stopPropagation()\"\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 { isPlatformBrowser } from '@angular/common';\nimport {\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 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 start (called from template)\n onPlayerDragStart(event: { playerId: string; playerName: string }): void {\n // Player component handles its own drag positioning\n // This is just for logging/debugging\n console.log('[SoccerBoard] Drag started', event.playerId);\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 elementWidth: number;\n elementHeight: 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 // These computed signals automatically cache results when dependencies haven't changed\n // The @for loop uses trackBy with player.id to only re-render changed players\n // NOTE: Even if a new array is returned, trackBy ensures only changed items re-render\n homePlayers = computed(() => {\n return this.players().filter(\n (player) =>\n player.side === SoccerBoardTeamSide.Home &&\n player.fieldX !== undefined &&\n player.fieldY !== undefined &&\n !isNaN(player.fieldX) &&\n !isNaN(player.fieldY)\n );\n });\n\n awayPlayers = computed(() => {\n return this.players().filter(\n (player) =>\n player.side === SoccerBoardTeamSide.Away &&\n player.fieldX !== undefined &&\n player.fieldY !== undefined &&\n !isNaN(player.fieldX) &&\n !isNaN(player.fieldY)\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 // Computed: Map of player positions for stable rendering\n // This ensures positions are only recalculated when players() or orientation() change\n // Using a Map allows efficient lookups\n private playerPositions = computed(() => {\n const positions = new Map<string, { left: number; top: number }>();\n const players = this.players();\n // Track orientation dependency - fieldToHalfCoordinates uses it internally\n this.orientation();\n\n // Process all players with valid coordinates\n for (const player of players) {\n if (\n player.fieldX !== undefined &&\n player.fieldY !== undefined &&\n player.side !== undefined &&\n !isNaN(player.fieldX) &&\n !isNaN(player.fieldY)\n ) {\n // Validate coordinates are within bounds (0-100)\n const fieldX = Math.max(0, Math.min(100, player.fieldX));\n const fieldY = Math.max(0, Math.min(100, player.fieldY));\n\n // Calculate position using validated coordinates\n const position = this.fieldToHalfCoordinates(fieldX, fieldY, player.side);\n positions.set(player.id, position);\n }\n }\n\n return positions;\n });\n\n // Helper method to get visual position for a player (public for template)\n // Now uses the computed positions map instead of calculating on the fly\n public getPlayerPosition(player: SoccerBoardPlayer): { left: number; top: number } {\n const positions = this.playerPositions();\n const position = positions.get(player.id);\n\n if (position) {\n return position;\n }\n\n // Fallback: if position is not in cache but player has coordinates, calculate it\n // This should rarely happen, but handles edge cases\n if (\n player.fieldX !== undefined &&\n player.fieldY !== undefined &&\n player.side !== undefined &&\n !isNaN(player.fieldX) &&\n !isNaN(player.fieldY)\n ) {\n const fieldX = Math.max(0, Math.min(100, player.fieldX));\n const fieldY = Math.max(0, Math.min(100, player.fieldY));\n return this.fieldToHalfCoordinates(fieldX, fieldY, player.side);\n }\n\n return { left: 0, top: 0 };\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 elementWidth?: number;\n elementHeight?: number;\n }): void {\n console.log('[SoccerBoard] handlePlayerDrop called', event);\n\n // Calculate position immediately (don't use requestAnimationFrame as it causes timing issues)\n // The coordinates are already correct from the drag end event\n // clientX/clientY represent where the mouse/touch was when released\n // offsetX/offsetY represent the offset from element's top-left to click point\n // elementWidth/elementHeight are the dimensions of the dragged element\n const position = this.calculateFieldPosition(\n event.clientX,\n event.clientY,\n event.offsetX,\n event.offsetY,\n event.elementWidth,\n event.elementHeight\n );\n\n console.log('[SoccerBoard] Calculated position', position);\n\n if (!position) {\n console.warn('[SoccerBoard] Position is null - player not dropped on field');\n return;\n }\n\n // Get current player state BEFORE validation to avoid race conditions\n // Use the current players() signal value to get the latest state\n const currentPlayers = this.players();\n const currentPlayer = currentPlayers.find((p) => p.id === event.playerId);\n\n if (!currentPlayer) {\n console.warn('[SoccerBoard] Player not found', event.playerId);\n return;\n }\n\n const isMovingPlayer = currentPlayer.fieldX !== undefined && currentPlayer.fieldY !== undefined;\n const isMovingToDifferentSide = isMovingPlayer && currentPlayer.side !== position.side;\n\n // Check maximum players per side:\n // - For new players: always check\n // - For moving players: only check if moving to a DIFFERENT side\n // - When moving within the same side, allow it (no limit check needed)\n if (!isMovingPlayer || isMovingToDifferentSide) {\n // Count players on the target side (excluding the current player if moving)\n const playersOnTargetSide = currentPlayers.filter(\n (p) =>\n p.id !== event.playerId && // Exclude the player being moved\n p.side === position.side &&\n p.fieldX !== undefined &&\n p.fieldY !== undefined &&\n !isNaN(p.fieldX) &&\n !isNaN(p.fieldY)\n ).length;\n\n if (playersOnTargetSide >= this.maxPlayersPerSide()) {\n console.warn(\n `[SoccerBoard] Maximum players (${this.maxPlayersPerSide()}) reached for ${position.side} side. Cannot ${isMovingPlayer ? 'move' : 'add'} player.`\n );\n return; // Don't allow drop if max players reached on target side\n }\n }\n\n // Validate coordinates are within bounds\n const fieldX = Math.max(0, Math.min(100, position.fieldX));\n const fieldY = Math.max(0, Math.min(100, position.fieldY));\n\n const tacticalPosition = this.detectTacticalPosition(\n fieldX,\n fieldY,\n position.side\n );\n\n console.log('🎯 Player dropped:', {\n playerId: event.playerId,\n isMovingPlayer,\n isMovingToDifferentSide,\n position: tacticalPosition,\n coordinates: {\n fieldX,\n fieldY,\n side: position.side,\n },\n });\n\n // Emit event with position information (using validated coordinates)\n // Emit immediately - the parent component handles the update\n this.playerPositioned.emit({\n playerId: event.playerId,\n fieldX,\n fieldY,\n side: position.side,\n position: tacticalPosition,\n });\n }\n\n /**\n * Calculates field position from client coordinates\n * @param clientX - X coordinate of the mouse/touch event\n * @param clientY - Y coordinate of the mouse/touch event\n * @param offsetX - Optional: X offset from element's left edge to click point (used to calculate center)\n * @param offsetY - Optional: Y offset from element's top edge to click point (used to calculate center)\n * @param elementWidth - Optional: Width of the dragged element\n * @param elementHeight - Optional: Height of the dragged element\n */\n private calculateFieldPosition(\n clientX: number,\n clientY: number,\n offsetX?: number,\n offsetY?: number,\n elementWidth?: number,\n elementHeight?: 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 // Calculate the center of the dragged element\n // clientX/clientY is where the cursor is\n // offsetX/offsetY is the offset from the element's top-left to where the user clicked\n // elementWidth/elementHeight are the actual dimensions of the element\n //\n // The element's top-left corner is at:\n // elementLeft = clientX - offsetX\n // elementTop = clientY - offsetY\n //\n // The element's center is at:\n // centerX = elementLeft + elementWidth / 2 = clientX - offsetX + elementWidth / 2\n // centerY = elementTop + elementHeight / 2 = clientY - offsetY + elementHeight / 2\n\n let centerX = clientX;\n let centerY = clientY;\n\n if (\n offsetX !== undefined &&\n offsetY !== undefined &&\n elementWidth !== undefined &&\n elementHeight !== undefined\n ) {\n // Calculate the actual center of the element\n centerX = clientX - offsetX + elementWidth / 2;\n centerY = clientY - offsetY + elementHeight / 2;\n }\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 (dragStart)=\"onPlayerDragStart($event)\"\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 <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Small\"\n [positionLeft]=\"getPlayerPosition(player).left\"\n [positionTop]=\"getPlayerPosition(player).top\"\n (dragStart)=\"onPlayerDragStart($event)\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n (removeFromField)=\"onPlayerRemoveFromField($event)\"\n (playerClicked)=\"onPlayerClick($event)\"\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 <lib-soccer-board-player\n [player]=\"player\"\n [size]=\"PlayerSize.Small\"\n [positionLeft]=\"getPlayerPosition(player).left\"\n [positionTop]=\"getPlayerPosition(player).top\"\n (dragStart)=\"onPlayerDragStart($event)\"\n (dragEnd)=\"onPlayerDragEnd($event)\"\n (removeFromField)=\"onPlayerRemoveFromField($event)\"\n (playerClicked)=\"onPlayerClick($event)\"\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.2",
|
|
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",
|
|
@@ -105,12 +105,18 @@ declare class SoccerBoardComponent implements AfterViewInit, OnDestroy {
|
|
|
105
105
|
playerId: string;
|
|
106
106
|
player: SoccerBoardPlayer;
|
|
107
107
|
}>;
|
|
108
|
+
onPlayerDragStart(event: {
|
|
109
|
+
playerId: string;
|
|
110
|
+
playerName: string;
|
|
111
|
+
}): void;
|
|
108
112
|
onPlayerDragEnd(event: {
|
|
109
113
|
playerId: string;
|
|
110
114
|
clientX: number;
|
|
111
115
|
clientY: number;
|
|
112
116
|
offsetX: number;
|
|
113
117
|
offsetY: number;
|
|
118
|
+
elementWidth: number;
|
|
119
|
+
elementHeight: number;
|
|
114
120
|
}): void;
|
|
115
121
|
onPlayerClick(event: {
|
|
116
122
|
playerId: string;
|
|
@@ -175,6 +181,7 @@ declare class SoccerBoardComponent implements AfterViewInit, OnDestroy {
|
|
|
175
181
|
availablePlayers: _angular_core.Signal<SoccerBoardPlayer[]>;
|
|
176
182
|
layoutClasses: _angular_core.Signal<"layout-no-sidebar" | "layout-players-right" | "layout-players-top" | "layout-players-bottom" | "layout-players-left">;
|
|
177
183
|
playersGridColumns: _angular_core.Signal<string>;
|
|
184
|
+
private playerPositions;
|
|
178
185
|
getPlayerPosition(player: SoccerBoardPlayer): {
|
|
179
186
|
left: number;
|
|
180
187
|
top: number;
|
|
@@ -192,9 +199,17 @@ declare class SoccerBoardComponent implements AfterViewInit, OnDestroy {
|
|
|
192
199
|
clientY: number;
|
|
193
200
|
offsetX: number;
|
|
194
201
|
offsetY: number;
|
|
202
|
+
elementWidth?: number;
|
|
203
|
+
elementHeight?: number;
|
|
195
204
|
}): void;
|
|
196
205
|
/**
|
|
197
206
|
* Calculates field position from client coordinates
|
|
207
|
+
* @param clientX - X coordinate of the mouse/touch event
|
|
208
|
+
* @param clientY - Y coordinate of the mouse/touch event
|
|
209
|
+
* @param offsetX - Optional: X offset from element's left edge to click point (used to calculate center)
|
|
210
|
+
* @param offsetY - Optional: Y offset from element's top edge to click point (used to calculate center)
|
|
211
|
+
* @param elementWidth - Optional: Width of the dragged element
|
|
212
|
+
* @param elementHeight - Optional: Height of the dragged element
|
|
198
213
|
*/
|
|
199
214
|
private calculateFieldPosition;
|
|
200
215
|
/**
|
|
@@ -224,6 +239,8 @@ declare class SoccerBoardPlayerComponent {
|
|
|
224
239
|
private readonly hostElement;
|
|
225
240
|
player: _angular_core.InputSignal<SoccerBoardPlayer>;
|
|
226
241
|
size: _angular_core.InputSignal<SoccerBoardPlayerSize>;
|
|
242
|
+
positionLeft: _angular_core.InputSignal<number>;
|
|
243
|
+
positionTop: _angular_core.InputSignal<number>;
|
|
227
244
|
dragStart: _angular_core.OutputEmitterRef<{
|
|
228
245
|
playerId: string;
|
|
229
246
|
playerName: string;
|
|
@@ -241,6 +258,8 @@ declare class SoccerBoardPlayerComponent {
|
|
|
241
258
|
clientY: number;
|
|
242
259
|
offsetX: number;
|
|
243
260
|
offsetY: number;
|
|
261
|
+
elementWidth: number;
|
|
262
|
+
elementHeight: number;
|
|
244
263
|
}>;
|
|
245
264
|
removeFromField: _angular_core.OutputEmitterRef<{
|
|
246
265
|
playerId: string;
|
|
@@ -252,20 +271,23 @@ declare class SoccerBoardPlayerComponent {
|
|
|
252
271
|
private readonly isDragging;
|
|
253
272
|
private readonly dragOffsetX;
|
|
254
273
|
private readonly dragOffsetY;
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
274
|
+
private readonly waitingForPositionUpdate;
|
|
275
|
+
private readonly lastDragEndPosition;
|
|
276
|
+
private readonly isPotentialDrag;
|
|
277
|
+
private readonly dragStartX;
|
|
278
|
+
private readonly dragStartY;
|
|
279
|
+
private readonly DRAG_THRESHOLD;
|
|
260
280
|
playerPhoto: _angular_core.Signal<string>;
|
|
261
281
|
playerName: _angular_core.Signal<string>;
|
|
262
282
|
playerNumber: _angular_core.Signal<number>;
|
|
263
283
|
isOnField: _angular_core.Signal<boolean>;
|
|
284
|
+
private hasPosition;
|
|
264
285
|
playerPosition: _angular_core.Signal<string>;
|
|
265
286
|
sizeClasses: _angular_core.Signal<"w-12 h-12" | "w-20 h-20" | "w-16 h-16">;
|
|
266
287
|
constructor();
|
|
267
288
|
onMouseDown(event: MouseEvent): void;
|
|
268
289
|
onTouchStart(event: TouchEvent): void;
|
|
290
|
+
private preparePotentialDrag;
|
|
269
291
|
private startDrag;
|
|
270
292
|
onMouseMove(event: MouseEvent): void;
|
|
271
293
|
onTouchMove(event: TouchEvent): void;
|
|
@@ -276,59 +298,7 @@ declare class SoccerBoardPlayerComponent {
|
|
|
276
298
|
onRemoveClick(event: Event): void;
|
|
277
299
|
onPlayerClick(event: MouseEvent): void;
|
|
278
300
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SoccerBoardPlayerComponent, never>;
|
|
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
|
-
}
|
|
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>;
|
|
301
|
+
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; }; "positionLeft": { "alias": "positionLeft"; "required": false; "isSignal": true; }; "positionTop": { "alias": "positionTop"; "required": false; "isSignal": true; }; }, { "dragStart": "dragStart"; "dragging": "dragging"; "dragEnd": "dragEnd"; "removeFromField": "removeFromField"; "playerClicked": "playerClicked"; }, never, never, true, never>;
|
|
332
302
|
}
|
|
333
303
|
|
|
334
304
|
/**
|
|
@@ -343,5 +313,5 @@ declare const SoccerBoardFieldConstants: {
|
|
|
343
313
|
readonly RATIO: number;
|
|
344
314
|
};
|
|
345
315
|
|
|
346
|
-
export {
|
|
347
|
-
export type {
|
|
316
|
+
export { SoccerBoardComponent, SoccerBoardFieldConstants, SoccerBoardFitMode, SoccerBoardOrientation, SoccerBoardPlayerComponent, SoccerBoardPlayerSize, SoccerBoardTeamSide };
|
|
317
|
+
export type { SoccerBoardFitModeType, SoccerBoardOrientationType, SoccerBoardPlayer, SoccerBoardPlayerSizeType, SoccerBoardTeamSideType };
|