@unovis/ts 1.6.6-beta.0 → 1.6.6-stellar.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/axis/config.d.ts +7 -10
- package/components/axis/config.js +1 -1
- package/components/axis/config.js.map +1 -1
- package/components/axis/index.d.ts +0 -1
- package/components/axis/index.js +53 -44
- package/components/axis/index.js.map +1 -1
- package/components/axis/style.d.ts +38 -2
- package/components/axis/style.js +24 -28
- package/components/axis/style.js.map +1 -1
- package/components/brush/config.d.ts +0 -3
- package/components/brush/config.js +1 -1
- package/components/brush/config.js.map +1 -1
- package/components/brush/index.d.ts +0 -1
- package/components/brush/index.js +3 -7
- package/components/brush/index.js.map +1 -1
- package/components/crosshair/config.d.ts +0 -2
- package/components/crosshair/config.js +1 -1
- package/components/crosshair/config.js.map +1 -1
- package/components/crosshair/index.d.ts +0 -2
- package/components/crosshair/index.js +1 -8
- package/components/crosshair/index.js.map +1 -1
- package/components/sankey/config.d.ts +0 -2
- package/components/sankey/config.js +1 -1
- package/components/sankey/config.js.map +1 -1
- package/components/sankey/index.d.ts +2 -2
- package/components/sankey/index.js +5 -12
- package/components/sankey/index.js.map +1 -1
- package/components/sankey/types.d.ts +0 -4
- package/components/sankey/types.js +2 -7
- package/components/sankey/types.js.map +1 -1
- package/components/scatter/index.js +0 -2
- package/components/scatter/index.js.map +1 -1
- package/components/timeline/config.d.ts +1 -5
- package/components/timeline/config.js +2 -2
- package/components/timeline/config.js.map +1 -1
- package/components/timeline/index.d.ts +2 -2
- package/components/timeline/index.js +31 -64
- package/components/timeline/index.js.map +1 -1
- package/components/timeline/style.d.ts +1 -6
- package/components/timeline/style.js +46 -40
- package/components/timeline/style.js.map +1 -1
- package/components/topojson-map/index.d.ts +2 -2
- package/components/topojson-map/index.js +24 -5
- package/components/topojson-map/index.js.map +1 -1
- package/index.js +1 -1
- package/package.json +1 -1
- package/types.js +1 -1
- package/utils/text.js +2 -6
- package/utils/text.js.map +1 -1
- package/types/style.d.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/topojson-map/index.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { D3ZoomEvent, zoom, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { timeout } from 'd3-timer'\nimport { easeCubicInOut } from 'd3-ease'\nimport { geoPath, GeoProjection, ExtendedFeatureCollection } from 'd3-geo'\nimport { color } from 'd3-color'\nimport { packSiblings } from 'd3-hierarchy'\nimport { feature } from 'topojson-client'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { MapGraphDataModel } from 'data-models/map-graph'\n\n// Utils\nimport { clamp, getNumber, getString, isNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor, hexToBrightness } from 'utils/color'\nimport { getCSSVariableValue, isStringCSSVariable } from 'utils/misc'\nimport { trimStringMiddle } from 'utils/text'\n// Types\nimport { MapLink } from 'types/map'\nimport { GenericDataRecord } from 'types/data'\nimport Supercluster, { PointFeature, ClusterFeature } from 'supercluster'\nimport { NumericAccessor, ColorAccessor, StringAccessor } from 'types/accessor'\n\n// Local Types\nimport {\n MapData,\n MapFeature,\n MapPointLabelPosition,\n MapProjection,\n TopoJSONMapPointShape,\n FlowParticle,\n TopoJSONMapPoint,\n TopoJSONMapClusterDatum,\n TopoJSONMapPointDatum,\n TopoJSONMapPieDatum,\n ExpandedClusterPoint,\n CollapsedClusterFeature,\n PointOrClusterProperties,\n} from './types'\n\n// Config\nimport { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config'\n\n// Modules\nimport {\n arc,\n getLonLat,\n getDonutData,\n getPointPathData,\n collideAreaLabels,\n collidePointBottomLabels,\n getPointRadius,\n calculateClusterIndex,\n getClustersAndPoints,\n geoJsonPointToScreenPoint,\n getNextZoomLevelOnClusterClick,\n getClusterRadius,\n PackedPoint,\n} from './utils'\nimport { updateDonut } from './modules/donut'\nimport { renderBackground } from './modules/background'\nimport { updateSelectionRing } from './modules/selectionRing'\nimport { initFlowFeatures, updateFlowParticles, FlowInitContext, FlowUpdateContext } from './modules/flow'\n\n// Styles\nimport * as s from './style'\n\n// Supercluster expects zoom levels 0-22 (like map tiles). zoomExtent[1] is a scale factor\n// for the map, so we cap the cluster maxZoom to avoid excessive quadtree depth and wrong\n// packing/expansion behavior when zoomExtent has large values (e.g. 1000).\nconst SUPERCLUSTER_MAX_ZOOM = 22\n\nexport class TopoJSONMap<\n AreaDatum,\n PointDatum = GenericDataRecord,\n LinkDatum = GenericDataRecord,\n> extends ComponentCore<\n MapData<AreaDatum, PointDatum, LinkDatum>,\n TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n > {\n static selectors = s\n protected _defaultConfig = TopoJSONMapDefaultConfig as TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n public config: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum> = this._defaultConfig\n\n datamodel: MapGraphDataModel<AreaDatum, PointDatum, LinkDatum> = new MapGraphDataModel()\n g: Selection<SVGGElement, unknown, null, undefined>\n private _firstRender = true\n private _isResizing = false\n private _initialScale: number = undefined\n private _center: [number, number]\n private _currentZoomLevel: number = undefined\n private _transform: ZoomTransform = zoomIdentity\n private _path = geoPath()\n private _projection: GeoProjection\n private _prevWidth: number\n private _prevHeight: number\n private _animFrameId: number\n private _isZooming = false\n private _zoomEndTimeoutId: ReturnType<typeof setTimeout>\n private _collisionDetectionAnimFrameId: ReturnType<typeof requestAnimationFrame>\n private _clusterIndex: Supercluster<PointDatum> | null = null\n private _expandedCluster: {\n cluster: TopoJSONMapPoint<PointDatum>;\n points: ExpandedClusterPoint<PointDatum>[];\n } | null = null\n\n private _collapsedCluster: CollapsedClusterFeature<PointDatum> | null = null\n private _collapsedClusterPointIds: Set<string> | null = null\n private _prevZoomToLocation: { coordinates: [number, number]; zoomLevel: number; expandCluster?: boolean } | undefined = undefined\n\n private _eventInitiatedByComponent = false\n\n private _featureCollection: GeoJSON.FeatureCollection\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown> = zoom()\n private _backgroundRect = this.g.append('rect').attr('class', s.background)\n private _featuresGroup = this.g.append('g').attr('class', s.features)\n private _areaLabelsGroup = this.g.append('g').attr('class', s.areaLabel)\n private _linksGroup = this.g.append('g').attr('class', s.links)\n private _clusterBackgroundGroup = this.g.append('g').attr('class', s.clusterBackground)\n private _pointsGroup = this.g.append('g').attr('class', s.points)\n private _pointSelectionRing = this._pointsGroup.append('g').attr('class', s.pointSelectionRing)\n .call(sel => sel.append('path').attr('class', s.pointSelection))\n\n private _selectedPoint: TopoJSONMapPoint<PointDatum> | null = null\n private _flowParticlesGroup = this.g.append('g').attr('class', s.flowParticles)\n private _sourcePointsGroup = this.g.append('g').attr('class', s.sourcePoints)\n private _flowParticles: FlowParticle[] = []\n private _sourcePoints: { x: number; y: number; radius: number; color: string; flowData: LinkDatum }[] = []\n private _animationId: number | null = null\n\n events = {\n [TopoJSONMap.selectors.point]: {},\n [TopoJSONMap.selectors.feature]: {},\n }\n\n constructor (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>, data?: MapData<AreaDatum, PointDatum, LinkDatum>) {\n super()\n this._zoomBehavior\n .on('zoom', this._onZoom.bind(this))\n .on('end', this._onZoomEnd.bind(this))\n\n if (config) this.setConfig(config)\n if (data) this.setData(data)\n\n this.g.append('defs')\n .append('filter')\n .attr('id', 'heatmapFilter')\n .html(`\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"${this.config.heatmapModeBlurStdDeviation}\" color-interpolation-filters=\"sRGB\" result=\"blur\"></feGaussianBlur>\n <feColorMatrix class=\"blurValues\" in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -4\"></feColorMatrix>\n `)\n }\n\n setData (data: MapData<AreaDatum, PointDatum, LinkDatum>): void {\n const { config } = this\n\n this.datamodel.pointId = config.pointId\n this.datamodel.linkSource = config.linkSource\n this.datamodel.linkTarget = config.linkTarget\n this.datamodel.data = data\n\n // Reset expanded cluster when data changes\n this._resetExpandedCluster()\n\n // Initialize clustering if enabled\n if (config.clustering && data.points?.length) {\n const dataValid = data.points.filter(d => {\n const lat = getNumber(d, config.latitude)\n const lon = getNumber(d, config.longitude)\n return isNumber(lat) && isNumber(lon)\n })\n const zoomExtent = this.config.zoomExtent\n const maxClusterZoomLevel = Array.isArray(zoomExtent) ? Math.min(zoomExtent[1], SUPERCLUSTER_MAX_ZOOM) : 16\n this._clusterIndex = calculateClusterIndex(dataValid, this.config, maxClusterZoomLevel)\n } else {\n this._clusterIndex = null\n }\n\n // If there was a data change and mapFitToPoints is enabled, we will need to re-fit the map\n this._firstRender = this._firstRender || config.mapFitToPoints\n }\n\n setConfig (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>): void {\n super.setConfig(config)\n\n // Setting the default here instead of defaultConfig to prevent mutation from other TopoJSONMap instances\n const newProjection = this.config.projection ?? MapProjection.Kavrayskiy7()\n if (this._projection) {\n newProjection.scale(this._projection.scale()).translate(this._projection.translate())\n }\n this._projection = newProjection\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n this._renderBackground()\n this._renderMap(duration)\n this._renderAreaLabels(duration)\n this._renderGroups(duration)\n this._renderLinks(duration)\n this._renderClusterBackground(duration)\n this._renderPoints(duration)\n\n // Flow features\n if (config.enableFlowAnimation) {\n this._initFlowFeatures()\n this._renderSourcePoints(duration)\n this._renderFlowParticles(duration)\n this._startFlowAnimation()\n } else {\n this._stopFlowAnimation()\n }\n\n // When animation is running we need to temporary disable zoom behaviour\n if (duration && !config.disableZoom) {\n this.g.on('.zoom', null)\n timeout(() => {\n this.g.call(this._zoomBehavior)\n }, duration)\n }\n\n // When zoom behaviour is active we assign the `draggable` class to show the grabbing cursor\n this.g.classed('draggable', !config.disableZoom)\n this._firstRender = false\n\n // Apply zoomToLocation if it changed\n if (config.zoomToLocation) {\n const hasChanged = !this._prevZoomToLocation ||\n this._prevZoomToLocation.coordinates[0] !== config.zoomToLocation.coordinates[0] ||\n this._prevZoomToLocation.coordinates[1] !== config.zoomToLocation.coordinates[1] ||\n this._prevZoomToLocation.zoomLevel !== config.zoomToLocation.zoomLevel ||\n this._prevZoomToLocation.expandCluster !== config.zoomToLocation.expandCluster\n\n if (hasChanged) {\n this._prevZoomToLocation = { ...config.zoomToLocation }\n\n // If expandCluster is true, find and expand the cluster at/near the coordinates\n if (config.zoomToLocation.expandCluster) {\n const cluster = this._findClusterAtCoordinates(config.zoomToLocation.coordinates)\n if (cluster) {\n this._expandCluster(cluster)\n }\n }\n\n this._zoomToLocation(config.zoomToLocation.coordinates, config.zoomToLocation.zoomLevel)\n }\n } else {\n this._prevZoomToLocation = undefined\n }\n\n // Run collision detection after initial render\n if (!this._isZooming) {\n this._runCollisionDetection()\n }\n }\n\n _renderBackground (): void {\n renderBackground(\n this._backgroundRect,\n this.bleed.left,\n this.bleed.top,\n () => this._collapseExpandedCluster()\n )\n }\n\n _renderGroups (duration: number): void {\n const transformString = this._transform.toString()\n smartTransition(this._featuresGroup, duration)\n .attr('transform', transformString)\n .attr('stroke-width', 1 / this._currentZoomLevel)\n\n smartTransition(this._areaLabelsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._linksGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._clusterBackgroundGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._pointsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._sourcePointsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._flowParticlesGroup, duration)\n .attr('transform', transformString)\n }\n\n _renderMap (duration: number): void {\n const { bleed, config, datamodel } = this\n\n this.g.attr('transform', `translate(${bleed.left}, ${bleed.top})`)\n const mapData: TopoJSON.Topology = config.topojson\n const featureName = config.mapFeatureName\n const featureObject = mapData?.objects?.[featureName]\n if (!featureObject) return\n\n this._featureCollection = feature(mapData, featureObject) as GeoJSON.FeatureCollection\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n if (this._firstRender) {\n // Rendering the map for the first time.\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n\n if (config.mapFitToPoints) {\n // Re-fit projection to points instead of full topojson\n this._fitToPoints()\n }\n\n // After initial fit (to features or points), treat the current projection\n // scale as the baseline for zoom level 1.\n this._initialScale = this._projection.scale()\n this._center = this._projection.translate()\n\n const zoomExtent = config.zoomExtent\n this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale])\n this._currentZoomLevel = config.zoomFactor || 1\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n\n if (!config.disableZoom) {\n this.g.call(this._zoomBehavior)\n this._applyZoom()\n }\n\n // Initialize transform for first render after applyZoom\n const scale = this._currentZoomLevel\n const center = this._projection.translate()\n this._transform = zoomIdentity\n .translate(this._center[0] - center[0] * scale, this._center[1] - center[1] * scale)\n .scale(scale)\n\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n if (this._prevWidth !== this._width || this._prevHeight !== this._height) {\n this._onResize()\n }\n\n\n this._path.projection(this._projection)\n\n // Merge passed area data and map feature data\n const areaData = datamodel.areas\n areaData.forEach(a => {\n const feature = featureData.find(f => f.id.toString() === getString(a, config.areaId).toString())\n if (feature) feature.data = a\n else if (this._firstRender) console.warn(`Can't find feature by area code ${getString(a, config.areaId)}`)\n })\n\n const features = this._featuresGroup\n .selectAll<SVGPathElement, unknown>(`.${s.feature}`)\n .data(featureData)\n\n const featuresEnter = features.enter().append('path').attr('class', s.feature)\n const featuresMerged = featuresEnter.merge(features)\n\n // Animate geometry changes, but apply fill immediately to avoid \"delay then jump\"\n smartTransition(featuresMerged, duration)\n .attr('d', this._path)\n .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null)\n\n // Set fill directly so color updates are instantaneous instead of snapping at the end of a transition\n featuresMerged.style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null)\n\n // Add click handler to collapse expanded cluster when clicking on map features\n featuresMerged.on('click', () => {\n this._collapseExpandedCluster()\n })\n\n features.exit().remove()\n }\n\n _renderAreaLabels (duration: number): void {\n const { config } = this\n\n // Early return if no area label configuration\n if (!config.areaLabel) {\n this._areaLabelsGroup.selectAll('*').remove()\n return\n }\n\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n // Prepare candidate labels with optimized filtering and calculations\n const candidateLabels = featureData\n .map(feature => {\n // Use area data if present, otherwise fall back to GeoJSON properties\n const areaDatum = feature.data || feature.properties\n const labelText = areaDatum ? getString(areaDatum as AreaDatum, config.areaLabel) : null\n if (!labelText) return null\n\n const centroid = this._path.centroid(feature)\n\n // Skip if centroid is invalid (e.g., for very small or complex shapes)\n if (!centroid || centroid.some(coord => !isFinite(coord))) return null\n\n const bounds = this._path.bounds(feature)\n const area = (bounds[1][0] - bounds[0][0]) * (bounds[1][1] - bounds[0][1])\n\n return {\n feature,\n centroid,\n area,\n labelText,\n id: feature.data ? getString(feature.data, config.areaId) : feature.id?.toString(),\n }\n })\n .filter(Boolean) // Remove null entries\n .sort((a, b) => b.area - a.area) // Prioritize larger areas\n\n // D3 data binding with improved key function\n const labels = this._areaLabelsGroup\n .selectAll<SVGTextElement, typeof candidateLabels[0]>(`.${s.areaLabel}`)\n .data(candidateLabels, d => d.id || '')\n\n // Handle entering labels\n const labelsEnter = labels.enter()\n .append('text')\n .attr('class', s.areaLabel)\n .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`)\n .style('opacity', 0)\n .style('pointer-events', 'none')\n\n // Update all labels (enter + update)\n const labelsMerged = labelsEnter.merge(labels)\n labelsMerged\n .text(d => d.labelText)\n .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`)\n .style('font-size', `calc(var(${s.variables.mapPointLabelFontSize}) / ${this._currentZoomLevel})`)\n .style('text-anchor', 'middle')\n .style('dominant-baseline', 'middle')\n\n // Handle exiting labels\n smartTransition(labels.exit(), duration)\n .style('opacity', 0)\n .remove()\n\n // Only update opacity after zoom completes\n if (!this._isZooming) {\n smartTransition(labelsMerged, duration)\n .style('opacity', 1)\n }\n }\n\n _renderClusterBackground (duration: number): void {\n const { config } = this\n const currentZoomLevel = this._currentZoomLevel || 1\n\n // Always remove existing background circles first\n this._clusterBackgroundGroup.selectAll('circle').remove()\n\n if (this._expandedCluster && config.clusterBackground) {\n const cluster = this._expandedCluster.cluster\n const pos = this._projection(cluster.geometry.coordinates as [number, number])\n\n const backgroundRadius = getClusterRadius(this._expandedCluster as { points: PackedPoint[]; cluster: TopoJSONMapPoint<PointDatum> })\n // Divide by zoom level since the group transform will scale it back up\n const adjustedRadius = backgroundRadius / currentZoomLevel\n\n this._clusterBackgroundGroup\n .append('circle')\n .attr('class', s.clusterBackgroundCircle)\n .attr('cx', pos[0])\n .attr('cy', pos[1])\n .attr('r', 0)\n .style('fill', `var(${s.variables.mapClusterExpandedBackgroundFillColor})`)\n .style('opacity', 0)\n .style('cursor', 'pointer')\n .on('click', () => {\n this._collapseExpandedCluster()\n })\n .transition()\n .duration(duration)\n .attr('r', adjustedRadius)\n .style('opacity', 0.7)\n }\n }\n\n _renderLinks (duration: number): void {\n const { config, datamodel } = this\n const links = datamodel.links\n\n const edges = this._linksGroup\n .selectAll<SVGPathElement, MapLink<PointDatum, LinkDatum>>(`.${s.link}`)\n .data(links, (d, i) => getString(d, config.linkId, i))\n\n const edgesEnter = edges.enter().append('path').attr('class', s.link)\n .style('stroke-width', 0)\n\n smartTransition(edgesEnter.merge(edges), duration)\n .attr('d', link => {\n const source = this._projection(getLonLat(link.source, config.longitude, config.latitude))\n const target = this._projection(getLonLat(link.target, config.longitude, config.latitude))\n return arc(source, target)\n })\n .style('stroke-width', link => getNumber(link, config.linkWidth) / this._currentZoomLevel)\n .style('cursor', link => getString(link, config.linkCursor))\n .style('stroke', (link, i) => getColor(link, config.linkColor, i))\n edges.exit().remove()\n }\n\n private _shouldFilterPointOrCluster (point: TopoJSONMapPoint<PointDatum>, pointIdsToFilter: Set<string>): boolean {\n const { config } = this\n\n // If it's a cluster (potential subcluster), check if any of its leaves should be filtered\n if ((point.properties as TopoJSONMapClusterDatum<PointDatum>).cluster) {\n const clusterId = (point.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId\n const clusterLeaves = this._clusterIndex.getLeaves(clusterId, Infinity)\n // Filter out this subcluster if any of its leaves are in the filter set\n return clusterLeaves.some((leaf: PointFeature<PointDatum>) =>\n pointIdsToFilter.has(getString(leaf.properties as PointDatum, config.pointId))\n )\n }\n\n // For individual points, filter if they're in the filter set\n const pointId = getString(point.properties as PointDatum, config.pointId)\n return pointIdsToFilter.has(pointId)\n }\n\n private _getPointData (): TopoJSONMapPoint<PointDatum>[] {\n const { config, datamodel } = this\n\n if (!config.clustering || !this._clusterIndex) {\n // Return regular points when clustering is disabled\n return datamodel.points.map((d, i) => {\n const pos = this._projection(getLonLat(d, config.longitude, config.latitude))\n const radius = getNumber(d, config.pointRadius)\n const shape = getString(d, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const donutData = getDonutData(d, config.colorMap)\n const pointColor = getColor(d, config.pointColor, i)\n\n return {\n geometry: { type: 'Point', coordinates: getLonLat(d, config.longitude, config.latitude) },\n bbox: { x1: pos[0] - radius, y1: pos[1] - radius, x2: pos[0] + radius, y2: pos[1] + radius },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(d, config.pointId, i),\n properties: d as TopoJSONMapPointDatum<PointDatum>,\n donutData,\n isCluster: false,\n _zIndex: 0,\n } as TopoJSONMapPoint<PointDatum>\n })\n }\n\n // Get bounds for clustering - [westLng, southLat, eastLng, northLat]\n // For now, use full world bounds since calculating viewport bounds with zoom transforms is complex\n const bounds: [number, number, number, number] = [-180, -90, 180, 90]\n\n // Use map zoom level directly for Supercluster, capped at SUPERCLUSTER_MAX_ZOOM.\n // Supercluster expects zoom 0-22; beyond that, all points are unclustered anyway.\n const mapZoom = this._currentZoomLevel || 1\n const zoom = Math.max(0, Math.min(Math.round(mapZoom), SUPERCLUSTER_MAX_ZOOM))\n let geoJsonPoints = getClustersAndPoints(this._clusterIndex!, bounds, zoom)\n\n // Handle expanded cluster points - replace the expanded cluster with individual points\n if (this._expandedCluster) {\n const expandedClusterId = (this._expandedCluster.cluster.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId\n\n // Remove the expanded cluster if it still exists at this zoom level\n geoJsonPoints = geoJsonPoints.filter((c) => {\n const props = c.properties as TopoJSONMapClusterDatum<PointDatum>\n const isExpandedCluster = props.cluster && props.clusterId === expandedClusterId\n return !isExpandedCluster\n })\n\n // Remove any individual points and subclusters that are part of the expanded cluster to avoid duplicates\n const expandedPointIds = new Set(this._expandedCluster.points.map(p => p.id.toString()))\n geoJsonPoints = geoJsonPoints.filter(c => !this._shouldFilterPointOrCluster(\n geoJsonPointToScreenPoint(\n c as ClusterFeature<TopoJSONMapClusterDatum<PointDatum>> | PointFeature<TopoJSONMapPointDatum<PointDatum>>,\n 0,\n this._projection,\n this.config,\n this._currentZoomLevel || 1\n ),\n expandedPointIds\n ))\n\n // Add points from the expanded cluster\n geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points as unknown as Array<ClusterFeature<TopoJSONMapClusterDatum<PointDatum>> | PointFeature<PointDatum>>)\n }\n\n if (this._collapsedCluster) {\n // When collapsed, restore the original cluster point instead of relying on clustering algorithm\n const collapsedClusterId = this._collapsedCluster.properties.clusterId\n\n // Check if the clustering algorithm has recreated a similar cluster at this zoom level\n const hasNaturalCluster = geoJsonPoints.some(c => {\n const props = c.properties as TopoJSONMapClusterDatum<PointDatum>\n return props.cluster && props.clusterId === collapsedClusterId\n })\n\n if (hasNaturalCluster) {\n // Natural cluster exists, we can safely clear the collapsed cluster\n this._collapsedCluster = null\n this._collapsedClusterPointIds = null\n } else {\n // Remove any individual points and subclusters that were part of the collapsed cluster\n geoJsonPoints = geoJsonPoints.filter(c => !this._shouldFilterPointOrCluster(\n geoJsonPointToScreenPoint(\n c as ClusterFeature<TopoJSONMapClusterDatum<PointDatum>> | PointFeature<TopoJSONMapPointDatum<PointDatum>>,\n 0,\n this._projection,\n this.config,\n this._currentZoomLevel || 1\n ),\n this._collapsedClusterPointIds\n ))\n\n // Add the original cluster back\n geoJsonPoints.push(this._collapsedCluster as unknown as ClusterFeature<TopoJSONMapClusterDatum<PointDatum>>)\n }\n }\n\n return geoJsonPoints.map((geoPoint, i) =>\n geoJsonPointToScreenPoint(\n geoPoint as ClusterFeature<TopoJSONMapClusterDatum<PointDatum>> | PointFeature<TopoJSONMapPointDatum<PointDatum>>,\n i,\n this._projection,\n this.config,\n this._currentZoomLevel || 1\n )\n )\n }\n\n _renderPoints (duration: number): void {\n const { config } = this\n const pointData = this._getPointData()\n const currentZoomLevel = this._currentZoomLevel || 1\n\n // Set z-index for expanded cluster points to ensure proper layering\n if (this._expandedCluster && config.clusterBackground) {\n pointData.forEach((d) => {\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n expandedPoint._zIndex = expandedPoint.expandedClusterPoint ? 2 : 0\n })\n }\n\n const points = this._pointsGroup\n .selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.point}`)\n .data(pointData, (d, i) => d.id?.toString() ?? `point-${i}`)\n\n\n // Enter\n const pointsEnter = points.enter().append('g').attr('class', s.point)\n .attr('transform', d => {\n const pos = this._projection(d.geometry.coordinates as [number, number])\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n // Divide by zoom level to compensate for the group's zoom transform\n const dx = (expandedPoint.dx ?? 0) / currentZoomLevel\n const dy = (expandedPoint.dy ?? 0) / currentZoomLevel\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('opacity', 1e-6)\n\n // Main shape (circle, square, triangle) - always draw path; fill/stroke hide when donut shown (match leaflet)\n pointsEnter.append('path')\n .attr('class', s.pointShape)\n .attr('d', d => {\n const radius = d.radius / currentZoomLevel\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n return getPointPathData({ x: 0, y: 0 }, radius, shape)\n })\n .style('fill', (d) => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n if (shape === TopoJSONMapPointShape.Ring) return 'none'\n return d.color\n })\n .style('stroke', d => d.color)\n .style('stroke-width', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const baseStrokeWidth = isRing ? getNumber(d.properties as PointDatum, config.pointRingWidth) : getNumber(d.properties as PointDatum, config.pointStrokeWidth)\n return baseStrokeWidth / currentZoomLevel\n })\n\n // Donut group for color-map functionality\n const donutGroup = pointsEnter.append('g')\n .attr('class', d => d.isCluster ? s.clusterDonut : s.pointDonut)\n .attr('data-point-id', (d, i) => getString(d.properties as PointDatum, config.pointId, i))\n\n // Add background circle for clusters with donut data\n donutGroup.each(function (d) {\n if (d.isCluster && d.donutData.length > 0) {\n select(this).append('circle')\n .attr('class', s.clusterBackground)\n .attr('r', 0)\n }\n })\n\n // Ring overlay path for ring shape\n pointsEnter.append('path')\n .attr('class', s.pointPathRing)\n .attr('d', 'M0,0')\n .style('display', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape\n return shape === TopoJSONMapPointShape.Ring ? null : 'none'\n })\n\n // Center label (for cluster summary or point label)\n pointsEnter.append('text')\n .attr('class', s.pointLabel)\n .attr('dy', '0.32em')\n .style('opacity', 0)\n\n pointsEnter.append('text').attr('class', s.pointBottomLabel)\n .style('opacity', 0)\n\n // Update\n const pointsMerged = pointsEnter.merge(points)\n smartTransition(pointsMerged, duration)\n .attr('transform', d => {\n const pos = this._projection(d.geometry.coordinates as [number, number])\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n // Divide by zoom level to compensate for the group's zoom transform\n const dx = (expandedPoint.dx ?? 0) / currentZoomLevel\n const dy = (expandedPoint.dy ?? 0) / currentZoomLevel\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('cursor', d => {\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n // Expanded cluster points use default cursor (clicking them does nothing)\n if (expandedPoint.expandedClusterPoint) {\n return getString(expandedPoint.properties as PointDatum, config.pointCursor) ?? 'default'\n }\n return d.isCluster ? 'pointer' : getString(d.properties as PointDatum, config.pointCursor)\n })\n .style('opacity', 1)\n\n // Add click event handler for clusters\n pointsMerged.on('click', (event: MouseEvent, d: TopoJSONMapPoint<PointDatum>) => {\n this._onPointClick(d, event)\n })\n\n // Update donut charts and cluster backgrounds (match leaflet: radius 0 when shape is non-circular)\n pointsMerged.selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.pointDonut}, .${s.clusterDonut}`).each(function (d) {\n const group = select(this as SVGGElement)\n const pointShape = getString(d.properties as PointDatum, config.pointShape)\n const isRing = pointShape === TopoJSONMapPointShape.Ring\n const isCircular = (pointShape === TopoJSONMapPointShape.Circle) || isRing || d.isCluster || !pointShape\n\n // Update or create background circle for clusters\n if (d.isCluster && d.donutData.length > 0) {\n const radius = d.radius / currentZoomLevel\n const bgCircle = group.select(`.${s.clusterBackground}`)\n\n if (bgCircle.empty()) {\n group.insert('circle', ':first-child')\n .attr('class', s.clusterBackground)\n .attr('r', radius)\n } else {\n bgCircle.attr('r', radius)\n }\n }\n\n // Update donut/pie chart: pass radius 0 when non-circular so donut is not drawn (shape takes priority)\n if (d.donutData.length > 0) {\n const radius = (isCircular ? d.radius : 0) / currentZoomLevel\n const arcWidth = d.isCluster ? (2 / currentZoomLevel) : (isCircular ? d.radius / currentZoomLevel : 0)\n const strokeWidth = 0.5 / currentZoomLevel\n updateDonut(group, d.donutData, radius, arcWidth, strokeWidth, 0.05)\n } else {\n group.selectAll('*').remove()\n }\n\n // Update the class attribute based on whether it's a cluster\n group.attr('class', d.isCluster ? s.clusterDonut : s.pointDonut)\n })\n\n // Update point shapes\n smartTransition(pointsMerged.select(`.${s.pointShape}`), duration)\n .attr('d', d => {\n const radius = d.radius / currentZoomLevel\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n return getPointPathData({ x: 0, y: 0 }, radius, shape)\n })\n .style('fill', d => {\n const pointShape = getString(d.properties as PointDatum, config.pointShape)\n const shape = pointShape as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const hasDonut = d.donutData.length > 0\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n\n // For expanded cluster points, use the preserved cluster color\n if (expandedPoint.expandedClusterPoint) {\n return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color\n }\n\n if (isRing) return 'none'\n // Match leaflet: cluster with donut uses transparent background; otherwise path uses d.color (colorMap or pointColor)\n if (hasDonut && d.isCluster) return 'transparent'\n return d.color\n })\n .style('stroke', d => {\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n // For expanded cluster points, use the preserved cluster color\n if (expandedPoint.expandedClusterPoint) {\n return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color\n }\n return d.color\n })\n .style('stroke-width', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const baseStrokeWidth = isRing ? getNumber(d.properties as PointDatum, config.pointRingWidth) : getNumber(d.properties as PointDatum, config.pointStrokeWidth)\n return baseStrokeWidth / currentZoomLevel\n })\n\n // Ring overlay update\n smartTransition(pointsMerged.select(`.${s.pointPathRing}`), duration)\n .attr('d', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape\n if (shape !== TopoJSONMapPointShape.Ring) return ''\n const radius = d.radius / currentZoomLevel\n return getPointPathData({ x: 0, y: 0 }, radius, TopoJSONMapPointShape.Circle)\n })\n .style('display', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape\n return shape === TopoJSONMapPointShape.Ring ? null : 'none'\n })\n\n const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`)\n pointLabelsMerged\n .text(d => {\n if (d.isCluster) {\n return getString(d.properties as TopoJSONMapClusterDatum<PointDatum>, config.clusterLabel) ?? ''\n }\n return getString(d.properties as PointOrClusterProperties<PointDatum>, config.pointLabel as StringAccessor<PointOrClusterProperties<PointDatum>>) ?? ''\n })\n .style('font-size', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) {\n return `calc(var(${s.variables.mapPointLabelFontSize}) / ${currentZoomLevel})`\n }\n const radius = d.isCluster\n ? (d.radius / currentZoomLevel)\n : getNumber(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointRadius as NumericAccessor<PointOrClusterProperties<PointDatum>>,\n 0\n ) / currentZoomLevel\n const pointLabelText = d.isCluster\n ? (getString(d.properties as TopoJSONMapClusterDatum<PointDatum>, config.clusterLabel) || '')\n : (getString(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointLabel as StringAccessor<PointOrClusterProperties<PointDatum>>\n ) || '')\n const textLength = pointLabelText.length\n // Use the same formula as Leaflet map for consistent font sizing\n const fontSize = radius / Math.pow(textLength, 0.4)\n // Match Leaflet: minimum is the calculated fontSize itself, max is 16\n return clamp(fontSize, fontSize, 16)\n })\n .attr('y', d => {\n // For points with pie/donut charts, always center the label\n if (d.donutData.length > 0) return null\n\n if (config.pointLabelPosition === MapPointLabelPosition.Center) return null\n\n const radius = d.isCluster\n ? (d.radius / currentZoomLevel)\n : getNumber(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointRadius as NumericAccessor<PointOrClusterProperties<PointDatum>>,\n 0\n ) / currentZoomLevel\n return radius\n })\n .attr('dy', d => {\n // For points with pie/donut charts, always use centered dy\n if (d.donutData.length > 0) return '0.32em'\n return config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em'\n })\n\n smartTransition(pointLabelsMerged, duration)\n .style('fill', (d, i) => {\n if (d.donutData.length > 0) {\n // Cluster background is white, so use dark text\n return d.isCluster\n ? `var(${s.variables.mapPointLabelTextColorDark})`\n : `var(${s.variables.mapPointLabelTextColorLight})`\n } else {\n if (config.pointLabelColor) {\n const labelColor = getColor(d.properties as PointDatum, config.pointLabelColor, i)\n if (labelColor) return labelColor\n }\n\n const pointColor = getColor(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointColor as ColorAccessor<PointOrClusterProperties<PointDatum>>,\n i\n )\n const hex = color(isStringCSSVariable(pointColor) ? getCSSVariableValue(pointColor, this.element) : pointColor)?.hex()\n if (!hex) return null\n\n const brightness = hexToBrightness(hex)\n return brightness > config.pointLabelTextBrightnessRatio\n ? `var(${s.variables.mapPointLabelTextColorDark})`\n : `var(${s.variables.mapPointLabelTextColorLight})`\n }\n })\n .style('opacity', 1)\n .style('pointer-events', 'none')\n .attr('visibility', d => {\n // Show labels for clusters, individual points with pie charts, and when pointLabel is defined\n const hasLabel = d.isCluster\n ? !!getString(d.properties as TopoJSONMapClusterDatum<PointDatum>, config.clusterLabel)\n : !!getString(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointLabel as StringAccessor<PointOrClusterProperties<PointDatum>>\n )\n return hasLabel ? null : 'hidden'\n })\n\n // Point & cluster bottom labels (hidden when point is inside expanded cluster)\n const bottomLabelsMerged = pointsMerged.select(`.${s.pointBottomLabel}`)\n bottomLabelsMerged\n .attr('visibility', d => (d as ExpandedClusterPoint<PointDatum>).expandedClusterPoint ? 'hidden' : null)\n .text(d => {\n const bottomLabelText = d.isCluster\n ? (getString(d.properties as TopoJSONMapClusterDatum<PointDatum>, config.clusterBottomLabel) ?? '')\n : (getString(d.properties as PointDatum, config.pointBottomLabel) ?? '')\n return trimStringMiddle(bottomLabelText, 15)\n })\n .attr('y', d => {\n const radius = d.isCluster\n ? (d.radius / this._currentZoomLevel)\n : (getNumber(d.properties as PointDatum, config.pointRadius) / this._currentZoomLevel)\n return radius + (10 / this._currentZoomLevel) // offset below the point/cluster, scaled with zoom\n })\n .attr('dy', '0.32em')\n .style('font-size', `calc(var(${s.variables.mapPointBottomLabelFontSize}) / ${this._currentZoomLevel})`)\n\n smartTransition(bottomLabelsMerged, duration)\n .style('opacity', d => (d as ExpandedClusterPoint<PointDatum>).expandedClusterPoint ? 0 : 1)\n\n // Sort elements by z-index to ensure expanded cluster points appear above everything else\n if (this._expandedCluster && config.clusterBackground) {\n this._pointsGroup\n .selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.point}`)\n .sort((a: TopoJSONMapPoint<PointDatum>, b: TopoJSONMapPoint<PointDatum>) => a._zIndex - b._zIndex)\n }\n\n // Exit\n points.exit().remove()\n\n // Heatmap\n this._pointsGroup.style('filter', (config.heatmapMode && this._currentZoomLevel < config.heatmapModeZoomLevelThreshold) ? 'url(#heatmapFilter)' : null)\n this._pointsGroup.selectAll(`.${s.pointLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null)\n this._pointsGroup.selectAll(`.${s.pointBottomLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null)\n\n // Update selection ring\n updateSelectionRing<AreaDatum, PointDatum, LinkDatum>(\n this._pointSelectionRing,\n this._selectedPoint,\n pointData,\n this.config,\n this._projection,\n currentZoomLevel\n )\n\n // Set up events and custom attributes for rendered points (match LeafletMap behavior)\n this._setUpComponentEventsThrottled()\n this._setCustomAttributesThrottled()\n }\n\n _fitToPoints (points?: PointDatum[], pad = 0.1): void {\n const { config, datamodel } = this\n const pointData = points || datamodel.points\n if (pointData.length === 0) return\n\n const coordinates = pointData.map(p => [\n getNumber(p, d => getNumber(d, config.longitude)),\n getNumber(p, d => getNumber(d, config.latitude)),\n ] as [number, number])\n\n if (coordinates.length === 1) {\n // Single point has zero-area bounds and breaks fitExtent; center the projection on the point\n this._projection.center(coordinates[0])\n this._projection.translate([this._width / 2, this._height / 2])\n } else {\n const featureCollection: ExtendedFeatureCollection = {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: { type: 'MultiPoint', coordinates },\n }],\n }\n\n this._projection.fitExtent([\n [this._width * pad, this._height * pad],\n [this._width * (1 - pad), this._height * (1 - pad)],\n ], featureCollection)\n\n const maxScale = config.zoomExtent[1] * this._initialScale\n const fittedScale = this._projection.scale()\n\n if (fittedScale > maxScale) {\n const fittedTranslate = this._projection.translate()\n const scaleRatio = maxScale / fittedScale\n\n this._projection.scale(maxScale)\n this._projection.translate([\n this._width / 2 - (this._width / 2 - fittedTranslate[0]) * scaleRatio,\n this._height / 2 - (this._height / 2 - fittedTranslate[1]) * scaleRatio,\n ])\n }\n }\n\n this._center = this._projection.translate()\n }\n\n _applyZoom (): void {\n const translate = this._center ?? this._projection.translate()\n const scale = this._initialScale * this._currentZoomLevel\n this.g.call(this._zoomBehavior.transform, zoomIdentity.translate(translate[0], translate[1]).scale(scale))\n this._isZooming = true\n this._onZoomEnd()\n }\n\n _onResize (): void {\n this._isResizing = true\n const prevTranslate = this._projection.translate()\n\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n\n // If a point is selected, center the view on it after resize\n if (this._selectedPoint) {\n const coords = this._selectedPoint.geometry.coordinates as [number, number]\n const pos = this._projection(coords)\n const projTranslate = this._projection.translate()\n if (pos) {\n const k = this._currentZoomLevel\n this._center = [\n this._width / 2 - (pos[0] - projTranslate[0]) * k,\n this._height / 2 - (pos[1] - projTranslate[1]) * k,\n ]\n }\n } else {\n this._center = [\n this._projection.translate()[0] * this._center[0] / prevTranslate[0],\n this._projection.translate()[1] * this._center[1] / prevTranslate[1],\n ]\n }\n\n this._applyZoom()\n\n this._isResizing = false\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n _onZoom (event: D3ZoomEvent<SVGGElement, unknown>): void {\n if (this._firstRender) {\n // On first render, just update the zoom level, don't trigger animation\n this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1\n // Set CSS custom property for zoom level\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n return // To prevent double render because of binding zoom behaviour\n }\n const isMouseEvent = !!event.sourceEvent\n const isExternalEvent = !event?.sourceEvent && !this._isResizing\n const isResizeEvent = this._isResizing && !event?.sourceEvent\n\n this._isZooming = true\n\n // Clear any pending zoom end timeout\n if (this._zoomEndTimeoutId) {\n clearTimeout(this._zoomEndTimeoutId)\n }\n\n // Reset expanded cluster when manually zooming (but not during component-initiated zoom)\n if (isMouseEvent && !this._eventInitiatedByComponent) {\n this._resetExpandedCluster()\n // Also clear the collapsed cluster state so points can naturally re-cluster at the new zoom level\n this._collapsedCluster = null\n this._collapsedClusterPointIds = null\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent, isResizeEvent))\n\n if (isMouseEvent) {\n // Update the center coordinate so that the next call to _applyZoom()\n // will zoom with respect to the current view\n this._center = [event.transform.x, event.transform.y]\n }\n this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1\n // Set CSS custom property for zoom level\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n\n // Fallback timeout in case zoom end event doesn't fire\n this._onZoomEnd()\n }\n\n _onZoomEnd (): void {\n if (this._zoomEndTimeoutId) {\n clearTimeout(this._zoomEndTimeoutId)\n }\n\n this._zoomEndTimeoutId = setTimeout(() => {\n this._isZooming = false\n this._runCollisionDetection()\n }, 150)\n }\n\n private _runCollisionDetection (): void {\n window.cancelAnimationFrame(this._collisionDetectionAnimFrameId)\n this._collisionDetectionAnimFrameId = window.requestAnimationFrame(() => {\n const duration = this.config.duration\n // Run collision detection for area labels\n const areaLabels = this._areaLabelsGroup.selectAll<SVGTextElement, unknown>(`.${s.areaLabel}`)\n collideAreaLabels(areaLabels, duration)\n\n // Run collision detection for point bottom labels\n const pointBottomLabels = this._pointsGroup.selectAll<SVGTextElement, TopoJSONMapPoint<PointDatum>>(`.${s.point} .${s.pointBottomLabel}`)\n collidePointBottomLabels(pointBottomLabels, duration)\n })\n }\n\n _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean, isResizeEvent = false): void {\n const scale = transform.k / this._initialScale || 1\n const center = this._projection.translate()\n\n this._transform = zoomIdentity\n .translate(transform.x - center[0] * scale, transform.y - center[1] * scale)\n .scale(scale)\n\n const customDuration = (isExternalEvent || isResizeEvent)\n ? this.config.zoomDuration\n : (isMouseEvent ? 0 : null)\n\n // Call render functions that depend on this._transform\n this._renderGroups(customDuration)\n this._renderAreaLabels(customDuration)\n this._renderLinks(customDuration)\n this._renderClusterBackground(customDuration)\n this._renderPoints(customDuration)\n this._renderSourcePoints(customDuration)\n }\n\n public zoomIn (increment = 0.5): void {\n if (this._isZooming) return\n this._resetExpandedCluster()\n this.setZoom(this._currentZoomLevel + increment)\n }\n\n public zoomOut (increment = 0.5): void {\n if (this._isZooming) return\n this._resetExpandedCluster()\n this.setZoom(this._currentZoomLevel - increment)\n }\n\n public setZoom (zoomLevel: number): void {\n const { config } = this\n const newZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n const currentK = this._initialScale * this._currentZoomLevel\n const newK = this._initialScale * newZoomLevel\n // Update _center so the viewport center stays fixed when zooming (avoids drift after pan)\n if (currentK > 0 && isFinite(currentK) && isFinite(newK)) {\n const ratio = newK / currentK\n this._center[0] = (this._width / 2 - this.bleed.left) * (1 - ratio) + this._center[0] * ratio\n this._center[1] = (this._height / 2 - this.bleed.top) * (1 - ratio) + this._center[1] * ratio\n }\n this._currentZoomLevel = newZoomLevel\n // Set CSS custom property for zoom level\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n this._transform = zoomIdentity\n .translate(this._center[0] * (1 - this._currentZoomLevel), this._center[1] * (1 - this._currentZoomLevel))\n .scale(this._currentZoomLevel)\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n public fitView (): void {\n const { config } = this\n\n this._resetExpandedCluster()\n\n if (config.mapFitToPoints) {\n // When mapFitToPoints is enabled, fitView should refit the projection to the points\n // and reset the zoom level relative to that fitted scale.\n this._fitToPoints()\n // Treat the newly fitted scale as the baseline and reset zoom to 1\n this._initialScale = this._projection.scale()\n this._currentZoomLevel = 1\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', '1')\n this._center = this._projection.translate()\n this._applyZoom()\n } else {\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1\n // Set CSS custom property for zoom level\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n this._center = this._projection.translate()\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n }\n\n private _initFlowFeatures (): void {\n initFlowFeatures<AreaDatum, PointDatum, LinkDatum>(\n this as unknown as FlowInitContext<AreaDatum, PointDatum, LinkDatum>\n )\n }\n\n private _renderSourcePoints (duration: number): void {\n const { config } = this\n\n const sourcePoints = this._sourcePointsGroup\n .selectAll<SVGCircleElement, { x: number; y: number; radius: number; color: string; flowData: LinkDatum }>(`.${s.sourcePoint}`)\n .data(this._sourcePoints, (d, i) => `${d.flowData}-${i}`)\n\n const sourcePointsEnter = sourcePoints.enter()\n .append('circle')\n .attr('class', s.sourcePoint)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', d => d.radius / this._currentZoomLevel)\n .style('fill', d => d.color)\n .style('stroke', d => d.color)\n .style('stroke-width', 0)\n .style('opacity', 0)\n .on('click', (event: MouseEvent, d) => {\n event.stopPropagation()\n config.onSourcePointClick?.(d.flowData, d.x, d.y, event)\n })\n .on('mouseenter', (event: MouseEvent, d) => {\n config.onSourcePointMouseEnter?.(d.flowData, d.x, d.y, event)\n })\n .on('mouseleave', (event: MouseEvent, d) => {\n config.onSourcePointMouseLeave?.(d.flowData, event)\n })\n\n smartTransition(sourcePointsEnter.merge(sourcePoints), duration)\n .attr('r', d => d.radius / this._currentZoomLevel)\n .style('opacity', 1)\n\n sourcePoints.exit().remove()\n }\n\n private _renderFlowParticles (duration: number): void {\n const flowParticles = this._flowParticlesGroup\n .selectAll<SVGCircleElement, FlowParticle>(`.${s.flowParticle}`)\n .data(this._flowParticles, d => d.id)\n\n const flowParticlesEnter = flowParticles.enter()\n .append('circle')\n .attr('class', s.flowParticle)\n .attr('r', 0)\n .style('opacity', 0)\n\n smartTransition(flowParticlesEnter.merge(flowParticles), duration)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', d => d.radius / (this._currentZoomLevel || 1))\n .style('fill', d => d.color)\n .style('opacity', 0.8)\n\n flowParticles.exit().remove()\n }\n\n private _startFlowAnimation (): void {\n if (this._animationId) return // Animation already running\n\n this._animateFlow()\n }\n\n private _animateFlow (): void {\n if (!this.config.enableFlowAnimation) return\n\n this._animationId = requestAnimationFrame(() => {\n this._updateFlowParticles()\n this._animateFlow() // Recursive call like LeafletFlowMap\n })\n }\n\n private _stopFlowAnimation (): void {\n if (this._animationId) {\n cancelAnimationFrame(this._animationId)\n this._animationId = null\n }\n }\n\n private _updateFlowParticles (): void {\n updateFlowParticles({\n _flowParticles: this._flowParticles as FlowParticle[],\n _currentZoomLevel: this._currentZoomLevel,\n _flowParticlesGroup: this._flowParticlesGroup,\n } as FlowUpdateContext)\n }\n\n private _onPointClick (d: TopoJSONMapPoint<PointDatum>, event: MouseEvent): void {\n const { config } = this\n event.stopPropagation()\n\n // Clicking on expanded cluster points does nothing - they stay expanded\n // (clicking outside on the map background will collapse them)\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n if (expandedPoint.expandedClusterPoint) {\n return\n }\n\n if (d.isCluster && (d.properties as TopoJSONMapClusterDatum<PointDatum>).cluster) {\n const zoomLevel = this._currentZoomLevel || 1\n const coordinates = d.geometry.coordinates as [number, number]\n const zoomExtent = config.zoomExtent\n const zoomMax = zoomExtent?.[1] ?? 12\n\n if (config.clusterExpandOnClick) {\n // Zoom to cluster and expand in one action\n const newZoomLevel = getNextZoomLevelOnClusterClick(zoomLevel, zoomMax)\n this._expandCluster(d)\n this._zoomToLocation(coordinates, newZoomLevel)\n } else {\n // Just zoom to cluster without expanding\n const newZoomLevel = getNextZoomLevelOnClusterClick(zoomLevel, zoomMax)\n this._zoomToLocation(coordinates, newZoomLevel)\n }\n }\n }\n\n private _findClusterAtCoordinates (coordinates: [number, number]): TopoJSONMapPoint<PointDatum> | undefined {\n const pointData = this._getPointData()\n const [targetLon, targetLat] = coordinates\n\n // Find clusters and calculate their distance to the target coordinates\n const clusters = pointData.filter(p => p.isCluster)\n if (clusters.length === 0) return undefined\n\n // Find the cluster closest to the target coordinates\n let closestCluster: TopoJSONMapPoint<PointDatum> | undefined\n let minDistance = Infinity\n\n for (const cluster of clusters) {\n const [lon, lat] = cluster.geometry.coordinates as [number, number]\n const distance = Math.sqrt(Math.pow(lon - targetLon, 2) + Math.pow(lat - targetLat, 2))\n\n if (distance < minDistance) {\n minDistance = distance\n closestCluster = cluster\n }\n }\n\n return closestCluster\n }\n\n private _expandCluster (clusterPoint: TopoJSONMapPoint<PointDatum>): PointDatum[] | undefined {\n const { config } = this\n\n if (!clusterPoint.clusterIndex) {\n console.error('Cannot expand cluster - no clusterIndex!')\n return undefined\n }\n\n // Note: _collapsedCluster.id is numeric (e.g., 331), but clusterPoint.id is \"cluster-331\"\n if (this._collapsedCluster && `cluster-${this._collapsedCluster.id}` === clusterPoint.id) {\n this._collapsedCluster = null\n this._collapsedClusterPointIds = null\n }\n\n const padding = 1\n const clusterId = (clusterPoint.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId as number\n const points = clusterPoint.clusterIndex.getLeaves(clusterId, Infinity)\n\n // Determine packing zoom level. Cap at SUPERCLUSTER_MAX_ZOOM to avoid huge radii when\n // zoomExtent[1] is large (e.g. 1000), which would cause incorrect expansion and weird animation.\n const maxClusterZoomLevel = Array.isArray(config.zoomExtent) ? Math.min(config.zoomExtent[1], SUPERCLUSTER_MAX_ZOOM) : 16\n const packingZoomLevel = Math.min(this._currentZoomLevel || 1, maxClusterZoomLevel)\n\n const packPoints: {x: number | null; y: number | null; r: number }[] = points.map((point) => {\n return {\n x: null as number | null,\n y: null as number | null,\n r: getPointRadius(point as PointFeature<TopoJSONMapPointDatum<PointDatum>>, config.pointRadius, packingZoomLevel) + padding,\n }\n })\n packSiblings(packPoints)\n\n // Create expanded points with relative positions\n const expandedPoints = points.map((point, i) => {\n const originalData = point.properties as PointDatum\n const radius = getNumber(originalData, config.pointRadius) || 8\n const shape = getString(originalData, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n // Don't show pie charts for expanded cluster points (similar to Leaflet map)\n const donutData: TopoJSONMapPieDatum[] = []\n // Use each point's own color (from colorMap or pointColor) so shapes keep their correct color when expanded\n const explicitPointColor = getColor(originalData, config.pointColor)\n const pointDonutData = getDonutData(originalData, config.colorMap)\n const maxVal = pointDonutData.length ? Math.max(...pointDonutData.map(d => d.value)) : 0\n const biggestDatum = pointDonutData.find(d => d.value === maxVal) || pointDonutData[0]\n const pointColor = explicitPointColor ?? biggestDatum?.color ?? clusterPoint.color\n\n return {\n geometry: { type: 'Point' as const, coordinates: clusterPoint.geometry.coordinates },\n bbox: { x1: 0, y1: 0, x2: 0, y2: 0 },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(originalData, config.pointId, i) || `${clusterId}-${i}`,\n properties: originalData,\n donutData,\n isCluster: false,\n _zIndex: 1,\n expandedClusterPoint: clusterPoint,\n clusterColor: pointColor,\n dx: packPoints[i].x,\n dy: packPoints[i].y,\n packedRadius: packPoints[i].r, // Store the packed radius for cluster background calculation\n } as TopoJSONMapPoint<PointDatum> & { expandedClusterPoint: TopoJSONMapPoint<PointDatum>; dx: number; dy: number; packedRadius: number }\n })\n\n this._resetExpandedCluster()\n this._expandedCluster = {\n cluster: clusterPoint,\n points: expandedPoints,\n }\n\n // Re-render to show expanded points and cluster background with smooth animation\n this._renderClusterBackground(config.duration / 2)\n this._renderPoints(config.duration / 2)\n\n // Re-bind user-defined events to include newly created expanded cluster points\n this._setUpComponentEventsThrottled()\n this._setCustomAttributesThrottled()\n\n // Return the original point data for centroid calculation\n return points.map(p => p.properties as PointDatum)\n }\n\n private _zoomToLocation (coordinates: [number, number], zoomLevel: number): void {\n const { config } = this\n\n const clampedZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n\n // Project the target coordinates using the current projection\n const targetPoint = this._projection(coordinates)\n if (!targetPoint) return\n\n // Calculate the center of the viewport\n const centerX = this._width / 2\n const centerY = this._height / 2\n\n // Calculate the scale factor\n const k = this._initialScale * clampedZoomLevel\n\n // Calculate translation to center the target point\n const currentCenter = this._projection.translate()\n const x = centerX + (currentCenter[0] - targetPoint[0]) * (k / this._initialScale)\n const y = centerY + (currentCenter[1] - targetPoint[1]) * (k / this._initialScale)\n\n const transform = zoomIdentity.translate(x, y).scale(k)\n\n // Update internal state\n this._currentZoomLevel = clampedZoomLevel\n this._center = [x, y]\n\n // Set flag to indicate this is a component-initiated zoom\n this._eventInitiatedByComponent = true\n\n // Apply the transform with smooth eased animation\n this.g\n .transition()\n .duration(config.zoomDuration)\n .ease(easeCubicInOut)\n .call(this._zoomBehavior.transform, transform)\n .on('end', () => {\n // Reset the flag after transition completes\n this._eventInitiatedByComponent = false\n })\n }\n\n private _collapseExpandedCluster (): void {\n if (this._expandedCluster) {\n this._resetExpandedCluster()\n this._renderClusterBackground(this.config.duration)\n this._renderPoints(this.config.duration)\n }\n }\n\n private _resetExpandedCluster (): void {\n if (this._expandedCluster) {\n // Store the original cluster to restore it\n const originalCluster = this._expandedCluster.cluster\n const expandedPointIds = new Set(this._expandedCluster.points.map((p: TopoJSONMapPoint<PointDatum>) => getString(p.properties as PointDatum, this.config.pointId)))\n\n // Convert the original cluster back to GeoJSON format for re-insertion\n // Preserve critical fields: id (for cluster identification), clusterIndex (for re-expansion)\n const clusterGeoJson = {\n type: 'Feature' as const,\n id: (originalCluster.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId, // Use clusterId as the feature id\n properties: {\n ...originalCluster.properties,\n clusterIndex: originalCluster.clusterIndex, // Preserve clusterIndex for re-expansion\n },\n geometry: originalCluster.geometry,\n }\n\n this._collapsedCluster = clusterGeoJson\n this._collapsedClusterPointIds = expandedPointIds\n\n // Clean up all references to prevent memory leaks\n this._expandedCluster.points?.forEach((d) => {\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n delete expandedPoint.expandedClusterPoint\n delete expandedPoint.clusterColor\n delete expandedPoint.dx\n delete expandedPoint.dy\n })\n this._expandedCluster = null\n }\n }\n\n /** Select a point by id */\n public selectPointById (id: string): void {\n const { config } = this\n const pointData = this._getPointData()\n const foundPoint = pointData.find(d => getString(d.properties as PointDatum, config.pointId) === id)\n\n if (foundPoint) {\n this._selectedPoint = foundPoint\n this._renderPoints(config.duration)\n } else {\n console.warn(`Unovis | TopoJSON Map: Point with id ${id} not found`)\n }\n }\n\n /** Get the id of the selected point */\n public getSelectedPointId (): string | number | undefined {\n return this._selectedPoint?.id\n }\n\n /** Unselect point */\n public unselectPoint (): void {\n this._selectedPoint = null\n this._renderPoints(this.config.duration)\n }\n\n destroy (): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._stopFlowAnimation()\n window.cancelAnimationFrame(this._collisionDetectionAnimFrameId)\n if (this._zoomEndTimeoutId) {\n clearTimeout(this._zoomEndTimeoutId)\n }\n }\n}\n"],"names":["s.background","s.features","s.areaLabel","s.links","s.clusterBackground","s.points","s.pointSelectionRing","s.pointSelection","s.flowParticles","s.sourcePoints","s.feature","s.variables","s.clusterBackgroundCircle","s.link","s.point","s.pointShape","s.clusterDonut","s.pointDonut","s.pointPathRing","s.pointLabel","s.pointBottomLabel","s.sourcePoint","s.flowParticle","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/topojson-map/index.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { D3ZoomEvent, zoom, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { timeout } from 'd3-timer'\nimport { easeCubicInOut } from 'd3-ease'\nimport { geoPath, GeoProjection, ExtendedFeatureCollection } from 'd3-geo'\nimport { color } from 'd3-color'\nimport { packSiblings } from 'd3-hierarchy'\nimport { feature } from 'topojson-client'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { MapGraphDataModel } from 'data-models/map-graph'\n\n// Utils\nimport { clamp, getNumber, getString, isNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor, hexToBrightness } from 'utils/color'\nimport { getCSSVariableValue, isStringCSSVariable } from 'utils/misc'\nimport { trimStringMiddle } from 'utils/text'\n// Types\nimport { MapLink } from 'types/map'\nimport { GenericDataRecord } from 'types/data'\nimport Supercluster, { PointFeature, ClusterFeature } from 'supercluster'\nimport { NumericAccessor, ColorAccessor, StringAccessor } from 'types/accessor'\n\n// Local Types\nimport {\n MapData,\n MapFeature,\n MapPointLabelPosition,\n MapProjection,\n TopoJSONMapPointShape,\n FlowParticle,\n TopoJSONMapPoint,\n TopoJSONMapClusterDatum,\n TopoJSONMapPointDatum,\n TopoJSONMapPieDatum,\n ExpandedClusterPoint,\n CollapsedClusterFeature,\n PointOrClusterProperties,\n} from './types'\n\n// Config\nimport { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config'\n\n// Modules\nimport {\n arc,\n getLonLat,\n getDonutData,\n getPointPathData,\n collideAreaLabels,\n collidePointBottomLabels,\n getPointRadius,\n calculateClusterIndex,\n getClustersAndPoints,\n geoJsonPointToScreenPoint,\n getNextZoomLevelOnClusterClick,\n getClusterRadius,\n PackedPoint,\n} from './utils'\nimport { updateDonut } from './modules/donut'\nimport { renderBackground } from './modules/background'\nimport { updateSelectionRing } from './modules/selectionRing'\nimport { initFlowFeatures, updateFlowParticles, FlowInitContext, FlowUpdateContext } from './modules/flow'\n\n// Styles\nimport * as s from './style'\n\n// Supercluster expects zoom levels 0-22 (like map tiles). zoomExtent[1] is a scale factor\n// for the map, so we cap the cluster maxZoom to avoid excessive quadtree depth and wrong\n// packing/expansion behavior when zoomExtent has large values (e.g. 1000).\nconst SUPERCLUSTER_MAX_ZOOM = 22\n\nexport class TopoJSONMap<\n AreaDatum,\n PointDatum = GenericDataRecord,\n LinkDatum = GenericDataRecord,\n> extends ComponentCore<\n MapData<AreaDatum, PointDatum, LinkDatum>,\n TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n > {\n static selectors = s\n protected _defaultConfig = TopoJSONMapDefaultConfig as TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n public config: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum> = this._defaultConfig\n\n datamodel: MapGraphDataModel<AreaDatum, PointDatum, LinkDatum> = new MapGraphDataModel()\n g: Selection<SVGGElement, unknown, null, undefined>\n private _firstRender = true\n private _isResizing = false\n private _initialScale: number = undefined\n private _center: [number, number]\n private _currentZoomLevel: number = undefined\n private _transform: ZoomTransform = zoomIdentity\n private _path = geoPath()\n private _projection: GeoProjection\n private _prevWidth: number\n private _prevHeight: number\n private _animFrameId: number\n private _isZooming = false\n private _zoomEndTimeoutId: ReturnType<typeof setTimeout>\n private _collisionDetectionAnimFrameId: ReturnType<typeof requestAnimationFrame>\n private _clusterIndex: Supercluster<PointDatum> | null = null\n private _expandedCluster: {\n cluster: TopoJSONMapPoint<PointDatum>;\n points: ExpandedClusterPoint<PointDatum>[];\n } | null = null\n\n private _collapsedCluster: CollapsedClusterFeature<PointDatum> | null = null\n private _collapsedClusterPointIds: Set<string> | null = null\n private _prevZoomToLocation: { coordinates: [number, number]; zoomLevel: number; expandCluster?: boolean } | undefined = undefined\n\n private _eventInitiatedByComponent = false\n\n private _featureCollection: GeoJSON.FeatureCollection\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown> = zoom()\n private _backgroundRect = this.g.append('rect').attr('class', s.background)\n private _featuresGroup = this.g.append('g').attr('class', s.features)\n private _areaLabelsGroup = this.g.append('g').attr('class', s.areaLabel)\n private _linksGroup = this.g.append('g').attr('class', s.links)\n private _clusterBackgroundGroup = this.g.append('g').attr('class', s.clusterBackground)\n private _flowParticlesGroup = this.g.append('g').attr('class', s.flowParticles)\n // Points after links + flow groups so map nodes paint above link arcs and flow particles\n private _pointsGroup = this.g.append('g').attr('class', s.points)\n private _pointSelectionRing = this._pointsGroup.append('g').attr('class', s.pointSelectionRing)\n .call(sel => sel.append('path').attr('class', s.pointSelection))\n\n private _sourcePointsGroup = this.g.append('g').attr('class', s.sourcePoints)\n private _selectedPoint: TopoJSONMapPoint<PointDatum> | null = null\n private _flowParticles: FlowParticle[] = []\n private _sourcePoints: { x: number; y: number; radius: number; color: string; flowData: LinkDatum }[] = []\n private _animationId: number | null = null\n\n events = {\n [TopoJSONMap.selectors.point]: {},\n [TopoJSONMap.selectors.feature]: {},\n }\n\n constructor (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>, data?: MapData<AreaDatum, PointDatum, LinkDatum>) {\n super()\n this._zoomBehavior\n .on('zoom', this._onZoom.bind(this))\n .on('end', this._onZoomEnd.bind(this))\n\n if (config) this.setConfig(config)\n if (data) this.setData(data)\n\n this.g.append('defs')\n .append('filter')\n .attr('id', 'heatmapFilter')\n .html(`\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"${this.config.heatmapModeBlurStdDeviation}\" color-interpolation-filters=\"sRGB\" result=\"blur\"></feGaussianBlur>\n <feColorMatrix class=\"blurValues\" in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -4\"></feColorMatrix>\n `)\n }\n\n setData (data: MapData<AreaDatum, PointDatum, LinkDatum>): void {\n const { config } = this\n\n this.datamodel.pointId = config.pointId\n this.datamodel.linkSource = config.linkSource\n this.datamodel.linkTarget = config.linkTarget\n this.datamodel.data = data\n\n // Reset expanded cluster when data changes\n this._resetExpandedCluster()\n\n // Initialize clustering if enabled\n if (config.clustering && data.points?.length) {\n const dataValid = data.points.filter(d => {\n const lat = getNumber(d, config.latitude)\n const lon = getNumber(d, config.longitude)\n return isNumber(lat) && isNumber(lon)\n })\n const zoomExtent = this.config.zoomExtent\n const maxClusterZoomLevel = Array.isArray(zoomExtent) ? Math.min(zoomExtent[1], SUPERCLUSTER_MAX_ZOOM) : 16\n this._clusterIndex = calculateClusterIndex(dataValid, this.config, maxClusterZoomLevel)\n } else {\n this._clusterIndex = null\n }\n\n // If there was a data change and mapFitToPoints is enabled, we will need to re-fit the map\n this._firstRender = this._firstRender || config.mapFitToPoints\n }\n\n setConfig (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>): void {\n super.setConfig(config)\n\n // Setting the default here instead of defaultConfig to prevent mutation from other TopoJSONMap instances\n const newProjection = this.config.projection ?? MapProjection.Kavrayskiy7()\n if (this._projection) {\n newProjection.scale(this._projection.scale()).translate(this._projection.translate())\n }\n this._projection = newProjection\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n this._renderBackground()\n this._renderMap(duration)\n this._renderAreaLabels(duration)\n this._renderGroups(duration)\n this._renderLinks(duration)\n this._renderClusterBackground(duration)\n this._renderPoints(duration)\n\n // Flow features\n if (config.enableFlowAnimation) {\n this._initFlowFeatures()\n this._renderSourcePoints(duration)\n this._renderFlowParticles(duration)\n this._startFlowAnimation()\n } else {\n this._stopFlowAnimation()\n }\n\n // When animation is running we need to temporary disable zoom behaviour\n if (duration && !config.disableZoom) {\n this.g.on('.zoom', null)\n timeout(() => {\n this.g.call(this._zoomBehavior)\n }, duration)\n }\n\n // When zoom behaviour is active we assign the `draggable` class to show the grabbing cursor\n this.g.classed('draggable', !config.disableZoom)\n this._firstRender = false\n\n // Apply zoomToLocation if it changed\n if (config.zoomToLocation) {\n const hasChanged = !this._prevZoomToLocation ||\n this._prevZoomToLocation.coordinates[0] !== config.zoomToLocation.coordinates[0] ||\n this._prevZoomToLocation.coordinates[1] !== config.zoomToLocation.coordinates[1] ||\n this._prevZoomToLocation.zoomLevel !== config.zoomToLocation.zoomLevel ||\n this._prevZoomToLocation.expandCluster !== config.zoomToLocation.expandCluster\n\n if (hasChanged) {\n this._prevZoomToLocation = { ...config.zoomToLocation }\n\n // If expandCluster is true, find and expand the cluster at/near the coordinates\n if (config.zoomToLocation.expandCluster) {\n const cluster = this._findClusterAtCoordinates(config.zoomToLocation.coordinates)\n if (cluster) {\n this._expandCluster(cluster)\n }\n }\n\n this._zoomToLocation(config.zoomToLocation.coordinates, config.zoomToLocation.zoomLevel)\n }\n } else {\n this._prevZoomToLocation = undefined\n }\n\n // Run collision detection after initial render\n if (!this._isZooming) {\n this._runCollisionDetection()\n }\n }\n\n _renderBackground (): void {\n renderBackground(\n this._backgroundRect,\n this.bleed.left,\n this.bleed.top,\n () => this._collapseExpandedCluster()\n )\n }\n\n _renderGroups (duration: number): void {\n const transformString = this._transform.toString()\n smartTransition(this._featuresGroup, duration)\n .attr('transform', transformString)\n .attr('stroke-width', 1 / this._currentZoomLevel)\n\n smartTransition(this._areaLabelsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._linksGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._clusterBackgroundGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._pointsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._sourcePointsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._flowParticlesGroup, duration)\n .attr('transform', transformString)\n }\n\n _renderMap (duration: number): void {\n const { bleed, config, datamodel } = this\n\n this.g.attr('transform', `translate(${bleed.left}, ${bleed.top})`)\n const mapData: TopoJSON.Topology = config.topojson\n const featureName = config.mapFeatureName\n const featureObject = mapData?.objects?.[featureName]\n if (!featureObject) return\n\n this._featureCollection = feature(mapData, featureObject) as GeoJSON.FeatureCollection\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n if (this._firstRender) {\n // Rendering the map for the first time.\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n\n if (config.mapFitToPoints) {\n // Re-fit projection to points instead of full topojson\n this._fitToPoints()\n }\n\n // After initial fit (to features or points), treat the current projection\n // scale as the baseline for zoom level 1.\n this._initialScale = this._projection.scale()\n this._center = this._projection.translate()\n\n const zoomExtent = config.zoomExtent\n this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale])\n this._currentZoomLevel = config.zoomFactor || 1\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n\n if (!config.disableZoom) {\n this.g.call(this._zoomBehavior)\n this._applyZoom()\n }\n\n // Initialize transform for first render after applyZoom\n const scale = this._currentZoomLevel\n const center = this._projection.translate()\n this._transform = zoomIdentity\n .translate(this._center[0] - center[0] * scale, this._center[1] - center[1] * scale)\n .scale(scale)\n\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n if (this._prevWidth !== this._width || this._prevHeight !== this._height) {\n this._onResize()\n }\n\n\n this._path.projection(this._projection)\n\n // Merge passed area data and map feature data\n const areaData = datamodel.areas\n areaData.forEach(a => {\n const feature = featureData.find(f => f.id.toString() === getString(a, config.areaId).toString())\n if (feature) feature.data = a\n else if (this._firstRender) console.warn(`Can't find feature by area code ${getString(a, config.areaId)}`)\n })\n\n const features = this._featuresGroup\n .selectAll<SVGPathElement, unknown>(`.${s.feature}`)\n .data(featureData)\n\n const featuresEnter = features.enter().append('path').attr('class', s.feature)\n const featuresMerged = featuresEnter.merge(features)\n\n // Animate geometry changes, but apply fill immediately to avoid \"delay then jump\"\n smartTransition(featuresMerged, duration)\n .attr('d', this._path)\n .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null)\n\n // Set fill directly so color updates are instantaneous instead of snapping at the end of a transition\n featuresMerged.style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null)\n\n // Add click handler to collapse expanded cluster when clicking on map features\n featuresMerged.on('click', () => {\n this._collapseExpandedCluster()\n })\n\n features.exit().remove()\n }\n\n _renderAreaLabels (duration: number): void {\n const { config } = this\n\n // Early return if no area label configuration\n if (!config.areaLabel) {\n this._areaLabelsGroup.selectAll('*').remove()\n return\n }\n\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n // Prepare candidate labels with optimized filtering and calculations\n const candidateLabels = featureData\n .map(feature => {\n // Use area data if present, otherwise fall back to GeoJSON properties\n const areaDatum = feature.data || feature.properties\n const labelText = areaDatum ? getString(areaDatum as AreaDatum, config.areaLabel) : null\n if (!labelText) return null\n\n const centroid = this._path.centroid(feature)\n\n // Skip if centroid is invalid (e.g., for very small or complex shapes)\n if (!centroid || centroid.some(coord => !isFinite(coord))) return null\n\n const bounds = this._path.bounds(feature)\n const area = (bounds[1][0] - bounds[0][0]) * (bounds[1][1] - bounds[0][1])\n\n return {\n feature,\n centroid,\n area,\n labelText,\n id: feature.data ? getString(feature.data, config.areaId) : feature.id?.toString(),\n }\n })\n .filter(Boolean) // Remove null entries\n .sort((a, b) => b.area - a.area) // Prioritize larger areas\n\n // D3 data binding with improved key function\n const labels = this._areaLabelsGroup\n .selectAll<SVGTextElement, typeof candidateLabels[0]>(`.${s.areaLabel}`)\n .data(candidateLabels, d => d.id || '')\n\n // Handle entering labels\n const labelsEnter = labels.enter()\n .append('text')\n .attr('class', s.areaLabel)\n .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`)\n .style('opacity', 0)\n .style('pointer-events', 'none')\n\n // Update all labels (enter + update)\n const labelsMerged = labelsEnter.merge(labels)\n labelsMerged\n .text(d => d.labelText)\n .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`)\n .style('font-size', `calc(var(${s.variables.mapPointLabelFontSize}) / ${this._currentZoomLevel})`)\n .style('text-anchor', 'middle')\n .style('dominant-baseline', 'middle')\n\n // Handle exiting labels\n smartTransition(labels.exit(), duration)\n .style('opacity', 0)\n .remove()\n\n // Only update opacity after zoom completes\n if (!this._isZooming) {\n smartTransition(labelsMerged, duration)\n .style('opacity', 1)\n }\n }\n\n _renderClusterBackground (duration: number): void {\n const { config } = this\n const currentZoomLevel = this._currentZoomLevel || 1\n\n // Always remove existing background circles first\n this._clusterBackgroundGroup.selectAll('circle').remove()\n\n if (this._expandedCluster && config.clusterBackground) {\n const cluster = this._expandedCluster.cluster\n const pos = this._projection(cluster.geometry.coordinates as [number, number])\n\n const backgroundRadius = getClusterRadius(this._expandedCluster as { points: PackedPoint[]; cluster: TopoJSONMapPoint<PointDatum> })\n // Divide by zoom level since the group transform will scale it back up\n const adjustedRadius = backgroundRadius / currentZoomLevel\n\n this._clusterBackgroundGroup\n .append('circle')\n .attr('class', s.clusterBackgroundCircle)\n .attr('cx', pos[0])\n .attr('cy', pos[1])\n .attr('r', 0)\n .style('fill', `var(${s.variables.mapClusterExpandedBackgroundFillColor})`)\n .style('opacity', 0)\n .style('cursor', 'pointer')\n .on('click', () => {\n this._collapseExpandedCluster()\n })\n .transition()\n .duration(duration)\n .attr('r', adjustedRadius)\n .style('opacity', 0.7)\n }\n }\n\n _renderLinks (duration: number): void {\n const { config, datamodel } = this\n const links = datamodel.links\n\n const edges = this._linksGroup\n .selectAll<SVGPathElement, MapLink<PointDatum, LinkDatum>>(`.${s.link}`)\n .data(links, (d, i) => getString(d, config.linkId, i))\n\n const edgesEnter = edges.enter().append('path').attr('class', s.link)\n .style('stroke-width', 0)\n\n smartTransition(edgesEnter.merge(edges), duration)\n .attr('d', link => {\n const source = this._projection(getLonLat(link.source, config.longitude, config.latitude))\n const target = this._projection(getLonLat(link.target, config.longitude, config.latitude))\n return arc(source, target)\n })\n .style('stroke-width', link => getNumber(link, config.linkWidth) / this._currentZoomLevel)\n .style('cursor', link => getString(link, config.linkCursor))\n .style('stroke', (link, i) => getColor(link, config.linkColor, i))\n edges.exit().remove()\n }\n\n private _shouldFilterPointOrCluster (point: TopoJSONMapPoint<PointDatum>, pointIdsToFilter: Set<string>): boolean {\n const { config } = this\n\n // If it's a cluster (potential subcluster), check if any of its leaves should be filtered\n if ((point.properties as TopoJSONMapClusterDatum<PointDatum>).cluster) {\n const clusterId = (point.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId\n const clusterLeaves = this._clusterIndex.getLeaves(clusterId, Infinity)\n // Filter out this subcluster if any of its leaves are in the filter set\n return clusterLeaves.some((leaf: PointFeature<PointDatum>) =>\n pointIdsToFilter.has(getString(leaf.properties as PointDatum, config.pointId))\n )\n }\n\n // For individual points, filter if they're in the filter set\n const pointId = getString(point.properties as PointDatum, config.pointId)\n return pointIdsToFilter.has(pointId)\n }\n\n private _getPointData (): TopoJSONMapPoint<PointDatum>[] {\n const { config, datamodel } = this\n\n if (!config.clustering || !this._clusterIndex) {\n // Return regular points when clustering is disabled\n return datamodel.points.map((d, i) => {\n const pos = this._projection(getLonLat(d, config.longitude, config.latitude))\n const radius = getNumber(d, config.pointRadius)\n const shape = getString(d, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const donutData = getDonutData(d, config.colorMap)\n const pointColor = getColor(d, config.pointColor, i)\n\n return {\n geometry: { type: 'Point', coordinates: getLonLat(d, config.longitude, config.latitude) },\n bbox: { x1: pos[0] - radius, y1: pos[1] - radius, x2: pos[0] + radius, y2: pos[1] + radius },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(d, config.pointId, i),\n properties: d as TopoJSONMapPointDatum<PointDatum>,\n donutData,\n isCluster: false,\n _zIndex: 0,\n } as TopoJSONMapPoint<PointDatum>\n })\n }\n\n // Get bounds for clustering - [westLng, southLat, eastLng, northLat]\n // For now, use full world bounds since calculating viewport bounds with zoom transforms is complex\n const bounds: [number, number, number, number] = [-180, -90, 180, 90]\n\n // Use map zoom level directly for Supercluster, capped at SUPERCLUSTER_MAX_ZOOM.\n // Supercluster expects zoom 0-22; beyond that, all points are unclustered anyway.\n const mapZoom = this._currentZoomLevel || 1\n const zoom = Math.max(0, Math.min(Math.round(mapZoom), SUPERCLUSTER_MAX_ZOOM))\n let geoJsonPoints = getClustersAndPoints(this._clusterIndex!, bounds, zoom)\n\n // Handle expanded cluster points - replace the expanded cluster with individual points\n if (this._expandedCluster) {\n const expandedClusterId = (this._expandedCluster.cluster.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId\n\n // Remove the expanded cluster if it still exists at this zoom level\n geoJsonPoints = geoJsonPoints.filter((c) => {\n const props = c.properties as TopoJSONMapClusterDatum<PointDatum>\n const isExpandedCluster = props.cluster && props.clusterId === expandedClusterId\n return !isExpandedCluster\n })\n\n // Remove any individual points and subclusters that are part of the expanded cluster to avoid duplicates\n const expandedPointIds = new Set(this._expandedCluster.points.map(p => p.id.toString()))\n geoJsonPoints = geoJsonPoints.filter(c => !this._shouldFilterPointOrCluster(\n geoJsonPointToScreenPoint(\n c as ClusterFeature<TopoJSONMapClusterDatum<PointDatum>> | PointFeature<TopoJSONMapPointDatum<PointDatum>>,\n 0,\n this._projection,\n this.config,\n this._currentZoomLevel || 1\n ),\n expandedPointIds\n ))\n\n // Add points from the expanded cluster\n geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points as unknown as Array<ClusterFeature<TopoJSONMapClusterDatum<PointDatum>> | PointFeature<PointDatum>>)\n }\n\n if (this._collapsedCluster) {\n // When collapsed, restore the original cluster point instead of relying on clustering algorithm\n const collapsedClusterId = this._collapsedCluster.properties.clusterId\n\n // Check if the clustering algorithm has recreated a similar cluster at this zoom level\n const hasNaturalCluster = geoJsonPoints.some(c => {\n const props = c.properties as TopoJSONMapClusterDatum<PointDatum>\n return props.cluster && props.clusterId === collapsedClusterId\n })\n\n if (hasNaturalCluster) {\n // Natural cluster exists, we can safely clear the collapsed cluster\n this._collapsedCluster = null\n this._collapsedClusterPointIds = null\n } else {\n // Remove any individual points and subclusters that were part of the collapsed cluster\n geoJsonPoints = geoJsonPoints.filter(c => !this._shouldFilterPointOrCluster(\n geoJsonPointToScreenPoint(\n c as ClusterFeature<TopoJSONMapClusterDatum<PointDatum>> | PointFeature<TopoJSONMapPointDatum<PointDatum>>,\n 0,\n this._projection,\n this.config,\n this._currentZoomLevel || 1\n ),\n this._collapsedClusterPointIds\n ))\n\n // Add the original cluster back\n geoJsonPoints.push(this._collapsedCluster as unknown as ClusterFeature<TopoJSONMapClusterDatum<PointDatum>>)\n }\n }\n\n return geoJsonPoints.map((geoPoint, i) =>\n geoJsonPointToScreenPoint(\n geoPoint as ClusterFeature<TopoJSONMapClusterDatum<PointDatum>> | PointFeature<TopoJSONMapPointDatum<PointDatum>>,\n i,\n this._projection,\n this.config,\n this._currentZoomLevel || 1\n )\n )\n }\n\n _renderPoints (duration: number): void {\n const { config } = this\n const pointData = this._getPointData()\n const currentZoomLevel = this._currentZoomLevel || 1\n\n // Set z-index for expanded cluster points to ensure proper layering\n if (this._expandedCluster && config.clusterBackground) {\n pointData.forEach((d) => {\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n expandedPoint._zIndex = expandedPoint.expandedClusterPoint ? 2 : 0\n })\n }\n\n const points = this._pointsGroup\n .selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.point}`)\n .data(pointData, (d, i) => d.id?.toString() ?? `point-${i}`)\n\n\n // Enter\n const pointsEnter = points.enter().append('g').attr('class', s.point)\n .attr('transform', d => {\n const pos = this._projection(d.geometry.coordinates as [number, number])\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n // Divide by zoom level to compensate for the group's zoom transform\n const dx = (expandedPoint.dx ?? 0) / currentZoomLevel\n const dy = (expandedPoint.dy ?? 0) / currentZoomLevel\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('opacity', 1e-6)\n\n // Main shape (circle, square, triangle) - always draw path; fill/stroke hide when donut shown (match leaflet)\n pointsEnter.append('path')\n .attr('class', s.pointShape)\n .attr('d', d => {\n const radius = d.radius / currentZoomLevel\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n return getPointPathData({ x: 0, y: 0 }, radius, shape)\n })\n .style('fill', (d) => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n if (shape === TopoJSONMapPointShape.Ring) return 'none'\n return d.color\n })\n .style('stroke', d => d.color)\n .style('stroke-width', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const baseStrokeWidth = isRing ? getNumber(d.properties as PointDatum, config.pointRingWidth) : getNumber(d.properties as PointDatum, config.pointStrokeWidth)\n return baseStrokeWidth / currentZoomLevel\n })\n\n // Donut group for color-map functionality\n const donutGroup = pointsEnter.append('g')\n .attr('class', d => d.isCluster ? s.clusterDonut : s.pointDonut)\n .attr('data-point-id', (d, i) => getString(d.properties as PointDatum, config.pointId, i))\n\n // Add background circle for clusters with donut data\n donutGroup.each(function (d) {\n if (d.isCluster && d.donutData.length > 0) {\n select(this).append('circle')\n .attr('class', s.clusterBackground)\n .attr('r', 0)\n }\n })\n\n // Ring overlay path for ring shape\n pointsEnter.append('path')\n .attr('class', s.pointPathRing)\n .attr('d', 'M0,0')\n .style('display', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape\n return shape === TopoJSONMapPointShape.Ring ? null : 'none'\n })\n\n // Center label (for cluster summary or point label)\n pointsEnter.append('text')\n .attr('class', s.pointLabel)\n .attr('dy', '0.32em')\n .style('opacity', 0)\n\n pointsEnter.append('text').attr('class', s.pointBottomLabel)\n .style('opacity', 0)\n\n // Update\n const pointsMerged = pointsEnter.merge(points)\n smartTransition(pointsMerged, duration)\n .attr('transform', d => {\n const pos = this._projection(d.geometry.coordinates as [number, number])\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n // Divide by zoom level to compensate for the group's zoom transform\n const dx = (expandedPoint.dx ?? 0) / currentZoomLevel\n const dy = (expandedPoint.dy ?? 0) / currentZoomLevel\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('cursor', d => {\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n // Expanded cluster points use default cursor (clicking them does nothing)\n if (expandedPoint.expandedClusterPoint) {\n return getString(expandedPoint.properties as PointDatum, config.pointCursor) ?? 'default'\n }\n return d.isCluster ? 'pointer' : getString(d.properties as PointDatum, config.pointCursor)\n })\n .style('opacity', 1)\n\n // Add click event handler for clusters\n pointsMerged.on('click', (event: MouseEvent, d: TopoJSONMapPoint<PointDatum>) => {\n this._onPointClick(d, event)\n })\n\n // Update donut charts and cluster backgrounds (match leaflet: radius 0 when shape is non-circular)\n pointsMerged.selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.pointDonut}, .${s.clusterDonut}`).each(function (d) {\n const group = select(this as SVGGElement)\n const pointShape = getString(d.properties as PointDatum, config.pointShape)\n const isRing = pointShape === TopoJSONMapPointShape.Ring\n const isCircular = (pointShape === TopoJSONMapPointShape.Circle) || isRing || d.isCluster || !pointShape\n\n // Update or create background circle for clusters\n if (d.isCluster && d.donutData.length > 0) {\n const radius = d.radius / currentZoomLevel\n const bgCircle = group.select(`.${s.clusterBackground}`)\n\n if (bgCircle.empty()) {\n group.insert('circle', ':first-child')\n .attr('class', s.clusterBackground)\n .attr('r', radius)\n } else {\n bgCircle.attr('r', radius)\n }\n }\n\n // Update donut/pie chart: pass radius 0 when non-circular so donut is not drawn (shape takes priority)\n if (d.donutData.length > 0) {\n const radius = (isCircular ? d.radius : 0) / currentZoomLevel\n const arcWidth = d.isCluster ? (2 / currentZoomLevel) : (isCircular ? d.radius / currentZoomLevel : 0)\n const strokeWidth = 0.5 / currentZoomLevel\n updateDonut(group, d.donutData, radius, arcWidth, strokeWidth, 0.05)\n } else {\n group.selectAll('*').remove()\n }\n\n // Update the class attribute based on whether it's a cluster\n group.attr('class', d.isCluster ? s.clusterDonut : s.pointDonut)\n })\n\n // Update point shapes\n smartTransition(pointsMerged.select(`.${s.pointShape}`), duration)\n .attr('d', d => {\n const radius = d.radius / currentZoomLevel\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n return getPointPathData({ x: 0, y: 0 }, radius, shape)\n })\n .style('fill', d => {\n const pointShape = getString(d.properties as PointDatum, config.pointShape)\n const shape = pointShape as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const hasDonut = d.donutData.length > 0\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n\n // For expanded cluster points, use the preserved cluster color\n if (expandedPoint.expandedClusterPoint) {\n return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color\n }\n\n if (isRing) return 'none'\n // Match leaflet: cluster with donut uses transparent background; otherwise path uses d.color (colorMap or pointColor)\n if (hasDonut && d.isCluster) return 'transparent'\n return d.color\n })\n .style('stroke', d => {\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n // For expanded cluster points, use the preserved cluster color\n if (expandedPoint.expandedClusterPoint) {\n return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color\n }\n return d.color\n })\n .style('stroke-width', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const baseStrokeWidth = isRing ? getNumber(d.properties as PointDatum, config.pointRingWidth) : getNumber(d.properties as PointDatum, config.pointStrokeWidth)\n return baseStrokeWidth / currentZoomLevel\n })\n\n // Ring overlay update\n smartTransition(pointsMerged.select(`.${s.pointPathRing}`), duration)\n .attr('d', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape\n if (shape !== TopoJSONMapPointShape.Ring) return ''\n const radius = d.radius / currentZoomLevel\n return getPointPathData({ x: 0, y: 0 }, radius, TopoJSONMapPointShape.Circle)\n })\n .style('display', d => {\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape\n return shape === TopoJSONMapPointShape.Ring ? null : 'none'\n })\n\n const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`)\n pointLabelsMerged\n .text(d => {\n if (d.isCluster) {\n return getString(d.properties as TopoJSONMapClusterDatum<PointDatum>, config.clusterLabel) ?? ''\n }\n return getString(d.properties as PointOrClusterProperties<PointDatum>, config.pointLabel as StringAccessor<PointOrClusterProperties<PointDatum>>) ?? ''\n })\n .style('font-size', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) {\n return `calc(var(${s.variables.mapPointLabelFontSize}) / ${currentZoomLevel})`\n }\n const radius = d.isCluster\n ? (d.radius / currentZoomLevel)\n : getNumber(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointRadius as NumericAccessor<PointOrClusterProperties<PointDatum>>,\n 0\n ) / currentZoomLevel\n const pointLabelText = d.isCluster\n ? (getString(d.properties as TopoJSONMapClusterDatum<PointDatum>, config.clusterLabel) || '')\n : (getString(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointLabel as StringAccessor<PointOrClusterProperties<PointDatum>>\n ) || '')\n const textLength = pointLabelText.length\n // Use the same formula as Leaflet map for consistent font sizing\n const fontSize = radius / Math.pow(textLength, 0.4)\n // Match Leaflet: minimum is the calculated fontSize itself, max is 16\n return clamp(fontSize, fontSize, 16)\n })\n .attr('y', d => {\n // For points with pie/donut charts, always center the label\n if (d.donutData.length > 0) return null\n\n if (config.pointLabelPosition === MapPointLabelPosition.Center) return null\n\n const radius = d.isCluster\n ? (d.radius / currentZoomLevel)\n : getNumber(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointRadius as NumericAccessor<PointOrClusterProperties<PointDatum>>,\n 0\n ) / currentZoomLevel\n return radius\n })\n .attr('dy', d => {\n // For points with pie/donut charts, always use centered dy\n if (d.donutData.length > 0) return '0.32em'\n return config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em'\n })\n\n smartTransition(pointLabelsMerged, duration)\n .style('fill', (d, i) => {\n if (d.donutData.length > 0) {\n // Cluster background is white, so use dark text\n return d.isCluster\n ? `var(${s.variables.mapPointLabelTextColorDark})`\n : `var(${s.variables.mapPointLabelTextColorLight})`\n } else {\n if (config.pointLabelColor) {\n const labelColor = getColor(d.properties as PointDatum, config.pointLabelColor, i)\n if (labelColor) return labelColor\n }\n\n const pointColor = getColor(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointColor as ColorAccessor<PointOrClusterProperties<PointDatum>>,\n i\n )\n const hex = color(isStringCSSVariable(pointColor) ? getCSSVariableValue(pointColor, this.element) : pointColor)?.hex()\n if (!hex) return null\n\n const brightness = hexToBrightness(hex)\n return brightness > config.pointLabelTextBrightnessRatio\n ? `var(${s.variables.mapPointLabelTextColorDark})`\n : `var(${s.variables.mapPointLabelTextColorLight})`\n }\n })\n .style('opacity', 1)\n .style('pointer-events', 'none')\n .attr('visibility', d => {\n // Show labels for clusters, individual points with pie charts, and when pointLabel is defined\n const hasLabel = d.isCluster\n ? !!getString(d.properties as TopoJSONMapClusterDatum<PointDatum>, config.clusterLabel)\n : !!getString(\n d.properties as PointOrClusterProperties<PointDatum>,\n config.pointLabel as StringAccessor<PointOrClusterProperties<PointDatum>>\n )\n return hasLabel ? null : 'hidden'\n })\n\n // Point & cluster bottom labels (hidden when point is inside expanded cluster)\n const bottomLabelsMerged = pointsMerged.select(`.${s.pointBottomLabel}`)\n bottomLabelsMerged\n .attr('visibility', d => (d as ExpandedClusterPoint<PointDatum>).expandedClusterPoint ? 'hidden' : null)\n .text(d => {\n const bottomLabelText = d.isCluster\n ? (getString(d.properties as TopoJSONMapClusterDatum<PointDatum>, config.clusterBottomLabel) ?? '')\n : (getString(d.properties as PointDatum, config.pointBottomLabel) ?? '')\n return trimStringMiddle(bottomLabelText, 15)\n })\n .attr('y', d => {\n const radius = d.isCluster\n ? (d.radius / this._currentZoomLevel)\n : (getNumber(d.properties as PointDatum, config.pointRadius) / this._currentZoomLevel)\n return radius + (10 / this._currentZoomLevel) // offset below the point/cluster, scaled with zoom\n })\n .attr('dy', '0.32em')\n .style('font-size', `calc(var(${s.variables.mapPointBottomLabelFontSize}) / ${this._currentZoomLevel})`)\n\n smartTransition(bottomLabelsMerged, duration)\n .style('opacity', d => (d as ExpandedClusterPoint<PointDatum>).expandedClusterPoint ? 0 : 1)\n\n // Sort elements by z-index to ensure expanded cluster points appear above everything else\n if (this._expandedCluster && config.clusterBackground) {\n this._pointsGroup\n .selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.point}`)\n .sort((a: TopoJSONMapPoint<PointDatum>, b: TopoJSONMapPoint<PointDatum>) => a._zIndex - b._zIndex)\n }\n\n // Exit\n points.exit().remove()\n\n // Heatmap\n this._pointsGroup.style('filter', (config.heatmapMode && this._currentZoomLevel < config.heatmapModeZoomLevelThreshold) ? 'url(#heatmapFilter)' : null)\n this._pointsGroup.selectAll(`.${s.pointLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null)\n this._pointsGroup.selectAll(`.${s.pointBottomLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null)\n\n // Update selection ring\n updateSelectionRing<AreaDatum, PointDatum, LinkDatum>(\n this._pointSelectionRing,\n this._selectedPoint,\n pointData,\n this.config,\n this._projection,\n currentZoomLevel\n )\n\n // Set up events and custom attributes for rendered points (match LeafletMap behavior)\n this._setUpComponentEventsThrottled()\n this._setCustomAttributesThrottled()\n }\n\n _fitToPoints (points?: PointDatum[], pad = 0.1): void {\n const { config, datamodel } = this\n const pointData = points || datamodel.points\n if (pointData.length === 0 && !(datamodel.data?.links?.length)) return\n\n const coordinates = pointData.map(p => [\n getNumber(p, d => getNumber(d, config.longitude)),\n getNumber(p, d => getNumber(d, config.latitude)),\n ] as [number, number]).filter(([lon, lat]) => isNumber(lon) && isNumber(lat))\n\n const rawLinks = datamodel.data?.links ?? []\n for (let i = 0; i < rawLinks.length; i += 1) {\n const link = rawLinks[i]\n const slon = getNumber(link, config.sourceLongitude, i)\n const slat = getNumber(link, config.sourceLatitude, i)\n const tlon = getNumber(link, config.targetLongitude, i)\n const tlat = getNumber(link, config.targetLatitude, i)\n if (isNumber(slon) && isNumber(slat)) coordinates.push([slon, slat])\n if (isNumber(tlon) && isNumber(tlat)) coordinates.push([tlon, tlat])\n }\n\n if (coordinates.length === 0) return\n\n if (coordinates.length === 1) {\n // Single point has zero-area bounds and breaks fitExtent; center the projection on the point\n this._projection.center(coordinates[0])\n this._projection.translate([this._width / 2, this._height / 2])\n } else {\n const featureCollection: ExtendedFeatureCollection = {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: { type: 'MultiPoint', coordinates },\n }],\n }\n\n this._projection.fitExtent([\n [this._width * pad, this._height * pad],\n [this._width * (1 - pad), this._height * (1 - pad)],\n ], featureCollection)\n\n const maxScale = config.zoomExtent[1] * this._initialScale\n const fittedScale = this._projection.scale()\n\n if (fittedScale > maxScale) {\n const fittedTranslate = this._projection.translate()\n const scaleRatio = maxScale / fittedScale\n\n this._projection.scale(maxScale)\n this._projection.translate([\n this._width / 2 - (this._width / 2 - fittedTranslate[0]) * scaleRatio,\n this._height / 2 - (this._height / 2 - fittedTranslate[1]) * scaleRatio,\n ])\n }\n }\n\n this._center = this._projection.translate()\n }\n\n _applyZoom (): void {\n const translate = this._center ?? this._projection.translate()\n const scale = this._initialScale * this._currentZoomLevel\n\n // Set an explicit pixel extent so D3 never falls back to defaultExtent2,\n // which reads SVGLength.baseVal.value and throws on SVGs with % dimensions.\n this._zoomBehavior.extent([[0, 0], [this._width, this._height]])\n\n this.g.call(this._zoomBehavior.transform, zoomIdentity.translate(translate[0], translate[1]).scale(scale))\n this._isZooming = true\n this._onZoomEnd()\n }\n\n _onResize (): void {\n this._isResizing = true\n const prevTranslate = this._projection.translate()\n\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n\n // If a point is selected, center the view on it after resize\n if (this._selectedPoint) {\n const coords = this._selectedPoint.geometry.coordinates as [number, number]\n const pos = this._projection(coords)\n const projTranslate = this._projection.translate()\n if (pos) {\n const k = this._currentZoomLevel\n this._center = [\n this._width / 2 - (pos[0] - projTranslate[0]) * k,\n this._height / 2 - (pos[1] - projTranslate[1]) * k,\n ]\n }\n } else {\n this._center = [\n this._projection.translate()[0] * this._center[0] / prevTranslate[0],\n this._projection.translate()[1] * this._center[1] / prevTranslate[1],\n ]\n }\n\n this._applyZoom()\n\n this._isResizing = false\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n _onZoom (event: D3ZoomEvent<SVGGElement, unknown>): void {\n if (this._firstRender) {\n // On first render, just update the zoom level, don't trigger animation\n this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1\n // Set CSS custom property for zoom level\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n return // To prevent double render because of binding zoom behaviour\n }\n const isMouseEvent = !!event.sourceEvent\n const isExternalEvent = !event?.sourceEvent && !this._isResizing\n const isResizeEvent = this._isResizing && !event?.sourceEvent\n\n this._isZooming = true\n\n // Clear any pending zoom end timeout\n if (this._zoomEndTimeoutId) {\n clearTimeout(this._zoomEndTimeoutId)\n }\n\n // Reset expanded cluster when manually zooming (but not during component-initiated zoom)\n if (isMouseEvent && !this._eventInitiatedByComponent) {\n this._resetExpandedCluster()\n // Also clear the collapsed cluster state so points can naturally re-cluster at the new zoom level\n this._collapsedCluster = null\n this._collapsedClusterPointIds = null\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent, isResizeEvent))\n\n if (isMouseEvent) {\n // Update the center coordinate so that the next call to _applyZoom()\n // will zoom with respect to the current view\n this._center = [event.transform.x, event.transform.y]\n }\n this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1\n // Set CSS custom property for zoom level\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n\n // Fallback timeout in case zoom end event doesn't fire\n this._onZoomEnd()\n }\n\n _onZoomEnd (): void {\n if (this._zoomEndTimeoutId) {\n clearTimeout(this._zoomEndTimeoutId)\n }\n\n this._zoomEndTimeoutId = setTimeout(() => {\n this._isZooming = false\n this._runCollisionDetection()\n }, 150)\n }\n\n private _runCollisionDetection (): void {\n window.cancelAnimationFrame(this._collisionDetectionAnimFrameId)\n this._collisionDetectionAnimFrameId = window.requestAnimationFrame(() => {\n const duration = this.config.duration\n // Run collision detection for area labels\n const areaLabels = this._areaLabelsGroup.selectAll<SVGTextElement, unknown>(`.${s.areaLabel}`)\n collideAreaLabels(areaLabels, duration)\n\n // Run collision detection for point bottom labels\n const pointBottomLabels = this._pointsGroup.selectAll<SVGTextElement, TopoJSONMapPoint<PointDatum>>(`.${s.point} .${s.pointBottomLabel}`)\n collidePointBottomLabels(pointBottomLabels, duration)\n })\n }\n\n _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean, isResizeEvent = false): void {\n const scale = transform.k / this._initialScale || 1\n const center = this._projection.translate()\n\n this._transform = zoomIdentity\n .translate(transform.x - center[0] * scale, transform.y - center[1] * scale)\n .scale(scale)\n\n const customDuration = (isExternalEvent || isResizeEvent)\n ? this.config.zoomDuration\n : (isMouseEvent ? 0 : null)\n\n // Call render functions that depend on this._transform\n this._renderGroups(customDuration)\n this._renderAreaLabels(customDuration)\n this._renderLinks(customDuration)\n this._renderClusterBackground(customDuration)\n this._renderPoints(customDuration)\n this._renderSourcePoints(customDuration)\n }\n\n public zoomIn (increment = 0.5): void {\n if (this._isZooming) return\n this._resetExpandedCluster()\n this.setZoom(this._currentZoomLevel + increment)\n }\n\n public zoomOut (increment = 0.5): void {\n if (this._isZooming) return\n this._resetExpandedCluster()\n this.setZoom(this._currentZoomLevel - increment)\n }\n\n public setZoom (zoomLevel: number): void {\n const { config } = this\n const newZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n const currentK = this._initialScale * this._currentZoomLevel\n const newK = this._initialScale * newZoomLevel\n // Update _center so the viewport center stays fixed when zooming (avoids drift after pan)\n if (currentK > 0 && isFinite(currentK) && isFinite(newK)) {\n const ratio = newK / currentK\n this._center[0] = (this._width / 2 - this.bleed.left) * (1 - ratio) + this._center[0] * ratio\n this._center[1] = (this._height / 2 - this.bleed.top) * (1 - ratio) + this._center[1] * ratio\n }\n this._currentZoomLevel = newZoomLevel\n // Set CSS custom property for zoom level\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n this._transform = zoomIdentity\n .translate(this._center[0] * (1 - this._currentZoomLevel), this._center[1] * (1 - this._currentZoomLevel))\n .scale(this._currentZoomLevel)\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n public fitView (): void {\n const { config } = this\n\n this._resetExpandedCluster()\n\n if (config.mapFitToPoints) {\n // When mapFitToPoints is enabled, fitView should refit the projection to the points\n // and reset the zoom level relative to that fitted scale.\n this._fitToPoints()\n // Treat the newly fitted scale as the baseline and reset zoom to 1\n this._initialScale = this._projection.scale()\n this._currentZoomLevel = 1\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', '1')\n this._center = this._projection.translate()\n this._applyZoom()\n } else {\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1\n // Set CSS custom property for zoom level\n this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel))\n this._center = this._projection.translate()\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n }\n\n private _initFlowFeatures (): void {\n initFlowFeatures<AreaDatum, PointDatum, LinkDatum>(\n this as unknown as FlowInitContext<AreaDatum, PointDatum, LinkDatum>\n )\n }\n\n private _renderSourcePoints (duration: number): void {\n const { config } = this\n\n const sourcePoints = this._sourcePointsGroup\n .selectAll<SVGCircleElement, { x: number; y: number; radius: number; color: string; flowData: LinkDatum }>(`.${s.sourcePoint}`)\n .data(this._sourcePoints, (d, i) => `${d.flowData}-${i}`)\n\n const sourcePointsEnter = sourcePoints.enter()\n .append('circle')\n .attr('class', s.sourcePoint)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', d => d.radius / this._currentZoomLevel)\n .style('fill', d => d.color)\n .style('stroke', d => d.color)\n .style('stroke-width', 0)\n .style('opacity', 0)\n .on('click', (event: MouseEvent, d) => {\n event.stopPropagation()\n config.onSourcePointClick?.(d.flowData, d.x, d.y, event)\n })\n .on('mouseenter', (event: MouseEvent, d) => {\n config.onSourcePointMouseEnter?.(d.flowData, d.x, d.y, event)\n })\n .on('mouseleave', (event: MouseEvent, d) => {\n config.onSourcePointMouseLeave?.(d.flowData, event)\n })\n\n smartTransition(sourcePointsEnter.merge(sourcePoints), duration)\n .attr('r', d => d.radius / this._currentZoomLevel)\n .style('opacity', 1)\n\n sourcePoints.exit().remove()\n }\n\n private _renderFlowParticles (duration: number): void {\n const flowParticles = this._flowParticlesGroup\n .selectAll<SVGCircleElement, FlowParticle>(`.${s.flowParticle}`)\n .data(this._flowParticles, d => d.id)\n\n const flowParticlesEnter = flowParticles.enter()\n .append('circle')\n .attr('class', s.flowParticle)\n .attr('r', 0)\n .style('opacity', 0)\n\n smartTransition(flowParticlesEnter.merge(flowParticles), duration)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', d => d.radius / (this._currentZoomLevel || 1))\n .style('fill', d => d.color)\n .style('opacity', 0.8)\n\n flowParticles.exit().remove()\n }\n\n private _startFlowAnimation (): void {\n if (this._animationId) return // Animation already running\n\n this._animateFlow()\n }\n\n private _animateFlow (): void {\n if (!this.config.enableFlowAnimation) return\n\n this._animationId = requestAnimationFrame(() => {\n this._updateFlowParticles()\n this._animateFlow() // Recursive call like LeafletFlowMap\n })\n }\n\n private _stopFlowAnimation (): void {\n if (this._animationId) {\n cancelAnimationFrame(this._animationId)\n this._animationId = null\n }\n }\n\n private _updateFlowParticles (): void {\n updateFlowParticles({\n _flowParticles: this._flowParticles as FlowParticle[],\n _currentZoomLevel: this._currentZoomLevel,\n _flowParticlesGroup: this._flowParticlesGroup,\n } as FlowUpdateContext)\n }\n\n private _onPointClick (d: TopoJSONMapPoint<PointDatum>, event: MouseEvent): void {\n const { config } = this\n event.stopPropagation()\n\n // Clicking on expanded cluster points does nothing - they stay expanded\n // (clicking outside on the map background will collapse them)\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n if (expandedPoint.expandedClusterPoint) {\n return\n }\n\n if (d.isCluster && (d.properties as TopoJSONMapClusterDatum<PointDatum>).cluster) {\n const zoomLevel = this._currentZoomLevel || 1\n const coordinates = d.geometry.coordinates as [number, number]\n const zoomExtent = config.zoomExtent\n const zoomMax = zoomExtent?.[1] ?? 12\n\n if (config.clusterExpandOnClick) {\n // Zoom to cluster and expand in one action\n const newZoomLevel = getNextZoomLevelOnClusterClick(zoomLevel, zoomMax)\n this._expandCluster(d)\n this._zoomToLocation(coordinates, newZoomLevel)\n } else {\n // Just zoom to cluster without expanding\n const newZoomLevel = getNextZoomLevelOnClusterClick(zoomLevel, zoomMax)\n this._zoomToLocation(coordinates, newZoomLevel)\n }\n }\n }\n\n private _findClusterAtCoordinates (coordinates: [number, number]): TopoJSONMapPoint<PointDatum> | undefined {\n const pointData = this._getPointData()\n const [targetLon, targetLat] = coordinates\n\n // Find clusters and calculate their distance to the target coordinates\n const clusters = pointData.filter(p => p.isCluster)\n if (clusters.length === 0) return undefined\n\n // Find the cluster closest to the target coordinates\n let closestCluster: TopoJSONMapPoint<PointDatum> | undefined\n let minDistance = Infinity\n\n for (const cluster of clusters) {\n const [lon, lat] = cluster.geometry.coordinates as [number, number]\n const distance = Math.sqrt(Math.pow(lon - targetLon, 2) + Math.pow(lat - targetLat, 2))\n\n if (distance < minDistance) {\n minDistance = distance\n closestCluster = cluster\n }\n }\n\n return closestCluster\n }\n\n private _expandCluster (clusterPoint: TopoJSONMapPoint<PointDatum>): PointDatum[] | undefined {\n const { config } = this\n\n if (!clusterPoint.clusterIndex) {\n console.error('Cannot expand cluster - no clusterIndex!')\n return undefined\n }\n\n // Note: _collapsedCluster.id is numeric (e.g., 331), but clusterPoint.id is \"cluster-331\"\n if (this._collapsedCluster && `cluster-${this._collapsedCluster.id}` === clusterPoint.id) {\n this._collapsedCluster = null\n this._collapsedClusterPointIds = null\n }\n\n const padding = 1\n const clusterId = (clusterPoint.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId as number\n const points = clusterPoint.clusterIndex.getLeaves(clusterId, Infinity)\n\n // Determine packing zoom level. Cap at SUPERCLUSTER_MAX_ZOOM to avoid huge radii when\n // zoomExtent[1] is large (e.g. 1000), which would cause incorrect expansion and weird animation.\n const maxClusterZoomLevel = Array.isArray(config.zoomExtent) ? Math.min(config.zoomExtent[1], SUPERCLUSTER_MAX_ZOOM) : 16\n const packingZoomLevel = Math.min(this._currentZoomLevel || 1, maxClusterZoomLevel)\n\n const packPoints: {x: number | null; y: number | null; r: number }[] = points.map((point) => {\n return {\n x: null as number | null,\n y: null as number | null,\n r: getPointRadius(point as PointFeature<TopoJSONMapPointDatum<PointDatum>>, config.pointRadius, packingZoomLevel) + padding,\n }\n })\n packSiblings(packPoints)\n\n // Create expanded points with relative positions\n const expandedPoints = points.map((point, i) => {\n const originalData = point.properties as PointDatum\n const radius = getNumber(originalData, config.pointRadius) || 8\n const shape = getString(originalData, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n // Don't show pie charts for expanded cluster points (similar to Leaflet map)\n const donutData: TopoJSONMapPieDatum[] = []\n // Use each point's own color (from colorMap or pointColor) so shapes keep their correct color when expanded\n const explicitPointColor = getColor(originalData, config.pointColor)\n const pointDonutData = getDonutData(originalData, config.colorMap)\n const maxVal = pointDonutData.length ? Math.max(...pointDonutData.map(d => d.value)) : 0\n const biggestDatum = pointDonutData.find(d => d.value === maxVal) || pointDonutData[0]\n const pointColor = explicitPointColor ?? biggestDatum?.color ?? clusterPoint.color\n\n return {\n geometry: { type: 'Point' as const, coordinates: clusterPoint.geometry.coordinates },\n bbox: { x1: 0, y1: 0, x2: 0, y2: 0 },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(originalData, config.pointId, i) || `${clusterId}-${i}`,\n properties: originalData,\n donutData,\n isCluster: false,\n _zIndex: 1,\n expandedClusterPoint: clusterPoint,\n clusterColor: pointColor,\n dx: packPoints[i].x,\n dy: packPoints[i].y,\n packedRadius: packPoints[i].r, // Store the packed radius for cluster background calculation\n } as TopoJSONMapPoint<PointDatum> & { expandedClusterPoint: TopoJSONMapPoint<PointDatum>; dx: number; dy: number; packedRadius: number }\n })\n\n this._resetExpandedCluster()\n this._expandedCluster = {\n cluster: clusterPoint,\n points: expandedPoints,\n }\n\n // Re-render to show expanded points and cluster background with smooth animation\n this._renderClusterBackground(config.duration / 2)\n this._renderPoints(config.duration / 2)\n\n // Re-bind user-defined events to include newly created expanded cluster points\n this._setUpComponentEventsThrottled()\n this._setCustomAttributesThrottled()\n\n // Return the original point data for centroid calculation\n return points.map(p => p.properties as PointDatum)\n }\n\n private _zoomToLocation (coordinates: [number, number], zoomLevel: number): void {\n const { config } = this\n\n const clampedZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n\n // Project the target coordinates using the current projection\n const targetPoint = this._projection(coordinates)\n if (!targetPoint) return\n\n // Calculate the center of the viewport\n const centerX = this._width / 2\n const centerY = this._height / 2\n\n // Calculate the scale factor\n const k = this._initialScale * clampedZoomLevel\n\n // Calculate translation to center the target point\n const currentCenter = this._projection.translate()\n const x = centerX + (currentCenter[0] - targetPoint[0]) * (k / this._initialScale)\n const y = centerY + (currentCenter[1] - targetPoint[1]) * (k / this._initialScale)\n\n const transform = zoomIdentity.translate(x, y).scale(k)\n\n // Update internal state\n this._currentZoomLevel = clampedZoomLevel\n this._center = [x, y]\n\n // Set flag to indicate this is a component-initiated zoom\n this._eventInitiatedByComponent = true\n\n // Apply the transform with smooth eased animation\n this.g\n .transition()\n .duration(config.zoomDuration)\n .ease(easeCubicInOut)\n .call(this._zoomBehavior.transform, transform)\n .on('end', () => {\n // Reset the flag after transition completes\n this._eventInitiatedByComponent = false\n })\n }\n\n private _collapseExpandedCluster (): void {\n if (this._expandedCluster) {\n this._resetExpandedCluster()\n this._renderClusterBackground(this.config.duration)\n this._renderPoints(this.config.duration)\n }\n }\n\n private _resetExpandedCluster (): void {\n if (this._expandedCluster) {\n // Store the original cluster to restore it\n const originalCluster = this._expandedCluster.cluster\n const expandedPointIds = new Set(this._expandedCluster.points.map((p: TopoJSONMapPoint<PointDatum>) => getString(p.properties as PointDatum, this.config.pointId)))\n\n // Convert the original cluster back to GeoJSON format for re-insertion\n // Preserve critical fields: id (for cluster identification), clusterIndex (for re-expansion)\n const clusterGeoJson = {\n type: 'Feature' as const,\n id: (originalCluster.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId, // Use clusterId as the feature id\n properties: {\n ...originalCluster.properties,\n clusterIndex: originalCluster.clusterIndex, // Preserve clusterIndex for re-expansion\n },\n geometry: originalCluster.geometry,\n }\n\n this._collapsedCluster = clusterGeoJson\n this._collapsedClusterPointIds = expandedPointIds\n\n // Clean up all references to prevent memory leaks\n this._expandedCluster.points?.forEach((d) => {\n const expandedPoint = d as ExpandedClusterPoint<PointDatum>\n delete expandedPoint.expandedClusterPoint\n delete expandedPoint.clusterColor\n delete expandedPoint.dx\n delete expandedPoint.dy\n })\n this._expandedCluster = null\n }\n }\n\n /** Select a point by id */\n public selectPointById (id: string): void {\n const { config } = this\n const pointData = this._getPointData()\n const foundPoint = pointData.find(d => getString(d.properties as PointDatum, config.pointId) === id)\n\n if (foundPoint) {\n this._selectedPoint = foundPoint\n this._renderPoints(config.duration)\n } else {\n console.warn(`Unovis | TopoJSON Map: Point with id ${id} not found`)\n }\n }\n\n /** Get the id of the selected point */\n public getSelectedPointId (): string | number | undefined {\n return this._selectedPoint?.id\n }\n\n /** Unselect point */\n public unselectPoint (): void {\n this._selectedPoint = null\n this._renderPoints(this.config.duration)\n }\n\n destroy (): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._stopFlowAnimation()\n window.cancelAnimationFrame(this._collisionDetectionAnimFrameId)\n if (this._zoomEndTimeoutId) {\n clearTimeout(this._zoomEndTimeoutId)\n }\n }\n}\n"],"names":["s.background","s.features","s.areaLabel","s.links","s.clusterBackground","s.flowParticles","s.points","s.pointSelectionRing","s.pointSelection","s.sourcePoints","s.feature","s.variables","s.clusterBackgroundCircle","s.link","s.point","s.pointShape","s.clusterDonut","s.pointDonut","s.pointPathRing","s.pointLabel","s.pointBottomLabel","s.sourcePoint","s.flowParticle","s"],"mappings":"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"}
|