@unovis/ts 1.7.0-stellar.1 → 1.7.0-stellar.3

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.
@@ -64,6 +64,7 @@ export declare class TopoJSONMap<AreaDatum, PointDatum = unknown, LinkDatum = un
64
64
  fitView(): void;
65
65
  fitViewToFlows(pad?: number): void;
66
66
  private _onPointClick;
67
+ private _clusterInScreenSpace;
67
68
  private _expandCluster;
68
69
  private _zoomToLocation;
69
70
  private _resetExpandedCluster;
@@ -4,7 +4,6 @@ import { timeout } from 'd3-timer';
4
4
  import { easeCubicInOut } from 'd3-ease';
5
5
  import { geoPath } from 'd3-geo';
6
6
  import { color } from 'd3-color';
7
- import { packSiblings } from 'd3-hierarchy';
8
7
  import { feature } from 'topojson-client';
9
8
  import { ComponentCore } from '../../core/component/index.js';
10
9
  import { MapGraphDataModel } from '../../data-models/map-graph.js';
@@ -15,7 +14,7 @@ import { rectIntersect, isStringCSSVariable, getCSSVariableValue } from '../../u
15
14
  import { estimateStringPixelLength } from '../../utils/text.js';
16
15
  import { MapProjection, TopoJSONMapPointShape, MapPointLabelPosition } from './types.js';
17
16
  import { TopoJSONMapDefaultConfig } from './config.js';
18
- import { calculateClusterIndex, getLonLat, arc, getDonutData, getPointPathData, getClustersAndPoints, geoJsonPointToScreenPoint, getNextZoomLevelOnClusterClick } from './utils.js';
17
+ import { calculateClusterIndex, getLonLat, arc, getDonutData, getPointPathData, getNextZoomLevelOnClusterClick } from './utils.js';
19
18
  import { updateDonut } from './modules/donut.js';
20
19
  import * as style from './style.js';
21
20
  import { background, features, areaLabel, links, points, flowParticles, sourcePoints, feature as feature$1, link, point, pointCircle, pointLabel, sourcePoint, flowParticle } from './style.js';
@@ -347,7 +346,7 @@ class TopoJSONMap extends ComponentCore {
347
346
  }
348
347
  _getPointData() {
349
348
  const { config, datamodel } = this;
350
- if (!config.clustering || !this._clusterIndex) {
349
+ if (!config.clustering || !this._clusterIndex || config.clusteringDistance === 0) {
351
350
  // Return regular points when clustering is disabled
352
351
  return datamodel.points.map((d, i) => {
353
352
  const pos = this._projection(getLonLat(d, config.longitude, config.latitude));
@@ -369,16 +368,32 @@ class TopoJSONMap extends ComponentCore {
369
368
  };
370
369
  });
371
370
  }
372
- // Get bounds for clustering
373
- const bounds = this._projection.invert ? [
374
- this._projection.invert([0, this._height])[0],
375
- this._projection.invert([0, this._height])[1],
376
- this._projection.invert([this._width, 0])[0],
377
- this._projection.invert([this._width, 0])[1],
378
- ] : [-180, -90, 180, 90];
379
- // Use a capped zoom level for clustering to prevent over-fragmentation
380
- const clusterZoom = Math.min(Math.round(this._currentZoomLevel || 1), 8);
381
- let geoJsonPoints = getClustersAndPoints(this._clusterIndex, bounds, clusterZoom);
371
+ // Convert all points to screen space first
372
+ const allPoints = datamodel.points.map((d, i) => {
373
+ const coords = getLonLat(d, config.longitude, config.latitude);
374
+ const screenPos = this._projection(coords);
375
+ const radius = getNumber(d, config.pointRadius);
376
+ const shape = getString(d, config.pointShape) || TopoJSONMapPointShape.Circle;
377
+ const donutData = getDonutData(d, config.colorMap);
378
+ const pointColor = getColor(d, config.pointColor, i);
379
+ return {
380
+ geometry: { type: 'Point', coordinates: coords },
381
+ bbox: { x1: screenPos[0] - radius, y1: screenPos[1] - radius, x2: screenPos[0] + radius, y2: screenPos[1] + radius },
382
+ radius,
383
+ path: getPointPathData({ x: 0, y: 0 }, radius, shape),
384
+ color: pointColor,
385
+ id: getString(d, config.pointId, i),
386
+ properties: d,
387
+ donutData,
388
+ isCluster: false,
389
+ _zIndex: 0,
390
+ screenX: screenPos[0],
391
+ screenY: screenPos[1],
392
+ originalData: d,
393
+ };
394
+ });
395
+ // Perform clustering in screen space
396
+ let geoJsonPoints = this._clusterInScreenSpace(allPoints);
382
397
  // Handle expanded cluster points - replace the expanded cluster with individual points
383
398
  if (this._expandedCluster) {
384
399
  // Remove expanded cluster from the data
@@ -386,7 +401,7 @@ class TopoJSONMap extends ComponentCore {
386
401
  // Add points from the expanded cluster
387
402
  geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points);
388
403
  }
389
- return geoJsonPoints.map((geoPoint, i) => geoJsonPointToScreenPoint(geoPoint, i, this._projection, this.config, this._currentZoomLevel || 1));
404
+ return geoJsonPoints;
390
405
  }
391
406
  _renderPoints(duration) {
392
407
  const { config } = this;
@@ -520,7 +535,7 @@ class TopoJSONMap extends ComponentCore {
520
535
  return null;
521
536
  if (d.isCluster) {
522
537
  // For clusters, use contrasting color against cluster background
523
- const clusterColor = getColor(d, config.clusterColor, i) || '#2196F3';
538
+ const clusterColor = getColor(d, config.clusterColor) || '#2196F3';
524
539
  const hex = (_a = color(isStringCSSVariable(clusterColor) ? getCSSVariableValue(clusterColor, this.element) : clusterColor)) === null || _a === void 0 ? void 0 : _a.hex();
525
540
  if (hex) {
526
541
  const brightness = hexToBrightness(hex);
@@ -626,7 +641,7 @@ class TopoJSONMap extends ComponentCore {
626
641
  // will zoom with respect to the current view
627
642
  this._center = [event.transform.x, event.transform.y];
628
643
  }
629
- this._currentZoomLevel = ((event === null || event === void 0 ? void 0 : event.transform.k) / this._initialScale) || 1;
644
+ // _currentZoomLevel is now set in _onZoomHandler to track previous value
630
645
  }
631
646
  _onZoomHandler(transform, isMouseEvent, isExternalEvent) {
632
647
  const scale = transform.k / this._initialScale || 1;
@@ -634,6 +649,8 @@ class TopoJSONMap extends ComponentCore {
634
649
  this._transform = zoomIdentity
635
650
  .translate(transform.x - center[0] * scale, transform.y - center[1] * scale)
636
651
  .scale(scale);
652
+ // Update zoom level for clustering calculations
653
+ this._currentZoomLevel = (transform.k / this._initialScale) || 1;
637
654
  const customDuration = isExternalEvent
638
655
  ? this.config.zoomDuration
639
656
  : (isMouseEvent ? 0 : null);
@@ -752,31 +769,93 @@ class TopoJSONMap extends ComponentCore {
752
769
  }
753
770
  }
754
771
  }
772
+ _clusterInScreenSpace(points) {
773
+ const { config } = this;
774
+ const clusteringDistance = config.clusteringDistance || 55;
775
+ // If clustering distance is 0, return all points as individual points
776
+ if (clusteringDistance === 0) {
777
+ return points;
778
+ }
779
+ const clusters = [];
780
+ const processed = new Set();
781
+ for (let i = 0; i < points.length; i++) {
782
+ if (processed.has(i))
783
+ continue;
784
+ const point = points[i];
785
+ const nearbyPoints = [point];
786
+ processed.add(i);
787
+ // Find all points within clustering distance
788
+ for (let j = i + 1; j < points.length; j++) {
789
+ if (processed.has(j))
790
+ continue;
791
+ const otherPoint = points[j];
792
+ const distance = Math.sqrt(Math.pow(point.screenX - otherPoint.screenX, 2) +
793
+ Math.pow(point.screenY - otherPoint.screenY, 2));
794
+ if (distance <= clusteringDistance) {
795
+ nearbyPoints.push(otherPoint);
796
+ processed.add(j);
797
+ }
798
+ }
799
+ if (nearbyPoints.length > 1) {
800
+ // Create cluster
801
+ const centerX = nearbyPoints.reduce((sum, p) => sum + p.screenX, 0) / nearbyPoints.length;
802
+ const centerY = nearbyPoints.reduce((sum, p) => sum + p.screenY, 0) / nearbyPoints.length;
803
+ const centerCoords = this._projection.invert ? this._projection.invert([centerX, centerY]) : [0, 0];
804
+ const clusterRadius = getNumber(nearbyPoints[0].originalData, config.clusterRadius) || 10;
805
+ const clusterId = clusters.length;
806
+ const cluster = {
807
+ geometry: { type: 'Point', coordinates: centerCoords },
808
+ properties: {
809
+ cluster: true,
810
+ clusterId: clusterId,
811
+ pointCount: nearbyPoints.length,
812
+ clusterPoints: nearbyPoints.map(p => p.originalData),
813
+ },
814
+ bbox: { x1: centerX - clusterRadius, y1: centerY - clusterRadius, x2: centerX + clusterRadius, y2: centerY + clusterRadius },
815
+ radius: clusterRadius,
816
+ path: getPointPathData({ x: 0, y: 0 }, clusterRadius, TopoJSONMapPointShape.Circle),
817
+ color: getColor(nearbyPoints[0].originalData, config.clusterColor) || '#2196F3',
818
+ id: `cluster-${clusterId}`,
819
+ donutData: [],
820
+ isCluster: true,
821
+ _zIndex: 1,
822
+ clusterIndex: {
823
+ getLeaves: (id) => {
824
+ if (id === clusterId) {
825
+ return nearbyPoints.map(p => ({ properties: p.originalData }));
826
+ }
827
+ return [];
828
+ },
829
+ },
830
+ };
831
+ clusters.push(cluster);
832
+ }
833
+ else {
834
+ // Keep as individual point
835
+ clusters.push(point);
836
+ }
837
+ }
838
+ return clusters;
839
+ }
755
840
  _expandCluster(clusterPoint) {
756
841
  const { config } = this;
757
842
  if (!clusterPoint.clusterIndex)
758
843
  return undefined;
759
- const padding = 1;
760
844
  const clusterId = clusterPoint.properties.clusterId;
761
845
  const points = clusterPoint.clusterIndex.getLeaves(clusterId, Infinity);
762
- // Calculate positions for expanded points using d3.packSiblings (same as leaflet map)
763
- const packPoints = points.map(() => ({
764
- x: 0,
765
- y: 0,
766
- r: 8 + padding, // Base radius for individual points
767
- }));
768
- packSiblings(packPoints);
769
- // Create expanded points with relative positions
846
+ // Create expanded points at their actual geographic coordinates
770
847
  const expandedPoints = points.map((point, i) => {
771
848
  const originalData = point.properties;
849
+ const coords = getLonLat(originalData, config.longitude, config.latitude);
850
+ const pos = this._projection(coords);
772
851
  const radius = getNumber(originalData, config.pointRadius) || 8;
773
852
  const shape = getString(originalData, config.pointShape) || TopoJSONMapPointShape.Circle;
774
853
  const donutData = getDonutData(originalData, config.colorMap);
775
- // Use the cluster's exact color for all expanded points to maintain visual consistency
776
- const pointColor = clusterPoint.color;
854
+ // Use individual point color based on its own data
855
+ const pointColor = getColor(originalData, config.pointColor, i);
777
856
  return {
778
- geometry: { type: 'Point', coordinates: clusterPoint.geometry.coordinates },
779
- bbox: { x1: 0, y1: 0, x2: 0, y2: 0 },
857
+ geometry: { type: 'Point', coordinates: coords },
858
+ bbox: { x1: pos[0] - radius, y1: pos[1] - radius, x2: pos[0] + radius, y2: pos[1] + radius },
780
859
  radius,
781
860
  path: getPointPathData({ x: 0, y: 0 }, radius, shape),
782
861
  color: pointColor,
@@ -786,9 +865,8 @@ class TopoJSONMap extends ComponentCore {
786
865
  isCluster: false,
787
866
  _zIndex: 1,
788
867
  expandedClusterPoint: clusterPoint,
789
- clusterColor: pointColor,
790
- dx: packPoints[i].x,
791
- dy: packPoints[i].y,
868
+ dx: 0,
869
+ dy: 0,
792
870
  };
793
871
  });
794
872
  this._resetExpandedCluster();
@@ -925,7 +1003,7 @@ class TopoJSONMap extends ComponentCore {
925
1003
  color,
926
1004
  flowData: link,
927
1005
  progress: 0,
928
- id: `${getString(link, config.linkId, i) || i}-${j}`,
1006
+ id: `${link.id || i}-${j}`,
929
1007
  };
930
1008
  this._flowParticles.push(particle);
931
1009
  }
@@ -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'\nimport Supercluster from 'supercluster'\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, rectIntersect } from 'utils/misc'\nimport { estimateStringPixelLength } from 'utils/text'\n\n// Types\nimport { MapLink } from 'types/map'\nimport { Rect } from 'types/misc'\n\n// Local Types\nimport {\n MapData,\n MapFeature,\n MapPointLabelPosition,\n MapProjection,\n TopoJSONMapPointShape,\n TopoJSONMapPoint,\n TopoJSONMapClusterDatum,\n TopoJSONMapPointDatum,\n FlowParticle,\n FlowSourcePoint,\n} from './types'\n\n// Config\nimport { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config'\n\n// Modules\nimport {\n arc,\n getLonLat,\n getDonutData,\n getPointPathData,\n calculateClusterIndex,\n getClustersAndPoints,\n geoJsonPointToScreenPoint,\n getNextZoomLevelOnClusterClick,\n} from './utils'\nimport { updateDonut } from './modules/donut'\n\n// Styles\nimport * as s from './style'\n\nexport class TopoJSONMap<\n AreaDatum,\n PointDatum = unknown,\n LinkDatum = unknown,\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\n private _path = geoPath()\n private _projection: GeoProjection\n private _prevWidth: number\n private _prevHeight: number\n private _animFrameId: number\n private _clusterIndex: Supercluster<PointDatum> | null = null\n private _expandedCluster: {\n cluster: TopoJSONMapPoint<PointDatum>;\n points: any[];\n } | null = null\n\n private _eventInitiatedByComponent = false\n private _collideLabelsAnimFrameId: ReturnType<typeof requestAnimationFrame>\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 _pointsGroup = this.g.append('g').attr('class', s.points)\n\n // Flow-related properties\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: any[] = []\n private _sourcePoints: any[] = []\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.on('zoom', this._onZoom.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\n this._clusterIndex = calculateClusterIndex(dataValid as any, this.config as any) as any\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._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\n _renderBackground (): void {\n this._backgroundRect\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('transform', `translate(${-this.bleed.left}, ${-this.bleed.top})`)\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._pointsGroup, duration)\n .attr('transform', transformString)\n\n // Flow groups\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 this._initialScale = this._projection.scale()\n this._center = this._projection.translate()\n\n if (config.mapFitToPoints) {\n this._fitToPoints()\n }\n\n const zoomExtent = config.zoomExtent\n this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale])\n this.setZoom(config.zoomFactor || 1)\n\n if (!config.disableZoom) {\n this.g.call(this._zoomBehavior)\n this._applyZoom()\n }\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 smartTransition(featuresEnter.merge(features), duration)\n .attr('d', this._path)\n .style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null)\n .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null)\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 // Get label text from user-provided area data only\n const labelText = feature.data ? getString(feature.data, 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(--vis-map-point-label-font-size) / ${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 // Run collision detection immediately to prevent flickering during zoom\n if (candidateLabels.length > 0) {\n window.cancelAnimationFrame(this._collideLabelsAnimFrameId)\n // Run collision detection synchronously first\n this._collideLabels()\n\n // Then schedule follow-up collision detection for any dynamic changes\n this._collideLabelsAnimFrameId = window.requestAnimationFrame(() => {\n this._collideLabels()\n })\n }\n\n // Animate to visible state AFTER collision detection\n smartTransition(labelsMerged, duration)\n .style('opacity', 1)\n }\n\n private _collideLabels (): void {\n const labels = this._areaLabelsGroup.selectAll<SVGTextElement, any>(`.${s.areaLabel}`)\n const labelNodes = labels.nodes() as (SVGTextElement & { _labelVisible?: boolean })[]\n const labelData = labels.data()\n\n if (labelNodes.length === 0) return\n\n // Reset all labels to visible and mark them as such\n labelNodes.forEach((node) => {\n node._labelVisible = true\n })\n\n // Helper function to get bounding box\n const getBBox = (labelData: any): Rect => {\n const [x, y] = labelData.centroid\n const labelText = labelData.labelText || ''\n const fontSize = 12 // Default font size\n\n const width = estimateStringPixelLength(labelText, fontSize, 0.6)\n const height = fontSize * 1.2 // Line height factor\n\n return {\n x: x - width / 2,\n y: y - height / 2,\n width,\n height,\n }\n }\n\n // Run collision detection similar to scatter plot\n labelNodes.forEach((node1, i) => {\n const data1 = labelData[i]\n if (!node1._labelVisible) return\n\n const label1BoundingRect = getBBox(data1)\n\n for (let j = 0; j < labelNodes.length; j++) {\n if (i === j) continue\n\n const node2 = labelNodes[j]\n const data2 = labelData[j]\n\n if (!node2._labelVisible) continue\n\n const label2BoundingRect = getBBox(data2)\n const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, 2)\n\n if (intersect) {\n // Priority based on area size - larger areas keep their labels\n if (data1.area >= data2.area) {\n node2._labelVisible = false\n } else {\n node1._labelVisible = false\n break\n }\n }\n }\n })\n\n // Apply visibility based on collision detection\n labels.style('opacity', (d, i) => labelNodes[i]._labelVisible ? 1 : 0)\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 _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\n const bounds = this._projection.invert ? [\n this._projection.invert([0, this._height])[0],\n this._projection.invert([0, this._height])[1],\n this._projection.invert([this._width, 0])[0],\n this._projection.invert([this._width, 0])[1],\n ] as [number, number, number, number] : [-180, -90, 180, 90] as [number, number, number, number]\n\n // Use a capped zoom level for clustering to prevent over-fragmentation\n const clusterZoom = Math.min(Math.round(this._currentZoomLevel || 1), 8)\n let geoJsonPoints = getClustersAndPoints(this._clusterIndex as any, bounds, clusterZoom)\n\n // Handle expanded cluster points - replace the expanded cluster with individual points\n if (this._expandedCluster) {\n // Remove expanded cluster from the data\n geoJsonPoints = geoJsonPoints.filter((c: any) => c.properties.clusterId !== (this._expandedCluster?.cluster.properties as any).clusterId)\n // Add points from the expanded cluster\n geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points as any)\n }\n\n return geoJsonPoints.map((geoPoint, i) =>\n geoJsonPointToScreenPoint(geoPoint as any, i, this._projection, this.config as any, this._currentZoomLevel || 1)\n ) as any\n }\n\n _renderPoints (duration: number): void {\n const { config } = this\n const hasColorMap = config.colorMap && Object.keys(config.colorMap).length > 0\n const pointData = this._getPointData()\n\n\n const points = this._pointsGroup\n .selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.point}`)\n .data(pointData, (d, i) => d.id.toString())\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 any\n const dx = expandedPoint.dx || 0\n const dy = expandedPoint.dy || 0\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('opacity', 0)\n\n pointsEnter.append('path').attr('class', s.pointCircle)\n .attr('d', 'M0,0')\n .style('fill', (d, i) => d.color)\n .style('stroke-width', d => getNumber(d.properties as PointDatum, config.pointStrokeWidth))\n\n // Add donut chart group\n pointsEnter.append('g').attr('class', 'donut-group')\n\n pointsEnter.append('text').attr('class', s.pointLabel)\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 any\n const dx = expandedPoint.dx || 0\n const dy = expandedPoint.dy || 0\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('cursor', d => {\n return (d.isCluster && (config.clusterExpandOnClick || hasColorMap)) ? 'pointer' : getString(d.properties as PointDatum, config.pointCursor)\n })\n .style('opacity', 1)\n\n // Cursor is handled by the parent point element\n\n // Add click event handler for clusters\n pointsMerged\n .style('pointer-events', 'all') // Ensure pointer events are enabled\n .on('click', (event: MouseEvent, d: TopoJSONMapPoint<PointDatum>) => {\n this._onPointClick(d, event)\n })\n\n\n smartTransition(pointsMerged.select(`.${s.pointCircle}`), duration)\n .attr('d', d => {\n const radius = d.radius / (this._currentZoomLevel || 1)\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 donutData = d.donutData\n const shape = getString(d.properties as any, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const expandedPoint = d as any\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 (donutData.length > 0) return 'transparent'\n return isRing ? 'transparent' : d.color\n })\n .style('stroke', d => {\n const expandedPoint = d as any\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 any, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const baseStrokeWidth = isRing ? getNumber(d.properties as any, config.pointRingWidth) : getNumber(d.properties as any, config.pointStrokeWidth)\n return baseStrokeWidth / (this._currentZoomLevel || 1)\n })\n\n // Update donut charts\n const currentZoomLevel = this._currentZoomLevel\n pointsMerged.select('.donut-group')\n .style('pointer-events', 'none') // Allow clicks to pass through donut charts\n .each(function (d) {\n if (d.donutData.length > 0) {\n const radius = getNumber(d.properties as any, config.pointRadius, 0) / (currentZoomLevel || 1)\n const arcWidth = (d.isCluster ? 4 : 2) / (currentZoomLevel || 1) // Thicker ring for clusters\n updateDonut(select(this as SVGGElement), d.donutData, radius, arcWidth, 0.05)\n } else {\n select(this as SVGGElement).selectAll('*').remove()\n }\n })\n\n const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`)\n pointLabelsMerged\n .text(d => {\n if (d.isCluster) {\n // Use cluster label for clusters\n return getString(d as any, config.clusterLabel) ?? ''\n } else {\n // Use point label for regular points\n return getString(d.properties as any, config.pointLabel) ?? ''\n }\n })\n .style('font-size', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) {\n return `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel}`\n }\n const pointDiameter = 2 * getNumber(d.properties as any, config.pointRadius, 0)\n const pointLabelText = d.isCluster\n ? (getString(d as any, config.clusterLabel) || '')\n : (getString(d.properties as any, config.pointLabel) || '')\n const textLength = pointLabelText.length\n const fontSize = 0.5 * pointDiameter / Math.pow(textLength, 0.4)\n return clamp(fontSize, fontSize, 16)\n })\n .attr('y', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Center) return null\n\n const pointRadius = getNumber(d.properties as any, config.pointRadius, 0) / this._currentZoomLevel\n return pointRadius\n })\n .attr('dy', config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em')\n\n smartTransition(pointLabelsMerged, duration)\n .style('fill', (d, i) => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) return null\n\n if (d.isCluster) {\n // For clusters, use contrasting color against cluster background\n const clusterColor = getColor(d as any, config.clusterColor, i) || '#2196F3'\n const hex = color(isStringCSSVariable(clusterColor) ? getCSSVariableValue(clusterColor, this.element) : clusterColor)?.hex()\n if (hex) {\n const brightness = hexToBrightness(hex)\n return brightness > 0.5 ? '#333' : '#fff'\n }\n return '#fff'\n } else {\n // Regular point label color logic\n const pointColor = getColor(d.properties as any, config.pointColor, i)\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 ? 'var(--vis-map-point-label-text-color-dark)' : 'var(--vis-map-point-label-text-color-light)'\n }\n })\n .style('font-weight', d => d.isCluster ? 'bold' : 'normal')\n .style('opacity', 1)\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 }\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 this.fitView()\n\n const featureCollection: ExtendedFeatureCollection = {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: {\n type: 'MultiPoint',\n coordinates: pointData.map(p => {\n return [\n getNumber(p, d => getNumber(d, config.longitude)),\n getNumber(p, d => getNumber(d, config.latitude)),\n ]\n }),\n },\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 // If we don't update the center, the next zoom will be centered around the previous value\n this._center = this._projection.translate()\n this._applyZoom()\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 }\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 this._center = [\n this._projection.translate()[0] * this._center[0] / prevTranslate[0],\n this._projection.translate()[1] * this._center[1] / prevTranslate[1],\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<any, any>): void {\n if (this._firstRender) return // To prevent double render because of binding zoom behaviour\n const isMouseEvent = event.sourceEvent !== undefined\n const isExternalEvent = !event?.sourceEvent && !this._isResizing\n\n // Reset expanded cluster when manually zooming (but not during component-initiated zoom)\n if (isMouseEvent && !this._eventInitiatedByComponent) this._resetExpandedCluster()\n\n // Reset the flag after handling the zoom\n if (this._eventInitiatedByComponent && !isMouseEvent) {\n this._eventInitiatedByComponent = false\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent))\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 }\n\n _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean): 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\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._renderPoints(customDuration)\n\n // Update flow features on zoom\n if (this.config.enableFlowAnimation) {\n this._renderSourcePoints(customDuration)\n this._renderFlowParticles(customDuration)\n }\n\n // Update flow features on zoom\n if (this.config.enableFlowAnimation) {\n this._renderSourcePoints(customDuration)\n this._renderFlowParticles(customDuration)\n }\n }\n\n public zoomIn (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel + increment)\n }\n\n public zoomOut (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel - increment)\n }\n\n public setZoom (zoomLevel: number): void {\n const { config } = this\n this._currentZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\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 this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1\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 public fitViewToFlows (pad = 0.1): void {\n const { config, datamodel } = this\n const points: PointDatum[] = [...(datamodel.points || [])]\n const links = datamodel.links || []\n\n // Add flow endpoints to the points to consider for fitting\n links.forEach((link) => {\n // Try to get source point\n if (config.sourceLongitude && config.sourceLatitude) {\n const sourceLon = getNumber(link, config.sourceLongitude)\n const sourceLat = getNumber(link, config.sourceLatitude)\n if (isNumber(sourceLon) && isNumber(sourceLat)) {\n points.push({ longitude: sourceLon, latitude: sourceLat } as unknown as PointDatum)\n }\n } else {\n const sourcePoint = config.linkSource?.(link)\n if (typeof sourcePoint === 'object' && sourcePoint !== null) {\n points.push(sourcePoint as PointDatum)\n }\n }\n\n // Try to get target point\n if (config.targetLongitude && config.targetLatitude) {\n const targetLon = getNumber(link, config.targetLongitude)\n const targetLat = getNumber(link, config.targetLatitude)\n if (isNumber(targetLon) && isNumber(targetLat)) {\n points.push({ longitude: targetLon, latitude: targetLat } as unknown as PointDatum)\n }\n } else {\n const targetPoint = config.linkTarget?.(link)\n if (typeof targetPoint === 'object' && targetPoint !== null) {\n points.push(targetPoint as PointDatum)\n }\n }\n })\n\n if (points.length > 0) {\n this._fitToPoints(points, pad)\n } else {\n this.fitView()\n }\n }\n\n private _onPointClick (d: TopoJSONMapPoint<PointDatum>, event: MouseEvent): void {\n const { config } = this\n event.stopPropagation()\n\n // Handle clicking on expanded cluster points to collapse them\n const expandedPoint = d as any\n if (expandedPoint.expandedClusterPoint) {\n this._resetExpandedCluster()\n this._renderPoints(config.duration)\n return\n }\n\n if (d.isCluster && (d.properties as TopoJSONMapClusterDatum<PointDatum>).cluster) {\n // Enable click expansion when clusterExpandOnClick is true OR when colorMap is enabled (for pie chart clusters)\n const hasColorMap = config.colorMap && Object.keys(config.colorMap).length > 0\n\n if (config.clusterExpandOnClick || hasColorMap) {\n // Always expand the cluster to show individual points\n const expandedPoints = this._expandCluster(d)\n\n // Calculate the geographic center (centroid) of the expanded points and zoom to it\n if (expandedPoints && expandedPoints.length > 0) {\n const avgLat = expandedPoints.reduce((sum, p) => sum + getNumber(p, config.latitude), 0) / expandedPoints.length\n const avgLon = expandedPoints.reduce((sum, p) => sum + getNumber(p, config.longitude), 0) / expandedPoints.length\n const centroidCoordinates: [number, number] = [avgLon, avgLat]\n\n // Calculate appropriate zoom level\n const newZoomLevel = getNextZoomLevelOnClusterClick(this._currentZoomLevel || 1)\n\n // Start zoom immediately for smoother transition\n this._zoomToLocation(centroidCoordinates, newZoomLevel)\n }\n }\n }\n }\n\n private _expandCluster (clusterPoint: TopoJSONMapPoint<PointDatum>): PointDatum[] | undefined {\n const { config } = this\n\n if (!clusterPoint.clusterIndex) return undefined\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 // Calculate positions for expanded points using d3.packSiblings (same as leaflet map)\n const packPoints: {x: number; y: number; r: number }[] = points.map(() => ({\n x: 0,\n y: 0,\n r: 8 + padding, // Base radius for individual points\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 const donutData = getDonutData(originalData, config.colorMap)\n // Use the cluster's exact color for all expanded points to maintain visual consistency\n const pointColor = 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),\n properties: originalData,\n donutData,\n isCluster: false,\n _zIndex: 1,\n expandedClusterPoint: clusterPoint,\n clusterColor: pointColor, // Preserve the cluster color\n dx: packPoints[i].x,\n dy: packPoints[i].y,\n } as TopoJSONMapPoint<PointDatum> & { expandedClusterPoint: TopoJSONMapPoint<PointDatum>; dx: number; dy: number }\n })\n\n this._resetExpandedCluster()\n this._expandedCluster = {\n cluster: clusterPoint,\n points: expandedPoints,\n }\n\n // Re-render to show expanded points with smooth animation\n this._renderPoints(config.duration / 2)\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 // We need to account for the current projection center\n const currentCenter = this._projection.translate()\n const x = currentCenter[0] + (centerX - targetPoint[0]) * (k / this._initialScale)\n const y = currentCenter[1] + (centerY - 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 }\n\n private _resetExpandedCluster (): void {\n this._expandedCluster?.points?.forEach((d: any) => { delete d.expandedClusterPoint })\n this._expandedCluster = null\n }\n\n private _initFlowFeatures (): void {\n const { config, datamodel } = this\n // Use raw links data instead of processed links to avoid point lookup issues for flows\n const rawLinks = datamodel.data?.links || []\n\n // Clear existing flow data\n this._flowParticles = []\n this._sourcePoints = []\n\n if (!rawLinks || rawLinks.length === 0) return\n\n // Create source points and flow particles for each link\n rawLinks.forEach((link, i) => {\n // Try to get coordinates from flow-specific accessors first, then fall back to link endpoints\n let sourceLon: number, sourceLat: number, targetLon: number, targetLat: number\n\n if (config.sourceLongitude && config.sourceLatitude) {\n sourceLon = getNumber(link, config.sourceLongitude)\n sourceLat = getNumber(link, config.sourceLatitude)\n } else {\n // Fall back to using linkSource point coordinates\n const sourcePoint = config.linkSource?.(link)\n if (typeof sourcePoint === 'object' && sourcePoint !== null) {\n sourceLon = getNumber(sourcePoint as PointDatum, config.longitude)\n sourceLat = getNumber(sourcePoint as PointDatum, config.latitude)\n } else {\n return // Skip if can't resolve source coordinates\n }\n }\n\n if (config.targetLongitude && config.targetLatitude) {\n targetLon = getNumber(link, config.targetLongitude)\n targetLat = getNumber(link, config.targetLatitude)\n } else {\n // Fall back to using linkTarget point coordinates\n const targetPoint = config.linkTarget?.(link)\n if (typeof targetPoint === 'object' && targetPoint !== null) {\n targetLon = getNumber(targetPoint as PointDatum, config.longitude)\n targetLat = getNumber(targetPoint as PointDatum, config.latitude)\n } else {\n return // Skip if can't resolve target coordinates\n }\n }\n\n if (!isNumber(sourceLon) || !isNumber(sourceLat) || !isNumber(targetLon) || !isNumber(targetLat)) {\n return\n }\n\n const source = { lat: sourceLat, lon: sourceLon }\n const target = { lat: targetLat, lon: targetLon }\n\n // Create source point\n const sourcePos = this._projection([sourceLon, sourceLat])\n if (sourcePos) {\n const sourcePoint: FlowSourcePoint = {\n lat: sourceLat,\n lon: sourceLon,\n x: sourcePos[0],\n y: sourcePos[1],\n radius: getNumber(link, config.sourcePointRadius),\n color: getColor(link, config.sourcePointColor, i),\n flowData: link,\n }\n this._sourcePoints.push(sourcePoint)\n }\n\n // Create flow particles\n const dist = Math.sqrt((targetLat - sourceLat) ** 2 + (targetLon - sourceLon) ** 2)\n const numParticles = Math.max(1, Math.round(dist * getNumber(link, config.flowParticleDensity)))\n const velocity = getNumber(link, config.flowParticleSpeed)\n const radius = getNumber(link, config.flowParticleRadius)\n const color = getColor(link, config.flowParticleColor, i)\n\n for (let j = 0; j < numParticles; j += 1) {\n const progress = j / numParticles\n const location = {\n lat: sourceLat + (targetLat - sourceLat) * progress,\n lon: sourceLon + (targetLon - sourceLon) * progress,\n }\n\n const pos = this._projection([location.lon, location.lat])\n if (pos) {\n const particle: FlowParticle = {\n x: pos[0],\n y: pos[1],\n source,\n target,\n location,\n velocity,\n radius,\n color,\n flowData: link,\n progress: 0, // Keep for compatibility but not used in angle-based movement\n id: `${getString(link, config.linkId, i) || i}-${j}`,\n }\n this._flowParticles.push(particle)\n }\n }\n })\n }\n\n private _renderSourcePoints (duration: number): void {\n const { config } = this\n\n const sourcePoints = this._sourcePointsGroup\n .selectAll<SVGCircleElement, FlowSourcePoint>(`.${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('r', 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('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('stroke', d => d.color)\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 if (this._flowParticles.length === 0) return\n\n const zoomLevel = this._currentZoomLevel || 1\n\n this._flowParticles.forEach(particle => {\n const { source, target } = particle\n\n // Calculate movement using angle-based velocity (like LeafletFlowMap)\n const fullDist = Math.sqrt((target.lat - source.lat) ** 2 + (target.lon - source.lon) ** 2)\n const remainedDist = Math.sqrt((target.lat - particle.location.lat) ** 2 + (target.lon - particle.location.lon) ** 2)\n const angle = Math.atan2(target.lat - source.lat, target.lon - source.lon)\n\n // Update geographic location\n particle.location.lat += particle.velocity * Math.sin(angle)\n particle.location.lon += particle.velocity * Math.cos(angle)\n\n // Reset to start when reaching target (like LeafletFlowMap)\n if (\n (((target.lat > source.lat) && (particle.location.lat > target.lat)) || ((target.lon > source.lon) && (particle.location.lon > target.lon))) ||\n (((target.lat < source.lat) && (particle.location.lat < target.lat)) || ((target.lon < source.lon) && (particle.location.lon < target.lon)))\n ) {\n particle.location.lat = source.lat\n particle.location.lon = source.lon\n }\n\n // Project to screen coordinates\n const pos = this._projection([particle.location.lon, particle.location.lat])\n if (pos) {\n // Add orthogonal arc shift (adapted from LeafletFlowMap)\n const orthogonalArcShift = -(zoomLevel ** 2 * fullDist / 8) * Math.cos(Math.PI / 2 * (fullDist / 2 - remainedDist) / (fullDist / 2)) || 0\n particle.x = pos[0]\n particle.y = pos[1] + orthogonalArcShift\n }\n })\n\n // Update DOM elements directly without data rebinding (for performance)\n this._flowParticlesGroup\n .selectAll<SVGCircleElement, any>(`.${s.flowParticle}`)\n .attr('cx', (d, i) => this._flowParticles[i]?.x || 0)\n .attr('cy', (d, i) => this._flowParticles[i]?.y || 0)\n .attr('r', (d, i) => (this._flowParticles[i]?.radius || 1) / zoomLevel)\n }\n\n destroy (): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._stopFlowAnimation()\n window.cancelAnimationFrame(this._collideLabelsAnimFrameId)\n }\n}\n"],"names":["s.background","s.features","s.areaLabel","s.links","s.points","s.flowParticles","s.sourcePoints","s.feature","s.link","s.point","s.pointCircle","s.pointLabel","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'\n\nimport { feature } from 'topojson-client'\nimport Supercluster from 'supercluster'\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, rectIntersect } from 'utils/misc'\nimport { estimateStringPixelLength } from 'utils/text'\n\n// Types\nimport { MapLink } from 'types/map'\nimport { Rect } from 'types/misc'\n\n// Local Types\nimport {\n MapData,\n MapFeature,\n MapPointLabelPosition,\n MapProjection,\n TopoJSONMapPointShape,\n TopoJSONMapPoint,\n TopoJSONMapClusterDatum,\n TopoJSONMapPointDatum,\n FlowParticle,\n FlowSourcePoint,\n} from './types'\n\n// Config\nimport { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config'\n\n// Modules\nimport { arc, getLonLat, getDonutData, getPointPathData, calculateClusterIndex, getNextZoomLevelOnClusterClick } from './utils'\nimport { updateDonut } from './modules/donut'\n\n// Styles\nimport * as s from './style'\n\nexport class TopoJSONMap<\n AreaDatum,\n PointDatum = unknown,\n LinkDatum = unknown,\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\n private _path = geoPath()\n private _projection: GeoProjection\n private _prevWidth: number\n private _prevHeight: number\n private _animFrameId: number\n private _clusterIndex: Supercluster<PointDatum> | null = null\n private _expandedCluster: {\n cluster: TopoJSONMapPoint<PointDatum>;\n points: any[];\n } | null = null\n\n private _eventInitiatedByComponent = false\n private _collideLabelsAnimFrameId: ReturnType<typeof requestAnimationFrame>\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 _pointsGroup = this.g.append('g').attr('class', s.points)\n\n // Flow-related properties\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: any[] = []\n private _sourcePoints: any[] = []\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.on('zoom', this._onZoom.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\n this._clusterIndex = calculateClusterIndex(dataValid as any, this.config as any) as any\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._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\n _renderBackground (): void {\n this._backgroundRect\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('transform', `translate(${-this.bleed.left}, ${-this.bleed.top})`)\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._pointsGroup, duration)\n .attr('transform', transformString)\n\n // Flow groups\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 this._initialScale = this._projection.scale()\n this._center = this._projection.translate()\n\n if (config.mapFitToPoints) {\n this._fitToPoints()\n }\n\n const zoomExtent = config.zoomExtent\n this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale])\n this.setZoom(config.zoomFactor || 1)\n\n if (!config.disableZoom) {\n this.g.call(this._zoomBehavior)\n this._applyZoom()\n }\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 smartTransition(featuresEnter.merge(features), duration)\n .attr('d', this._path)\n .style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null)\n .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null)\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 // Get label text from user-provided area data only\n const labelText = feature.data ? getString(feature.data, 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(--vis-map-point-label-font-size) / ${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 // Run collision detection immediately to prevent flickering during zoom\n if (candidateLabels.length > 0) {\n window.cancelAnimationFrame(this._collideLabelsAnimFrameId)\n // Run collision detection synchronously first\n this._collideLabels()\n\n // Then schedule follow-up collision detection for any dynamic changes\n this._collideLabelsAnimFrameId = window.requestAnimationFrame(() => {\n this._collideLabels()\n })\n }\n\n // Animate to visible state AFTER collision detection\n smartTransition(labelsMerged, duration)\n .style('opacity', 1)\n }\n\n private _collideLabels (): void {\n const labels = this._areaLabelsGroup.selectAll<SVGTextElement, any>(`.${s.areaLabel}`)\n const labelNodes = labels.nodes()\n const labelData = labels.data()\n\n if (labelNodes.length === 0) return\n\n // Reset all labels to visible and mark them as such\n labelNodes.forEach((node: any) => {\n node._labelVisible = true\n })\n\n // Helper function to get bounding box\n const getBBox = (labelData: any): Rect => {\n const [x, y] = labelData.centroid\n const labelText = labelData.labelText || ''\n const fontSize = 12 // Default font size\n\n const width = estimateStringPixelLength(labelText, fontSize, 0.6)\n const height = fontSize * 1.2 // Line height factor\n\n return {\n x: x - width / 2,\n y: y - height / 2,\n width,\n height,\n }\n }\n\n // Run collision detection similar to scatter plot\n labelNodes.forEach((node1: any, i) => {\n const data1 = labelData[i]\n if (!node1._labelVisible) return\n\n const label1BoundingRect = getBBox(data1)\n\n for (let j = 0; j < labelNodes.length; j++) {\n if (i === j) continue\n\n const node2 = labelNodes[j] as any\n const data2 = labelData[j]\n\n if (!node2._labelVisible) continue\n\n const label2BoundingRect = getBBox(data2)\n const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, 2)\n\n if (intersect) {\n // Priority based on area size - larger areas keep their labels\n if (data1.area >= data2.area) {\n node2._labelVisible = false\n } else {\n node1._labelVisible = false\n break\n }\n }\n }\n })\n\n // Apply visibility based on collision detection\n labels.style('opacity', (d, i) => (labelNodes[i] as any)._labelVisible ? 1 : 0)\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 _getPointData (): TopoJSONMapPoint<PointDatum>[] {\n const { config, datamodel } = this\n\n if (!config.clustering || !this._clusterIndex || config.clusteringDistance === 0) {\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 // Convert all points to screen space first\n const allPoints = datamodel.points.map((d, i) => {\n const coords = getLonLat(d, config.longitude, config.latitude)\n const screenPos = this._projection(coords)\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: coords },\n bbox: { x1: screenPos[0] - radius, y1: screenPos[1] - radius, x2: screenPos[0] + radius, y2: screenPos[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 screenX: screenPos[0],\n screenY: screenPos[1],\n originalData: d,\n }\n })\n\n // Perform clustering in screen space\n let geoJsonPoints = this._clusterInScreenSpace(allPoints)\n\n // Handle expanded cluster points - replace the expanded cluster with individual points\n if (this._expandedCluster) {\n // Remove expanded cluster from the data\n geoJsonPoints = geoJsonPoints.filter((c: any) => c.properties.clusterId !== (this._expandedCluster?.cluster.properties as any).clusterId)\n // Add points from the expanded cluster\n geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points as any)\n }\n\n return geoJsonPoints as any\n }\n\n _renderPoints (duration: number): void {\n const { config } = this\n const hasColorMap = config.colorMap && Object.keys(config.colorMap).length > 0\n const pointData = this._getPointData()\n\n\n const points = this._pointsGroup\n .selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.point}`)\n .data(pointData, (d, i) => d.id.toString())\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 any\n const dx = expandedPoint.dx || 0\n const dy = expandedPoint.dy || 0\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('opacity', 0)\n\n pointsEnter.append('path').attr('class', s.pointCircle)\n .attr('d', 'M0,0')\n .style('fill', (d, i) => d.color)\n .style('stroke-width', d => getNumber(d.properties as PointDatum, config.pointStrokeWidth))\n\n // Add donut chart group\n pointsEnter.append('g').attr('class', 'donut-group')\n\n pointsEnter.append('text').attr('class', s.pointLabel)\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 any\n const dx = expandedPoint.dx || 0\n const dy = expandedPoint.dy || 0\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('cursor', d => {\n return (d.isCluster && (config.clusterExpandOnClick || hasColorMap)) ? 'pointer' : getString(d.properties as PointDatum, config.pointCursor)\n })\n .style('opacity', 1)\n\n // Cursor is handled by the parent point element\n\n // Add click event handler for clusters\n pointsMerged\n .style('pointer-events', 'all') // Ensure pointer events are enabled\n .on('click', (event: MouseEvent, d: TopoJSONMapPoint<PointDatum>) => {\n this._onPointClick(d, event)\n })\n\n\n smartTransition(pointsMerged.select(`.${s.pointCircle}`), duration)\n .attr('d', d => {\n const radius = d.radius / (this._currentZoomLevel || 1)\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 donutData = d.donutData\n const shape = getString(d.properties as any, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const expandedPoint = d as any\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 (donutData.length > 0) return 'transparent'\n return isRing ? 'transparent' : d.color\n })\n .style('stroke', d => {\n const expandedPoint = d as any\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 any, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const baseStrokeWidth = isRing ? getNumber(d.properties as any, config.pointRingWidth) : getNumber(d.properties as any, config.pointStrokeWidth)\n return baseStrokeWidth / (this._currentZoomLevel || 1)\n })\n\n // Update donut charts\n const currentZoomLevel = this._currentZoomLevel\n pointsMerged.select('.donut-group')\n .style('pointer-events', 'none') // Allow clicks to pass through donut charts\n .each(function (d) {\n if (d.donutData.length > 0) {\n const radius = getNumber(d.properties as any, config.pointRadius, 0) / (currentZoomLevel || 1)\n const arcWidth = (d.isCluster ? 4 : 2) / (currentZoomLevel || 1) // Thicker ring for clusters\n updateDonut(select(this as SVGGElement), d.donutData, radius, arcWidth, 0.05)\n } else {\n select(this as SVGGElement).selectAll('*').remove()\n }\n })\n\n const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`)\n pointLabelsMerged\n .text(d => {\n if (d.isCluster) {\n // Use cluster label for clusters\n return getString(d as any, config.clusterLabel) ?? ''\n } else {\n // Use point label for regular points\n return getString(d.properties as any, config.pointLabel) ?? ''\n }\n })\n .style('font-size', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) {\n return `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel}`\n }\n const pointDiameter = 2 * getNumber(d.properties as any, config.pointRadius, 0)\n const pointLabelText = d.isCluster\n ? (getString(d as any, config.clusterLabel) || '')\n : (getString(d.properties as any, config.pointLabel) || '')\n const textLength = pointLabelText.length\n const fontSize = 0.5 * pointDiameter / Math.pow(textLength, 0.4)\n return clamp(fontSize, fontSize, 16)\n })\n .attr('y', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Center) return null\n\n const pointRadius = getNumber(d.properties as any, config.pointRadius, 0) / this._currentZoomLevel\n return pointRadius\n })\n .attr('dy', config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em')\n\n smartTransition(pointLabelsMerged, duration)\n .style('fill', (d, i) => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) return null\n\n if (d.isCluster) {\n // For clusters, use contrasting color against cluster background\n const clusterColor = getColor(d as any, config.clusterColor) || '#2196F3'\n const hex = color(isStringCSSVariable(clusterColor) ? getCSSVariableValue(clusterColor, this.element) : clusterColor)?.hex()\n if (hex) {\n const brightness = hexToBrightness(hex)\n return brightness > 0.5 ? '#333' : '#fff'\n }\n return '#fff'\n } else {\n // Regular point label color logic\n const pointColor = getColor(d.properties as any, config.pointColor, i)\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 ? 'var(--vis-map-point-label-text-color-dark)' : 'var(--vis-map-point-label-text-color-light)'\n }\n })\n .style('font-weight', d => d.isCluster ? 'bold' : 'normal')\n .style('opacity', 1)\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 }\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 this.fitView()\n\n const featureCollection: ExtendedFeatureCollection = {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: {\n type: 'MultiPoint',\n coordinates: pointData.map(p => {\n return [\n getNumber(p, d => getNumber(d, config.longitude)),\n getNumber(p, d => getNumber(d, config.latitude)),\n ]\n }),\n },\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 // If we don't update the center, the next zoom will be centered around the previous value\n this._center = this._projection.translate()\n this._applyZoom()\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 }\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 this._center = [\n this._projection.translate()[0] * this._center[0] / prevTranslate[0],\n this._projection.translate()[1] * this._center[1] / prevTranslate[1],\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<any, any>): void {\n if (this._firstRender) return // To prevent double render because of binding zoom behaviour\n const isMouseEvent = event.sourceEvent !== undefined\n const isExternalEvent = !event?.sourceEvent && !this._isResizing\n\n // Reset expanded cluster when manually zooming (but not during component-initiated zoom)\n if (isMouseEvent && !this._eventInitiatedByComponent) this._resetExpandedCluster()\n\n // Reset the flag after handling the zoom\n if (this._eventInitiatedByComponent && !isMouseEvent) {\n this._eventInitiatedByComponent = false\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent))\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 // _currentZoomLevel is now set in _onZoomHandler to track previous value\n }\n\n _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean): 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 // Update zoom level for clustering calculations\n this._currentZoomLevel = (transform.k / this._initialScale) || 1\n\n const customDuration = isExternalEvent\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._renderPoints(customDuration)\n\n // Update flow features on zoom\n if (this.config.enableFlowAnimation) {\n this._renderSourcePoints(customDuration)\n this._renderFlowParticles(customDuration)\n }\n\n // Update flow features on zoom\n if (this.config.enableFlowAnimation) {\n this._renderSourcePoints(customDuration)\n this._renderFlowParticles(customDuration)\n }\n }\n\n public zoomIn (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel + increment)\n }\n\n public zoomOut (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel - increment)\n }\n\n public setZoom (zoomLevel: number): void {\n const { config } = this\n this._currentZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\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 this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1\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 public fitViewToFlows (pad = 0.1): void {\n const { config, datamodel } = this\n const points: PointDatum[] = [...(datamodel.points || [])]\n const links = datamodel.links || []\n\n // Add flow endpoints to the points to consider for fitting\n links.forEach((link) => {\n // Try to get source point\n if (config.sourceLongitude && config.sourceLatitude) {\n const sourceLon = getNumber(link, config.sourceLongitude)\n const sourceLat = getNumber(link, config.sourceLatitude)\n if (isNumber(sourceLon) && isNumber(sourceLat)) {\n points.push({ longitude: sourceLon, latitude: sourceLat } as unknown as PointDatum)\n }\n } else {\n const sourcePoint = config.linkSource?.(link)\n if (typeof sourcePoint === 'object' && sourcePoint !== null) {\n points.push(sourcePoint as PointDatum)\n }\n }\n\n // Try to get target point\n if (config.targetLongitude && config.targetLatitude) {\n const targetLon = getNumber(link, config.targetLongitude)\n const targetLat = getNumber(link, config.targetLatitude)\n if (isNumber(targetLon) && isNumber(targetLat)) {\n points.push({ longitude: targetLon, latitude: targetLat } as unknown as PointDatum)\n }\n } else {\n const targetPoint = config.linkTarget?.(link)\n if (typeof targetPoint === 'object' && targetPoint !== null) {\n points.push(targetPoint as PointDatum)\n }\n }\n })\n\n if (points.length > 0) {\n this._fitToPoints(points, pad)\n } else {\n this.fitView()\n }\n }\n\n private _onPointClick (d: TopoJSONMapPoint<PointDatum>, event: MouseEvent): void {\n const { config } = this\n event.stopPropagation()\n\n // Handle clicking on expanded cluster points to collapse them\n const expandedPoint = d as any\n if (expandedPoint.expandedClusterPoint) {\n this._resetExpandedCluster()\n this._renderPoints(config.duration)\n return\n }\n\n if (d.isCluster && (d.properties as TopoJSONMapClusterDatum<PointDatum>).cluster) {\n // Enable click expansion when clusterExpandOnClick is true OR when colorMap is enabled (for pie chart clusters)\n const hasColorMap = config.colorMap && Object.keys(config.colorMap).length > 0\n\n if (config.clusterExpandOnClick || hasColorMap) {\n // Always expand the cluster to show individual points\n const expandedPoints = this._expandCluster(d)\n\n // Calculate the geographic center (centroid) of the expanded points and zoom to it\n if (expandedPoints && expandedPoints.length > 0) {\n const avgLat = expandedPoints.reduce((sum, p) => sum + getNumber(p, config.latitude), 0) / expandedPoints.length\n const avgLon = expandedPoints.reduce((sum, p) => sum + getNumber(p, config.longitude), 0) / expandedPoints.length\n const centroidCoordinates: [number, number] = [avgLon, avgLat]\n\n // Calculate appropriate zoom level\n const newZoomLevel = getNextZoomLevelOnClusterClick(this._currentZoomLevel || 1)\n\n // Start zoom immediately for smoother transition\n this._zoomToLocation(centroidCoordinates, newZoomLevel)\n }\n }\n }\n }\n\n private _clusterInScreenSpace (points: any[]): any[] {\n const { config } = this\n const clusteringDistance = config.clusteringDistance || 55\n\n // If clustering distance is 0, return all points as individual points\n if (clusteringDistance === 0) {\n return points\n }\n\n const clusters: any[] = []\n const processed = new Set<number>()\n\n for (let i = 0; i < points.length; i++) {\n if (processed.has(i)) continue\n\n const point = points[i]\n const nearbyPoints = [point]\n processed.add(i)\n\n // Find all points within clustering distance\n for (let j = i + 1; j < points.length; j++) {\n if (processed.has(j)) continue\n\n const otherPoint = points[j]\n const distance = Math.sqrt(\n Math.pow(point.screenX - otherPoint.screenX, 2) +\n Math.pow(point.screenY - otherPoint.screenY, 2)\n )\n\n if (distance <= clusteringDistance) {\n nearbyPoints.push(otherPoint)\n processed.add(j)\n }\n }\n\n if (nearbyPoints.length > 1) {\n // Create cluster\n const centerX = nearbyPoints.reduce((sum, p) => sum + p.screenX, 0) / nearbyPoints.length\n const centerY = nearbyPoints.reduce((sum, p) => sum + p.screenY, 0) / nearbyPoints.length\n const centerCoords = this._projection.invert ? this._projection.invert([centerX, centerY]) : [0, 0]\n\n const clusterRadius = getNumber(nearbyPoints[0].originalData, config.clusterRadius) || 10\n const clusterId = clusters.length\n const cluster = {\n geometry: { type: 'Point', coordinates: centerCoords },\n properties: {\n cluster: true,\n clusterId: clusterId,\n pointCount: nearbyPoints.length,\n clusterPoints: nearbyPoints.map(p => p.originalData),\n } as TopoJSONMapClusterDatum<PointDatum>,\n bbox: { x1: centerX - clusterRadius, y1: centerY - clusterRadius, x2: centerX + clusterRadius, y2: centerY + clusterRadius },\n radius: clusterRadius,\n path: getPointPathData({ x: 0, y: 0 }, clusterRadius, TopoJSONMapPointShape.Circle),\n color: getColor(nearbyPoints[0].originalData, config.clusterColor) || '#2196F3',\n id: `cluster-${clusterId}`,\n donutData: [] as any[],\n isCluster: true,\n _zIndex: 1,\n clusterIndex: {\n getLeaves: (id: number) => {\n if (id === clusterId) {\n return nearbyPoints.map(p => ({ properties: p.originalData }))\n }\n return []\n },\n },\n }\n\n clusters.push(cluster)\n } else {\n // Keep as individual point\n clusters.push(point)\n }\n }\n\n return clusters\n }\n\n private _expandCluster (clusterPoint: TopoJSONMapPoint<PointDatum>): PointDatum[] | undefined {\n const { config } = this\n\n if (!clusterPoint.clusterIndex) return undefined\n\n const clusterId = (clusterPoint.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId as number\n const points = clusterPoint.clusterIndex.getLeaves(clusterId, Infinity)\n\n // Create expanded points at their actual geographic coordinates\n const expandedPoints = points.map((point, i) => {\n const originalData = point.properties as PointDatum\n const coords = getLonLat(originalData, config.longitude, config.latitude)\n const pos = this._projection(coords)\n const radius = getNumber(originalData, config.pointRadius) || 8\n const shape = getString(originalData, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const donutData = getDonutData(originalData, config.colorMap)\n // Use individual point color based on its own data\n const pointColor = getColor(originalData, config.pointColor, i)\n\n return {\n geometry: { type: 'Point' as const, coordinates: coords },\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(originalData, config.pointId, i),\n properties: originalData,\n donutData,\n isCluster: false,\n _zIndex: 1,\n expandedClusterPoint: clusterPoint,\n dx: 0, // No offset needed since using actual coordinates\n dy: 0,\n } as TopoJSONMapPoint<PointDatum> & { expandedClusterPoint: TopoJSONMapPoint<PointDatum>; dx: number; dy: number }\n })\n\n this._resetExpandedCluster()\n this._expandedCluster = {\n cluster: clusterPoint,\n points: expandedPoints,\n }\n\n // Re-render to show expanded points with smooth animation\n this._renderPoints(config.duration / 2)\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 // We need to account for the current projection center\n const currentCenter = this._projection.translate()\n const x = currentCenter[0] + (centerX - targetPoint[0]) * (k / this._initialScale)\n const y = currentCenter[1] + (centerY - 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 }\n\n private _resetExpandedCluster (): void {\n this._expandedCluster?.points?.forEach((d: any) => { delete d.expandedClusterPoint })\n this._expandedCluster = null\n }\n\n private _initFlowFeatures (): void {\n const { config, datamodel } = this\n // Use raw links data instead of processed links to avoid point lookup issues for flows\n const rawLinks = datamodel.data?.links || []\n\n // Clear existing flow data\n this._flowParticles = []\n this._sourcePoints = []\n\n if (!rawLinks || rawLinks.length === 0) return\n\n // Create source points and flow particles for each link\n rawLinks.forEach((link, i) => {\n // Try to get coordinates from flow-specific accessors first, then fall back to link endpoints\n let sourceLon: number, sourceLat: number, targetLon: number, targetLat: number\n\n if (config.sourceLongitude && config.sourceLatitude) {\n sourceLon = getNumber(link, config.sourceLongitude)\n sourceLat = getNumber(link, config.sourceLatitude)\n } else {\n // Fall back to using linkSource point coordinates\n const sourcePoint = config.linkSource?.(link)\n if (typeof sourcePoint === 'object' && sourcePoint !== null) {\n sourceLon = getNumber(sourcePoint as PointDatum, config.longitude)\n sourceLat = getNumber(sourcePoint as PointDatum, config.latitude)\n } else {\n return // Skip if can't resolve source coordinates\n }\n }\n\n if (config.targetLongitude && config.targetLatitude) {\n targetLon = getNumber(link, config.targetLongitude)\n targetLat = getNumber(link, config.targetLatitude)\n } else {\n // Fall back to using linkTarget point coordinates\n const targetPoint = config.linkTarget?.(link)\n if (typeof targetPoint === 'object' && targetPoint !== null) {\n targetLon = getNumber(targetPoint as PointDatum, config.longitude)\n targetLat = getNumber(targetPoint as PointDatum, config.latitude)\n } else {\n return // Skip if can't resolve target coordinates\n }\n }\n\n if (!isNumber(sourceLon) || !isNumber(sourceLat) || !isNumber(targetLon) || !isNumber(targetLat)) {\n return\n }\n\n const source = { lat: sourceLat, lon: sourceLon }\n const target = { lat: targetLat, lon: targetLon }\n\n // Create source point\n const sourcePos = this._projection([sourceLon, sourceLat])\n if (sourcePos) {\n const sourcePoint: FlowSourcePoint = {\n lat: sourceLat,\n lon: sourceLon,\n x: sourcePos[0],\n y: sourcePos[1],\n radius: getNumber(link, config.sourcePointRadius),\n color: getColor(link, config.sourcePointColor, i),\n flowData: link,\n }\n this._sourcePoints.push(sourcePoint)\n }\n\n // Create flow particles\n const dist = Math.sqrt((targetLat - sourceLat) ** 2 + (targetLon - sourceLon) ** 2)\n const numParticles = Math.max(1, Math.round(dist * getNumber(link, config.flowParticleDensity)))\n const velocity = getNumber(link, config.flowParticleSpeed)\n const radius = getNumber(link, config.flowParticleRadius)\n const color = getColor(link, config.flowParticleColor, i)\n\n for (let j = 0; j < numParticles; j += 1) {\n const progress = j / numParticles\n const location = {\n lat: sourceLat + (targetLat - sourceLat) * progress,\n lon: sourceLon + (targetLon - sourceLon) * progress,\n }\n\n const pos = this._projection([location.lon, location.lat])\n if (pos) {\n const particle: FlowParticle = {\n x: pos[0],\n y: pos[1],\n source,\n target,\n location,\n velocity,\n radius,\n color,\n flowData: link,\n progress: 0, // Keep for compatibility but not used in angle-based movement\n id: `${(link as any).id || i}-${j}`,\n }\n this._flowParticles.push(particle)\n }\n }\n })\n }\n\n private _renderSourcePoints (duration: number): void {\n const { config } = this\n\n const sourcePoints = this._sourcePointsGroup\n .selectAll<SVGCircleElement, FlowSourcePoint>(`.${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('r', 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('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('stroke', d => d.color)\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 if (this._flowParticles.length === 0) return\n\n const zoomLevel = this._currentZoomLevel || 1\n\n this._flowParticles.forEach(particle => {\n const { source, target } = particle\n\n // Calculate movement using angle-based velocity (like LeafletFlowMap)\n const fullDist = Math.sqrt((target.lat - source.lat) ** 2 + (target.lon - source.lon) ** 2)\n const remainedDist = Math.sqrt((target.lat - particle.location.lat) ** 2 + (target.lon - particle.location.lon) ** 2)\n const angle = Math.atan2(target.lat - source.lat, target.lon - source.lon)\n\n // Update geographic location\n particle.location.lat += particle.velocity * Math.sin(angle)\n particle.location.lon += particle.velocity * Math.cos(angle)\n\n // Reset to start when reaching target (like LeafletFlowMap)\n if (\n (((target.lat > source.lat) && (particle.location.lat > target.lat)) || ((target.lon > source.lon) && (particle.location.lon > target.lon))) ||\n (((target.lat < source.lat) && (particle.location.lat < target.lat)) || ((target.lon < source.lon) && (particle.location.lon < target.lon)))\n ) {\n particle.location.lat = source.lat\n particle.location.lon = source.lon\n }\n\n // Project to screen coordinates\n const pos = this._projection([particle.location.lon, particle.location.lat])\n if (pos) {\n // Add orthogonal arc shift (adapted from LeafletFlowMap)\n const orthogonalArcShift = -(zoomLevel ** 2 * fullDist / 8) * Math.cos(Math.PI / 2 * (fullDist / 2 - remainedDist) / (fullDist / 2)) || 0\n particle.x = pos[0]\n particle.y = pos[1] + orthogonalArcShift\n }\n })\n\n // Update DOM elements directly without data rebinding (for performance)\n this._flowParticlesGroup\n .selectAll<SVGCircleElement, any>(`.${s.flowParticle}`)\n .attr('cx', (d, i) => this._flowParticles[i]?.x || 0)\n .attr('cy', (d, i) => this._flowParticles[i]?.y || 0)\n .attr('r', (d, i) => (this._flowParticles[i]?.radius || 1) / zoomLevel)\n }\n\n destroy (): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._stopFlowAnimation()\n window.cancelAnimationFrame(this._collideLabelsAnimFrameId)\n }\n}\n"],"names":["s.background","s.features","s.areaLabel","s.links","s.points","s.flowParticles","s.sourcePoints","s.feature","s.link","s.point","s.pointCircle","s.pointLabel","s.sourcePoint","s.flowParticle","s"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@unovis/ts",
3
3
  "description": "Modular data visualization framework for React, Angular, Svelte, Vue, Solid, and vanilla TypeScript or JavaScript",
4
- "version": "1.7.0-stellar.1",
4
+ "version": "1.7.0-stellar.3",
5
5
  "packageManager": "npm@10.9.1",
6
6
  "repository": {
7
7
  "type": "git",