{"version":3,"file":"michelin-maps.mjs","sources":["../../../packages/maps/src/lib/map.model.ts","../../../packages/maps/src/lib/map.component.ts","../../../packages/maps/src/lib/map.component.html","../../../packages/maps/src/lib/map.module.ts","../../../packages/maps/src/lib/choropleth.helper.ts","../../../packages/maps/src/public_api.ts","../../../packages/maps/src/michelin-maps.ts"],"sourcesContent":["const ICON_SIZE = 40;\nconst POPUP_ANCHOR_X = 1;\nconst POPUP_ANCHOR_Y = -20;\nconst ICON_ANCHOR_X = 12;\nconst ICON_ANCHOR_Y = 24;\nconst DEFAULT_POPUP_ANCHOR: PointExpression = [POPUP_ANCHOR_X, POPUP_ANCHOR_Y];\nconst DEFAULT_ICON_ANCHOR: PointExpression = [ICON_ANCHOR_X, ICON_ANCHOR_Y];\nimport {\n  divIcon,\n  DivIcon,\n  DivIconOptions,\n  MapOptions as LeafletMapOptions,\n  CircleMarkerOptions as LeafletCircleMarkerOptions,\n  PolylineOptions as LeafletPolylineOptions,\n  Point as LeafletPoint,\n  PointExpression,\n  MarkerCluster\n} from 'leaflet';\n\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { SecurityContext } from '@angular/core';\nimport { MaterialIconFonts } from '@michelin/theme';\n\n// Explicitly declare the MarkerCluster interface to ensure compatibility\ndeclare module 'leaflet' {\n  interface MarkerCluster extends L.Marker {\n    getAllChildMarkers(): L.Marker[];\n    getChildCount(): number;\n    zoomToBounds(options?: L.FitBoundsOptions): void;\n    getBounds(): L.LatLngBounds;\n    spiderfy(): void;\n    unspiderfy(): void;\n  }\n\n  interface MarkerClusterGroupOptions extends L.LayerOptions {\n    maxClusterRadius?: number | ((zoom: number) => number);\n    iconCreateFunction?: (cluster: MarkerCluster) => Icon | DivIcon;\n  }\n\n  interface MarkerClusterGroup extends L.FeatureGroup {\n    addLayer(layer: L.Layer): this;\n    addLayers(layers: L.Layer[]): this;\n    removeLayer(layer: L.Layer): this;\n    removeLayers(layers: L.Layer[]): this;\n    clearLayers(): this;\n    zoomToShowLayer(layer: L.Layer, callback?: () => void): void;\n  }\n\n  function markerClusterGroup(options?: MarkerClusterGroupOptions): MarkerClusterGroup;\n}\n\nconst iconSize = 40;\n\n// Anchor offset constants (no magic numbers)\n\n/**\n * Map layer\n */\nexport class MapLayer {\n  /**\n   * Label to describe layer on the map selector\n   */\n  label: string;\n  /**\n   * Url to retrieve the layer tiles usefull with custom layers\n   */\n  url: string | string[];\n  /**\n   * Is the layer darkmode friendly\n   */\n  darkmode: boolean;\n\n  constructor(label: string, url: string | string[], darkmode: boolean = false) {\n    this.label = label;\n    this.url = url;\n    this.darkmode = darkmode;\n  }\n}\n\n/**\n * Map options\n * Extends leaflet MapOptions\n */\nexport interface MapOptions extends LeafletMapOptions {\n  /**\n   * Fit markers bounds\n   */\n  fitMarkersBounds?: number;\n  /**\n   * Fit trips bounds\n   */\n  fitTripsBounds?: number;\n  /**\n   * Define some options for markers\n   */\n  marker?: LeafletCircleMarkerOptions;\n  /**\n   * Define some options for lines\n   */\n  line?: LeafletPolylineOptions;\n}\n\n/**\n * Define a marker that could be display on the map\n */\nexport class MapMarker {\n  /**\n   * Marker latitude\n   */\n  latitude: number;\n  /**\n   * Marker longitude\n   */\n  longitude: number;\n  /**\n   * Material icon key\n   */\n  icon: string;\n  /**\n   * Information text (displayed in infobulle)\n   */\n  info?: string;\n  /**\n   * Marker color\n   */\n  color?: string;\n  /**\n   * Font set for icon\n   * Ex for material : filled, round, outlined, sharp, twotone\n   */\n  fontSet?: MaterialIconFonts;\n\n  constructor(marker: Partial<MapMarker>) {\n    this.latitude = marker?.latitude;\n    this.longitude = marker?.longitude;\n    this.color = marker?.color;\n    this.info = marker?.info;\n    this.icon = marker?.icon;\n    this.fontSet = marker?.fontSet;\n  }\n\n  /**\n   * Get icon for a giving color using a html container\n   */\n  getDivIcon(sanitizer: DomSanitizer): DivIcon {\n    // Sanitize individual values before interpolation\n    const safeColor = this.color ? sanitizer.sanitize(SecurityContext.STYLE, this.color) : '';\n    const safeFontSet = this.fontSet ? sanitizer.sanitize(SecurityContext.HTML, this.fontSet.valueOf()) : 'material-icons';\n    const safeIcon = this.icon ? sanitizer.sanitize(SecurityContext.HTML, this.icon) : 'place';\n\n    const style = safeColor ? `color: ${safeColor};` : '';\n    const html = `<span class=\"map-icon ${safeFontSet}\" style=\"${style}\">${safeIcon}</span>`;\n    const popupAnchor = DEFAULT_POPUP_ANCHOR; // Using named constant\n    const iconAnchor = DEFAULT_ICON_ANCHOR; // Using named constant\n\n    return divIcon({\n      className: 'marker',\n      iconAnchor,\n      popupAnchor,\n      html: sanitizer.sanitize(SecurityContext.HTML, html)\n    });\n  }\n}\n\n/**\n * Marker cluster configuration\n */\nexport class MapMarkerClusterConfig {\n  /**\n   * Enable the clustering\n   */\n  clusterEnabled: boolean;\n  /**\n   * Icon function\n   * Use to draw custom cluster\n   */\n  // Use explicit type import to help with type resolution\n  iconCreateFunction?: (cluster: MarkerCluster) => DivIconOptions;\n\n  constructor(mapMarkerClusterConfig: Partial<MapMarkerClusterConfig>) {\n    this.clusterEnabled = !!mapMarkerClusterConfig.clusterEnabled;\n\n    if (mapMarkerClusterConfig.iconCreateFunction) {\n      this.iconCreateFunction = mapMarkerClusterConfig.iconCreateFunction;\n    }\n  }\n\n  getMarkerClusterDivIcon(cluster: MarkerCluster, _sanitizer: DomSanitizer): DivIcon {\n    let config;\n    if (this.iconCreateFunction instanceof Function) {\n      config = this.iconCreateFunction(cluster);\n    }\n\n    return divIcon({\n      // default values\n      html: `<div><span>${cluster.getChildCount()}</span></div>`,\n      iconSize: new LeafletPoint(ICON_SIZE, ICON_SIZE), // Using named constant\n      // Object from the parent app\n      ...(config ?? {}),\n      // Override with default values\n      className: 'marker-cluster ' + (config?.className ?? 'marker-cluster-primary')\n    });\n  }\n}\n\n/**\n * Map point use in trip\n */\nexport class MapPoint {\n  /**\n   * Point latitude\n   */\n  latitude: number;\n  /**\n   * Point longitude\n   */\n  longitude: number;\n  /**\n   * Point color\n   */\n  color?: string;\n  /**\n   * Optional point size (radius in pixels) for bubble maps\n   */\n  size?: number;\n  /**\n   * Data value for color mapping and legend (e.g., population, revenue, temperature)\n   * When provided, this value is used for color interpolation instead of size\n   */\n  value?: number;\n  /**\n   * Point tooltip. Accepts String and HTML content.\n   */\n  tooltip?: string;\n}\n\n/**\n * Define a trip that could displayed on the map\n */\nexport class MapTrip {\n  /**\n   * List of points\n   */\n  waypoints: MapPoint[];\n  /**\n   * Optional color\n   */\n  color?: string;\n  /**\n   * Display mode (route, line, point)\n   */\n  mode?: MapMode;\n  /**\n   * Label for the data value displayed in bubble maps (e.g., \"Population\", \"Revenue\", \"Temperature\")\n   * This label appears in the legend to describe what the bubble colors represent\n   */\n  valueLabel?: string;\n}\n\n/**\n * Define enumeration for map trip mode\n */\nexport enum MapMode {\n  LINE = 'LINE',\n  POINT = 'POINT'\n}\n\n/**\n * GeoJSON layer configuration for displaying polygons, countries, regions, etc.\n * Useful for choropleth maps and country-wise data visualization\n */\nexport class MapGeoJSONLayer {\n  /**\n   * GeoJSON data (FeatureCollection or Feature)\n   */\n  data: any;\n  /**\n   * Style function to customize appearance based on feature properties\n   * @param feature - The GeoJSON feature being styled\n   * @returns Style options for the layer\n   */\n  style?: (feature: any) => L.PathOptions;\n  /**\n   * Function called for each feature in the layer\n   * Useful for adding popups, tooltips, or event handlers\n   * @param feature - The GeoJSON feature\n   * @param layer - The Leaflet layer representing the feature\n   */\n  onEachFeature?: (feature: any, layer: L.Layer) => void;\n  /**\n   * Optional name/label for this GeoJSON layer\n   */\n  label?: string;\n  /**\n   * Data map for choropleth coloring (country/region name -> value)\n   */\n  dataMap?: { [key: string]: number };\n  /**\n   * Property key to use for matching features with dataMap (e.g., 'ADMIN', 'name')\n   */\n  featurePropertyKey?: string;\n  /**\n   * Minimum value for color scale (defaults to 0)\n   */\n  zmin?: number;\n  /**\n   * Maximum value for color scale (auto-calculated if not provided)\n   */\n  zmax?: number;\n\n  constructor(geoJsonLayer: Partial<MapGeoJSONLayer>) {\n    this.data = geoJsonLayer?.data;\n    this.style = geoJsonLayer?.style;\n    this.onEachFeature = geoJsonLayer?.onEachFeature;\n    this.label = geoJsonLayer?.label;\n    this.dataMap = geoJsonLayer?.dataMap;\n    this.featurePropertyKey = geoJsonLayer?.featurePropertyKey || 'ADMIN';\n    this.zmin = geoJsonLayer?.zmin;\n    this.zmax = geoJsonLayer?.zmax;\n  }\n}\n","const DEFAULT_MAP_HEIGHT = '460px';\nconst CANVAS_PADDING = 0.5;\nimport { Component, effect, inject, input, output, signal, DestroyRef, AfterViewInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { Theme, ThemingService } from '@michelin/theme';\nimport * as L from 'leaflet';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MapLayer, MapMarker, MapMarkerClusterConfig, MapMode, MapOptions, MapPoint, MapTrip, MapGeoJSONLayer } from './map.model';\n\n/**\n * Extended Leaflet Map type to include internal properties\n */\ninterface MapWithPanes extends L.Map {\n  _panes?: Record<string, HTMLElement>;\n}\n\nconst defaultMapColors = {\n  light: '#27509b',\n  dark: '#99cef6'\n};\n\nconst defaultWeight = 5;\nconst defaultRadius = 5;\nconst defaultOpacity = 1;\n\nconst SEQUENTIAL_ACCENT = 'sequential-accent';\nconst DIVERGENT_ACCENT = 'divergent-accent';\n\n@Component({\n  selector: 'mic-map',\n  templateUrl: './map.component.html',\n  styleUrls: ['./map.component.scss'],\n  standalone: true,\n  imports: [CommonModule]\n})\nexport class MapComponent implements AfterViewInit {\n  // Retrieve michelin theme\n  private readonly themingService = inject(ThemingService);\n  private readonly sanitizer = inject(DomSanitizer);\n  private readonly destroyRef = inject(DestroyRef);\n\n  // Signal inputs with defaults\n  readonly height = input<string>(DEFAULT_MAP_HEIGHT);\n  readonly options = input<MapOptions | undefined>(undefined);\n  readonly markers = input<MapMarker[]>([]);\n  readonly trips = input<MapTrip[]>([]);\n  readonly layers = input<MapLayer[] | undefined>(undefined);\n  readonly markerClusterConfig = input<MapMarkerClusterConfig | undefined>(undefined);\n  readonly extrapolation = input<number>(0);\n  readonly geoJsonLayers = input<MapGeoJSONLayer[]>([]);\n  readonly colorPalette = input<typeof SEQUENTIAL_ACCENT | typeof DIVERGENT_ACCENT>(SEQUENTIAL_ACCENT);\n  readonly colorMode = input<'rdbu' | 'oranges' | 'storm' | 'divergent' | 'temperature'>('storm');\n\n  // Signal outputs\n  readonly mapInit = output<L.Map>();\n\n  // Internal signal state\n  readonly darkTheme = signal<boolean>(this.themingService.theme.isDark);\n  readonly layerSupportDarkmode = signal<boolean>(true);\n\n  // Reference to the primary map object\n  private map: L.Map;\n  // Store leaflet instance for controls\n  private controlsInstances: L.Control[] = [];\n  // Store leaflet instance for lines\n  private linesInstances: L.Polyline[] = [];\n  // Store leaflet instance for circles\n  private circlesInstances: L.Circle[] = [];\n  // Store leaflet instance for markers\n  private markersInstances: L.Marker[] = [];\n  // Store leaflet instance for clusters\n  private clusterInstance: L.MarkerClusterGroup;\n  // Store leaflet instance for GeoJSON layers\n  private geoJsonInstances: L.GeoJSON[] = [];\n  // Store leaflet instance for legend control\n  private legendControl: L.Control | null = null;\n\n  // Map id\n  id = Math.random();\n\n  // Initialization state\n  private isMapInitialized = false;\n  private shouldInitializeMap = false;\n  // Cache for CSS variables to avoid repeated lookups\n  private readonly cssVariableCache: Map<string, string> = new Map();\n  private cssVariablesAvailable = false;\n  // Track retry attempts for GeoJSON layer loading\n  private retryCount = 0;\n\n  constructor() {\n    // Handle theme changes\n    this.themingService.themeChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((theme: Theme) => {\n      this.darkTheme.set(theme.isDark);\n      // Reload GeoJSON layers to update colors for choropleth maps\n      this.loadGeoJsonLayers();\n    });\n\n    // Initialize map when layers become available\n    effect(() => {\n      const layersValue = this.layers();\n      if (layersValue && layersValue.length > 0) {\n        if (!this.isMapInitialized && this.shouldInitializeMap) {\n          this.initializeMap();\n        } else if (this.isMapInitialized) {\n          this.loadLayers();\n        }\n      }\n    });\n\n    // Watch for marker changes\n    effect(() => {\n      const markersValue = this.markers();\n      if (this.isMapInitialized && this.map && markersValue?.length > 0) {\n        this.loadMarkers();\n      }\n    });\n\n    // Watch for trip changes\n    effect(() => {\n      const tripsValue = this.trips();\n      if (this.isMapInitialized && this.map && tripsValue?.length > 0) {\n        this.loadTrips();\n      }\n    });\n\n    // Watch for geoJson changes\n    effect(() => {\n      const geoJsonLayersValue = this.geoJsonLayers();\n      // Load GeoJSON layers when they become available (non-empty)\n      if (this.isMapInitialized && this.map && geoJsonLayersValue && geoJsonLayersValue.length > 0) {\n        this.loadGeoJsonLayers();\n      }\n    });\n\n    // Watch for color palette and mode changes\n    effect(() => {\n      this.colorPalette();\n      this.colorMode();\n      if (this.isMapInitialized && this.map && this.geoJsonLayers()?.length > 0) {\n        // Reload GeoJSON layers when color palette or mode changes\n        this.loadGeoJsonLayers();\n      }\n    });\n\n    // Cleanup on destroy\n    this.destroyRef.onDestroy(() => {\n      if (this.map) {\n        this.map.remove();\n      }\n    });\n  }\n\n  /**\n   * Lifecycle hook: After view init\n   */\n  ngAfterViewInit(): void {\n    if (this.layers()?.length > 0) {\n      this.initializeMap();\n    } else {\n      this.shouldInitializeMap = true;\n    }\n  }\n\n  /**\n   * Initialize the map when layers are ready\n   */\n  private initializeMap() {\n    if (this.isMapInitialized || !this.layers()?.length) {\n      return;\n    }\n\n    // Create the map with some reasonable defaults\n    this.map = L.map(this.id.toString(), {\n      ...this.options(),\n      //This makes the map use a Canvas Renderer instead of the default SVG renderer if preferCanvas is set to True\n      //Existing Leaflet code that should do this doesn't seem to work well\n      renderer: this.options()?.preferCanvas ? L.canvas({ padding: CANVAS_PADDING }) : L.svg({ padding: CANVAS_PADDING })\n    });\n\n    this.loadLayers();\n    this.loadMarkers();\n    this.loadTrips();\n\n    this.isMapInitialized = true;\n    this.shouldInitializeMap = false;\n\n    // Load GeoJSON layers after a delay to ensure CSS variables are available\n    // Use requestAnimationFrame + additional timeout to guarantee CSS is computed\n    // Increased delay to 500ms to handle slower style loading and signal propagation\n    requestAnimationFrame(() => {\n      setTimeout(() => {\n        this.loadGeoJsonLayers();\n      }, 500);\n    });\n\n    // Emit event\n    this.mapInit.emit(this.map);\n  }\n\n  /**\n   * Reset the map\n   */\n  resetMap(): void {\n    [...this.controlsInstances, ...this.linesInstances, ...this.circlesInstances].forEach((instance: L.Control | L.Polyline | L.Circle) => {\n      instance.remove();\n    });\n    this.controlsInstances = [];\n    this.linesInstances = [];\n    this.circlesInstances = [];\n\n    // Clean up GeoJSON layers\n    this.geoJsonInstances.forEach((geoJsonLayer: L.GeoJSON) => {\n      geoJsonLayer.remove();\n    });\n    this.geoJsonInstances = [];\n\n    // Remove legend\n    this.removeLegend();\n  }\n\n  /**\n   * Load layers\n   */\n  private loadLayers(): void {\n    const layers = this.layers();\n    if (!layers || layers.length === 0 || !this.map) {\n      return;\n    }\n\n    const layerMap: { [key: string]: L.TileLayer | L.LayerGroup } = {};\n    layers.forEach((mapLayer) => {\n      const layer = Array.isArray(mapLayer.url)\n        ? L.layerGroup(mapLayer.url.map((url: string) => L.tileLayer(url)))\n        : L.tileLayer(mapLayer.url);\n\n      layerMap[mapLayer.label] = layer;\n    });\n\n    const firstLayerLabel = layers[0].label;\n    const defaultLayer = layerMap[firstLayerLabel];\n    this.map.addLayer(defaultLayer);\n\n    this.layerSupportDarkmode.set(layers[0].darkmode);\n\n    if (layers.length > 1) {\n      this.map.addControl(new L.Control.Layers(layerMap));\n    }\n\n    this.map.on('baselayerchange', (e: L.LayersControlEvent) => {\n      const l = layers.find((imagelayer) => imagelayer.label === e.name);\n      if (l) {\n        this.layerSupportDarkmode.set(l.darkmode);\n      }\n    });\n  }\n\n  /**\n   * Load all trips\n   *\n   * @private\n   */\n  private loadTrips(): void {\n    this.resetMap();\n\n    let allPoints: MapPoint[] = [];\n    const trips = this.trips();\n    const markers = this.markers();\n\n    // Draw trips\n    if (trips?.length) {\n      trips.forEach((trip: MapTrip) => {\n        allPoints = [...allPoints, ...trip.waypoints];\n        switch (trip.mode) {\n          case MapMode.LINE:\n            this.drawLines(\n              trip.waypoints.map((point: MapPoint) => this.getPoint(point)),\n              trip.waypoints.map((point: MapPoint) => this.getColor(point.color)),\n              trip.waypoints.map((point: MapPoint) => point.tooltip)\n            );\n            break;\n          case MapMode.POINT: {\n            // Determine which property to use for color mapping: value (preferred) or size (fallback)\n            const useValueForColor = trip.waypoints.some((point: MapPoint) => point.value !== undefined);\n            const dataValues = trip.waypoints.map((point: MapPoint) => (useValueForColor ? point.value ?? 0 : (point as any).size ?? 0));\n            const sizes = trip.waypoints.map((point: MapPoint) => (point as any).size ?? 0);\n\n            const minValue = Math.min(...dataValues);\n            const maxValue = Math.max(...dataValues);\n            const bubblePalette = this.colorPalette() === DIVERGENT_ACCENT ? DIVERGENT_ACCENT : SEQUENTIAL_ACCENT;\n            const palette = this.resolveThemePalette(bubblePalette);\n            const colors = dataValues.map((value) => this.interpolateColor(value, minValue, maxValue, palette));\n\n            this.drawPoints(\n              trip.waypoints.map((point: MapPoint) => this.getPoint(point)),\n              colors,\n              trip.waypoints.map((point: MapPoint) => point.tooltip),\n              sizes\n            );\n\n            if (palette.length > 0 && minValue !== maxValue) {\n              this.addLegend(minValue, maxValue, palette, trip.valueLabel);\n            }\n\n            break;\n          }\n          default:\n        }\n      });\n    }\n\n    // Load markers\n    if (markers?.length) {\n      markers.forEach((marker: MapMarker) => {\n        allPoints.push(marker);\n      });\n    }\n\n    // Auto center\n    const mapOptions = this.options();\n    if (allPoints.length && mapOptions?.fitTripsBounds) {\n      const bounds = L.latLngBounds(allPoints.map((point: MapPoint) => this.getPoint(point)));\n      this.map.fitBounds(bounds, { maxZoom: mapOptions.fitTripsBounds });\n    }\n  }\n\n  /**\n   * Get leaflet point from map point\n   *\n   * @param mapPoint the map point\n   */\n  getPoint(mapPoint: MapPoint): L.LatLng {\n    return { lat: mapPoint.latitude, lng: mapPoint.longitude } as L.LatLng;\n  }\n\n  /**\n   * Get a color\n   *\n   * @param color the input color\n   */\n  getColor(color: string): string {\n    if (!color || !color.length) {\n      return this.darkTheme() ? defaultMapColors.dark : defaultMapColors.light;\n    }\n    return color;\n  }\n\n  /**\n   * Draw lines on calculated route\n   *\n   * @param coordinates all coordinates\n   * @param colors all colors\n   * @param tooltips all tooltips\n   * @private\n   */\n  private drawLines(coordinates: L.LatLng[], colors: string[], tooltips: string[]): void {\n    const smoothedCoordinates: L.LatLng[] = [];\n    const smoothedColors: string[] = [];\n    const extrapolationValue = this.extrapolation();\n\n    // Generate extrapolation points\n    coordinates.forEach((coordinate: L.LatLng, index: number) => {\n      smoothedCoordinates.push(coordinate);\n      smoothedColors.push(colors[index]);\n      if (index < coordinates.length - 1) {\n        for (let i = 0; i < extrapolationValue; i++) {\n          const avgPoint = MapComponent.getAveragePoint(\n            coordinates[index],\n            coordinates[index + 1],\n            colors[index],\n            colors[index + 1],\n            +((1 / extrapolationValue) * i)\n          );\n          smoothedCoordinates.push(this.getPoint(avgPoint));\n          smoothedColors.push(avgPoint.color);\n        }\n      }\n    });\n\n    // Draw lines\n    let startCoordinate = smoothedCoordinates[0];\n    let destinationCoordinate;\n    smoothedCoordinates.forEach((_coordinate: L.LatLng, index: number) => {\n      if (index < smoothedCoordinates.length - 1) {\n        destinationCoordinate = smoothedCoordinates[index + 1];\n        this.drawLine(startCoordinate, destinationCoordinate, smoothedColors[index], tooltips[index]);\n        startCoordinate = destinationCoordinate;\n      }\n    });\n  }\n\n  /**\n   * Get an average dot\n   *\n   * @param point1 the first dot\n   * @param point2 the second dot\n   * @param color1 the first color\n   * @param color2 the second color\n   * @param ratio the ratio\n   * @private\n   */\n  private static getAveragePoint(point1: L.LatLng, point2: L.LatLng, color1: string, color2: string, ratio: number): MapPoint {\n    return {\n      latitude: point1.lat + (point2.lat - point1.lat) * ratio,\n      longitude: point1.lng + (point2.lng - point1.lng) * ratio,\n      color: MapComponent.generateColor(color1, color2, ratio)\n    };\n  }\n\n  /**\n   * Draw a line between start and destination with a color\n   *\n   * @param start\n   * @param destination\n   * @param color\n   * @param tooltipContent\n   * @private\n   */\n  private drawLine(start: L.LatLng, destination: L.LatLng, color: string, tooltipContent: string): void {\n    const options: L.PolylineOptions = {\n      weight: defaultWeight,\n      opacity: defaultOpacity,\n      smoothFactor: 1\n    };\n    const line = new L.Polyline([start, destination], {\n      color,\n      ...options,\n      ...this.options()?.line\n    });\n    this.addTooltip(line, tooltipContent);\n    line.addTo(this.map);\n    this.linesInstances.push(line);\n  }\n\n  /**\n   * Draw points on calculated route\n   *\n   * @param coordinates all coordinates\n   * @param colors all colors\n   * @param tooltips all tooltips\n   * @private\n   */\n  private drawPoints(coordinates: L.LatLng[], colors: string[], tooltips: string[], sizes?: (number | undefined)[]): void {\n    coordinates.forEach((coordinate: L.LatLng, index: number) =>\n      this.drawPoint(coordinate, colors[index], tooltips[index], sizes ? sizes[index] : undefined)\n    );\n  }\n\n  /**\n   * Draw a point on a position with a color\n   *\n   * @param position\n   * @param color\n   * @param tooltipContent\n   * @private\n   */\n  private drawPoint(position: L.LatLng, color: string, tooltipContent: string, size?: number): void {\n    const options: L.CircleMarkerOptions = {\n      radius: size ?? defaultRadius,\n      fillOpacity: defaultOpacity\n    };\n    const circle = new L.Circle(position, {\n      radius: size ?? defaultRadius,\n      color,\n      fillColor: color,\n      ...options,\n      ...this.options()?.marker\n    });\n    this.addTooltip(circle, tooltipContent);\n    circle.addTo(this.map);\n    this.circlesInstances.push(circle);\n  }\n\n  /**\n   * Load markers onto the map\n   * Markers can be grouped with clustering functionality for better performance and visualization\n   * This method handles both individual markers and clustered markers based on configuration\n   *\n   * @see markers input property for marker data\n   */\n  private loadMarkers() {\n    let markerCluster: L.MarkerClusterGroup;\n    const markerClusterConfig = this.markerClusterConfig();\n\n    // Initialize marker clustering if enabled in configuration\n    if (markerClusterConfig?.clusterEnabled) {\n      // Create a new marker cluster group with custom icon generation\n      // Uses the imported Leaflet library instead of global window.L for better type safety\n      markerCluster = new (window as any).L.markerClusterGroup({\n        iconCreateFunction: (cluster: L.MarkerCluster) => markerClusterConfig.getMarkerClusterDivIcon(cluster, this.sanitizer)\n      });\n    }\n\n    // Clean up existing markers from the map to prevent duplicates\n    // Remove each marker instance from the map and clear the tracking array\n    this.markersInstances.forEach((marker: L.Marker) => {\n      marker.remove();\n    });\n    this.markersInstances = [];\n\n    // Remove any existing cluster instance from the map\n    if (this.clusterInstance) {\n      this.clusterInstance.remove();\n    }\n\n    // Add all markers to either the cluster or directly to the map\n    this.addMarkersToInstance(markerCluster);\n\n    // Automatically fit the map view to show all markers if option is enabled\n    const mapOptions = this.options();\n    if (this.markersInstances.length && mapOptions?.fitMarkersBounds) {\n      // Create bounds from all marker positions\n      const bounds = L.latLngBounds(this.markersInstances.map((marker) => marker.getLatLng()));\n      // Fit the map view to these bounds with optional maximum zoom level\n      this.map.fitBounds(bounds, { maxZoom: mapOptions.fitMarkersBounds });\n    }\n\n    // Add the cluster layer to the map if clustering is enabled\n    if (markerClusterConfig?.clusterEnabled) {\n      this.map.addLayer(markerCluster);\n      // Store reference to cluster instance for future cleanup\n      this.clusterInstance = markerCluster;\n    }\n\n    // Trigger a resize event to ensure proper map rendering after marker changes\n    window.dispatchEvent(new Event('resize'));\n  }\n\n  /**\n   * Add individual markers to either the cluster group or directly to the map\n   * This method processes each marker from the markers array and creates Leaflet marker instances\n   *\n   * @param markerCluster - The cluster group to add markers to (if clustering is enabled)\n   * @private\n   */\n  private addMarkersToInstance(markerCluster: L.MarkerClusterGroup) {\n    const markers = this.markers();\n    const markerClusterConfig = this.markerClusterConfig();\n\n    // Iterate through each marker in the markers input array\n    markers.forEach((m: MapMarker) => {\n      // Only create markers with valid latitude and longitude coordinates\n      if (m.latitude !== undefined && m.longitude !== undefined) {\n        // Create a new Leaflet marker with the specified position and custom icon\n        const newMarker = L.marker([m.latitude, m.longitude], { icon: m.getDivIcon(this.sanitizer) });\n\n        // Add popup information if provided in the marker data\n        if (m.info) {\n          newMarker.bindPopup(m.info);\n        }\n\n        // Add marker to cluster or directly to map based on clustering configuration\n        if (markerClusterConfig?.clusterEnabled) {\n          // Add to cluster group for grouped display\n          markerCluster.addLayer(newMarker);\n        } else {\n          // Add directly to the map for individual display\n          newMarker.addTo(this.map);\n        }\n\n        // Keep track of all marker instances for future management (cleanup, bounds calculation, etc.)\n        this.markersInstances.push(newMarker);\n      }\n    });\n  }\n\n  /**\n   * Generate a color between two colors\n   *\n   * @param startColor\n   * @param endColor\n   * @param percent\n   * @private\n   */\n  private static generateColor(startColor: string, endColor: string, percent: number) {\n    const HEX_RADIX = 16;\n    const HEX_LENGTH = 6;\n    const MAX_COLOR_VALUE = 255;\n    startColor = startColor.replace('#', '');\n    endColor = endColor.replace('#', '');\n\n    const hex = function (x: number): string {\n      const v = Math.max(0, Math.min(MAX_COLOR_VALUE, Math.round(Number(x) || 0)));\n      const s = v.toString(HEX_RADIX);\n      return s.length === 1 ? '0' + s : s;\n    };\n\n    const r = Math.ceil(\n      parseInt(startColor.substring(0, 2), HEX_RADIX) * percent + parseInt(endColor.substring(0, 2), HEX_RADIX) * (1 - percent)\n    );\n    const g = Math.ceil(\n      parseInt(startColor.substring(2, 4), HEX_RADIX) * percent + parseInt(endColor.substring(2, 4), HEX_RADIX) * (1 - percent)\n    );\n    const b = Math.ceil(\n      parseInt(startColor.substring(4, HEX_LENGTH), HEX_RADIX) * percent +\n        parseInt(endColor.substring(4, HEX_LENGTH), HEX_RADIX) * (1 - percent)\n    );\n\n    return `#${hex(r)}${hex(g)}${hex(b)}`;\n  }\n\n  /**\n   * Adds a tooltip to the given 'Leaflet' element\n   *\n   * @param element 'Leaflet' element to add the tooltip to\n   * @param tooltipContent Content of the tooltip to create\n   * @private\n   */\n  private addTooltip(element: L.Evented, tooltipContent: string) {\n    if (tooltipContent) {\n      let tooltip: L.Tooltip;\n      element\n        .on('mouseover', (e) => {\n          tooltip = L.tooltip({ direction: 'top' }).setContent(tooltipContent).setLatLng(e.latlng).openOn(this.map);\n        })\n        .on('mouseout', () => {\n          this.map.closeTooltip(tooltip);\n        });\n    }\n  }\n\n  /**\n   * Resolve theme color palette from CSS variables (same as Plotly)\n   */\n  private resolveThemePalette(palette: typeof SEQUENTIAL_ACCENT | typeof DIVERGENT_ACCENT = SEQUENTIAL_ACCENT): string[] {\n    const colors: string[] = [];\n\n    for (let i = 1; i <= 20; i++) {\n      const color = this.resolveSingleColor(i, palette);\n\n      if (!color) {\n        break;\n      }\n\n      colors.push(color);\n    }\n\n    // If no colors were found, it might be because CSS variables aren't loaded yet\n    // Return empty array and let the caller retry\n    if (colors.length === 0) {\n      console.warn(`No CSS variables found for palette: ${palette}-${this.colorMode()}. CSS may not be loaded yet.`);\n    }\n\n    return colors;\n  }\n\n  /**\n   * Resolve a single color from the theme palette\n   */\n  private resolveSingleColor(index: number, palette: typeof SEQUENTIAL_ACCENT | typeof DIVERGENT_ACCENT = SEQUENTIAL_ACCENT): string {\n    const paddedToken = String(index).padStart(2, '0');\n    const paddedVarName = `--mic-data-viz-${palette}-${this.colorMode()}-${paddedToken}`;\n    let color = this.getCSSVariable(paddedVarName);\n\n    if (!color) {\n      const normalizedVarName = `--mic-data-viz-${palette}-${this.colorMode()}-${index}`;\n      color = this.getCSSVariable(normalizedVarName);\n    }\n\n    return color;\n  }\n\n  /**\n   * Get CSS variable value with fallback and caching\n   */\n  private getCSSVariable(name: string): string {\n    // Check cache first\n    if (this.cssVariableCache.has(name)) {\n      return this.cssVariableCache.get(name) || '';\n    }\n\n    try {\n      let value = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n\n      // Convert rgb/rgba to hex if needed\n      if (value.startsWith('rgb')) {\n        value = this.rgbToHex(value);\n      }\n\n      // Cache the value\n      this.cssVariableCache.set(name, value);\n\n      // Track if we've found at least one CSS variable\n      if (value) {\n        this.cssVariablesAvailable = true;\n      }\n\n      return value || '';\n    } catch (error) {\n      console.warn(`Failed to get CSS variable: ${name}`, error);\n      return '';\n    }\n  }\n\n  /**\n   * Convert RGB/RGBA to hex color\n   */\n  private rgbToHex(rgb: string): string {\n    const regex = /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/;\n    const match = regex.exec(rgb);\n    if (!match) return rgb;\n\n    const r = Number.parseInt(match[1], 10);\n    const g = Number.parseInt(match[2], 10);\n    const b = Number.parseInt(match[3], 10);\n\n    return (\n      '#' +\n      [r, g, b]\n        .map((x) => {\n          const hex = x.toString(16);\n          return hex.length === 1 ? '0' + hex : hex;\n        })\n        .join('')\n    );\n  }\n\n  /**\n   * Interpolate color from a palette based on value and min/max range\n   */\n  private interpolateColor(value: number, min: number, max: number, palette: string[]): string {\n    if (palette.length === 0) {\n      return '#cccccc';\n    }\n    if (palette.length === 1) {\n      return palette[0];\n    }\n\n    // Normalize value to 0-1 range\n    const normalized = max > min ? (value - min) / (max - min) : 0;\n    const clamped = Math.max(0, Math.min(1, normalized));\n\n    // Find position in palette\n    const position = clamped * (palette.length - 1);\n    const lowerIndex = Math.floor(position);\n    const upperIndex = Math.ceil(position);\n\n    if (lowerIndex === upperIndex) {\n      return palette[lowerIndex];\n    }\n\n    // Interpolate between two colors\n    const localRatio = position - lowerIndex;\n    const blended = this.blendColors(palette[lowerIndex], palette[upperIndex], localRatio);\n\n    return blended;\n  }\n\n  /**\n   * Blend two hex colors\n   */\n  private blendColors(color1: string, color2: string, ratio: number): string {\n    const hex = (x: number): string => {\n      const v = Math.max(0, Math.min(255, Math.round(x)));\n      const s = v.toString(16);\n      return s.length === 1 ? '0' + s : s;\n    };\n\n    const r1 = Number.parseInt(color1.substring(1, 3), 16);\n    const g1 = Number.parseInt(color1.substring(3, 5), 16);\n    const b1 = Number.parseInt(color1.substring(5, 7), 16);\n\n    const r2 = Number.parseInt(color2.substring(1, 3), 16);\n    const g2 = Number.parseInt(color2.substring(3, 5), 16);\n    const b2 = Number.parseInt(color2.substring(5, 7), 16);\n\n    const r = r1 + (r2 - r1) * ratio;\n    const g = g1 + (g2 - g1) * ratio;\n    const b = b1 + (b2 - b1) * ratio;\n\n    return `#${hex(r)}${hex(g)}${hex(b)}`;\n  }\n\n  /**\n   * Load GeoJSON layers onto the map\n   * Used for displaying polygons, countries, regions, and other geographic features\n   * Supports choropleth maps and country-wise data visualization\n   *\n   * @private\n   */\n  private loadGeoJsonLayers(): void {\n    // Clean up existing GeoJSON layers\n    this.geoJsonInstances.forEach((geoJsonLayer: L.GeoJSON) => {\n      geoJsonLayer.remove();\n    });\n    this.geoJsonInstances = [];\n\n    // Remove existing legend if present\n    this.removeLegend();\n\n    // Add new GeoJSON layers if provided\n    const geoJsonLayersValue = this.geoJsonLayers();\n    if (!geoJsonLayersValue || geoJsonLayersValue.length === 0) {\n      return;\n    }\n\n    // Resolve theme palette once for all layers (choropleth only uses sequential)\n    const themePalette = this.resolveThemePalette(SEQUENTIAL_ACCENT);\n\n    // If palette is empty, CSS variables might not be loaded yet, retry\n    if (themePalette.length === 0) {\n      console.warn(\n        `[Choropleth] CSS variables not available yet (attempt ${\n          this.retryCount || 0\n        }). Palette: ${SEQUENTIAL_ACCENT}-${this.colorMode()}. Retrying...`\n      );\n\n      // Initialize retry count if needed\n      if (!this.retryCount) {\n        this.retryCount = 0;\n      }\n      this.retryCount++;\n\n      // Increase delay on each retry: 200ms -> 400ms -> 600ms\n      const retryDelay = Math.min(600, 200 + this.retryCount * 200);\n\n      setTimeout(() => {\n        // Clear the cache to force re-reading CSS variables\n        this.cssVariableCache.clear();\n        this.cssVariablesAvailable = false;\n        this.loadGeoJsonLayers();\n      }, retryDelay);\n      return;\n    }\n\n    // Reset retry count on success\n    this.retryCount = 0;\n\n    // Track if we need to create a legend\n    let legendData: { min: number; max: number; palette: string[]; label?: string } | null = null;\n\n    geoJsonLayersValue.forEach((geoJsonLayer: MapGeoJSONLayer) => {\n      if (geoJsonLayer.data) {\n        // Determine if this is a choropleth layer (has dataMap)\n        const isChoropleth = geoJsonLayer.dataMap && Object.keys(geoJsonLayer.dataMap).length > 0;\n\n        let styleFunction = geoJsonLayer.style;\n\n        if (isChoropleth && themePalette.length > 0) {\n          // Calculate min/max values for color scaling\n          const values = Object.values(geoJsonLayer.dataMap);\n          const minValue = geoJsonLayer.zmin ?? Math.min(...values, 0);\n          const maxValue = geoJsonLayer.zmax ?? Math.max(...values);\n\n          // Store legend data for the first choropleth layer\n          if (!legendData) {\n            legendData = {\n              min: minValue,\n              max: maxValue,\n              palette: themePalette,\n              label: geoJsonLayer.label\n            };\n          }\n\n          // Create a choropleth style function that captures the palette and data\n          // This ensures colors persist when panning the map\n          styleFunction = (feature: any) => {\n            // Get the feature's property value for matching with dataMap\n            const featureName = feature?.properties?.[geoJsonLayer.featurePropertyKey || 'ADMIN'];\n            const dataValue = featureName ? geoJsonLayer.dataMap[featureName] ?? 0 : 0;\n\n            // Interpolate color based on value\n            const fillColor = this.interpolateColor(dataValue, minValue, maxValue, themePalette);\n            // Apply custom style on top if provided\n            const customStyle = geoJsonLayer.style ? geoJsonLayer.style(feature) : {};\n\n            return {\n              fillColor: fillColor,\n              weight: 1,\n              opacity: 1,\n              color: 'white', // White borders like Plotly\n              fillOpacity: 0.95, // Higher opacity for vibrant colors like Plotly\n              ...customStyle // Allow custom style to override defaults\n            };\n          };\n        }\n\n        const leafletGeoJson = L.geoJSON(geoJsonLayer.data, {\n          style: styleFunction,\n          onEachFeature: (feature: any, layer: L.Layer) => {\n            // Call user's onEachFeature if provided, passing the GeoJSON layer for style resets\n            if (geoJsonLayer.onEachFeature) {\n              geoJsonLayer.onEachFeature(feature, layer);\n            }\n          }\n        });\n\n        leafletGeoJson.addTo(this.map);\n        this.geoJsonInstances.push(leafletGeoJson);\n      }\n    });\n\n    // Add legend if we have choropleth data\n    if (legendData) {\n      this.addLegend(legendData.min, legendData.max, legendData.palette, legendData.label);\n    }\n  }\n\n  /**\n   * Create and add a legend control to the map\n   *\n   * @param min Minimum data value\n   * @param max Maximum data value\n   * @param palette Array of color hex codes\n   * @param label Optional label for the legend\n   * @private\n   */\n  private addLegend(min: number, max: number, palette: string[], label?: string): void {\n    // Guard against adding legend to destroyed/invalid map\n    if (!this.map || !(this.map as MapWithPanes)._panes) {\n      return;\n    }\n\n    // Remove existing legend if present\n    this.removeLegend();\n\n    // Create custom legend control\n    const legend = new (L.Control as any)({ position: 'bottomright' });\n\n    legend.onAdd = () => {\n      const div = L.DomUtil.create('div', 'info legend');\n\n      // Add title if label is provided and not empty\n      if (label && label.trim().length > 0) {\n        div.innerHTML += `<div class=\"legend-title\">${label}</div>`;\n      }\n\n      // Create vertical gradient bar with intermediate labels\n      // Reverse palette so dark colors (high values) appear at top, light colors (low values) at bottom\n      const reversedPalette = [...palette].reverse();\n      const gradientStops = reversedPalette\n        .map((color, i) => {\n          const percent = (i / (reversedPalette.length - 1)) * 100;\n          return `${color} ${percent}%`;\n        })\n        .join(', ');\n\n      // Generate nice round step values for labels\n      let niceSteps = this.calculateNiceSteps(min, max, 10);\n      // Ensure min and max are included\n      if (niceSteps[0] !== min) {\n        niceSteps = [min, ...niceSteps];\n      }\n      if (niceSteps.at(-1) !== max) {\n        niceSteps = [...niceSteps, max];\n      }\n      // Remove duplicates and sort descending for legend\n      niceSteps = Array.from(new Set(niceSteps)).sort((a, b) => b - a);\n      const labels = niceSteps.map((v) => `<div class=\"legend-label\">${this.formatLegendValue(v)}</div>`);\n\n      div.innerHTML += `\n        <div class=\"legend-scale\">\n          <div class=\"legend-labels\">\n            ${labels.join('')}\n          </div>\n          <div class=\"legend-gradient\" style=\"background: linear-gradient(to bottom, ${gradientStops});\"></div>\n        </div>\n      `;\n\n      return div;\n    };\n\n    legend.addTo(this.map);\n    this.legendControl = legend;\n  }\n\n  /**\n   * Remove the legend control from the map\n   * @private\n   */\n  private removeLegend(): void {\n    if (this.legendControl) {\n      this.legendControl.remove();\n      this.legendControl = null;\n    }\n  }\n\n  /**\n   * Calculate nice round step values for legend labels\n   * @param min Minimum value\n   * @param max Maximum value\n   * @param desiredSteps Desired number of steps (approximate)\n   * @returns Array of nice round values\n   * @private\n   */\n  private calculateNiceSteps(min: number, max: number, desiredSteps: number): number[] {\n    const range = max - min;\n\n    // Calculate rough step size\n    const roughStep = range / (desiredSteps - 1);\n\n    // Find the magnitude (power of 10)\n    const magnitude = Math.pow(10, Math.floor(Math.log10(roughStep)));\n\n    // Round to nice numbers with adjusted thresholds to prefer smaller intervals\n    // This ensures we get 10K intervals for data in the 0-100K range\n    const normalizedStep = roughStep / magnitude;\n    let niceStep: number;\n\n    if (normalizedStep <= 1.5) {\n      niceStep = 1 * magnitude;\n    } else if (normalizedStep <= 3) {\n      niceStep = 2 * magnitude;\n    } else if (normalizedStep <= 7) {\n      niceStep = 5 * magnitude;\n    } else {\n      niceStep = 10 * magnitude;\n    }\n\n    // Round min down to nearest nice step\n    const niceMin = Math.floor(min / niceStep) * niceStep;\n\n    // Generate steps\n    const steps: number[] = [];\n    let current = niceMin;\n\n    while (current <= max) {\n      steps.push(current);\n      current += niceStep;\n    }\n\n    // Ensure we have at least a few steps\n    if (steps.length < 3) {\n      // If too few steps, try with half the step size\n      const smallerStep = niceStep / 2;\n      const smallerMin = Math.floor(min / smallerStep) * smallerStep;\n      const smallerSteps: number[] = [];\n      current = smallerMin;\n\n      while (current <= max) {\n        smallerSteps.push(current);\n        current += smallerStep;\n      }\n\n      return smallerSteps;\n    }\n\n    return steps;\n  }\n\n  /**\n   * Format a numeric value for display in the legend\n   * @param value The value to format (already rounded by calculateNiceSteps)\n   * @returns Formatted string with K/M suffix\n   * @private\n   */\n  private formatLegendValue(value: number): string {\n    const absValue = Math.abs(value);\n\n    // Format with K/M suffix\n    if (absValue >= 1000000) {\n      return value / 1000000 + 'M';\n    } else if (absValue >= 1000) {\n      return value / 1000 + 'K';\n    } else {\n      return value.toString();\n    }\n  }\n}\n","<div class=\"map-container\" [ngStyle]=\"{ height: height() }\">\n  <div [id]=\"id\" class=\"map\" [class.dark]=\"darkTheme() && layerSupportDarkmode\"></div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { MapComponent } from './map.component';\n\n/**\n *\n * <b>Requirements: </b>\n *\n * For standalone components, you can now import MapComponent directly:\n *\n * <code>import { MapComponent } from '@michelin/maps';</code>\n *\n * For legacy module-based imports:\n *\n * <code>import { MapModule } from '@michelin/maps';</code>\n */\n@NgModule({\n  imports: [MapComponent],\n  exports: [MapComponent]\n})\nexport class MapModule {}\n","/**\n * Choropleth Map Helper Utilities\n *\n * This module provides helper functions for working with choropleth maps.\n *\n * Usage Example:\n * ```typescript\n * import { processCountryData, MapGeoJSONLayer } from '@michelin/maps';\n *\n * // 1. Load your data\n * const response = await fetch('api/country-data');\n * const apiData = await response.json();\n *\n * // 2. Process with helper (handles country name normalization)\n * const countryData = processCountryData(apiData);\n *\n * // 3. Create choropleth layer\n * const layer = new MapGeoJSONLayer({\n *   data: geoJsonData,\n *   dataMap: countryData,\n *   featurePropertyKey: 'name',\n *   zmin: 0\n * });\n *\n * // 4. Pass to map component - it handles all coloring automatically!\n * ```\n */\n\n// Normalized country name constants to avoid duplication\nconst UNITED_STATES = 'United States of America';\nconst UNITED_KINGDOM = 'United Kingdom';\nconst UNITED_ARAB_EMIRATES = 'United Arab Emirates';\nconst RUSSIA = 'Russia';\nconst VIETNAM = 'Vietnam';\nconst CZECHIA = 'Czechia';\nconst CZECH_REPUBLIC = 'Czech Republic';\nconst SOUTH_KOREA = 'South Korea';\nconst REPUBLIC_OF_KOREA = 'Republic of Korea';\nconst NORTH_KOREA = 'North Korea';\nconst DEM_REP_KOREA = 'Dem. Rep. Korea';\nconst DEMOCRATIC_REPUBLIC_OF_CONGO = 'Democratic Republic of the Congo';\nconst REPUBLIC_OF_CONGO = 'Republic of the Congo';\nconst SERBIA = 'Serbia';\nconst BOSNIA_AND_HERZ = 'Bosnia and Herz.';\nconst MACEDONIA = 'Macedonia';\n\n/**\n * Normalize country names from various API formats to match GeoJSON property names\n * This helps match data from different sources to the standard country names in GeoJSON files\n *\n * @param apiName - Country name from API (e.g., \"USA\", \"UK\", \"Russian Federation\")\n * @returns Normalized country name matching GeoJSON properties (e.g., \"United States of America\", \"United Kingdom\", \"Russia\")\n */\nexport function normalizeCountryName(apiName: string): string {\n  const nameMap: { [key: string]: string } = {\n    [UNITED_STATES]: UNITED_STATES,\n    'USA': UNITED_STATES,\n    'US': UNITED_STATES,\n    'UK': UNITED_KINGDOM,\n    'UAE': UNITED_ARAB_EMIRATES,\n    [RUSSIA]: RUSSIA,\n    'Russian Federation': RUSSIA,\n    [VIETNAM]: VIETNAM,\n    'Viet Nam': VIETNAM,\n    [CZECH_REPUBLIC]: CZECHIA,\n    [CZECHIA]: CZECH_REPUBLIC,\n    'Korea, South': SOUTH_KOREA,\n    [SOUTH_KOREA]: REPUBLIC_OF_KOREA,\n    'Korea, North': NORTH_KOREA,\n    [NORTH_KOREA]: DEM_REP_KOREA,\n    'Congo (Kinshasa)': DEMOCRATIC_REPUBLIC_OF_CONGO,\n    'Congo (Brazzaville)': REPUBLIC_OF_CONGO,\n    'Republic of Serbia': SERBIA,\n    'Bosnia and Herzegovina': BOSNIA_AND_HERZ,\n    [MACEDONIA]: MACEDONIA\n  };\n\n  return nameMap[apiName] || apiName;\n}\n\n/**\n * Process country data from an API response\n *\n * Expects response with structure:\n * ```json\n * {\n *   \"count_by_country\": [\n *     { \"country\": \"USA\", \"count\": 90000 },\n *     { \"country\": \"China\", \"count\": 95000 }\n *   ]\n * }\n * ```\n *\n * @param apiResponse - API response object with count_by_country array\n * @returns Normalized country data map { [countryName]: value }\n *\n * @example\n * ```typescript\n * const response = await fetch('assets/sample-map-data.json');\n * const apiResponse = await response.json();\n * const countryData = processCountryData(apiResponse);\n * // Returns: { \"United States of America\": 90000, \"China\": 95000, ... }\n * ```\n */\nexport function processCountryData(apiResponse: any): { [key: string]: number } {\n  const countryData: { [key: string]: number } = {};\n\n  if (!apiResponse) {\n    return countryData;\n  }\n\n  if (apiResponse.count_by_country && Array.isArray(apiResponse.count_by_country)) {\n    apiResponse.count_by_country.forEach((item: any) => {\n      if (item.country && item.count != null) {\n        const normalizedName = normalizeCountryName(item.country);\n        countryData[normalizedName] = item.count;\n      }\n    });\n  }\n\n  return countryData;\n}\n","/// <reference types=\"leaflet\" />\n/// <reference types=\"leaflet.markercluster\" />\n\n/*\n * Public API Surface of maps library\n */\nexport { MapModule } from './lib/map.module';\nexport { MapLayer, MapMarker, MapMarkerClusterConfig, MapOptions, MapTrip, MapMode, MapPoint, MapGeoJSONLayer } from './lib/map.model';\nexport { MapComponent } from './lib/map.component';\nexport { normalizeCountryName, processCountryData } from './lib/choropleth.helper';\n\n// Re-export Leaflet and its extended types\nimport * as L from 'leaflet';\nimport 'leaflet.markercluster';\nexport { L };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["LeafletPoint"],"mappings":"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"}