{"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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"}