ngx-venue-map
Version:
Interactive venue seating map component for Angular applications
1 lines • 144 kB
Source Map (JSON)
{"version":3,"file":"ngx-venue-map.mjs","sources":["../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map.type.ts","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map.constant.ts","../../../projects/ngx-venue-map/src/lib/components/switch/switch.component.ts","../../../projects/ngx-venue-map/src/lib/components/switch/switch.component.html","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map-render.service.ts","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map.utils.ts","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map-mini-map.service.ts","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map-canvas.service.ts","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map-price.service.ts","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map-grade.service.ts","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map.component.ts","../../../projects/ngx-venue-map/src/lib/components/venue-map/venue-map.component.html","../../../projects/ngx-venue-map/src/public-api.ts","../../../projects/ngx-venue-map/src/ngx-venue-map.ts"],"sourcesContent":["import { fabric } from 'fabric';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\nexport enum VenueMapType {\n GRADE = 'grade',\n GRADE_PRICE = 'gradePrice',\n}\n\n// ============================================================================\n// BASIC TYPES\n// ============================================================================\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface Bounds {\n left: number;\n right: number;\n top: number;\n bottom: number;\n zoom: number;\n}\n\nexport interface ClientPositionSeat {\n clientX?: number;\n clientY?: number;\n}\n\n// ============================================================================\n// SHAPE & DESIGN TYPES\n// ============================================================================\n\nexport interface SizeShape {\n width: number;\n height: number;\n stroke: number;\n cornerRadius: number;\n padding: number;\n offsetLeft: number;\n offsetTop: number;\n}\n\nexport interface Circle extends Point {\n textColor: string;\n}\n\n// ============================================================================\n// MAP CONFIGURATION TYPES\n// ============================================================================\n\nexport interface MapSetting {\n width: number;\n height: number;\n scale?: number;\n}\n\nexport interface MiniMapConfiguration {\n scale: number;\n opacity: number;\n}\n\nexport interface ZoomConfiguration {\n min: number;\n max: number;\n step: number;\n showMiniMapAtLevel: number;\n}\n\nexport interface MapConfiguration {\n // Image paths - can be a single string or array of strings for multi-part images\n path: string | string[];\n\n // Dimensions\n width: number;\n height: number;\n offsetHeight: number;\n\n // Typography\n fontSize: number;\n\n // Shape configurations\n bubble: SizeShape;\n corner: SizeShape;\n arrow: SizeShape;\n circle: SizeShape;\n\n // Map interaction configurations\n zoom: ZoomConfiguration;\n minimap: MiniMapConfiguration;\n}\n\n// ============================================================================\n// FABRIC.JS EXTENDED TYPES\n// ============================================================================\n\nexport interface ExtendedObject extends fabric.Object {\n id?: string;\n subId?: string;\n subType?: string;\n shapeIndex?: number;\n}\n\nexport interface ExtendedGroup extends fabric.Group {\n id?: string;\n subId?: string;\n subType?: string;\n shapeIndex?: number;\n}\n\nexport interface ExtendedImage extends fabric.Image {\n id?: string;\n subId?: string;\n shapeIndex?: number;\n}\n\nexport interface FabricCanvas extends fabric.Canvas {\n wrapperEl: HTMLElement;\n lowerCanvasEl: HTMLCanvasElement;\n upperCanvasEl: HTMLCanvasElement;\n}\n\n// ============================================================================\n// GRADE SYSTEM TYPES\n// ============================================================================\n\nexport interface GradeSetting {\n angle: number;\n // Draw grade.abbreviation on the circle\n circle: Circle;\n // Draw a polygon covering the grade area\n points: Point[];\n // Fill color of the polygon\n color: string;\n}\n\nexport interface Grade {\n id: string;\n name: string;\n abbreviation: string;\n settings: GradeSetting[];\n disabled: boolean;\n price: number;\n}\n\n// ============================================================================\n// THEME CONFIGURATION TYPES\n// ============================================================================\n\nexport interface VenueMapTheme {\n // Canvas and background colors\n canvasBackgroundColor: string;\n\n // Grade visualization colors\n gradeStrokeColor: string;\n gradeTextColor: string;\n\n // Price visualization colors\n priceBackgroundColor: string;\n priceTextColor: string;\n priceBubbleStrokeColor: string;\n\n // Interactive elements\n miniMapViewportColor: string;\n\n // Seat colors\n availableSeatColor: string;\n unavailableSeatColor: string;\n selectedSeatColor: string;\n selectedSeatBorderColor: string;\n availableSeatBorderColor: string;\n disabledSeatColor: string;\n\n // Special seat types\n premiumSeatColor: string;\n premiumSeatHoverColor: string;\n goldSeatColor: string;\n\n // UI colors\n shadowColor: string;\n darkTextColor: string;\n}\n\n// =====s=======================================================================\n","import { SizeShape, VenueMapTheme } from './venue-map.type';\n\nconst DEFAULT_SIZE_SHAPE: SizeShape = {\n width: 0,\n height: 0,\n padding: 0,\n stroke: 0,\n offsetLeft: 0,\n offsetTop: 0,\n cornerRadius: 0,\n};\n\nexport const DEFAULT_MAP_CONFIG = {\n circle: {\n ...DEFAULT_SIZE_SHAPE,\n width: 50,\n height: 50,\n stroke: 2,\n padding: 10,\n },\n fontSize: 20,\n bubble: {\n ...DEFAULT_SIZE_SHAPE,\n width: 30,\n height: 20,\n },\n corner: {\n ...DEFAULT_SIZE_SHAPE,\n width: 20,\n },\n arrow: {\n ...DEFAULT_SIZE_SHAPE,\n width: 15,\n height: 10,\n padding: 12,\n },\n offsetHeight: 106,\n minimap: {\n scale: 0.12,\n opacity: 0.5,\n },\n zoom: {\n min: 1,\n max: 2.5,\n step: 0.2,\n showMiniMapAtLevel: 1.2,\n }\n};\n\n// Default theme colors that match the use cases\nexport const DEFAULT_VENUE_MAP_THEME: VenueMapTheme = {\n // Canvas and background colors\n canvasBackgroundColor: '#ffffff',\n\n // Grade visualization colors\n gradeStrokeColor: '#ffffff',\n gradeTextColor: '#ffffff',\n\n // Price visualization colors\n priceBackgroundColor: '#ffffff',\n priceTextColor: '#000000',\n priceBubbleStrokeColor: '#ffffff',\n\n // Interactive elements\n miniMapViewportColor: '#EE2039',\n\n // Seat colors\n availableSeatColor: '#ffffff',\n unavailableSeatColor: '#969696',\n selectedSeatColor: '#0071EAB2',\n selectedSeatBorderColor: '#0071EA',\n availableSeatBorderColor: '#0071EA',\n disabledSeatColor: '#2F2F2F',\n\n // Special seat types\n premiumSeatColor: '#B60000',\n premiumSeatHoverColor: '#B60000B2',\n goldSeatColor: '#8F7400',\n\n // UI colors\n shadowColor: 'rgba(0,0,0,0.22)',\n darkTextColor: '#767676',\n};\n\nexport const MULTIPLIER_GRADE_ICON = 1.5;\n","import { Component, input, model } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'app-switch',\n standalone: true,\n imports: [FormsModule, CommonModule],\n templateUrl: './switch.component.html',\n styleUrl: './switch.component.css',\n})\nexport class SwitchComponent {\n handleOnChange = input<((value: boolean) => void) | undefined>();\n className = input<string>('');\n checked = model<boolean>(false);\n\n onChange(event: Event) {\n const target = event.target as HTMLInputElement;\n this.checked.set(target.checked);\n this.handleOnChange()?.(target.checked);\n }\n}\n","<label class=\"switch\">\n <input\n type=\"checkbox\"\n [checked]=\"checked()\"\n (change)=\"onChange($event)\"\n class=\"sr-only switch-input\"\n />\n <div class=\"switch-indicator\" [ngClass]=\"className()\"></div>\n</label>\n","import { Injectable } from '@angular/core';\nimport { fabric } from 'fabric';\nimport {\n ExtendedImage,\n MapConfiguration,\n MapSetting,\n FabricCanvas\n} from './venue-map.type';\n\n/**\n * Service responsible for rendering venue map images and backgrounds.\n * Handles both single images and multi-part image loading.\n * For multi-part images, follows a file naming pattern: col_row.ext\n * Example: 0_0.png, 0_1.png, 1_0.png, 1_1.png\n * Also manages background image loading and canvas setup for venue maps.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class VenueMapRenderService {\n\n // ============================================================================\n // MULTI-PART IMAGE METHODS\n // ============================================================================\n\n /**\n * Determines if the path represents multiple image parts\n * @param path - Single path string or array of paths\n * @returns true if multiple parts should be rendered\n */\n public isMultiPartImage(path: string | string[]): boolean {\n return Array.isArray(path);\n }\n\n /**\n * Generates image paths based on pattern col_row.ext\n * @param basePath - Base path template (e.g., '/images/map/parts/{col}_{row}.png')\n * @param cols - Number of columns\n * @param rows - Number of rows\n * @returns Array of image paths\n */\n public generateImagePaths(basePath: string, cols: number, rows: number): string[] {\n const paths: string[] = [];\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const path = basePath\n .replace('{col}', col.toString())\n .replace('{row}', row.toString());\n paths.push(path);\n }\n }\n\n return paths;\n }\n\n /**\n * Parses column and row from filename pattern col_row.ext\n * @param filename - Filename to parse (e.g., '0_1.png')\n * @returns Object with col and row numbers, or null if pattern doesn't match\n */\n public parseImageCoordinates(filename: string): { col: number; row: number } | null {\n // Extract filename without path\n const name = filename.split('/').pop() || filename;\n\n // Remove extension\n const nameWithoutExt = name.split('.')[0];\n\n // Match pattern: col_row\n const match = nameWithoutExt.match(/^(\\d+)_(\\d+)$/);\n\n if (match) {\n return {\n col: parseInt(match[1], 10),\n row: parseInt(match[2], 10)\n };\n }\n\n return null;\n }\n\n /**\n * Calculates grid dimensions from array of image paths\n * @param paths - Array of image paths\n * @returns Object with cols and rows dimensions\n */\n public calculateGridDimensions(paths: string[]): { cols: number; rows: number } {\n let maxCol = 0;\n let maxRow = 0;\n\n for (const path of paths) {\n const coords = this.parseImageCoordinates(path);\n if (coords) {\n maxCol = Math.max(maxCol, coords.col);\n maxRow = Math.max(maxRow, coords.row);\n }\n }\n\n return {\n cols: maxCol + 1,\n rows: maxRow + 1\n };\n }\n\n /**\n * Loads multiple images and creates a composite fabric.Image\n * @param paths - Array of image paths\n * @param totalWidth - Total width of the composite image\n * @param totalHeight - Total height of the composite image\n * @param callback - Callback function with the composite image\n */\n public loadMultiPartImage(\n paths: string[],\n totalWidth: number,\n totalHeight: number,\n callback: (compositeImage: fabric.Image) => void\n ): void {\n const { cols, rows } = this.calculateGridDimensions(paths);\n\n if (cols === 0 || rows === 0) {\n console.error('Invalid grid dimensions calculated from paths');\n return;\n }\n\n const partWidth = totalWidth / cols;\n const partHeight = totalHeight / rows;\n\n // Create canvas for compositing\n const compositeCanvas = new fabric.StaticCanvas(null, {\n width: totalWidth,\n height: totalHeight\n });\n\n let loadedCount = 0;\n const totalParts = paths.length;\n\n // Load each image part\n paths.forEach(path => {\n fabric.Image.fromURL(\n path,\n (img) => {\n if (!img) {\n console.error(`Failed to load image: ${path}`);\n loadedCount++;\n if (loadedCount === totalParts) {\n this.finalizeCompositeImage(compositeCanvas, callback);\n }\n return;\n }\n\n const coords = this.parseImageCoordinates(path);\n if (!coords) {\n console.error(`Could not parse coordinates from path: ${path}`);\n loadedCount++;\n if (loadedCount === totalParts) {\n this.finalizeCompositeImage(compositeCanvas, callback);\n }\n return;\n }\n\n // Position the image part\n const x = coords.col * partWidth;\n const y = coords.row * partHeight;\n\n img.set({\n left: x,\n top: y,\n scaleX: partWidth / (img.width || 1),\n scaleY: partHeight / (img.height || 1),\n selectable: false,\n evented: false\n });\n\n compositeCanvas.add(img);\n loadedCount++;\n\n if (loadedCount === totalParts) {\n this.finalizeCompositeImage(compositeCanvas, callback);\n }\n },\n { crossOrigin: 'anonymous' }\n );\n });\n }\n\n /**\n * Finalizes the composite image and returns it via callback\n * @param compositeCanvas - Canvas containing all image parts\n * @param callback - Callback function with the final composite image\n */\n private finalizeCompositeImage(\n compositeCanvas: fabric.StaticCanvas,\n callback: (compositeImage: fabric.Image) => void\n ): void {\n // Render the canvas and create a new fabric.Image from it\n const dataURL = compositeCanvas.toDataURL({\n format: 'png',\n quality: 1.0\n });\n\n fabric.Image.fromURL(\n dataURL,\n (compositeImage) => {\n if (compositeImage) {\n compositeImage.set({\n selectable: false,\n evented: false,\n objectCaching: false\n });\n callback(compositeImage);\n }\n },\n { crossOrigin: 'anonymous' }\n );\n }\n\n /**\n * Loads a single image\n * @param path - Image path\n * @param callback - Callback function with the loaded image\n */\n public loadSingleImage(\n path: string,\n callback: (img: fabric.Image) => void\n ): void {\n fabric.Image.fromURL(path, callback, { crossOrigin: 'anonymous' });\n }\n\n // ============================================================================\n // VENUE IMAGE RENDERING METHODS\n // ============================================================================\n\n /**\n * Loads background image for the venue map canvas\n * @param canvas - Fabric canvas instance\n * @param mapConfig - Map configuration\n * @param viewDimensions - View dimensions\n * @param pathImg - Image path (single or array)\n * @param callback - Callback function with mapWidth\n */\n public loadBackgroundImage(\n canvas: FabricCanvas,\n mapConfig: MapConfiguration,\n viewDimensions: MapSetting,\n pathImg?: string | string[],\n callback?: (mapWidth: number) => void\n ): void {\n if (!canvas) return;\n\n const { path } = mapConfig;\n const targetPath = pathImg ?? path;\n\n const backgroundImage = canvas.backgroundImage;\n\n if (backgroundImage && backgroundImage instanceof fabric.Image) {\n canvas.remove(backgroundImage);\n }\n\n // Check if it's a multi-part image\n if (this.isMultiPartImage(targetPath)) {\n this.loadMultiPartBackgroundImage(canvas, mapConfig, viewDimensions, targetPath as string[], callback);\n } else {\n this.loadSingleBackgroundImage(canvas, mapConfig, viewDimensions, targetPath as string, callback);\n }\n }\n\n /**\n * Loads a single background image\n */\n private loadSingleBackgroundImage(\n canvas: FabricCanvas,\n mapConfig: MapConfiguration,\n viewDimensions: MapSetting,\n path: string,\n callback?: (mapWidth: number) => void\n ): void {\n fabric.Image.fromURL(path, img => {\n if (!img) return;\n const result = this.setDataImageToCanvas(canvas, mapConfig, viewDimensions, img);\n callback?.(result.mapWidth);\n }, { crossOrigin: 'anonymous' });\n }\n\n /**\n * Loads multiple image parts and creates a composite background\n */\n private loadMultiPartBackgroundImage(\n canvas: FabricCanvas,\n mapConfig: MapConfiguration,\n viewDimensions: MapSetting,\n paths: string[],\n callback?: (mapWidth: number) => void\n ): void {\n const { width, height } = mapConfig;\n\n this.loadMultiPartImage(\n paths,\n width,\n height,\n (compositeImage) => {\n if (!compositeImage) return;\n const result = this.setDataImageToCanvas(canvas, mapConfig, viewDimensions, compositeImage);\n callback?.(result.mapWidth);\n }\n );\n }\n\n\n\n /**\n * Sets image data to canvas and configures canvas properties\n */\n private setDataImageToCanvas(\n canvas: FabricCanvas,\n mapConfig: MapConfiguration,\n viewDimensions: MapSetting,\n img: fabric.Image\n ): { mapWidth: number } {\n mapConfig.width = img.width!;\n mapConfig.height = img.height!;\n viewDimensions.scale = viewDimensions.height / img.height!;\n\n const mapWidth = Math.max(\n this.scaleValue(img.width!, viewDimensions.scale!),\n viewDimensions.width\n );\n\n img.scaleToWidth(this.scaleValue(img.width!, viewDimensions.scale!));\n img.scaleToHeight(this.scaleValue(img.height!, viewDimensions.scale!));\n img.set({ selectable: false, evented: false, objectCaching: false });\n\n canvas.setWidth(viewDimensions.width);\n canvas.setHeight(viewDimensions.height);\n canvas.setBackgroundImage(img, () => {});\n\n return { mapWidth };\n }\n\n /**\n * Scales a value based on the current scale factor\n */\n private scaleValue(value: number, scale: number): number {\n return value * scale;\n }\n}\n","import { Point } from './venue-map.type';\n\n/**\n * Pure utility functions for venue map operations that don't require service dependencies.\n * These functions are used across different services for scaling operations.\n */\n\n/**\n * Scales a single value based on the provided scale factor.\n */\nexport function scaleValue(value: number, scale: number): number {\n return value * scale;\n}\n\n/**\n * Scales a point coordinate based on the provided scale factor.\n */\nexport function scalePoint(point: Point, scale: number): Point {\n return {\n x: point.x * scale,\n y: point.y * scale,\n };\n}\n\n/**\n * Scales an array of points based on the provided scale factor.\n */\nexport function scalePoints(points: Point[], scale: number): Point[] {\n return points.map(point => scalePoint(point, scale));\n}\n","import { Injectable } from '@angular/core';\nimport { fabric } from 'fabric';\nimport { ExtendedObject, MapConfiguration, VenueMapTheme } from './venue-map.type';\nimport { scaleValue } from './venue-map.utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class VenueMapMiniMapService {\n // ============================================================================\n // PROPERTIES\n // ============================================================================\n public miniMapCanvas!: fabric.StaticCanvas;\n private miniMapRect!: fabric.Rect;\n\n // ============================================================================\n // PUBLIC METHODS - MINIMAP INITIALIZATION\n // ============================================================================\n\n /**\n * Initializes the mini map canvas with the specified element\n */\n public initializeMiniMap(\n mapWidth: number,\n viewDimensions: { width: number; height: number; scale: number },\n mapConfig: MapConfiguration\n ): fabric.StaticCanvas {\n const miniMapScale = mapConfig.minimap.scale;\n const containerHeight = viewDimensions.height;\n\n this.miniMapCanvas = new fabric.StaticCanvas('miniMap', {\n width: scaleValue(mapWidth, viewDimensions.scale) * miniMapScale,\n height: containerHeight * miniMapScale,\n });\n\n return this.miniMapCanvas;\n }\n\n /**\n * Renders the mini map using data from the main canvas\n */\n public renderMiniMap(mainCanvas: fabric.Canvas): void {\n if (!this.miniMapCanvas || !mainCanvas) return;\n\n const mainCanvasImage = mainCanvas.toDataURL({\n format: 'png',\n quality: 1.0,\n });\n\n fabric.Image.fromURL(mainCanvasImage, (img) => {\n if (!img) return;\n\n img.scaleToWidth(this.miniMapCanvas.getWidth());\n img.scaleToHeight(this.miniMapCanvas.getHeight());\n this.miniMapCanvas.setBackgroundImage(img, () => {});\n }, { crossOrigin: 'anonymous' });\n\n this.miniMapCanvas.renderAll();\n }\n\n /**\n * Displays the viewport rectangle on the mini map\n */\n public showViewportRect(\n viewportTransform: number[] | undefined,\n canvasWidth: number,\n canvasHeight: number,\n currentZoom: number,\n viewDimensions: { width: number; height: number; scale: number },\n mapConfig: MapConfiguration,\n theme: VenueMapTheme\n ): void {\n if (this.miniMapRect) this.miniMapCanvas?.remove(this.miniMapRect);\n\n const minimapConfig = mapConfig.minimap;\n const scale = minimapConfig.scale;\n const position = this.findPositionViewport(\n viewportTransform,\n currentZoom,\n canvasWidth,\n canvasHeight,\n viewDimensions,\n scale\n );\n\n this.miniMapRect = new fabric.Rect({\n ...position,\n fill: theme.miniMapViewportColor,\n selectable: false,\n opacity: minimapConfig.opacity,\n });\n\n (this.miniMapRect as ExtendedObject).set('id', 'viewportZoom');\n\n this.miniMapCanvas?.add(this.miniMapRect);\n }\n\n /**\n * Finds the position and dimensions of the viewport rectangle on the mini map\n */\n private findPositionViewport(\n viewportTransform: number[] | undefined,\n currentZoom: number,\n canvasWidth: number,\n canvasHeight: number,\n viewDimensions: { width: number; height: number; scale: number },\n scale = 1\n ) {\n const canvasWidthScaled = (canvasWidth * scale) / currentZoom;\n const canvasHeightScaled = (canvasHeight * scale) / currentZoom;\n\n const width = (viewDimensions.width * scale) / currentZoom;\n const height = canvasHeightScaled;\n\n const left =\n (-(viewportTransform?.[4] ?? 0) * scale) / currentZoom +\n (canvasWidthScaled - width) / 2;\n const top = (-(viewportTransform?.[5] ?? 0) * scale) / currentZoom;\n\n return { top, left, width, height };\n }\n\n // ============================================================================\n // UTILITY METHODS\n // ============================================================================\n\n /**\n * Cleans up resources when service is no longer needed\n */\n public cleanup(): void {\n if (this.miniMapCanvas) {\n this.miniMapCanvas.clear();\n this.miniMapCanvas.dispose();\n this.miniMapCanvas = undefined!;\n }\n }\n}\n","import { Injectable, signal, computed, effect, inject } from '@angular/core';\nimport { throttle, debounce } from 'lodash-es';\nimport { BehaviorSubject } from 'rxjs';\nimport { fabric } from 'fabric';\n\nimport {\n ClientPositionSeat,\n ExtendedObject,\n ExtendedGroup,\n FabricCanvas,\n MapSetting,\n MapConfiguration,\n Bounds,\n Point,\n VenueMapTheme,\n} from './venue-map.type';\nimport { VenueMapRenderService } from './venue-map-render.service';\nimport { VenueMapMiniMapService } from './venue-map-mini-map.service';\nimport { scaleValue, scalePoint, scalePoints } from './venue-map.utils';\n\n// ============================================================================\n// INTERFACES & CONSTANTS\n// ============================================================================\n\ninterface ZoomInfo {\n max: number;\n min: number;\n}\n\ninterface TouchState {\n isTouching: boolean;\n isDragging: boolean;\n isPinching: boolean;\n isZooming: boolean;\n isMoving: boolean;\n pausePanning: boolean;\n}\n\ninterface Position {\n x: number;\n y: number;\n}\n\n// Constants\nconst LONG_TOUCH_DURATION = 200;\nconst ZOOM_THRESHOLD = 1.2;\nconst CLICK_THRESHOLD = 5;\nconst ZOOM_ANIMATION_DURATION = 500;\nconst DEBOUNCE_DELAY = 250;\nconst THROTTLE_DELAY = 100;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class VenueMapCanvasService {\n // ============================================================================\n // INJECTED SERVICES\n // ============================================================================\n\n private readonly renderService = inject(VenueMapRenderService);\n private readonly miniMapService = inject(VenueMapMiniMapService);\n\n // ============================================================================\n // SIGNAL-BASED STATE MANAGEMENT (Angular 20)\n // ============================================================================\n\n // Canvas state signals\n private readonly canvasReady$ = new BehaviorSubject<boolean>(false);\n\n // Public signal state\n readonly zoomLevel = signal(1);\n readonly isZooming = signal(false);\n readonly canvasReady = signal(false);\n\n // Computed signals for getters\n readonly disableZoomIn = computed(() =>\n this.zoomLevel() >= this.mapConfig?.zoom.max\n );\n\n readonly disableZoomOut = computed(() =>\n this.zoomLevel() <= this.mapConfig?.zoom.min\n );\n\n readonly showMiniMap = computed(() =>\n this.zoomLevel() >= this.mapConfig?.zoom.showMiniMapAtLevel\n);\n\n // ============================================================================\n // PRIVATE PROPERTIES\n // ============================================================================\n\n // Touch and interaction state\n private touchState: TouchState = {\n isTouching: false,\n isDragging: false,\n isPinching: false,\n isZooming: false,\n isMoving: false,\n pausePanning: false,\n };\n\n private touchTimeout?: ReturnType<typeof setTimeout>;\n private animationFrameId: number | null = null;\n private currentPosition: Position = { x: 0, y: 0 };\n private lastPosition: Position = { x: 0, y: 0 };\n private lastTouchEventTimestamp = 0;\n private zoomStartScale = 0;\n private lastScale = 0;\n private mapWidth = 0;\n\n // Event handlers\n private debouncedClickHandler!: ((object: ExtendedGroup) => void) & {\n cancel: () => void;\n };\n private debounceClick?: (object: ExtendedGroup, touch?: MouseEvent) => void;\n private workerRenderValue?: () => void;\n\n // ============================================================================\n // PUBLIC PROPERTIES\n // ============================================================================\n\n clientPopupPosition!: ClientPositionSeat;\n miniMapCanvas!: fabric.StaticCanvas;\n viewDimensions!: MapSetting;\n canvas!: FabricCanvas;\n mapConfig!: MapConfiguration;\n theme!: VenueMapTheme;\n\n constructor() {\n // Effect to sync zoom level with canvas zoom\n effect(() => {\n if (this.canvas) {\n const currentZoom = this.canvas.getZoom();\n if (currentZoom !== this.zoomLevel()) {\n this.zoomLevel.set(currentZoom);\n }\n }\n });\n\n // Effect to sync canvas ready state\n effect(() => {\n this.canvasReady$.next(this.canvasReady());\n });\n }\n\n // ============================================================================\n // PRIVATE HELPER METHODS\n // ============================================================================\n\n /**\n * Updates the zoom level signal and triggers reactive updates\n */\n private updateZoomLevel(zoom: number): void {\n this.zoomLevel.set(zoom);\n }\n\n // ============================================================================\n // PUBLIC METHODS - INITIALIZATION\n // ============================================================================\n getCanvasReadyObservable() {\n return this.canvasReady$.asObservable();\n }\n\n initialize(\n viewDimensions: MapSetting,\n config: MapConfiguration,\n theme: VenueMapTheme\n ): void {\n this.viewDimensions = viewDimensions;\n this.mapConfig = config;\n this.theme = theme;\n }\n\n public setupCanvas(canvasElement: HTMLCanvasElement): void {\n this.canvas = new fabric.Canvas(canvasElement, {\n selection: false,\n backgroundColor: this.theme.canvasBackgroundColor,\n renderOnAddRemove: false,\n stateful: false,\n }) as FabricCanvas;\n\n this.hiddenMap();\n this.setupEventListeners();\n }\n\n public hiddenMap(): void {\n if (!this.canvas) return;\n\n this.canvas.getElement().style.visibility = 'hidden';\n this.canvas.renderOnAddRemove = false;\n }\n\n // ============================================================================\n // PRIVATE METHODS - EVENT SETUP\n // ============================================================================\n\n private setupEventListeners(): void {\n this.canvas.on(\n 'mouse:wheel',\n throttle(e => this.handleZoom(e), THROTTLE_DELAY)\n );\n this.canvas.on(\n 'touch:gesture',\n throttle(e => this.handleGesture(e), THROTTLE_DELAY)\n );\n this.canvas.on(\n 'selection:created',\n () => (this.touchState.pausePanning = true)\n );\n this.canvas.on(\n 'selection:cleared',\n () => (this.touchState.pausePanning = false)\n );\n this.canvas.on('touch:drag', e => this.handleDrag(e));\n this.canvas.on('mouse:down', options => this.handleMouseDown(options));\n this.canvas.on(\n 'mouse:move',\n throttle(options => this.handleMouseMove(options), 50)\n );\n this.canvas.on('mouse:up', options => this.handleMouseUp(options));\n\n const wrapperEl = this.canvas.wrapperEl;\n if (wrapperEl) {\n wrapperEl.addEventListener(\n 'touchstart',\n this.handleTouchStart.bind(this),\n {\n passive: false,\n }\n );\n wrapperEl.addEventListener('touchmove', this.handleTouchMove.bind(this), {\n passive: false,\n });\n wrapperEl.addEventListener('touchend', this.handleTouchEnd.bind(this), {\n passive: false,\n });\n }\n }\n\n // ============================================================================\n // PRIVATE METHODS - TOUCH EVENT HANDLERS\n // ============================================================================\n\n private handleTouchStart(e: TouchEvent): void {\n e.preventDefault();\n this.cancelDebounceClick?.();\n\n this.touchState.isTouching = true;\n if (e.touches.length >= 2) {\n this.touchState.pausePanning = true;\n this.touchState.isZooming = true;\n this.touchState.isPinching = true;\n this.isZooming.set(true);\n this.touchState.isDragging = false;\n this.zoomStartScale = this.getDistance(e.touches[0], e.touches[1]);\n\n return;\n }\n\n this.lastPosition = {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY,\n };\n this.touchTimeout = setTimeout(() => {\n if (this.touchState.isTouching && !this.touchState.isPinching) {\n this.touchState.isDragging = true;\n this.cancelDebounceClick?.();\n }\n }, LONG_TOUCH_DURATION);\n }\n\n private handleTouchMove(e: TouchEvent): void {\n e.preventDefault();\n\n if (e.touches.length >= 2) {\n this.handlePinchZoom(e);\n\n return;\n }\n\n this.handleSingleTouchMove(e);\n }\n\n private handlePinchZoom(e: TouchEvent): void {\n const zoomFactor = 0.5;\n const smoothingFactor = 0.5;\n\n this.cancelDebounceClick?.();\n\n if (!this.touchState.isPinching) {\n this.touchState.isPinching = true;\n this.zoomStartScale = this.getDistance(e.touches[0], e.touches[1]);\n return;\n }\n\n this.touchState.isDragging = false;\n const now = Date.now();\n if (now - this.lastTouchEventTimestamp < 50) return;\n\n this.lastTouchEventTimestamp = now;\n const distance = this.getDistance(e.touches[0], e.touches[1]);\n let scale = distance / (this.zoomStartScale || distance);\n scale = 1 + (scale - 1) * zoomFactor;\n const zoomConfig = this.mapConfig.zoom;\n scale = Math.max(zoomConfig.min, Math.min(zoomConfig.max, scale));\n\n if (this.lastScale) {\n scale = this.lastScale + (scale - this.lastScale) * smoothingFactor;\n }\n this.lastScale = scale;\n\n const centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\n const centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2;\n\n const rect = this.canvas.wrapperEl.getBoundingClientRect();\n const point = new fabric.Point(centerX - rect.left, centerY - rect.top);\n\n let zoom = this.canvas.getZoom() * scale;\n zoom = Math.max(zoomConfig.min, Math.min(zoomConfig.max, zoom));\n this.canvas.zoomToPoint(point, zoom);\n this.updateZoomLevel(zoom);\n this.showDisplayViewportMap();\n\n if (zoom > zoomConfig.min && zoom < zoomConfig.max) {\n this.zoomStartScale = distance;\n }\n }\n\n private handleSingleTouchMove(e: TouchEvent): void {\n if (!this.touchState.pausePanning && !this.touchState.isPinching) {\n this.cancelDebounceClick?.();\n if (this.touchTimeout) clearTimeout(this.touchTimeout);\n const touch = e.touches[0];\n const xChange = touch.clientX - this.lastPosition.x;\n const yChange = touch.clientY - this.lastPosition.y;\n\n if (Math.abs(xChange) > 5 || Math.abs(yChange) > 5) {\n this.touchState.isDragging = true;\n const delta = new fabric.Point(xChange, yChange);\n this.canvas.relativePan(delta);\n this.lastPosition = { x: touch.clientX, y: touch.clientY };\n this.showDisplayViewportMap();\n }\n }\n }\n\n private handleTouchEnd(e: TouchEvent): void {\n e.preventDefault();\n this.cancelDebounceClick?.();\n\n if (this.touchTimeout) clearTimeout(this.touchTimeout);\n this.touchState.isTouching = false;\n\n if (this.touchState.isPinching && e.touches.length < 2) {\n const touch = e.touches[0];\n this.lastPosition = { x: touch.clientX, y: touch.clientY };\n }\n\n if (\n !this.touchState.isDragging &&\n !this.touchState.isPinching &&\n !this.touchState.isZooming &&\n e.changedTouches.length === 1\n ) {\n const touch = e.changedTouches[0];\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n if (target instanceof HTMLElement) {\n const fabricObject = this.canvas.findTarget(e, false) as ExtendedGroup;\n this.debounceClick?.(fabricObject, touch as unknown as MouseEvent);\n }\n }\n this.resetActionEvent();\n }\n\n private resetActionEvent(): void {\n this.zoomStartScale = 0;\n this.touchState.isMoving = false;\n this.touchState.isDragging = false;\n if (\n this.touchState.isPinching ||\n this.isZooming() ||\n this.touchState.pausePanning ||\n this.touchState.isDragging\n ) {\n setTimeout(() => {\n this.touchState.pausePanning = false;\n this.isZooming.set(false);\n this.touchState.isPinching = false;\n }, 150);\n }\n }\n\n // ============================================================================\n // PRIVATE METHODS - MOUSE EVENT HANDLERS\n // ============================================================================\n\n private handleMouseDown(options: fabric.IEvent): void {\n this.cancelDebounceClick?.();\n\n this.touchState.isTouching = true;\n const mouseEvent = options.e as MouseEvent;\n this.lastPosition = { x: mouseEvent.clientX, y: mouseEvent.clientY };\n\n this.touchTimeout = setTimeout(() => {\n if (this.touchState.isTouching) {\n this.touchState.isMoving = true;\n this.cancelDebounceClick?.();\n }\n }, LONG_TOUCH_DURATION);\n }\n\n private handleMouseUp(options: fabric.IEvent): void {\n const mouseEvent = options.e as MouseEvent;\n this.touchState.isTouching = false;\n\n if (\n Math.abs(mouseEvent.movementX) <= CLICK_THRESHOLD &&\n Math.abs(mouseEvent.movementY) <= CLICK_THRESHOLD &&\n !this.touchState.isMoving &&\n !this.touchState.isPinching &&\n !this.touchState.isDragging\n ) {\n const selectedObject = options.target as ExtendedGroup;\n this.cancelDebounceClick?.();\n this.debounceClick?.(selectedObject, options.e as MouseEvent);\n }\n\n this.resetActionEvent();\n }\n\n private handleMouseMove(options: fabric.IEvent): void {\n if (\n !this.touchState.isMoving ||\n this.touchState.isPinching ||\n this.isZooming()\n )\n return;\n\n const client = this.getClientPosition(options);\n const xChange = client.x - this.lastPosition.x;\n const yChange = client.y - this.lastPosition.y;\n\n if (Math.abs(xChange) > 5 || Math.abs(yChange) > 5) {\n const delta = new fabric.Point(xChange, yChange);\n this.canvas.relativePan(delta);\n this.lastPosition = client;\n this.showDisplayViewportMap();\n }\n }\n\n private handleZoom(event: fabric.IEvent): void {\n this.cancelDebounceClick?.();\n if (this.isZooming()) return;\n\n const e = event.e as WheelEvent;\n let zoom = this.canvas.getZoom();\n zoom *= 0.999 ** e.deltaY;\n const zoomConfig = this.mapConfig.zoom;\n zoom = Math.max(zoomConfig.min, Math.min(zoomConfig.max, zoom));\n\n this.canvas.zoomToPoint(new fabric.Point(e.offsetX, e.offsetY), zoom);\n this.updateZoomLevel(zoom);\n\n this.showDisplayViewportMap();\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n private handleGesture(event: fabric.IEvent): void {\n const e = event.e as TouchEvent;\n const zoomFactor = 0.5;\n\n if (!e.touches || e.touches.length !== 2) return;\n\n this.touchState.pausePanning = true;\n const touch1 = e.touches[0];\n const touch2 = e.touches[1];\n const distance = Math.sqrt(\n Math.pow(touch2.clientX - touch1.clientX, 2) +\n Math.pow(touch2.clientY - touch1.clientY, 2)\n );\n\n if (!this.zoomStartScale) {\n this.zoomStartScale = distance;\n } else {\n const centerX = (touch1.clientX + touch2.clientX) / 2;\n const centerY = (touch1.clientY + touch2.clientY) / 2;\n const point = new fabric.Point(centerX, centerY);\n let scale = distance / this.zoomStartScale;\n scale = 1 + (scale - 1) * zoomFactor;\n this.zoomStartScale = distance;\n let zoom = this.canvas.getZoom() * scale;\n const zoomConfig = this.mapConfig.zoom;\n zoom = Math.max(zoomConfig.min, Math.min(zoomConfig.max, zoom));\n this.canvas.zoomToPoint(point, zoom);\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n private handleDrag(event: fabric.IEvent): void {\n const e = event.e as TouchEvent;\n\n if (\n this.touchState.pausePanning ||\n !e.touches ||\n e.touches.length === 0 ||\n this.isZooming()\n )\n return;\n\n e.preventDefault();\n const touch = e.touches[0];\n this.currentPosition = { x: touch.clientX, y: touch.clientY };\n const xChange = this.currentPosition.x - this.lastPosition.x;\n const yChange = this.currentPosition.y - this.lastPosition.y;\n\n if (Math.abs(xChange) <= 50 && Math.abs(yChange) <= 50) {\n const delta = new fabric.Point(xChange, yChange);\n this.canvas.relativePan(delta);\n }\n\n this.lastPosition = this.currentPosition;\n }\n\n // ============================================================================\n // PUBLIC METHODS - IMAGE MANAGEMENT\n // ============================================================================\n\n public loadBackgroundImage(\n pathImg?: string | string[],\n callback?: () => void\n ): void {\n if (!this.canvas) return;\n\n this.renderService.loadBackgroundImage(\n this.canvas,\n this.mapConfig,\n this.viewDimensions,\n pathImg,\n (mapWidth: number) => {\n this.mapWidth = mapWidth;\n this.renderFrame();\n this.canvasReady.set(true);\n callback?.();\n }\n );\n }\n\n // ============================================================================\n // PUBLIC METHODS - RENDERING\n // ============================================================================\n\n public renderFrame(): void {\n this.workerRenderValue?.() ?? this.canvas?.renderAll();\n this.animationFrameId = requestAnimationFrame(() => this.renderFrame());\n }\n\n private stopRenderFrame(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n\n showMap(): void {\n this.canvas.getElement().style.visibility = 'visible';\n this.canvas.renderOnAddRemove = true;\n }\n\n // ============================================================================\n // PUBLIC METHODS - MINIMAP\n // ============================================================================\n\n public initializeMiniMap(): void {\n if (!this.canvas) return;\n\n this.miniMapCanvas = this.miniMapService.initializeMiniMap(\n this.mapWidth,\n {\n width: this.viewDimensions.width,\n height: this.viewDimensions.height,\n scale: this.viewDimensions.scale || 1\n },\n this.mapConfig\n );\n\n this.miniMapService.renderMiniMap(this.canvas);\n this.showDisplayViewportMap();\n }\n\n public showDisplayViewportMap(): void {\n if (!this.canvas || !this.miniMapCanvas) return;\n\n this.miniMapService.showViewportRect(\n this.canvas.viewportTransform,\n this.canvas.getWidth(),\n this.canvas.getHeight(),\n this.canvas.getZoom(),\n {\n width: this.viewDimensions.width,\n height: this.viewDimensions.height,\n scale: this.viewDimensions.scale || 1\n },\n this.mapConfig,\n this.theme\n );\n }\n\n // ============================================================================\n // PUBLIC METHODS - ZOOM & NAVIGATION\n // ============================================================================\n\n public zoomAnimated(\n point: fabric.Point,\n zoomLevel: number,\n duration = ZOOM_ANIMATION_DURATION,\n callback?: () => void\n ): void {\n if (this.isZooming() || !this.canvas) return;\n\n this.isZooming.set(true);\n const canvas = this.canvas;\n const startZoom = canvas.getZoom();\n const endZoom = zoomLevel;\n const startPoint = canvas.getVpCenter();\n const endPoint = new fabric.Point(point.x, point.y);\n\n const vpw = canvas.getWidth();\n const vph = canvas.getHeight();\n\n const throttledUpdate = throttle((value: number) => {\n const zoom = startZoom + (endZoom - startZoom) * value;\n canvas.setZoom(zoom);\n this.updateZoomLevel(zoom);\n\n const newX = startPoint.x + (endPoint.x - startPoint.x) * value;\n const newY = startPoint.y + (endPoint.y - startPoint.y) * value;\n\n const currentZoom = zoom;\n const viewportWidth = vpw / currentZoom;\n const viewportHeight = vph / currentZoom;\n\n const x = newX - viewportWidth / 2;\n const y = newY - viewportHeight / 2;\n\n canvas.setViewportTransform([zoom, 0, 0, zoom, -x * zoom, -y * zoom]);\n this.showDisplayViewportMap();\n }, 16);\n\n fabric.util.animate({\n startValue: 0,\n endValue: 1,\n duration: duration,\n onChange: value => {\n throttledUpdate(value);\n },\n onComplete: () => {\n this.isZooming.set(false);\n callback?.();\n },\n });\n }\n\n adjustViewToCenter(callback?: () => void, widthPercentage = 0.9): void {\n const { width, height } = this.viewDimensions;\n const centerPoint = this.centerPointCanvas();\n\n const zoomLevel =\n width < height\n ? width / this.mapWidth\n : height / this.scaleValue(this.mapConfig.height ?? 0);\n\n this.zoomAnimated(centerPoint, zoomLevel * widthPercentage);\n\n setTimeout(() => {\n callback?.();\n }, 550);\n }\n\n public resetZoomCanvas(): void {\n this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\n this.canvas.setZoom(1);\n this.updateZoomLevel(1);\n this.showDisplayViewportMap();\n }\n\n public handleZoomBtn(type: 'zoomIn' | 'zoomOut'): void {\n if (!this.canvas) return;\n\n const currentZoom = this.canvas.getZoom();\n const viewportTransform = this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0];\n\n // Calculate the center of the current viewport\n const canvasWidth = this.canvas.getWidth();\n const canvasHeight = this.canvas.getHeight();\n\n const viewportCenterX = -viewportTransform[4] / currentZoom + canvasWidth / (2 * currentZoom);\n const viewportCenterY = -viewportTransform[5] / currentZoom + canvasHeight / (2 * currentZoom);\n\n const centerPoint = new fabric.Point(viewportCenterX, viewportCenterY);\n\n const zoomStepValue = this.mapConfig.zoom.step;\n const zoomStep = zoomStepValue * currentZoom;\n const targetZoom =\n type === 'zoomIn' ? currentZoom + zoomStep : currentZoom - zoomStep;\n\n this.zoomAnimated(centerPoint, targetZoom);\n }\n\n public zoomAndPanToObject(\n object: ExtendedObject,\n zoom = ZOOM_THRESHOLD,\n callback?: () => void\n ): void {\n const targetObject: ExtendedObject = object;\n const objectCenter = targetObject.getCenterPoint();\n this.zoomAnimated(objectCenter, zoom, ZOOM_ANIMATION_DURATION, callback);\n }\n\n public zoomToObjectBufferHeight(\n object: ExtendedObject,\n zoom = ZOOM_THRESHOLD,\n heightPrice = 0,\n callback?: () => void\n ): void {\n const targetObject: ExtendedObject = object;\n const objectCenter = targetObject.getCenterPoint();\n const heightBuffer = this.viewDimensions.height * 0.3;\n objectCenter.setY(objectCenter.y + (heightBuffer + heightPrice) / 2);\n this.zoomAnimated(objectCenter, zoom, ZOOM_ANIMATION_DURATION, callback);\n }\n\n // ============================================================================\n // PUBLIC METHODS - CANVAS MANAGEMENT\n // ============================================================================\n\n public resetHeightCanvas(): void {\n this.canvas.setHeight(this.viewDimensions.height);\n }\n\n public setHeightCanvas(heightBuffer = 0): void {\n this.canvas.setHeight(this.viewDimensions.height + heightBuffer);\n }\n\n public centerPointCanvas(): fabric.Point {\n const { width, height } = this.mapConfig;\n\n return new fabric.Point(\n this.scaleValue(width / 2),\n this.scaleValue(height / 2)\n );\n }\n\n public removeGroupCanvas(): void {\n const objects = this.canvas.getObjects();\n const miniMapObjects = this.miniMapCanvas?.getObjects() ?? [];\n for (let i = objects.length - 1; i >= 0; i--) {\n this.canvas.remove(objects[i]);\n }\n for (let i = miniMapObjects.length - 1; i >= 0; i--) {\n this.miniMapCanvas.remove(miniMapObjects[i]);\n }\n }\n\n public createObjectFromPoint(point: Point): ExtendedGroup {\n const selectedObject = new fabric.Object({\n left: point.x,\n top: point.y,\n width: 1,\n height: 1,\n }) as ExtendedGroup;\n\n return selectedObject;\n }\n\n public findObjectByGrade(\n id?: string,\n shapeIndex?: number\n ): ExtendedGroup | undefined {\n if (!id || typeof shapeIndex !== 'number') return;\n\n const selectedObject = this.canvas\n .getObjects()\n .find(\n (obj: ExtendedObject) => obj.id === id && obj.shapeIndex === shapeIndex\n );\n return selectedObject as ExtendedGroup;\n }\n\n removeObjectCaching(): void {\n this.canvas?.getObjects().forEach(obj => {\n obj.set('objectCaching', false);\n });\n }\n\n // ============================================================================\n // PUBLIC METHODS - EVENT HANDLERS\n // ============================================================================\n\n setDebounceClickHandler(\n handler: (object: ExtendedGroup, touch?: MouseEvent) => void\n ): void {\n this.debouncedClickHandler = debounce(handler, DEBOUNCE_DELAY);\n this.debounceClick = this.debouncedClickHandler;\n }\n\n setWorkerRenderValue(handler: () => void): void {\n this.workerRenderValue = handler;\n }\n\n private cancelDebounceClick(): void {\n this.debouncedClickHandler?.cancel();\n }\n\n // ============================================================================\n // PUBLIC METHODS - UTILITY\n // ============================================================================\n\n public scaleValue(value: number): number {\n return scaleValue(value, this.viewDimensions.scale!);\n }\n\n public scalePoint(point: { x: number; y: number }): { x: number; y: number } {\n return scalePoint(point, this.viewDimensions.scale!);\n }\n\n public handleScalePoint(\n points: { x: number; y: number }[]\n ): { x: number; y: number }[] {\n return scalePoints(points, this.viewDimensions.scale!);\n }\n\n public scalePointGrade(\n point: { x: number; y: number },\n mapConfigGrade: MapConfiguration\n ): { x: number; y: number } {\n const scaleMap = this.mapConfig.width / mapConfigGrade.width;\n return {\n x: point.x * scaleMap * this.viewDimensions.scale!,\n y: point.y * scaleMap * this.viewDimensions.scale!,\n };\n }\n\n public calculateFramesDimensions(points?: Point[]) {\n if (!points || points.length < 3) {\n return {\n width: 1,\n height: 1,\n left: 1,\n top: 1,\n right: 1,\n bottom: 1,\n centerX: 1,\n centerY: 1,\n };\n }\n\n const minX = Math.min(...points.map(point => point.x));\n const maxX = Math.max(...points.map(point => point.x));\n const minY = Math.min(...points.map(point => point.y));\n const maxY = Math.max(...points.map(point => point.y));\n\n const width = maxX - minX;\n const height = maxY - minY;\n const centerX = minX + width / 2;\n const centerY = minY + height / 2;\n\n return {\n width,\n height,\n left: minX,\n top: minY,\n right: maxX,\n bottom: maxY,\n centerX,\n centerY,\n };\n }\n\n public getVisibleBounds(buffer = 0): Bounds {\n if (!this.canvas) {\n return { left: 0, top: 0, right: 0, bottom: 0, zoom: 1 };\n }\n\n const zoom = this.canvas.getZoom();\n const vpt = this.canvas.viewportTransform;\n\n return {\n left: -(vpt?.[4] ?? 0) / zoom - buffer,\n top: -(vpt?.[5] ?? 0) / zoom - buffer,\n right: (this.canvas.width ?? 0) / zoom - (vpt?.[4] ?? 0) / zoom + buffer,\n bottom:\n (this.canvas.height ?? 0) / zoom - (vpt?.[5] ?? 0) / zoom + buffer,\n zoom,\n };\n }\n\n public isInBounds(\n seatPoint: { left: number; top: number },\n bounds: Bounds\n ): boolean {\n return (\n seatPoint.left >= bounds.left &&\n seatPoint.left <= bounds.right &&\n seatPoint.top >= bounds.top &&\n seatPoint.top <= bounds.bottom\n );\n }\n\n private getClientPosition(options: fabric.IEvent): Position {\n let clientX, clientY;\n\n if (options.e.type.startsWith('touch')) {\n const touch =\n (options.e as TouchEvent).touches[0] ||\n (options.e as TouchEvent).changedTouches[0];\n clientX = touch.clientX;\n clientY = touch.clientY;\n } else {\n const mouseEvent = options.e as MouseEvent;\n clientX = mouseEvent.clientX;\n clientY = mouseEvent.clientY;\n }\n\n return { x: clientX, y: clientY };\n }\n\n private getDistance(touch1: Touch, touch2: Touch): number {\n return Math.sqrt(\n Math.pow(touch2.clientX - touch1.clientX, 2) +\n Math.pow(touch2.clientY - touch1.clientY, 2)\n );\n }\n\n // ============================================================================\n // CLEANUP METHODS\n // ============================================================================\n\n private removeEventListeners(): void {\n if (!this.canvas) return;\n\n this.canvas.off('mouse:wheel');\n this.canvas.off('touch:gesture');\n this.canvas.off('selection:created');\n this.canvas.off('selection:cleared');\n this.canvas.off('touch:drag');\n this.canvas.off('mouse:down');\n this.canvas.off('mouse:move');\n this.canvas.off('mouse:up');\n\n if (this.canvas.wrapperEl) {\n this.canvas.wrapperEl.removeEventListener(\n 'touchstart',\n this.handleTouchStart as EventListener\n );\n this.canvas.wrapperEl.removeEventListener(\n 'touchmove',\n this.handleTouchMove as EventListener\n );\n this.canvas.wrapperEl.removeEventListener(\n 'touchend',\n this.handleTouchEnd as EventListener\n );\n }\n }\n\n public removeCanvasMap(): void {\n if (this.canvas) {\n this.canvas.clear();\n this.canvas.dispose();\n this.canvas = undefined!;\n }\n\n if (this.miniMapCanvas) {\n this.miniMapCanvas.clear();\n this.miniMapCanvas.dispose();\n this.miniMapCanvas = undefined!;\n }\n this.stopRenderFrame();\n }\n\n clearMapService(): void {\n this.removeEventListeners();\n this.removeCanvasMap();\n this.stopRenderFrame();\n this.miniMapService.cleanup();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { fabric } from 'fabric';\n\nimport {\n ExtendedGroup,\n Grade,\n GradeSetting,\n MapConfiguration,\n VenueMapTheme,\n VenueMapType,\n} from './venue-map.type';\nimport { scaleValue } from './venue-map.utils';\n\n/**\n * Service responsible for creating and managing price displays on venue maps.\n * Handles the creation of sticky price elements and price-related rendering logic.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class VenueMapPriceService {\n /**\n * Finds the circle element within a grade shape.\n */\n private findCircleInGradeShape(gradeShape: ExtendedGroup): fabric.Object | undefined {\n return gradeShape\n .getObjects()\n .find(\n obj =>\n obj.type === 'group' && (obj as ExtendedGroup).subType === 'circle'\n );\n }\n\n /**\n * Calculates the height offset for circle elements.\n */\n private calculateCircleHeight(\n subId: string,\n gradeShape: ExtendedGroup,\n mapType: VenueMapType,\n circle?: fabric.Object\n ): number {\n return subId === gradeShape?.subId && mapType !== VenueMapType.GRADE\n ? (circle?.getScaledHeight() ?? 0) / 2\n : 0;\n }\n\n /**\n * Finds the text bubble group within a shape.\n */\n private findTextBubbleGroup(shape: ExtendedGroup): fabric.Object | undefined {\n return shape.getObjects().find(obj => obj.type === 'group');\n }\n\n /**\n * Calculates the position for sticky price elements.\n */\n private calculateStickyPosition(\n circle?: fabric.Object,\n circleHeight = 0,\n textBubbleGroup?: fabric.Object\n ): { left?: number; top: number } {\n return {\n left: circle?.left,\n top:\n (circle?.top ?? 0) -\n circleHeight -\n (textBubbleGroup?.getScaledHeight() ?? 0),\n };\n }\n\n /**\n * Updates the content of text bubble elements.\n */\n private updateTextBubbleContent(grade: { price: number }, shape: ExtendedGroup): void {\n shape.getObjects().forEach(obj => {\n const objGroup = obj as ExtendedGroup;\n if (objGroup.subType === 'textBubbleGroup') {\n this.updateTextContent(objGroup, grade);\n }\n });\n }\n\n /**\n * Updates the text content within a text bubble group.\n */\n private updateTextContent(\n textBubbleGroup: ExtendedGroup,\n grade: { price: number }\n ): void {\n textBubbleGroup.getObjects().forEach(textBubble => {\n if (textBubble.type === 'text') {\n (textBubble as fabric.Text).set(\n 'text',\n Number(grade.price).toLocaleString()\n );\n }\n });\n }\n /**\n * Creates a sticky price element for grade display.\n */\n public createStickyPrice(\n grade: Grade,\n gradeSetting: GradeSetting,\n mapInfo: MapConfiguration,\n scale: number,\n canvas: fabric.Canvas,\n theme: VenueMapTheme\n ): ExtendedGroup {\n const { fontSize, bubble, corner, arrow } = mapInfo;\n const { circle } = gradeSetting;\n\n const leftCircle = scaleValue(circle.x, scale);\n const topCircle = scaleValue(circle.y, scale);\n const price = Number(grade.price);\n\n const priceText = new fabric.Text(price.toLocaleString(), {\n fontSize: scaleValue(fontSize, scale),\n fontFamily: 'Arial',\n fontWeight: 'bold',\n fill: theme.priceTextColor,\n textAlign: 'center',\n originX: 'center',\n originY: 'center',\n });\n\n priceText.set('type', 'text');\n canvas.add(priceText);\n priceText.setCoords();\n\n const bubbleRect = new fabric.Rect({\n width:\n priceText.getScaledWidth() +\n scaleValue(bubble.width, scale),\n height:\n priceText.getScaledHeight() +\n scaleValue(bubble.height, scale),\n fill: grade.disabled ? undefined : theme.priceBackgroundColor,\n stroke: theme.priceBubbleStrokeColor,\n rx: scaleValue(corner.width, scale),\n ry: scaleValue(corner.width, scale),\n originX: 'center',\n originY: 'center',\n });\n\n canvas.remove(priceText);\n\n const arrowRect = new fabric.Triangle({\n width: scaleValue(arrow.width, scale),\n height: scaleValue(arrow.height, scale),\n fill: grade.disabled ? undefined : theme.priceBackgroundColor,\n stroke: theme.priceBubbleStrokeColor,\n originX: 'center',\n originY: 'top',\n left: bubbleRect.left,\n top:\n (bubbleRect.top ?? 0) +\n (bubbleRect.height ?? 0) / 2 +\n scaleValue(arrow.padding, scale),\n angle: 180,\n });\n\n const textBubbleGroup: ExtendedGroup = new fabric.Group(\n [bubbleRect, priceText],\n {\n originX: 'center',\n originY: 'center',\n }\n );\n\n textBubbleGroup.set('subType', 'textBubbleGroup');\n\n const positionStick = {\n left: leftCircle,\n top: topCircle - textBubbleGroup.getScaledHeight(),\n };\n\n const stickyPrice: ExtendedGroup = new fabric.Group(\n [textBubbleGroup, arrowRect],\n {\n ...positionStick,\n originX: 'center',\n originY: 'top',\n opacity: 0,\n }\n );\n\n const shadowOptions = {\n color: theme.shadowColor,\n blur: 2,\n offsetX: 0.5,\n offsetY: 0.5,\n };\n stickyPrice.set('shadow', new fabric.Shadow(shadowOptions));\n stickyPrice.set('subType', 'stickyPrice');\n\n return stickyPrice;\n }\n\n /**\n * Updates the position of sticky price elements.\n */\n public updateStickyPricePosition(\n grade: Grade,\n shape: ExtendedGroup,\n gradeShape: ExtendedGroup,\n subId: string,\n mapType: VenueMapType\n ): void {\n const circle = this.findCircleInGradeShape(gradeShape);\n const circleHeight = this.calculateCircleHeight(\n subId,\n gradeShape,\n mapType,\n circle\n );\n const textBubbleGroup = this.findTextBubbleGroup(shape);\n\n const position = this.calculateStickyPosition(\n circle,\n circleHeight,\n textBubbleGroup\n );\n\n this.updateTextBubbleContent(grade, shape);\n shape.set('top', position.top);\n }\n\n /**\n * Renders sticky price elements with proper visibility control.\n */\n public renderStickyPrice(\n grade: Grade,\n shape: ExtendedGroup,\n isVisible: boolean,\n gradeShape: ExtendedGroup,\n subId: string,\n mapType: VenueMapType\n ): void {\n if (shape.subType === 'stickyPrice') {\n // Only render (make visible) when show price mode is on\n shape.set('opacity', isVisible && mapType === VenueMapType.GRADE_PRICE ? 1 : 0);\n\n if (isVisible && mapType === VenueMapType.GRADE_PRICE) {\n this.updateStickyPricePosition(grade, shape, gradeShape, subId, mapType);\n }\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { v4 as uuidV4 } from 'uuid';\nimport { fabric } from 'fabric';\n\nimport {\n ExtendedGroup,\n ExtendedObject,\n MapConfiguration,\n VenueMapType,\n Grade,\n GradeSetting,\n VenueMapTheme,\n Point,\n} from './venue-map.type';\nimport { VenueMapCanvasService } from './venue-map-canvas.service';\nimport { VenueMapPriceService } from './venue-map-price.service';\nimport { scalePoints } from './venue-map.utils';\nimport {\n MULTIPLIER_GRADE_ICON,\n} from './venue-map.constant';\n\n/**\n * Service responsible for creating and managing venue grade visualizations.\n * Handles the creation of polygons, circles, and price sticky elements for grades.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class VenueMapGradeService {\n private readonly gradeIconMultiplier = MULTIPLIER_GRADE_ICON;\n private readonly canvasService = inject(VenueMapCanvasService);\n private readonly priceService = inject(VenueMapPriceService);\n\n /**\n * Creates a complete grade group containing polygon, circle, and sticky price elements.\n */\n public createGrade(\n polygon: fabric.Polygon,\n circle: ExtendedGroup,\n stickyPrice: ExtendedGroup,\n gradeInfo: Record<string, string | boolean>\n ): ExtendedGroup {\n const gradeGroup: ExtendedGroup = new fabric.Group(\n [polygon, circle, stickyPrice],\n {\n originX: 'center',\n originY: 'center',\n hoverCursor: 'pointer',\n selectable: false,\n hasBorders: false,\n perPixelTargetFind: true,\n evented: !gradeInfo['disabled'],\n }\n );\n\n gradeGroup.set({\n id: gradeInfo['id'].toString(),\n subId: uuidV4(),\n shapeIndex: Number(gradeInfo['shapeIndex']),\n });\n\n return gradeGroup;\n }\n\n /**\n * Creates and configures sticky elements for grade display based on map type.\n */\n public createGradeSticky(\n grade: Grade,\n gradeShape: ExtendedGroup,\n subId: string,\n mapType: VenueMapType\n ): void {\n if (!grade) return;\n\n gradeShape.getObjects().forEach(child => {\n if (child.type !== 'group') return;\n\n const targetChild = child as ExtendedGroup;\n this.renderStickyType(grade, targetChild, gradeShape, subId, mapType);\n\n if (subId === gradeShape.subId && mapType !== VenueMapType.GRADE) {\n this.renderShape(\n grade,\n targetChild,\n 'circle',\n true,\n gradeShape,\n subId,\n mapType\n );\n this.renderShape(\n grade,\n targetChild,\n 'stickyPrice',\n true,\n gradeShape,\n subId,\n mapType\n );\n }\n });\n }\n\n /**\n * Renders sticky elements based on map type.\n */\n private renderStickyType(\n grade: Grade,\n shape: ExtendedGroup,\n gradeShape: ExtendedGroup,\n subId: string,\n mapType: VenueMapType\n ): void {\n if (mapType === VenueMapType.GRADE) {\n this.renderShape(\n grade,\n shape,\n 'circle',\n true,\n gradeShape,\n subId,\n mapType\n );\n this.renderShape(\n grade,\n shape,\n 'stickyPrice',\n false,\n gradeShape,\n subId,\n mapType\n );\n return;\n }\n\n this.renderShape(grade, shape, 'circle', false, gradeShape, subId, mapType);\n this.renderShape(\n grade,\n shape,\n 'stickyPrice',\n true,\n gradeShape,\n subId,\n mapType\n );\n }\n\n /**\n * Renders individual shape elements with visibility control.\n */\n private renderShape(\n grade: Grade,\n shape: ExtendedGroup,\n type: string,\n isVisible: boolean,\n gradeShape: ExtendedGroup | ExtendedObject,\n subId: string,\n mapType: VenueMapType\n ): void {\n if (type === shape.subType) {\n if (shape.subType === 'stickyPrice') {\n // Delegate price rendering to price service\n this.priceService.renderStickyPrice(\n grade,\n shape,\n isVisible,\n gradeShape as ExtendedGroup,\n subId,\n mapType\n );\n } else {\n // Handle other shape types (like circles)\n shape.set('opacity', isVisible ? 1 : 0);\n }\n }\n }\n\n /**\n * Creates a sticky price element for grade display.\n */\n public createStickyPrice(\n grade: Grade,\n gradeSetting: GradeSetting,\n mapInfo: MapConfiguration,\n theme: VenueMapTheme\n ): ExtendedGroup {\n return this.priceService.createStickyPrice(\n grade,\n gradeSetting,\n mapInfo,\n this.canvasService.viewDimensions.scale!,\n this.canvasService.canvas,\n theme\n );\n }\n\n /**\n * Creates a polygon shape for the grade area.\n */\n public createPolygon(\n gradeSetting: GradeSetting,\n disabled = false\n ): fabric.Polygon {\n const { points, color } = gradeSetting;\n const scaledPoints = scalePoints(points ?? [], this.canvasService.viewDimensions.scale!);\n\n this.renderGrade(points, color, disabled);\n\n return new fabric.Polygon(scaledPoints, {\n fill: color,\n stroke: undefined,\n strokeWidth: 0,\n opacity: 0.01,\n selectable: false,\n evented: !disabled,\n hoverCursor: 'pointer',\n originX: 'center',\n originY: 'center',\n });\n }\n\n /**\n * Renders a polygon with image color instead of rendering the actual image.\n */\n private renderGrade(\n points: Point[],\n color: string,\n disabled = false\n ): void {\n if (!points?.length) return;\n\n const imagePoints = scalePoints(points, this.canvasService.viewDimensions.scale!);\n\n const polygon = new fabric.Polygon(imagePoints, {\n fill: color,\n stroke: undefined,\n strokeWidth: 0,\n opacity: disabled ? 0.5 : 1,\n selectable: false,\n evented: false,\n originX: 'center',\n originY: 'center',\n globalCompositeOperation: disabled ? 'soft-light' : 'hard-light',\n });\n\n this.canvasService.canvas.add(polygon);\n this.canvasService.canvas.sendToBack(polygon);\n }\n\n /**\n * Creates a circle element for grade display.\n */\n public createCircle(\n grade: Grade,\n gradeSetting: GradeSetting,\n mapInfo: MapConfiguration,\n theme: VenueMapTheme\n ): ExtendedGroup {\n const resolvedTheme = theme;\n const { color, circle } = gradeSetting;\n const { circle: mapCircle, fontSize } = mapInfo;\n\n const circleShape = new fabric.Rect({\n fill: grade.disabled ? undefined : color,\n stroke: resolvedTheme.gradeStrokeColor,\n strokeWidth: this.canvasService.scaleValue(mapCircle.stroke),\n originX: 'center',\n originY: 'center',\n height: this.canvasService.scaleValue(\n mapCircle.height * this.gradeIconMultiplier\n ),\n width: this.canvasService.scaleValue(\n mapCircle.width * this.gradeIconMultiplier\n ),\n rx: this.canvasService.scaleValue(mapCircle.height),\n ry: this.canvasService.scaleValue(mapCircle.height),\n });\n\n const text = new fabric.Text(grade.abbreviation.toString(), {\n fontSize:\n this.canvasService.scaleValue(fontSize) * this.gradeIconMultiplier,\n fontFamily: 'Roboto',\n fontWeight: 700,\n top: 0,\n fill: circle.textColor,\n textAlign: 'center',\n originX: 'center',\n originY: 'center',\n });\n\n const leftCircle = this.canvasService.scaleValue(circle.x);\n const topCircle = this.canvasService.scaleValue(circle.y);\n\n const groupCircle: ExtendedGroup = new fabric.Group(\n text ? [circleShape, text] : [circleShape],\n {\n left: leftCircle,\n top: topCircle,\n originX: 'center',\n originY: 'center',\n selectable: false,\n hoverCursor: 'pointer',\n }\n );\n\n groupCircle.set('subType', 'circle');\n\n return groupCircle;\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewEncapsulation,\n input,\n output,\n signal,\n computed,\n effect,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { cloneDeep, debounce, merge } from 'lodash-es';\nimport { v4 as uuidV4 } from 'uuid';\n\nimport {\n ExtendedGroup,\n Grade,\n MapConfiguration,\n VenueMapType,\n VenueMapTheme,\n GradeSetting,\n} from './venue-map.type';\nimport {\n DEFAULT_MAP_CONFIG,\n DEFAULT_VENUE_MAP_THEME,\n} from './venue-map.constant';\nimport { SwitchComponent } from '../switch/switch.component';\nimport { VenueMapCanvasService } from './venue-map-canvas.service';\nimport { VenueMapGradeService } from './venue-map-grade.service';\n\nconst DEBOUNCE_DELAY = 250;\nconst MAP_FOCUS_DELAY = 1500;\n\ninterface GradeSelection {\n grade: Grade;\n shapeIndex: number | undefined;\n}\n\ninterface FocusedGradePart {\n id: string;\n shapeIndex: number | undefined;\n}\n\n@Component({\n selector: 'ngx-venue-map',\n standalone: true,\n imports: [SwitchComponent, CommonModule, FormsModule],\n templateUrl: './venue-map.component.html',\n styleUrls: ['./venue-map.component.css'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class VenueMapComponent implements OnInit, AfterViewInit, OnDestroy {\n grades = input<Grade[]>([]);\n reloadMap = input<boolean>(true);\n focusedGradePart = input<FocusedGradePart | undefined>();\n mapConfiguration = input<\n (Partial<MapConfiguration> & Pick<MapConfiguration, 'width' | 'height' | 'path'>) | undefined\n >();\n theme = input<Partial<VenueMapTheme> | undefined>();\n\n // Signal Outputs (Angular 20 feature)\n selectGrade = output<GradeSelection>();\n\n // Template References\n @ViewChild('htmlCanvas', { static: true })\n canvasRef!: ElementRef<HTMLCanvasElement>;\n\n @ViewChild('mapContainer')\n mapContainer!: ElementRef<HTMLElement>;\n\n // Public Properties\n readonly VenueMapType = VenueMapType;\n\n // Signal-based State Management\n private readonly gradeService = inject(VenueMapGradeService);\n readonly canvasService = inject(VenueMapCanvasService);\n\n // Computed Signals\n resolvedMapConfiguration = computed(() => {\n const config = this.mapConfiguration();\n const defaultMapConfiguration = cloneDeep(DEFAULT_MAP_CONFIG) as MapConfiguration;\n return merge(defaultMapConfiguration, config ?? {}) as MapConfiguration;\n });\n\n resolvedTheme = computed(() => {\n const themeConfig = this.theme();\n return merge(\n cloneDeep(DEFAULT_VENUE_MAP_THEME),\n themeConfig ?? {}\n ) as VenueMapTheme;\n });\n\n viewDimensions = computed(() => {\n const mapHeight = window.innerHeight;\n const config = this.resolvedMapConfiguration();\n return {\n width: this.mapWidth(),\n height: mapHeight,\n scale: mapHeight / config.height,\n };\n });\n\n // Signal State\n venueMapType = signal(VenueMapType.GRADE);\n isLoading = signal(false);\n mapWidth = signal(0);\n gradeSelectCanvas = signal<ExtendedGroup | undefined>(undefined);\n gradeSelect = signal<Grade | undefined>(undefined);\n\n // Private Properties\n private pendingMapWidth = 0;\n private isRendering = false;\n\n // Debounced Methods\n private readonly debounceGradeMapShow = debounce(\n () => this.renderGradeSticky(),\n DEBOUNCE_DELAY\n );\n\n private readonly debounceUpdateMapWidth = debounce(\n () => this.updateMapWidth(),\n DEBOUNCE_DELAY\n );\n\n constructor() {\n // Effect for grades changes\n effect(() => {\n const gradesValue = this.grades();\n const mapWidthValue = this.mapWidth();\n\n if (gradesValue.length > 0 && mapWidthValue > 0) {\n this.debounceUpdateMapWidth();\n }\n });\n\n // Effect for map configuration changes\n effect(() => {\n this.mapConfiguration(); // Track changes\n this.debounceUpdateMapWidth();\n });\n\n // Effect for theme changes\n effect(() => {\n this.theme(); // Track changes\n this.debounceUpdateMapWidth();\n });\n }\n\n // ============================================================================\n // LIFECYCLE METHODS\n // ============================================================================\n\n ngOnInit(): void {\n this.initializeCanvasHandlers();\n }\n\n ngOnDestroy(): void {\n this.cleanupResources();\n }\n\n ngAfterViewInit(): void {\n this.debounceUpdateMapWidth();\n }\n\n // ============================================================================\n // PRIVATE INITIALIZATION METHODS\n // ============================================================================\n\n /**\n * Initializes canvas event handlers and observables.\n */\n private initializeCanvasHandlers(): void {\n this.canvasService.getCanvasReadyObservable().subscribe();\n this.canvasService.setDebounceClickHandler(this.onGradeClick.bind(this));\n }\n\n /**\n * Cleans up resources when component is destroyed.\n */\n private cleanupResources(): void {\n this.canvasService.clearMapService();\n this.debounceGradeMapShow.cancel();\n this.debounceUpdateMapWidth.cancel();\n }\n\n // ============================================================================\n // MAP RENDERING AND MANAGEMENT METHODS\n // ============================================================================\n\n /**\n * Updates the map width and triggers re-rendering if needed.\n */\n private updateMapWidth(): void {\n if (!this.mapContainer?.nativeElement) return;\n\n const newMapWidth = this.mapContainer.nativeElement.offsetWidth;\n if (!newMapWidth) return;\n\n if (this.isRendering) {\n this.pendingMapWidth = newMapWidth;\n return;\n }\n\n this.startRenderProcess(newMapWidth);\n }\n\n /**\n * Starts the rendering process with the new map width.\n */\n private startRenderProcess(mapWidth: number): void {\n this.isRendering = true;\n this.mapWidth.set(mapWidth);\n this.processRenderQueue();\n }\n\n /**\n * Processes the render queue and handles pending width changes.\n */\n private async processRenderQueue(): Promise<void> {\n await this.handleMapSettingsChange();\n\n if (this.pendingMapWidth) {\n const nextMapWidth = this.pendingMapWidth;\n this.pendingMapWidth = 0;\n this.mapWidth.set(nextMapWidth);\n return this.processRenderQueue();\n }\n\n this.isRendering = false;\n }\n\n /**\n * Handles changes to map settings and triggers re-initialization.\n */\n private async handleMapSettingsChange(): Promise<void> {\n if (this.reloadMap()) {\n this.canvasService.removeCanvasMap();\n }\n\n this.initializeMapData();\n this.canvasService.initialize(\n this.viewDimensions(),\n this.resolvedMapConfiguration(),\n this.resolvedTheme()\n );\n this.setupCanvas();\n await this.resetAndRenderGrades();\n }\n\n /**\n * Initializes map data and view dimensions.\n */\n private initializeMapData(): void {\n // Data is now handled by computed signals\n // resolvedMapConfiguration and resolvedTheme are computed automatically\n }\n\n /**\n * Sets up the canvas and loads background image.\n */\n private setupCanvas(): void {\n if (this.reloadMap() || !this.canvasService.canvas) {\n this.canvasService.setupCanvas(this.canvasRef.nativeElement);\n }\n\n const config = this.resolvedMapConfiguration();\n this.canvasService.loadBackgroundImage(\n config.path,\n );\n }\n\n /**\n * Resets canvas state and renders all grades.\n */\n private async resetAndRenderGrades(): Promise<void> {\n this.isLoading.set(true);\n this.resetCanvasState();\n this.renderGrades();\n this.renderGradeSticky();\n\n await this.showCenterFocusMap();\n this.canvasService.showMap();\n this.isLoading.set(false);\n }\n\n /**\n * Resets the canvas state and clears selections.\n */\n private resetCanvasState(): void {\n this.canvasService.resetZoomCanvas();\n this.canvasService.resetHeightCanvas();\n this.canvasService.removeGroupCanvas();\n this.clearGradeSelection();\n }\n\n /**\n * Clears the current grade selection.\n */\n private clearGradeSelection(): void {\n this.gradeSelectCanvas.set(undefined);\n this.gradeSelect.set(undefined);\n }\n\n /**\n * Renders all grades on the canvas.\n */\n private renderGrades(): void {\n const grades = this.grades();\n grades.forEach(grade =>\n grade.settings.forEach((shape, index) => {\n const gradeGroup = this.createGradeGroup(grade, shape, index);\n this.canvasService.canvas.add(gradeGroup);\n })\n );\n }\n\n /**\n * Creates a grade group with all its components.\n */\n private createGradeGroup(\n grade: Grade,\n shape: GradeSetting,\n index: number\n ): ExtendedGroup {\n const gradeInfo = this.buildGradeInfo(grade, index);\n\n return this.gradeService.createGrade(\n this.gradeService.createPolygon(shape, grade.disabled),\n this.gradeService.createCircle(\n grade,\n shape,\n this.resolvedMapConfiguration(),\n this.resolvedTheme()\n ),\n this.gradeService.createStickyPrice(\n grade,\n shape,\n this.resolvedMapConfiguration(),\n this.resolvedTheme()\n ),\n gradeInfo\n );\n }\n\n /**\n * Builds grade information object for grade creation.\n */\n private buildGradeInfo(\n grade: Grade,\n index: number\n ): Record<string, string | boolean> {\n return {\n id: grade.id,\n subId: uuidV4(),\n shapeIndex: index.toString(),\n disabled: !!grade.disabled,\n };\n }\n\n /**\n * Renders sticky elements for all grades based on current map type.\n */\n private renderGradeSticky(): void {\n this.canvasService.canvas.getObjects().forEach(gradeShape => {\n const gradeShapeTyped = gradeShape as ExtendedGroup;\n const gradeId = gradeShapeTyped.id;\n\n if (gradeId) {\n const grade = this.findGradeById(gradeId);\n if (grade) {\n this.gradeService.createGradeSticky(\n grade,\n gradeShapeTyped,\n this.gradeSelectCanvas()?.subId ?? '',\n this.venueMapType()\n );\n }\n }\n });\n }\n\n /**\n * Finds a grade by its ID.\n */\n private findGradeById(gradeId: string): Grade | undefined {\n const grades = this.grades();\n return grades.find(grade => grade.id === gradeId);\n }\n\n // ============================================================================\n // MAP FOCUS AND INTERACTION METHODS\n // ============================================================================\n\n /**\n * Shows the center focus map with animation delay.\n */\n private async showCenterFocusMap(): Promise<void> {\n return new Promise<void>(resolve => {\n setTimeout(() => {\n this.renderMapFocus(resolve);\n }, MAP_FOCUS_DELAY);\n });\n }\n\n /**\n * Renders the map focus and initializes mini map.\n */\n private renderMapFocus(resolve: () => void): void {\n this.canvasService.initializeMiniMap();\n this.canvasService.adjustViewToCenter(() => {\n resolve();\n });\n }\n\n /**\n * Handles grade click events.\n */\n private onGradeClick(selectedObject: ExtendedGroup): void {\n if (selectedObject?.type === 'group') {\n this.handleGradeSelection(selectedObject);\n }\n }\n\n /**\n * Handles the selection of a grade.\n */\n private handleGradeSelection(selectedGrade: ExtendedGroup): void {\n if (this.isGradeAlreadySelected(selectedGrade)) return;\n\n this.selectGradeInternal(selectedGrade);\n this.updateGradeDisplay();\n }\n\n /**\n * Updates the grade display after selection.\n */\n private updateGradeDisplay(): void {\n this.renderGradeSticky();\n this.canvasService.showDisplayViewportMap();\n }\n\n /**\n * Checks if the grade is already selected.\n */\n private isGradeAlreadySelected(selectedGrade: ExtendedGroup): boolean {\n const currentSelection = this.gradeSelectCanvas();\n return selectedGrade.subId === currentSelection?.subId;\n }\n\n /**\n * Selects a grade and updates the UI state.\n */\n private selectGradeInternal(selectedGrade: ExtendedGroup): void {\n this.canvasService.zoomToObjectBufferHeight(selectedGrade);\n\n const grade = this.findGradeById(selectedGrade.id ?? '');\n if (grade) {\n this.gradeSelect.set(cloneDeep(grade));\n this.gradeSelectCanvas.set(selectedGrade);\n }\n }\n\n // ============================================================================\n // PUBLIC METHODS\n // ============================================================================\n\n /**\n * Handles changes to grade map display.\n */\n public onChangeGradeMapShow(): void {\n this.cancelDebounceGradeMapShow();\n this.triggerDebounceGradeMapShow();\n }\n\n /**\n * Handles grade selection from external components.\n */\n public onGradeSelected(selectedObject: ExtendedGroup): void {\n const grade = this.findGradeById(selectedObject.id ?? '');\n if (!grade) return;\n\n const shapeIndex = selectedObject.shapeIndex;\n this.selectGrade.emit({ grade, shapeIndex });\n }\n\n /**\n * Handles seat grade selection.\n */\n public onSelectSeatGrade(): void {\n const currentGrade = this.gradeSelect();\n const currentCanvas = this.gradeSelectCanvas();\n\n if (!currentGrade || !currentCanvas) return;\n\n const shapeIndex = currentCanvas.shapeIndex;\n this.selectGrade.emit({ grade: currentGrade, shapeIndex });\n }\n\n /**\n * Handles changes to grade map type (grade view vs price view).\n */\n public onChangeGradeMapType(isPrice: boolean): void {\n this.venueMapType.set(isPrice\n ? VenueMapType.GRADE_PRICE\n : VenueMapType.GRADE);\n this.onChangeGradeMapShow();\n }\n\n // ============================================================================\n // PRIVATE HELPER METHODS\n // ============================================================================\n\n /**\n * Cancels the debounced grade map show operation.\n */\n private cancelDebounceGradeMapShow(): void {\n this.debounceGradeMapShow.cancel();\n }\n\n /**\n * Triggers the debounced grade map show operation.\n */\n private triggerDebounceGradeMapShow(): void {\n this.debounceGradeMapShow();\n }\n}\n","<div #mapContainer class=\"venue__container\">\n <div class=\"venue__grades\">\n <canvas #htmlCanvas id=\"c\"></canvas>\n </div>\n <canvas\n #miniMap\n class=\"venue__minimap\"\n id=\"miniMap\"\n [class.hidden]=\"!canvasService.showMiniMap()\"\n ></canvas>\n <div\n class=\"venue__switch-price\"\n *ngIf=\"\n !isLoading() && canvasService.canvas\n \"\n >\n <span class=\"venue__switch-label\">Show Price</span>\n <app-switch\n [checked]=\"venueMapType() === VenueMapType.GRADE_PRICE\"\n [handleOnChange]=\"onChangeGradeMapType.bind(this)\"\n className=\"bg-black\"\n ></app-switch>\n </div>\n <div\n class=\"venue__zoom-controls\"\n >\n <button\n [disabled]=\"canvasService.disableZoomIn()\"\n (click)=\"canvasService.handleZoomBtn('zoomIn')\"\n >\n <svg\n [class.venue__zoom-disabled]=\"canvasService.disableZoomIn()\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9.6 0H6.4V6.4H0V9.6H6.4V16H9.6V9.6H16V6.4H9.6V0Z\"\n fill=\"#707086\"\n />\n </svg>\n </button>\n <hr class=\"venue__zoom-divider\" />\n <button\n [disabled]=\"canvasService.disableZoomOut()\"\n (click)=\"canvasService.handleZoomBtn('zoomOut')\"\n >\n <svg\n [class.venue__zoom-disabled]=\"canvasService.disableZoomOut()\"\n width=\"16\"\n height=\"3\"\n viewBox=\"0 0 16 3\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M0 0V3H16V0H0Z\" fill=\"#707086\" />\n </svg>\n </button>\n </div>\n</div>\n","/*\n * Public API Surface of ngx-venue-map\n */\n\nexport { VenueMapComponent } from './lib/components/venue-map/venue-map.component';\nexport { VenueMapPriceService } from './lib/components/venue-map/venue-map-price.service';\nexport * from './lib/components/venue-map/venue-map.type';\nexport * from './lib/components/venue-map/venue-map.utils';\nexport { DEFAULT_MAP_CONFIG, DEFAULT_VENUE_MAP_THEME } from './lib/components/venue-map/venue-map.constant';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DEBOUNCE_DELAY","uuidV4"],"mappings":"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"}